Chromium Code Reviews| 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(); |
| + }); |
| +} |