| OLD | NEW | 
|---|
| 1 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file | 
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a | 
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. | 
| 4 | 4 | 
| 5 library pub_uploader_test; | 5 library pub_uploader_test; | 
| 6 | 6 | 
| 7 import 'dart:io'; | 7 import 'dart:io'; | 
| 8 import 'dart:json' as json; | 8 import 'dart:json' as json; | 
| 9 | 9 | 
|  | 10 import '../../../pkg/scheduled_test/lib/scheduled_process.dart'; | 
|  | 11 import '../../../pkg/scheduled_test/lib/scheduled_server.dart'; | 
|  | 12 import '../../../pkg/scheduled_test/lib/scheduled_test.dart'; | 
|  | 13 | 
|  | 14 import '../../pub/io.dart'; | 
|  | 15 import '../../pub/utils.dart'; | 
|  | 16 import 'descriptor.dart' as d; | 
| 10 import 'test_pub.dart'; | 17 import 'test_pub.dart'; | 
| 11 import '../../../pkg/unittest/lib/unittest.dart'; |  | 
| 12 import '../../pub/utils.dart'; |  | 
| 13 import '../../pub/io.dart'; |  | 
| 14 | 18 | 
| 15 final USAGE_STRING = ''' | 19 final USAGE_STRING = ''' | 
| 16     Manage uploaders for a package on pub.dartlang.org. | 20     Manage uploaders for a package on pub.dartlang.org. | 
| 17 | 21 | 
| 18     Usage: pub uploader [options] {add/remove} <email> | 22     Usage: pub uploader [options] {add/remove} <email> | 
| 19     --server     The package server on which the package is hosted | 23     --server     The package server on which the package is hosted | 
| 20                  (defaults to "https://pub.dartlang.org") | 24                  (defaults to "https://pub.dartlang.org") | 
| 21 | 25 | 
| 22     --package    The package whose uploaders will be modified | 26     --package    The package whose uploaders will be modified | 
| 23                  (defaults to the current package) | 27                  (defaults to the current package) | 
| (...skipping 19 matching lines...) Expand all  Loading... | 
| 43     }); | 47     }); | 
| 44 | 48 | 
| 45     integration('when run with an invalid command', () { | 49     integration('when run with an invalid command', () { | 
| 46       schedulePub(args: ['uploader', 'foo', 'email'], | 50       schedulePub(args: ['uploader', 'foo', 'email'], | 
| 47           output: USAGE_STRING, exitCode: 64); | 51           output: USAGE_STRING, exitCode: 64); | 
| 48     }); | 52     }); | 
| 49   }); | 53   }); | 
| 50 | 54 | 
| 51   integration('adds an uploader', () { | 55   integration('adds an uploader', () { | 
| 52     var server = new ScheduledServer(); | 56     var server = new ScheduledServer(); | 
| 53     credentialsFile(server, 'access token').scheduleCreate(); | 57     d.credentialsFile(server, 'access token').create(); | 
| 54     var pub = startPubUploader(server, ['--package', 'pkg', 'add', 'email']); | 58     var pub = startPubUploader(server, ['--package', 'pkg', 'add', 'email']); | 
| 55 | 59 | 
| 56     server.handle('POST', '/packages/pkg/uploaders.json', (request, response) { | 60     server.handle('POST', '/packages/pkg/uploaders.json', (request) { | 
| 57       expect(new ByteStream(request).toBytes().then((bodyBytes) { | 61       expect(new ByteStream(request).toBytes().then((bodyBytes) { | 
| 58         expect(new String.fromCharCodes(bodyBytes), equals('email=email')); | 62         expect(new String.fromCharCodes(bodyBytes), equals('email=email')); | 
| 59 | 63 | 
| 60         response.headers.contentType = new ContentType("application", "json"); | 64         request.response.headers.contentType = | 
| 61         response.write(json.stringify({ | 65             new ContentType("application", "json"); | 
|  | 66         request.response.write(json.stringify({ | 
| 62           'success': {'message': 'Good job!'} | 67           'success': {'message': 'Good job!'} | 
| 63         })); | 68         })); | 
| 64         response.close(); | 69         request.response.close(); | 
| 65       }), completes); | 70       }), completes); | 
| 66     }); | 71     }); | 
| 67 | 72 | 
| 68     expectLater(pub.nextLine(), equals('Good job!')); | 73     expect(pub.nextLine(), completion(equals('Good job!'))); | 
| 69     pub.shouldExit(0); | 74     pub.shouldExit(0); | 
| 70   }); | 75   }); | 
| 71 | 76 | 
| 72   integration('removes an uploader', () { | 77   integration('removes an uploader', () { | 
| 73     var server = new ScheduledServer(); | 78     var server = new ScheduledServer(); | 
| 74     credentialsFile(server, 'access token').scheduleCreate(); | 79     d.credentialsFile(server, 'access token').create(); | 
| 75     var pub = startPubUploader(server, ['--package', 'pkg', 'remove', 'email']); | 80     var pub = startPubUploader(server, ['--package', 'pkg', 'remove', 'email']); | 
| 76 | 81 | 
| 77     server.handle('DELETE', '/packages/pkg/uploaders/email.json', | 82     server.handle('DELETE', '/packages/pkg/uploaders/email.json', (request) { | 
| 78         (request, response) { | 83       request.response.headers.contentType = | 
| 79       response.headers.contentType = new ContentType("application", "json"); | 84           new ContentType("application", "json"); | 
| 80       response.write(json.stringify({ | 85       request.response.write(json.stringify({ | 
| 81         'success': {'message': 'Good job!'} | 86         'success': {'message': 'Good job!'} | 
| 82       })); | 87       })); | 
| 83       response.close(); | 88       request.response.close(); | 
| 84     }); | 89     }); | 
| 85 | 90 | 
| 86     expectLater(pub.nextLine(), equals('Good job!')); | 91     expect(pub.nextLine(), completion(equals('Good job!'))); | 
| 87     pub.shouldExit(0); | 92     pub.shouldExit(0); | 
| 88   }); | 93   }); | 
| 89 | 94 | 
| 90   integration('defaults to the current package', () { | 95   integration('defaults to the current package', () { | 
| 91     normalPackage.scheduleCreate(); | 96     d.validPackage.create(); | 
| 92 | 97 | 
| 93     var server = new ScheduledServer(); | 98     var server = new ScheduledServer(); | 
| 94     credentialsFile(server, 'access token').scheduleCreate(); | 99     d.credentialsFile(server, 'access token').create(); | 
| 95     var pub = startPubUploader(server, ['add', 'email']); | 100     var pub = startPubUploader(server, ['add', 'email']); | 
| 96 | 101 | 
| 97     server.handle('POST', '/packages/test_pkg/uploaders.json', | 102     server.handle('POST', '/packages/test_pkg/uploaders.json', (request) { | 
| 98         (request, response) { | 103       request.response.headers.contentType = | 
| 99       response.headers.contentType = new ContentType("application", "json"); | 104           new ContentType("application", "json"); | 
| 100       response.write(json.stringify({ | 105       request.response.write(json.stringify({ | 
| 101         'success': {'message': 'Good job!'} | 106         'success': {'message': 'Good job!'} | 
| 102       })); | 107       })); | 
| 103       response.close(); | 108       request.response.close(); | 
| 104     }); | 109     }); | 
| 105 | 110 | 
| 106     expectLater(pub.nextLine(), equals('Good job!')); | 111     expect(pub.nextLine(), completion(equals('Good job!'))); | 
| 107     pub.shouldExit(0); | 112     pub.shouldExit(0); | 
| 108   }); | 113   }); | 
| 109 | 114 | 
| 110   integration('add provides an error', () { | 115   integration('add provides an error', () { | 
| 111     var server = new ScheduledServer(); | 116     var server = new ScheduledServer(); | 
| 112     credentialsFile(server, 'access token').scheduleCreate(); | 117     d.credentialsFile(server, 'access token').create(); | 
| 113     var pub = startPubUploader(server, ['--package', 'pkg', 'add', 'email']); | 118     var pub = startPubUploader(server, ['--package', 'pkg', 'add', 'email']); | 
| 114 | 119 | 
| 115     server.handle('POST', '/packages/pkg/uploaders.json', (request, response) { | 120     server.handle('POST', '/packages/pkg/uploaders.json', (request) { | 
| 116       response.statusCode = 400; | 121       request.response.statusCode = 400; | 
| 117       response.headers.contentType = new ContentType("application", "json"); | 122       request.response.headers.contentType = | 
| 118       response.write(json.stringify({ | 123           new ContentType("application", "json"); | 
|  | 124       request.response.write(json.stringify({ | 
| 119         'error': {'message': 'Bad job!'} | 125         'error': {'message': 'Bad job!'} | 
| 120       })); | 126       })); | 
| 121       response.close(); | 127       request.response.close(); | 
| 122     }); | 128     }); | 
| 123 | 129 | 
| 124     expectLater(pub.nextErrLine(), equals('Bad job!')); | 130     expect(pub.nextErrLine(), completion(equals('Bad job!'))); | 
| 125     pub.shouldExit(1); | 131     pub.shouldExit(1); | 
| 126   }); | 132   }); | 
| 127 | 133 | 
| 128   integration('remove provides an error', () { | 134   integration('remove provides an error', () { | 
| 129     var server = new ScheduledServer(); | 135     var server = new ScheduledServer(); | 
| 130     credentialsFile(server, 'access token').scheduleCreate(); | 136     d.credentialsFile(server, 'access token').create(); | 
| 131     var pub = startPubUploader(server, | 137     var pub = startPubUploader(server, | 
| 132         ['--package', 'pkg', 'remove', 'e/mail']); | 138         ['--package', 'pkg', 'remove', 'e/mail']); | 
| 133 | 139 | 
| 134     server.handle('DELETE', '/packages/pkg/uploaders/e%2Fmail.json', | 140     server.handle('DELETE', '/packages/pkg/uploaders/e%2Fmail.json', (request) { | 
| 135         (request, response) { | 141       request.response.statusCode = 400; | 
| 136       response.statusCode = 400; | 142       request.response.headers.contentType = | 
| 137       response.headers.contentType = new ContentType("application", "json"); | 143           new ContentType("application", "json"); | 
| 138       response.write(json.stringify({ | 144       request.response.write(json.stringify({ | 
| 139         'error': {'message': 'Bad job!'} | 145         'error': {'message': 'Bad job!'} | 
| 140       })); | 146       })); | 
| 141       response.close(); | 147       request.response.close(); | 
| 142     }); | 148     }); | 
| 143 | 149 | 
| 144     expectLater(pub.nextErrLine(), equals('Bad job!')); | 150     expect(pub.nextErrLine(), completion(equals('Bad job!'))); | 
| 145     pub.shouldExit(1); | 151     pub.shouldExit(1); | 
| 146   }); | 152   }); | 
| 147 | 153 | 
| 148   integration('add provides invalid JSON', () { | 154   integration('add provides invalid JSON', () { | 
| 149     var server = new ScheduledServer(); | 155     var server = new ScheduledServer(); | 
| 150     credentialsFile(server, 'access token').scheduleCreate(); | 156     d.credentialsFile(server, 'access token').create(); | 
| 151     var pub = startPubUploader(server, ['--package', 'pkg', 'add', 'email']); | 157     var pub = startPubUploader(server, ['--package', 'pkg', 'add', 'email']); | 
| 152 | 158 | 
| 153     server.handle('POST', '/packages/pkg/uploaders.json', (request, response) { | 159     server.handle('POST', '/packages/pkg/uploaders.json', (request) { | 
| 154       response.write("{not json"); | 160       request.response.write("{not json"); | 
| 155       response.close(); | 161       request.response.close(); | 
| 156     }); | 162     }); | 
| 157 | 163 | 
| 158     expectLater(pub.nextErrLine(), equals('Invalid server response:')); | 164     expect(pub.nextErrLine(), completion(equals('Invalid server response:'))); | 
| 159     expectLater(pub.nextErrLine(), equals('{not json')); | 165     expect(pub.nextErrLine(), completion(equals('{not json'))); | 
| 160     pub.shouldExit(1); | 166     pub.shouldExit(1); | 
| 161   }); | 167   }); | 
| 162 | 168 | 
| 163   integration('remove provides invalid JSON', () { | 169   integration('remove provides invalid JSON', () { | 
| 164     var server = new ScheduledServer(); | 170     var server = new ScheduledServer(); | 
| 165     credentialsFile(server, 'access token').scheduleCreate(); | 171     d.credentialsFile(server, 'access token').create(); | 
| 166     var pub = startPubUploader(server, ['--package', 'pkg', 'remove', 'email']); | 172     var pub = startPubUploader(server, ['--package', 'pkg', 'remove', 'email']); | 
| 167 | 173 | 
| 168     server.handle('DELETE', '/packages/pkg/uploaders/email.json', | 174     server.handle('DELETE', '/packages/pkg/uploaders/email.json', (request) { | 
| 169         (request, response) { | 175       request.response.write("{not json"); | 
| 170       response.write("{not json"); | 176       request.response.close(); | 
| 171       response.close(); |  | 
| 172     }); | 177     }); | 
| 173 | 178 | 
| 174     expectLater(pub.nextErrLine(), equals('Invalid server response:')); | 179     expect(pub.nextErrLine(), completion(equals('Invalid server response:'))); | 
| 175     expectLater(pub.nextErrLine(), equals('{not json')); | 180     expect(pub.nextErrLine(), completion(equals('{not json'))); | 
| 176     pub.shouldExit(1); | 181     pub.shouldExit(1); | 
| 177   }); | 182   }); | 
| 178 } | 183 } | 
| OLD | NEW | 
|---|