Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(239)

Unified Diff: utils/tests/pub/pub_uploader_test.dart

Issue 11569046: Add a pub command for managing uploaders for packages. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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();
+ });
+}

Powered by Google App Engine
This is Rietveld 408576698