Index: utils/tests/pub/pub_uploader_test.dart |
diff --git a/utils/tests/pub/pub_uploader_test.dart b/utils/tests/pub/pub_uploader_test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..8fbdafccdfe58bf6b437990f3ab34dbd1614c47a |
--- /dev/null |
+++ b/utils/tests/pub/pub_uploader_test.dart |
@@ -0,0 +1,201 @@ |
+// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
+// for details. All rights reserved. Use of this source code is governed by a |
+// BSD-style license that can be found in the LICENSE file. |
+ |
+library pub_uploader_test; |
+ |
+import 'dart:io'; |
+import 'dart:json'; |
+ |
+import 'test_pub.dart'; |
+import '../../../pkg/unittest/lib/unittest.dart'; |
+import '../../pub/utils.dart'; |
+ |
+final USAGE_STRING = ''' |
+ Manage uploaders for a package on pub.dartlang.org. |
+ |
+ Usage: pub uploader [options] {add/remove} email |
+ --server The package server to which to upload this package |
+ (defaults to "https://pub.dartlang.org") |
+ |
+ --package The package whose uploaders will be modified |
+ (defaults to the current package) |
+ '''; |
+ |
+ScheduledProcess startPubUploader(ScheduledServer server, List<String> args) { |
+ var tokenEndpoint = server.url.transform((url) => |
+ url.resolve('/token').toString()); |
+ args = flatten(['uploader', '--server', tokenEndpoint, args]); |
+ return startPub(args: args, tokenEndpoint: tokenEndpoint); |
+} |
+ |
+main() { |
+ group('displays usage', () { |
+ test('when run with no arguments', () => |
+ runPub(args: ['uploader'], output: USAGE_STRING, exitCode: 64)); |
+ |
+ test('when run with only a command', () => |
+ runPub(args: ['uploader', 'add'], output: USAGE_STRING, exitCode: 64)); |
Bob Nystrom
2012/12/17 18:41:58
It would be good to show a specific error message
nweiz
2012/12/17 21:18:48
We do, it's just on stderr. I didn't think it was
|
+ |
+ test('when run with an invalid command', () => runPub( |
Bob Nystrom
2012/12/17 18:41:58
Ditto. 'Unknown uploader command "foo". Expected "
nweiz
2012/12/17 21:18:48
See above.
|
+ args: ['uploader', 'foo', 'email'], |
+ output: USAGE_STRING, exitCode: 64)); |
+ }); |
+ |
+ test('creates an uploader', () { |
Bob Nystrom
2012/12/17 18:41:58
"creates" -> "adds"
Here and elsewhere.
nweiz
2012/12/17 21:18:48
Done.
|
+ var server = new ScheduledServer(); |
+ credentialsFile(server, 'access token').scheduleCreate(); |
+ var pub = startPubUploader(server, ['--package', 'pkg', 'add', 'email']); |
+ |
+ server.handle('POST', '/packages/pkg/uploaders.json', (request, response) { |
Bob Nystrom
2012/12/17 18:41:58
Validate that the request includes the email?
nweiz
2012/12/17 21:18:48
Done.
|
+ response.headers.contentType = new ContentType("application", "json"); |
+ response.outputStream.writeString(JSON.stringify({ |
+ 'success': {'message': 'Good job!'} |
+ })); |
+ response.outputStream.close(); |
+ }); |
+ |
Bob Nystrom
2012/12/17 18:41:58
Should we validate that pub prints out "Good job!"
nweiz
2012/12/17 21:18:48
Yeah, that seems reasonable. Done.
|
+ pub.shouldExit(0); |
+ |
+ run(); |
+ }); |
+ |
+ test('deletes an uploader', () { |
Bob Nystrom
2012/12/17 18:41:58
"deletes" -> "removes"
Here and elsewhere.
nweiz
2012/12/17 21:18:48
Done.
|
+ var server = new ScheduledServer(); |
+ credentialsFile(server, 'access token').scheduleCreate(); |
+ var pub = startPubUploader(server, ['--package', 'pkg', 'remove', 'email']); |
+ |
+ server.handle('DELETE', '/packages/pkg/uploaders/email.json', |
+ (request, response) { |
Bob Nystrom
2012/12/17 18:41:58
Validate that the request includes the email?
nweiz
2012/12/17 21:18:48
In this case it's embedded in the URL.
Bob Nystrom
2012/12/17 21:26:59
Oh, sorry didn't notice. Does it URL-encode the em
|
+ response.headers.contentType = new ContentType("application", "json"); |
+ response.outputStream.writeString(JSON.stringify({ |
+ 'success': {'message': 'Good job!'} |
+ })); |
+ response.outputStream.close(); |
+ }); |
+ |
+ pub.shouldExit(0); |
+ |
+ run(); |
+ }); |
+ |
+ test('defaults to the current package', () { |
+ normalPackage.scheduleCreate(); |
+ |
+ var server = new ScheduledServer(); |
+ credentialsFile(server, 'access token').scheduleCreate(); |
+ var pub = startPubUploader(server, ['add', 'email']); |
+ |
+ server.handle('POST', '/packages/test_pkg/uploaders.json', |
+ (request, response) { |
+ response.headers.contentType = new ContentType("application", "json"); |
+ response.outputStream.writeString(JSON.stringify({ |
+ 'success': {'message': 'Good job!'} |
+ })); |
+ response.outputStream.close(); |
+ }); |
+ |
+ pub.shouldExit(0); |
+ |
+ run(); |
+ }); |
+ |
+ test('credentials are invalid', () { |
+ var server = new ScheduledServer(); |
+ credentialsFile(server, 'access token').scheduleCreate(); |
+ var pub = startPubUploader(server, ['--package', 'pkg', 'add', 'email']); |
+ |
+ server.handle('POST', '/packages/pkg/uploaders.json', (request, response) { |
+ response.statusCode = 401; |
+ response.headers.set('www-authenticate', 'Bearer error="invalid_token",' |
+ ' error_description="your token sucks"'); |
+ response.outputStream.writeString(JSON.stringify({ |
+ 'error': {'message': 'your token sucks'} |
+ })); |
Bob Nystrom
2012/12/17 18:41:58
We do this pretty frequently. Break out into a sep
nweiz
2012/12/17 21:18:48
I think we only do it twice. And actually, this te
|
+ response.outputStream.close(); |
+ }); |
+ |
+ expectLater(pub.nextErrLine(), equals('OAuth2 authorization failed (your ' |
+ 'token sucks).')); |
+ expectLater(pub.nextLine(), equals( |
+ 'Pub needs your authorization to upload packages on your behalf.')); |
+ pub.kill(); |
+ run(); |
+ }); |
+ |
+ test('create provides an error', () { |
+ var server = new ScheduledServer(); |
+ credentialsFile(server, 'access token').scheduleCreate(); |
+ var pub = startPubUploader(server, ['--package', 'pkg', 'add', 'email']); |
+ |
+ server.handle('POST', '/packages/pkg/uploaders.json', (request, response) { |
+ response.statusCode = 400; |
+ response.headers.contentType = new ContentType("application", "json"); |
+ response.outputStream.writeString(JSON.stringify({ |
+ 'error': {'message': 'Bad job!'} |
+ })); |
+ response.outputStream.close(); |
+ }); |
+ |
+ expectLater(pub.nextErrLine(), equals('Bad job!')); |
+ pub.shouldExit(1); |
+ |
+ run(); |
+ }); |
+ |
+ test('delete provides an error', () { |
+ var server = new ScheduledServer(); |
+ credentialsFile(server, 'access token').scheduleCreate(); |
+ var pub = startPubUploader(server, ['--package', 'pkg', 'remove', 'email']); |
+ |
+ server.handle('DELETE', '/packages/pkg/uploaders/email.json', |
+ (request, response) { |
+ response.statusCode = 400; |
+ response.headers.contentType = new ContentType("application", "json"); |
+ response.outputStream.writeString(JSON.stringify({ |
+ 'error': {'message': 'Bad job!'} |
+ })); |
+ response.outputStream.close(); |
+ }); |
+ |
+ expectLater(pub.nextErrLine(), equals('Bad job!')); |
+ pub.shouldExit(1); |
+ |
+ run(); |
+ }); |
+ |
+ test('create provides invalid JSON', () { |
+ var server = new ScheduledServer(); |
+ credentialsFile(server, 'access token').scheduleCreate(); |
+ var pub = startPubUploader(server, ['--package', 'pkg', 'add', 'email']); |
+ |
+ server.handle('POST', '/packages/pkg/uploaders.json', (request, response) { |
+ response.outputStream.writeString("{not json"); |
+ response.outputStream.close(); |
+ }); |
+ |
+ expectLater(pub.nextErrLine(), equals('Invalid server response:')); |
+ expectLater(pub.nextErrLine(), equals('{not json')); |
+ pub.shouldExit(1); |
+ |
+ run(); |
+ }); |
+ |
+ test('delete provides invalid JSON', () { |
+ var server = new ScheduledServer(); |
+ credentialsFile(server, 'access token').scheduleCreate(); |
+ var pub = startPubUploader(server, ['--package', 'pkg', 'remove', 'email']); |
+ |
+ server.handle('DELETE', '/packages/pkg/uploaders/email.json', |
+ (request, response) { |
+ response.outputStream.writeString("{not json"); |
+ response.outputStream.close(); |
+ }); |
+ |
+ expectLater(pub.nextErrLine(), equals('Invalid server response:')); |
+ expectLater(pub.nextErrLine(), equals('{not json')); |
+ pub.shouldExit(1); |
+ |
+ run(); |
+ }); |
+} |