| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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_lish_test; | 5 library pub_lish_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 'test_pub.dart'; | 10 import '../../../pkg/scheduled_test/lib/scheduled_test.dart'; |
| 11 import '../../../pkg/unittest/lib/unittest.dart'; | 11 import '../../../pkg/scheduled_test/lib/scheduled_server.dart'; |
| 12 |
| 12 import '../../pub/exit_codes.dart' as exit_codes; | 13 import '../../pub/exit_codes.dart' as exit_codes; |
| 13 import '../../pub/io.dart'; | 14 import '../../pub/io.dart'; |
| 15 import 'descriptor.dart' as d; |
| 16 import 'test_pub.dart'; |
| 14 | 17 |
| 15 void handleUploadForm(ScheduledServer server, [Map body]) { | 18 void handleUploadForm(ScheduledServer server, [Map body]) { |
| 16 server.handle('GET', '/packages/versions/new.json', (request, response) { | 19 server.handle('GET', '/packages/versions/new.json', (request) { |
| 17 return server.url.then((url) { | 20 return server.url.then((url) { |
| 18 expect(request.headers.value('authorization'), | 21 expect(request.headers.value('authorization'), |
| 19 equals('Bearer access token')); | 22 equals('Bearer access token')); |
| 20 | 23 |
| 21 if (body == null) { | 24 if (body == null) { |
| 22 body = { | 25 body = { |
| 23 'url': url.resolve('/upload').toString(), | 26 'url': url.resolve('/upload').toString(), |
| 24 'fields': { | 27 'fields': { |
| 25 'field1': 'value1', | 28 'field1': 'value1', |
| 26 'field2': 'value2' | 29 'field2': 'value2' |
| 27 } | 30 } |
| 28 }; | 31 }; |
| 29 } | 32 } |
| 30 | 33 |
| 31 response.headers.contentType = new ContentType("application", "json"); | 34 request.response.headers.contentType = |
| 32 response.write(json.stringify(body)); | 35 new ContentType("application", "json"); |
| 33 response.close(); | 36 request.response.write(json.stringify(body)); |
| 37 request.response.close(); |
| 34 }); | 38 }); |
| 35 }); | 39 }); |
| 36 } | 40 } |
| 37 | 41 |
| 38 void handleUpload(ScheduledServer server) { | 42 void handleUpload(ScheduledServer server) { |
| 39 server.handle('POST', '/upload', (request, response) { | 43 server.handle('POST', '/upload', (request) { |
| 40 // TODO(nweiz): Once a multipart/form-data parser in Dart exists, validate | 44 // TODO(nweiz): Once a multipart/form-data parser in Dart exists, validate |
| 41 // that the request body is correctly formatted. See issue 6952. | 45 // that the request body is correctly formatted. See issue 6952. |
| 42 return drainStream(request).then((_) { | 46 return drainStream(request).then((_) { |
| 43 return server.url; | 47 return server.url; |
| 44 }).then((url) { | 48 }).then((url) { |
| 45 response.statusCode = 302; | 49 request.response.statusCode = 302; |
| 46 response.headers.set('location', url.resolve('/create').toString()); | 50 request.response.headers.set( |
| 47 response.close(); | 51 'location', url.resolve('/create').toString()); |
| 52 request.response.close(); |
| 48 }); | 53 }); |
| 49 }); | 54 }); |
| 50 } | 55 } |
| 51 | 56 |
| 52 main() { | 57 main() { |
| 53 initConfig(); | 58 initConfig(); |
| 54 setUp(() => normalPackage.scheduleCreate()); | 59 setUp(() => d.validPackage.create()); |
| 55 | 60 |
| 56 integration('archives and uploads a package', () { | 61 integration('archives and uploads a package', () { |
| 57 var server = new ScheduledServer(); | 62 var server = new ScheduledServer(); |
| 58 credentialsFile(server, 'access token').scheduleCreate(); | 63 d.credentialsFile(server, 'access token').create(); |
| 59 var pub = startPubLish(server); | 64 var pub = startPublish(server); |
| 60 | 65 |
| 61 confirmPublish(pub); | 66 confirmPublish(pub); |
| 62 handleUploadForm(server); | 67 handleUploadForm(server); |
| 63 handleUpload(server); | 68 handleUpload(server); |
| 64 | 69 |
| 65 server.handle('GET', '/create', (request, response) { | 70 server.handle('GET', '/create', (request) { |
| 66 response.write(json.stringify({ | 71 request.response.write(json.stringify({ |
| 67 'success': {'message': 'Package test_pkg 1.0.0 uploaded!'} | 72 'success': {'message': 'Package test_pkg 1.0.0 uploaded!'} |
| 68 })); | 73 })); |
| 69 response.close(); | 74 request.response.close(); |
| 70 }); | 75 }); |
| 71 | 76 |
| 72 // TODO(rnystrom): The confirm line is run together with this one because | 77 // TODO(rnystrom): The confirm line is run together with this one because |
| 73 // in normal usage, the user will have entered a newline on stdin which | 78 // in normal usage, the user will have entered a newline on stdin which |
| 74 // gets echoed to the terminal. Do something better here? | 79 // gets echoed to the terminal. Do something better here? |
| 75 expectLater(pub.nextLine(), equals( | 80 expect(pub.nextLine(), completion(equals( |
| 76 'Looks great! Are you ready to upload your package (y/n)?' | 81 'Looks great! Are you ready to upload your package (y/n)?' |
| 77 ' Package test_pkg 1.0.0 uploaded!')); | 82 ' Package test_pkg 1.0.0 uploaded!'))); |
| 78 pub.shouldExit(0); | 83 pub.shouldExit(0); |
| 79 }); | 84 }); |
| 80 | 85 |
| 81 // TODO(nweiz): Once a multipart/form-data parser in Dart exists, we should | 86 // TODO(nweiz): Once a multipart/form-data parser in Dart exists, we should |
| 82 // test that "pub lish" chooses the correct files to publish. | 87 // test that "pub lish" chooses the correct files to publish. |
| 83 | 88 |
| 84 integration('package validation has an error', () { | 89 integration('package validation has an error', () { |
| 85 var pkg = package("test_pkg", "1.0.0"); | 90 var pkg = packageMap("test_pkg", "1.0.0"); |
| 86 pkg.remove("homepage"); | 91 pkg.remove("homepage"); |
| 87 dir(appPath, [pubspec(pkg)]).scheduleCreate(); | 92 d.dir(appPath, [d.pubspec(pkg)]).create(); |
| 88 | 93 |
| 89 var server = new ScheduledServer(); | 94 var server = new ScheduledServer(); |
| 90 var pub = startPubLish(server); | 95 var pub = startPublish(server); |
| 91 | 96 |
| 92 pub.shouldExit(0); | 97 pub.shouldExit(0); |
| 93 expectLater(pub.remainingStderr(), | 98 expect(pub.remainingStderr(), completion(contains( |
| 94 contains("Sorry, your package is missing a requirement and can't be " | 99 "Sorry, your package is missing a requirement and can't be published " |
| 95 "published yet.")); | 100 "yet."))); |
| 96 }); | 101 }); |
| 97 | 102 |
| 98 integration('preview package validation has a warning', () { | 103 integration('preview package validation has a warning', () { |
| 99 var pkg = package("test_pkg", "1.0.0"); | 104 var pkg = packageMap("test_pkg", "1.0.0"); |
| 100 pkg["author"] = "Nathan Weizenbaum"; | 105 pkg["author"] = "Nathan Weizenbaum"; |
| 101 dir(appPath, [pubspec(pkg)]).scheduleCreate(); | 106 d.dir(appPath, [d.pubspec(pkg)]).create(); |
| 102 | 107 |
| 103 var server = new ScheduledServer(); | 108 var server = new ScheduledServer(); |
| 104 var pub = startPubLish(server, args: ['--dry-run']); | 109 var pub = startPublish(server, args: ['--dry-run']); |
| 105 | 110 |
| 106 pub.shouldExit(0); | 111 pub.shouldExit(0); |
| 107 expectLater(pub.remainingStderr(), | 112 expect(pub.remainingStderr(), completion(contains( |
| 108 contains('Suggestions:\n* Author "Nathan Weizenbaum" in pubspec.yaml' | 113 'Suggestions:\n* Author "Nathan Weizenbaum" in pubspec.yaml should ' |
| 109 ' should have an email address\n' | 114 'have an email address\n' |
| 110 ' (e.g. "name <email>").\n\n' | 115 ' (e.g. "name <email>").\n\n' |
| 111 'Package has 1 warning.')); | 116 'Package has 1 warning.'))); |
| 112 }); | 117 }); |
| 113 | 118 |
| 114 integration('preview package validation has no warnings', () { | 119 integration('preview package validation has no warnings', () { |
| 115 var pkg = package("test_pkg", "1.0.0"); | 120 var pkg = packageMap("test_pkg", "1.0.0"); |
| 116 pkg["author"] = "Nathan Weizenbaum <nweiz@google.com>"; | 121 pkg["author"] = "Nathan Weizenbaum <nweiz@google.com>"; |
| 117 dir(appPath, [pubspec(pkg)]).scheduleCreate(); | 122 d.dir(appPath, [d.pubspec(pkg)]).create(); |
| 118 | 123 |
| 119 var server = new ScheduledServer(); | 124 var server = new ScheduledServer(); |
| 120 var pub = startPubLish(server, args: ['--dry-run']); | 125 var pub = startPublish(server, args: ['--dry-run']); |
| 121 | 126 |
| 122 pub.shouldExit(0); | 127 pub.shouldExit(0); |
| 123 expectLater(pub.remainingStderr(), | 128 expect(pub.remainingStderr(), |
| 124 contains('Package has 0 warnings.')); | 129 completion(contains('Package has 0 warnings.'))); |
| 125 }); | 130 }); |
| 126 | 131 |
| 127 integration('package validation has a warning and is canceled', () { | 132 integration('package validation has a warning and is canceled', () { |
| 128 var pkg = package("test_pkg", "1.0.0"); | 133 var pkg = packageMap("test_pkg", "1.0.0"); |
| 129 pkg["author"] = "Nathan Weizenbaum"; | 134 pkg["author"] = "Nathan Weizenbaum"; |
| 130 dir(appPath, [pubspec(pkg)]).scheduleCreate(); | 135 d.dir(appPath, [d.pubspec(pkg)]).create(); |
| 131 | 136 |
| 132 var server = new ScheduledServer(); | 137 var server = new ScheduledServer(); |
| 133 var pub = startPubLish(server); | 138 var pub = startPublish(server); |
| 134 | 139 |
| 135 pub.writeLine("n"); | 140 pub.writeLine("n"); |
| 136 pub.shouldExit(0); | 141 pub.shouldExit(0); |
| 137 expectLater(pub.remainingStderr(), contains("Package upload canceled.")); | 142 expect(pub.remainingStderr(), |
| 143 completion(contains("Package upload canceled."))); |
| 138 }); | 144 }); |
| 139 | 145 |
| 140 integration('package validation has a warning and continues', () { | 146 integration('package validation has a warning and continues', () { |
| 141 var pkg = package("test_pkg", "1.0.0"); | 147 var pkg = packageMap("test_pkg", "1.0.0"); |
| 142 pkg["author"] = "Nathan Weizenbaum"; | 148 pkg["author"] = "Nathan Weizenbaum"; |
| 143 dir(appPath, [pubspec(pkg)]).scheduleCreate(); | 149 d.dir(appPath, [d.pubspec(pkg)]).create(); |
| 144 | 150 |
| 145 var server = new ScheduledServer(); | 151 var server = new ScheduledServer(); |
| 146 credentialsFile(server, 'access token').scheduleCreate(); | 152 d.credentialsFile(server, 'access token').create(); |
| 147 var pub = startPubLish(server); | 153 var pub = startPublish(server); |
| 148 pub.writeLine("y"); | 154 pub.writeLine("y"); |
| 149 handleUploadForm(server); | 155 handleUploadForm(server); |
| 150 handleUpload(server); | 156 handleUpload(server); |
| 151 | 157 |
| 152 server.handle('GET', '/create', (request, response) { | 158 server.handle('GET', '/create', (request) { |
| 153 response.write(json.stringify({ | 159 request.response.write(json.stringify({ |
| 154 'success': {'message': 'Package test_pkg 1.0.0 uploaded!'} | 160 'success': {'message': 'Package test_pkg 1.0.0 uploaded!'} |
| 155 })); | 161 })); |
| 156 response.close(); | 162 request.response.close(); |
| 157 }); | 163 }); |
| 158 | 164 |
| 159 pub.shouldExit(0); | 165 pub.shouldExit(0); |
| 160 expectLater(pub.remainingStdout(), | 166 expect(pub.remainingStdout(), |
| 161 contains('Package test_pkg 1.0.0 uploaded!')); | 167 completion(contains('Package test_pkg 1.0.0 uploaded!'))); |
| 162 }); | 168 }); |
| 163 | 169 |
| 164 integration('upload form provides an error', () { | 170 integration('upload form provides an error', () { |
| 165 var server = new ScheduledServer(); | 171 var server = new ScheduledServer(); |
| 166 credentialsFile(server, 'access token').scheduleCreate(); | 172 d.credentialsFile(server, 'access token').create(); |
| 167 var pub = startPubLish(server); | 173 var pub = startPublish(server); |
| 168 | 174 |
| 169 confirmPublish(pub); | 175 confirmPublish(pub); |
| 170 | 176 |
| 171 server.handle('GET', '/packages/versions/new.json', (request, response) { | 177 server.handle('GET', '/packages/versions/new.json', (request) { |
| 172 response.statusCode = 400; | 178 request.response.statusCode = 400; |
| 173 response.write(json.stringify({ | 179 request.response.write(json.stringify({ |
| 174 'error': {'message': 'your request sucked'} | 180 'error': {'message': 'your request sucked'} |
| 175 })); | 181 })); |
| 176 response.close(); | 182 request.response.close(); |
| 177 }); | 183 }); |
| 178 | 184 |
| 179 expectLater(pub.nextErrLine(), equals('your request sucked')); | 185 expect(pub.nextErrLine(), completion(equals('your request sucked'))); |
| 180 pub.shouldExit(1); | 186 pub.shouldExit(1); |
| 181 }); | 187 }); |
| 182 | 188 |
| 183 integration('upload form provides invalid JSON', () { | 189 integration('upload form provides invalid JSON', () { |
| 184 var server = new ScheduledServer(); | 190 var server = new ScheduledServer(); |
| 185 credentialsFile(server, 'access token').scheduleCreate(); | 191 d.credentialsFile(server, 'access token').create(); |
| 186 var pub = startPubLish(server); | 192 var pub = startPublish(server); |
| 187 | 193 |
| 188 confirmPublish(pub); | 194 confirmPublish(pub); |
| 189 | 195 |
| 190 server.handle('GET', '/packages/versions/new.json', (request, response) { | 196 server.handle('GET', '/packages/versions/new.json', (request) { |
| 191 response.write('{not json'); | 197 request.response.write('{not json'); |
| 192 response.close(); | 198 request.response.close(); |
| 193 }); | 199 }); |
| 194 | 200 |
| 195 expectLater(pub.nextErrLine(), equals('Invalid server response:')); | 201 expect(pub.nextErrLine(), completion(equals('Invalid server response:'))); |
| 196 expectLater(pub.nextErrLine(), equals('{not json')); | 202 expect(pub.nextErrLine(), completion(equals('{not json'))); |
| 197 pub.shouldExit(1); | 203 pub.shouldExit(1); |
| 198 }); | 204 }); |
| 199 | 205 |
| 200 integration('upload form is missing url', () { | 206 integration('upload form is missing url', () { |
| 201 var server = new ScheduledServer(); | 207 var server = new ScheduledServer(); |
| 202 credentialsFile(server, 'access token').scheduleCreate(); | 208 d.credentialsFile(server, 'access token').create(); |
| 203 var pub = startPubLish(server); | 209 var pub = startPublish(server); |
| 204 | 210 |
| 205 confirmPublish(pub); | 211 confirmPublish(pub); |
| 206 | 212 |
| 207 var body = { | 213 var body = { |
| 208 'fields': { | 214 'fields': { |
| 209 'field1': 'value1', | 215 'field1': 'value1', |
| 210 'field2': 'value2' | 216 'field2': 'value2' |
| 211 } | 217 } |
| 212 }; | 218 }; |
| 213 | 219 |
| 214 handleUploadForm(server, body); | 220 handleUploadForm(server, body); |
| 215 expectLater(pub.nextErrLine(), equals('Invalid server response:')); | 221 expect(pub.nextErrLine(), completion(equals('Invalid server response:'))); |
| 216 expectLater(pub.nextErrLine(), equals(json.stringify(body))); | 222 expect(pub.nextErrLine(), completion(equals(json.stringify(body)))); |
| 217 pub.shouldExit(1); | 223 pub.shouldExit(1); |
| 218 }); | 224 }); |
| 219 | 225 |
| 220 integration('upload form url is not a string', () { | 226 integration('upload form url is not a string', () { |
| 221 var server = new ScheduledServer(); | 227 var server = new ScheduledServer(); |
| 222 credentialsFile(server, 'access token').scheduleCreate(); | 228 d.credentialsFile(server, 'access token').create(); |
| 223 var pub = startPubLish(server); | 229 var pub = startPublish(server); |
| 224 | 230 |
| 225 confirmPublish(pub); | 231 confirmPublish(pub); |
| 226 | 232 |
| 227 var body = { | 233 var body = { |
| 228 'url': 12, | 234 'url': 12, |
| 229 'fields': { | 235 'fields': { |
| 230 'field1': 'value1', | 236 'field1': 'value1', |
| 231 'field2': 'value2' | 237 'field2': 'value2' |
| 232 } | 238 } |
| 233 }; | 239 }; |
| 234 | 240 |
| 235 handleUploadForm(server, body); | 241 handleUploadForm(server, body); |
| 236 expectLater(pub.nextErrLine(), equals('Invalid server response:')); | 242 expect(pub.nextErrLine(), completion(equals('Invalid server response:'))); |
| 237 expectLater(pub.nextErrLine(), equals(json.stringify(body))); | 243 expect(pub.nextErrLine(), completion(equals(json.stringify(body)))); |
| 238 pub.shouldExit(1); | 244 pub.shouldExit(1); |
| 239 }); | 245 }); |
| 240 | 246 |
| 241 integration('upload form is missing fields', () { | 247 integration('upload form is missing fields', () { |
| 242 var server = new ScheduledServer(); | 248 var server = new ScheduledServer(); |
| 243 credentialsFile(server, 'access token').scheduleCreate(); | 249 d.credentialsFile(server, 'access token').create(); |
| 244 var pub = startPubLish(server); | 250 var pub = startPublish(server); |
| 245 | 251 |
| 246 confirmPublish(pub); | 252 confirmPublish(pub); |
| 247 | 253 |
| 248 var body = {'url': 'http://example.com/upload'}; | 254 var body = {'url': 'http://example.com/upload'}; |
| 249 handleUploadForm(server, body); | 255 handleUploadForm(server, body); |
| 250 expectLater(pub.nextErrLine(), equals('Invalid server response:')); | 256 expect(pub.nextErrLine(), completion(equals('Invalid server response:'))); |
| 251 expectLater(pub.nextErrLine(), equals(json.stringify(body))); | 257 expect(pub.nextErrLine(), completion(equals(json.stringify(body)))); |
| 252 pub.shouldExit(1); | 258 pub.shouldExit(1); |
| 253 }); | 259 }); |
| 254 | 260 |
| 255 integration('upload form fields is not a map', () { | 261 integration('upload form fields is not a map', () { |
| 256 var server = new ScheduledServer(); | 262 var server = new ScheduledServer(); |
| 257 credentialsFile(server, 'access token').scheduleCreate(); | 263 d.credentialsFile(server, 'access token').create(); |
| 258 var pub = startPubLish(server); | 264 var pub = startPublish(server); |
| 259 | 265 |
| 260 confirmPublish(pub); | 266 confirmPublish(pub); |
| 261 | 267 |
| 262 var body = {'url': 'http://example.com/upload', 'fields': 12}; | 268 var body = {'url': 'http://example.com/upload', 'fields': 12}; |
| 263 handleUploadForm(server, body); | 269 handleUploadForm(server, body); |
| 264 expectLater(pub.nextErrLine(), equals('Invalid server response:')); | 270 expect(pub.nextErrLine(), completion(equals('Invalid server response:'))); |
| 265 expectLater(pub.nextErrLine(), equals(json.stringify(body))); | 271 expect(pub.nextErrLine(), completion(equals(json.stringify(body)))); |
| 266 pub.shouldExit(1); | 272 pub.shouldExit(1); |
| 267 }); | 273 }); |
| 268 | 274 |
| 269 integration('upload form fields has a non-string value', () { | 275 integration('upload form fields has a non-string value', () { |
| 270 var server = new ScheduledServer(); | 276 var server = new ScheduledServer(); |
| 271 credentialsFile(server, 'access token').scheduleCreate(); | 277 d.credentialsFile(server, 'access token').create(); |
| 272 var pub = startPubLish(server); | 278 var pub = startPublish(server); |
| 273 | 279 |
| 274 confirmPublish(pub); | 280 confirmPublish(pub); |
| 275 | 281 |
| 276 var body = { | 282 var body = { |
| 277 'url': 'http://example.com/upload', | 283 'url': 'http://example.com/upload', |
| 278 'fields': {'field': 12} | 284 'fields': {'field': 12} |
| 279 }; | 285 }; |
| 280 handleUploadForm(server, body); | 286 handleUploadForm(server, body); |
| 281 expectLater(pub.nextErrLine(), equals('Invalid server response:')); | 287 expect(pub.nextErrLine(), completion(equals('Invalid server response:'))); |
| 282 expectLater(pub.nextErrLine(), equals(json.stringify(body))); | 288 expect(pub.nextErrLine(), completion(equals(json.stringify(body)))); |
| 283 pub.shouldExit(1); | 289 pub.shouldExit(1); |
| 284 }); | 290 }); |
| 285 | 291 |
| 286 integration('cloud storage upload provides an error', () { | 292 integration('cloud storage upload provides an error', () { |
| 287 var server = new ScheduledServer(); | 293 var server = new ScheduledServer(); |
| 288 credentialsFile(server, 'access token').scheduleCreate(); | 294 d.credentialsFile(server, 'access token').create(); |
| 289 var pub = startPubLish(server); | 295 var pub = startPublish(server); |
| 290 | 296 |
| 291 confirmPublish(pub); | 297 confirmPublish(pub); |
| 292 handleUploadForm(server); | 298 handleUploadForm(server); |
| 293 | 299 |
| 294 server.handle('POST', '/upload', (request, response) { | 300 server.handle('POST', '/upload', (request) { |
| 295 return drainStream(request).then((_) { | 301 return drainStream(request).then((_) { |
| 296 response.statusCode = 400; | 302 request.response.statusCode = 400; |
| 297 response.headers.contentType = new ContentType('application', 'xml'); | 303 request.response.headers.contentType = |
| 298 response.write('<Error><Message>Your request sucked.' | 304 new ContentType('application', 'xml'); |
| 305 request.response.write('<Error><Message>Your request sucked.' |
| 299 '</Message></Error>'); | 306 '</Message></Error>'); |
| 300 response.close(); | 307 request.response.close(); |
| 301 }); | 308 }); |
| 302 }); | 309 }); |
| 303 | 310 |
| 304 // TODO(nweiz): This should use the server's error message once the client | 311 // TODO(nweiz): This should use the server's error message once the client |
| 305 // can parse the XML. | 312 // can parse the XML. |
| 306 expectLater(pub.nextErrLine(), equals('Failed to upload the package.')); | 313 expect(pub.nextErrLine(), |
| 314 completion(equals('Failed to upload the package.'))); |
| 307 pub.shouldExit(1); | 315 pub.shouldExit(1); |
| 308 }); | 316 }); |
| 309 | 317 |
| 310 integration("cloud storage upload doesn't redirect", () { | 318 integration("cloud storage upload doesn't redirect", () { |
| 311 var server = new ScheduledServer(); | 319 var server = new ScheduledServer(); |
| 312 credentialsFile(server, 'access token').scheduleCreate(); | 320 d.credentialsFile(server, 'access token').create(); |
| 313 var pub = startPubLish(server); | 321 var pub = startPublish(server); |
| 314 | 322 |
| 315 confirmPublish(pub); | 323 confirmPublish(pub); |
| 316 handleUploadForm(server); | 324 handleUploadForm(server); |
| 317 | 325 |
| 318 server.handle('POST', '/upload', (request, response) { | 326 server.handle('POST', '/upload', (request) { |
| 319 return drainStream(request).then((_) { | 327 return drainStream(request).then((_) { |
| 320 // Don't set the location header. | 328 // Don't set the location header. |
| 321 response.close(); | 329 request.response.close(); |
| 322 }); | 330 }); |
| 323 }); | 331 }); |
| 324 | 332 |
| 325 expectLater(pub.nextErrLine(), equals('Failed to upload the package.')); | 333 expect(pub.nextErrLine(), |
| 334 completion(equals('Failed to upload the package.'))); |
| 326 pub.shouldExit(1); | 335 pub.shouldExit(1); |
| 327 }); | 336 }); |
| 328 | 337 |
| 329 integration('package creation provides an error', () { | 338 integration('package creation provides an error', () { |
| 330 var server = new ScheduledServer(); | 339 var server = new ScheduledServer(); |
| 331 credentialsFile(server, 'access token').scheduleCreate(); | 340 d.credentialsFile(server, 'access token').create(); |
| 332 var pub = startPubLish(server); | 341 var pub = startPublish(server); |
| 333 | 342 |
| 334 confirmPublish(pub); | 343 confirmPublish(pub); |
| 335 handleUploadForm(server); | 344 handleUploadForm(server); |
| 336 handleUpload(server); | 345 handleUpload(server); |
| 337 | 346 |
| 338 server.handle('GET', '/create', (request, response) { | 347 server.handle('GET', '/create', (request) { |
| 339 response.statusCode = 400; | 348 request.response.statusCode = 400; |
| 340 response.write(json.stringify({ | 349 request.response.write(json.stringify({ |
| 341 'error': {'message': 'Your package was too boring.'} | 350 'error': {'message': 'Your package was too boring.'} |
| 342 })); | 351 })); |
| 343 response.close(); | 352 request.response.close(); |
| 344 }); | 353 }); |
| 345 | 354 |
| 346 expectLater(pub.nextErrLine(), equals('Your package was too boring.')); | 355 expect(pub.nextErrLine(), |
| 356 completion(equals('Your package was too boring.'))); |
| 347 pub.shouldExit(1); | 357 pub.shouldExit(1); |
| 348 }); | 358 }); |
| 349 | 359 |
| 350 integration('package creation provides invalid JSON', () { | 360 integration('package creation provides invalid JSON', () { |
| 351 var server = new ScheduledServer(); | 361 var server = new ScheduledServer(); |
| 352 credentialsFile(server, 'access token').scheduleCreate(); | 362 d.credentialsFile(server, 'access token').create(); |
| 353 var pub = startPubLish(server); | 363 var pub = startPublish(server); |
| 354 | 364 |
| 355 confirmPublish(pub); | 365 confirmPublish(pub); |
| 356 handleUploadForm(server); | 366 handleUploadForm(server); |
| 357 handleUpload(server); | 367 handleUpload(server); |
| 358 | 368 |
| 359 server.handle('GET', '/create', (request, response) { | 369 server.handle('GET', '/create', (request) { |
| 360 response.write('{not json'); | 370 request.response.write('{not json'); |
| 361 response.close(); | 371 request.response.close(); |
| 362 }); | 372 }); |
| 363 | 373 |
| 364 expectLater(pub.nextErrLine(), equals('Invalid server response:')); | 374 expect(pub.nextErrLine(), completion(equals('Invalid server response:'))); |
| 365 expectLater(pub.nextErrLine(), equals('{not json')); | 375 expect(pub.nextErrLine(), completion(equals('{not json'))); |
| 366 pub.shouldExit(1); | 376 pub.shouldExit(1); |
| 367 }); | 377 }); |
| 368 | 378 |
| 369 integration('package creation provides a malformed error', () { | 379 integration('package creation provides a malformed error', () { |
| 370 var server = new ScheduledServer(); | 380 var server = new ScheduledServer(); |
| 371 credentialsFile(server, 'access token').scheduleCreate(); | 381 d.credentialsFile(server, 'access token').create(); |
| 372 var pub = startPubLish(server); | 382 var pub = startPublish(server); |
| 373 | 383 |
| 374 confirmPublish(pub); | 384 confirmPublish(pub); |
| 375 handleUploadForm(server); | 385 handleUploadForm(server); |
| 376 handleUpload(server); | 386 handleUpload(server); |
| 377 | 387 |
| 378 var body = {'error': 'Your package was too boring.'}; | 388 var body = {'error': 'Your package was too boring.'}; |
| 379 server.handle('GET', '/create', (request, response) { | 389 server.handle('GET', '/create', (request) { |
| 380 response.statusCode = 400; | 390 request.response.statusCode = 400; |
| 381 response.write(json.stringify(body)); | 391 request.response.write(json.stringify(body)); |
| 382 response.close(); | 392 request.response.close(); |
| 383 }); | 393 }); |
| 384 | 394 |
| 385 expectLater(pub.nextErrLine(), equals('Invalid server response:')); | 395 expect(pub.nextErrLine(), completion(equals('Invalid server response:'))); |
| 386 expectLater(pub.nextErrLine(), equals(json.stringify(body))); | 396 expect(pub.nextErrLine(), completion(equals(json.stringify(body)))); |
| 387 pub.shouldExit(1); | 397 pub.shouldExit(1); |
| 388 }); | 398 }); |
| 389 | 399 |
| 390 integration('package creation provides a malformed success', () { | 400 integration('package creation provides a malformed success', () { |
| 391 var server = new ScheduledServer(); | 401 var server = new ScheduledServer(); |
| 392 credentialsFile(server, 'access token').scheduleCreate(); | 402 d.credentialsFile(server, 'access token').create(); |
| 393 var pub = startPubLish(server); | 403 var pub = startPublish(server); |
| 394 | 404 |
| 395 confirmPublish(pub); | 405 confirmPublish(pub); |
| 396 handleUploadForm(server); | 406 handleUploadForm(server); |
| 397 handleUpload(server); | 407 handleUpload(server); |
| 398 | 408 |
| 399 var body = {'success': 'Your package was awesome.'}; | 409 var body = {'success': 'Your package was awesome.'}; |
| 400 server.handle('GET', '/create', (request, response) { | 410 server.handle('GET', '/create', (request) { |
| 401 response.write(json.stringify(body)); | 411 request.response.write(json.stringify(body)); |
| 402 response.close(); | 412 request.response.close(); |
| 403 }); | 413 }); |
| 404 | 414 |
| 405 expectLater(pub.nextErrLine(), equals('Invalid server response:')); | 415 expect(pub.nextErrLine(), completion(equals('Invalid server response:'))); |
| 406 expectLater(pub.nextErrLine(), equals(json.stringify(body))); | 416 expect(pub.nextErrLine(), completion(equals(json.stringify(body)))); |
| 407 pub.shouldExit(1); | 417 pub.shouldExit(1); |
| 408 }); | 418 }); |
| 409 | 419 |
| 410 group('--force', () { | 420 group('--force', () { |
| 411 setUp(() => normalPackage.scheduleCreate()); | 421 setUp(() => d.validPackage.create()); |
| 412 | 422 |
| 413 integration('cannot be combined with --dry-run', () { | 423 integration('cannot be combined with --dry-run', () { |
| 414 schedulePub(args: ['lish', '--force', '--dry-run'], | 424 schedulePub(args: ['lish', '--force', '--dry-run'], |
| 415 error: "Cannot use both --force and --dry-run.", | 425 error: "Cannot use both --force and --dry-run.", |
| 416 exitCode: exit_codes.USAGE); | 426 exitCode: exit_codes.USAGE); |
| 417 }); | 427 }); |
| 418 | 428 |
| 419 integration('publishes if there are no warnings or errors', () { | 429 integration('publishes if there are no warnings or errors', () { |
| 420 var server = new ScheduledServer(); | 430 var server = new ScheduledServer(); |
| 421 credentialsFile(server, 'access token').scheduleCreate(); | 431 d.credentialsFile(server, 'access token').create(); |
| 422 var pub = startPubLish(server, args: ['--force']); | 432 var pub = startPublish(server, args: ['--force']); |
| 423 | 433 |
| 424 handleUploadForm(server); | 434 handleUploadForm(server); |
| 425 handleUpload(server); | 435 handleUpload(server); |
| 426 | 436 |
| 427 server.handle('GET', '/create', (request, response) { | 437 server.handle('GET', '/create', (request) { |
| 428 response.write(json.stringify({ | 438 request.response.write(json.stringify({ |
| 429 'success': {'message': 'Package test_pkg 1.0.0 uploaded!'} | 439 'success': {'message': 'Package test_pkg 1.0.0 uploaded!'} |
| 430 })); | 440 })); |
| 431 response.close(); | 441 request.response.close(); |
| 432 }); | 442 }); |
| 433 | 443 |
| 434 pub.shouldExit(0); | 444 pub.shouldExit(0); |
| 435 expectLater(pub.remainingStdout(), contains( | 445 expect(pub.remainingStdout(), completion(contains( |
| 436 'Package test_pkg 1.0.0 uploaded!')); | 446 'Package test_pkg 1.0.0 uploaded!'))); |
| 437 }); | 447 }); |
| 438 | 448 |
| 439 integration('publishes if there are warnings', () { | 449 integration('publishes if there are warnings', () { |
| 440 var pkg = package("test_pkg", "1.0.0"); | 450 var pkg = packageMap("test_pkg", "1.0.0"); |
| 441 pkg["author"] = "Nathan Weizenbaum"; | 451 pkg["author"] = "Nathan Weizenbaum"; |
| 442 dir(appPath, [pubspec(pkg)]).scheduleCreate(); | 452 d.dir(appPath, [d.pubspec(pkg)]).create(); |
| 443 | 453 |
| 444 var server = new ScheduledServer(); | 454 var server = new ScheduledServer(); |
| 445 credentialsFile(server, 'access token').scheduleCreate(); | 455 d.credentialsFile(server, 'access token').create(); |
| 446 var pub = startPubLish(server, args: ['--force']); | 456 var pub = startPublish(server, args: ['--force']); |
| 447 | 457 |
| 448 handleUploadForm(server); | 458 handleUploadForm(server); |
| 449 handleUpload(server); | 459 handleUpload(server); |
| 450 | 460 |
| 451 server.handle('GET', '/create', (request, response) { | 461 server.handle('GET', '/create', (request) { |
| 452 response.write(json.stringify({ | 462 request.response.write(json.stringify({ |
| 453 'success': {'message': 'Package test_pkg 1.0.0 uploaded!'} | 463 'success': {'message': 'Package test_pkg 1.0.0 uploaded!'} |
| 454 })); | 464 })); |
| 455 response.close(); | 465 request.response.close(); |
| 456 }); | 466 }); |
| 457 | 467 |
| 458 pub.shouldExit(0); | 468 pub.shouldExit(0); |
| 459 expectLater(pub.remainingStderr(), contains( | 469 expect(pub.remainingStderr(), completion(contains( |
| 460 'Suggestions:\n* Author "Nathan Weizenbaum" in pubspec.yaml' | 470 'Suggestions:\n* Author "Nathan Weizenbaum" in pubspec.yaml' |
| 461 ' should have an email address\n' | 471 ' should have an email address\n' |
| 462 ' (e.g. "name <email>").')); | 472 ' (e.g. "name <email>").'))); |
| 463 expectLater(pub.remainingStdout(), contains( | 473 expect(pub.remainingStdout(), completion(contains( |
| 464 'Package test_pkg 1.0.0 uploaded!')); | 474 'Package test_pkg 1.0.0 uploaded!'))); |
| 465 }); | 475 }); |
| 466 | 476 |
| 467 integration('does not publish if there are errors', () { | 477 integration('does not publish if there are errors', () { |
| 468 var pkg = package("test_pkg", "1.0.0"); | 478 var pkg = packageMap("test_pkg", "1.0.0"); |
| 469 pkg.remove("homepage"); | 479 pkg.remove("homepage"); |
| 470 dir(appPath, [pubspec(pkg)]).scheduleCreate(); | 480 d.dir(appPath, [d.pubspec(pkg)]).create(); |
| 471 | 481 |
| 472 var server = new ScheduledServer(); | 482 var server = new ScheduledServer(); |
| 473 var pub = startPubLish(server, args: ['--force']); | 483 var pub = startPublish(server, args: ['--force']); |
| 474 | 484 |
| 475 pub.shouldExit(0); | 485 pub.shouldExit(0); |
| 476 expectLater(pub.remainingStderr(), contains( | 486 expect(pub.remainingStderr(), completion(contains( |
| 477 "Sorry, your package is missing a requirement and can't be " | 487 "Sorry, your package is missing a requirement and can't be " |
| 478 "published yet.")); | 488 "published yet."))); |
| 479 }); | 489 }); |
| 480 }); | 490 }); |
| 481 } | 491 } |
| OLD | NEW |