| 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 validator_test; | 5 library validator_test; |
| 6 | 6 |
| 7 import 'dart:async'; | 7 import 'dart:async'; |
| 8 import 'dart:io'; | 8 import 'dart:io'; |
| 9 import 'dart:json' as json; | 9 import 'dart:json' as json; |
| 10 | 10 |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 48 | 48 |
| 49 Validator pubspecField(Entrypoint entrypoint) => | 49 Validator pubspecField(Entrypoint entrypoint) => |
| 50 new PubspecFieldValidator(entrypoint); | 50 new PubspecFieldValidator(entrypoint); |
| 51 | 51 |
| 52 void scheduleNormalPackage() => normalPackage.scheduleCreate(); | 52 void scheduleNormalPackage() => normalPackage.scheduleCreate(); |
| 53 | 53 |
| 54 main() { | 54 main() { |
| 55 group('should consider a package valid if it', () { | 55 group('should consider a package valid if it', () { |
| 56 setUp(scheduleNormalPackage); | 56 setUp(scheduleNormalPackage); |
| 57 | 57 |
| 58 test('looks normal', () { | 58 integration('looks normal', () { |
| 59 dir(appPath, [libPubspec("test_pkg", "1.0.0")]).scheduleCreate(); | 59 dir(appPath, [libPubspec("test_pkg", "1.0.0")]).scheduleCreate(); |
| 60 expectNoValidationError(dependency); | 60 expectNoValidationError(dependency); |
| 61 expectNoValidationError(lib); | 61 expectNoValidationError(lib); |
| 62 expectNoValidationError(license); | 62 expectNoValidationError(license); |
| 63 expectNoValidationError(name); | 63 expectNoValidationError(name); |
| 64 expectNoValidationError(pubspecField); | 64 expectNoValidationError(pubspecField); |
| 65 run(); | |
| 66 }); | 65 }); |
| 67 | 66 |
| 68 test('has a COPYING file', () { | 67 integration('has a COPYING file', () { |
| 69 file(join(appPath, 'LICENSE'), '').scheduleDelete(); | 68 file(join(appPath, 'LICENSE'), '').scheduleDelete(); |
| 70 file(join(appPath, 'COPYING'), '').scheduleCreate(); | 69 file(join(appPath, 'COPYING'), '').scheduleCreate(); |
| 71 expectNoValidationError(license); | 70 expectNoValidationError(license); |
| 72 run(); | |
| 73 }); | 71 }); |
| 74 | 72 |
| 75 test('has a prefixed LICENSE file', () { | 73 integration('has a prefixed LICENSE file', () { |
| 76 file(join(appPath, 'LICENSE'), '').scheduleDelete(); | 74 file(join(appPath, 'LICENSE'), '').scheduleDelete(); |
| 77 file(join(appPath, 'MIT_LICENSE'), '').scheduleCreate(); | 75 file(join(appPath, 'MIT_LICENSE'), '').scheduleCreate(); |
| 78 expectNoValidationError(license); | 76 expectNoValidationError(license); |
| 79 run(); | |
| 80 }); | 77 }); |
| 81 | 78 |
| 82 test('has a suffixed LICENSE file', () { | 79 integration('has a suffixed LICENSE file', () { |
| 83 file(join(appPath, 'LICENSE'), '').scheduleDelete(); | 80 file(join(appPath, 'LICENSE'), '').scheduleDelete(); |
| 84 file(join(appPath, 'LICENSE.md'), '').scheduleCreate(); | 81 file(join(appPath, 'LICENSE.md'), '').scheduleCreate(); |
| 85 expectNoValidationError(license); | 82 expectNoValidationError(license); |
| 86 run(); | |
| 87 }); | 83 }); |
| 88 | 84 |
| 89 test('has "authors" instead of "author"', () { | 85 integration('has "authors" instead of "author"', () { |
| 90 var package = package("test_pkg", "1.0.0"); | 86 var package = package("test_pkg", "1.0.0"); |
| 91 package["authors"] = [package.remove("author")]; | 87 package["authors"] = [package.remove("author")]; |
| 92 dir(appPath, [pubspec(package)]).scheduleCreate(); | 88 dir(appPath, [pubspec(package)]).scheduleCreate(); |
| 93 expectNoValidationError(pubspecField); | 89 expectNoValidationError(pubspecField); |
| 94 run(); | |
| 95 }); | 90 }); |
| 96 | 91 |
| 97 test('has a badly-named library in lib/src', () { | 92 integration('has a badly-named library in lib/src', () { |
| 98 dir(appPath, [ | 93 dir(appPath, [ |
| 99 libPubspec("test_pkg", "1.0.0"), | 94 libPubspec("test_pkg", "1.0.0"), |
| 100 dir("lib", [ | 95 dir("lib", [ |
| 101 file("test_pkg.dart", "int i = 1;"), | 96 file("test_pkg.dart", "int i = 1;"), |
| 102 dir("src", [file("8ball.dart", "int j = 2;")]) | 97 dir("src", [file("8ball.dart", "int j = 2;")]) |
| 103 ]) | 98 ]) |
| 104 ]).scheduleCreate(); | 99 ]).scheduleCreate(); |
| 105 expectNoValidationError(name); | 100 expectNoValidationError(name); |
| 106 run(); | |
| 107 }); | 101 }); |
| 108 | 102 |
| 109 test('has a non-Dart file in lib', () { | 103 integration('has a non-Dart file in lib', () { |
| 110 dir(appPath, [ | 104 dir(appPath, [ |
| 111 libPubspec("test_pkg", "1.0.0"), | 105 libPubspec("test_pkg", "1.0.0"), |
| 112 dir("lib", [ | 106 dir("lib", [ |
| 113 file("thing.txt", "woo hoo") | 107 file("thing.txt", "woo hoo") |
| 114 ]) | 108 ]) |
| 115 ]).scheduleCreate(); | 109 ]).scheduleCreate(); |
| 116 expectNoValidationError(lib); | 110 expectNoValidationError(lib); |
| 117 run(); | |
| 118 }); | 111 }); |
| 119 | 112 |
| 120 test('has an unconstrained dependency on "unittest"', () { | 113 integration('has an unconstrained dependency on "unittest"', () { |
| 121 dir(appPath, [ | 114 dir(appPath, [ |
| 122 libPubspec("test_pkg", "1.0.0", [ | 115 libPubspec("test_pkg", "1.0.0", [ |
| 123 {'hosted': 'unittest'} | 116 {'hosted': 'unittest'} |
| 124 ]) | 117 ]) |
| 125 ]).scheduleCreate(); | 118 ]).scheduleCreate(); |
| 126 expectNoValidationError(dependency); | 119 expectNoValidationError(dependency); |
| 127 run(); | |
| 128 }); | 120 }); |
| 129 | 121 |
| 130 test('has a nested directory named "tools"', () { | 122 integration('has a nested directory named "tools"', () { |
| 131 dir(appPath, [ | 123 dir(appPath, [ |
| 132 dir("foo", [dir("tools")]) | 124 dir("foo", [dir("tools")]) |
| 133 ]).scheduleCreate(); | 125 ]).scheduleCreate(); |
| 134 expectNoValidationError(directory); | 126 expectNoValidationError(directory); |
| 135 run(); | |
| 136 }); | 127 }); |
| 137 }); | 128 }); |
| 138 | 129 |
| 139 group('should consider a package invalid if it', () { | 130 group('should consider a package invalid if it', () { |
| 140 setUp(scheduleNormalPackage); | 131 setUp(scheduleNormalPackage); |
| 141 | 132 |
| 142 test('is missing the "homepage" field', () { | 133 integration('is missing the "homepage" field', () { |
| 143 var package = package("test_pkg", "1.0.0"); | 134 var package = package("test_pkg", "1.0.0"); |
| 144 package.remove("homepage"); | 135 package.remove("homepage"); |
| 145 dir(appPath, [pubspec(package)]).scheduleCreate(); | 136 dir(appPath, [pubspec(package)]).scheduleCreate(); |
| 146 | 137 |
| 147 expectValidationError(pubspecField); | 138 expectValidationError(pubspecField); |
| 148 run(); | |
| 149 }); | 139 }); |
| 150 | 140 |
| 151 test('is missing the "description" field', () { | 141 integration('is missing the "description" field', () { |
| 152 var package = package("test_pkg", "1.0.0"); | 142 var package = package("test_pkg", "1.0.0"); |
| 153 package.remove("description"); | 143 package.remove("description"); |
| 154 dir(appPath, [pubspec(package)]).scheduleCreate(); | 144 dir(appPath, [pubspec(package)]).scheduleCreate(); |
| 155 | 145 |
| 156 expectValidationError(pubspecField); | 146 expectValidationError(pubspecField); |
| 157 run(); | |
| 158 }); | 147 }); |
| 159 | 148 |
| 160 test('is missing the "author" field', () { | 149 integration('is missing the "author" field', () { |
| 161 var package = package("test_pkg", "1.0.0"); | 150 var package = package("test_pkg", "1.0.0"); |
| 162 package.remove("author"); | 151 package.remove("author"); |
| 163 dir(appPath, [pubspec(package)]).scheduleCreate(); | 152 dir(appPath, [pubspec(package)]).scheduleCreate(); |
| 164 | 153 |
| 165 expectValidationError(pubspecField); | 154 expectValidationError(pubspecField); |
| 166 run(); | |
| 167 }); | 155 }); |
| 168 | 156 |
| 169 test('has a single author without an email', () { | 157 integration('has a single author without an email', () { |
| 170 var package = package("test_pkg", "1.0.0"); | 158 var package = package("test_pkg", "1.0.0"); |
| 171 package["author"] = "Nathan Weizenbaum"; | 159 package["author"] = "Nathan Weizenbaum"; |
| 172 dir(appPath, [pubspec(package)]).scheduleCreate(); | 160 dir(appPath, [pubspec(package)]).scheduleCreate(); |
| 173 | 161 |
| 174 expectValidationWarning(pubspecField); | 162 expectValidationWarning(pubspecField); |
| 175 run(); | |
| 176 }); | 163 }); |
| 177 | 164 |
| 178 test('has one of several authors without an email', () { | 165 integration('has one of several authors without an email', () { |
| 179 var package = package("test_pkg", "1.0.0"); | 166 var package = package("test_pkg", "1.0.0"); |
| 180 package.remove("author"); | 167 package.remove("author"); |
| 181 package["authors"] = [ | 168 package["authors"] = [ |
| 182 "Bob Nystrom <rnystrom@google.com>", | 169 "Bob Nystrom <rnystrom@google.com>", |
| 183 "Nathan Weizenbaum", | 170 "Nathan Weizenbaum", |
| 184 "John Messerly <jmesserly@google.com>" | 171 "John Messerly <jmesserly@google.com>" |
| 185 ]; | 172 ]; |
| 186 dir(appPath, [pubspec(package)]).scheduleCreate(); | 173 dir(appPath, [pubspec(package)]).scheduleCreate(); |
| 187 | 174 |
| 188 expectValidationWarning(pubspecField); | 175 expectValidationWarning(pubspecField); |
| 189 run(); | |
| 190 }); | 176 }); |
| 191 | 177 |
| 192 test('has a single author without a name', () { | 178 integration('has a single author without a name', () { |
| 193 var package = package("test_pkg", "1.0.0"); | 179 var package = package("test_pkg", "1.0.0"); |
| 194 package["author"] = "<nweiz@google.com>"; | 180 package["author"] = "<nweiz@google.com>"; |
| 195 dir(appPath, [pubspec(package)]).scheduleCreate(); | 181 dir(appPath, [pubspec(package)]).scheduleCreate(); |
| 196 | 182 |
| 197 expectValidationWarning(pubspecField); | 183 expectValidationWarning(pubspecField); |
| 198 run(); | |
| 199 }); | 184 }); |
| 200 | 185 |
| 201 test('has one of several authors without a name', () { | 186 integration('has one of several authors without a name', () { |
| 202 var package = package("test_pkg", "1.0.0"); | 187 var package = package("test_pkg", "1.0.0"); |
| 203 package.remove("author"); | 188 package.remove("author"); |
| 204 package["authors"] = [ | 189 package["authors"] = [ |
| 205 "Bob Nystrom <rnystrom@google.com>", | 190 "Bob Nystrom <rnystrom@google.com>", |
| 206 "<nweiz@google.com>", | 191 "<nweiz@google.com>", |
| 207 "John Messerly <jmesserly@google.com>" | 192 "John Messerly <jmesserly@google.com>" |
| 208 ]; | 193 ]; |
| 209 dir(appPath, [pubspec(package)]).scheduleCreate(); | 194 dir(appPath, [pubspec(package)]).scheduleCreate(); |
| 210 | 195 |
| 211 expectValidationWarning(pubspecField); | 196 expectValidationWarning(pubspecField); |
| 212 run(); | |
| 213 }); | 197 }); |
| 214 | 198 |
| 215 test('has no LICENSE file', () { | 199 integration('has no LICENSE file', () { |
| 216 file(join(appPath, 'LICENSE'), '').scheduleDelete(); | 200 file(join(appPath, 'LICENSE'), '').scheduleDelete(); |
| 217 expectValidationError(license); | 201 expectValidationError(license); |
| 218 run(); | |
| 219 }); | 202 }); |
| 220 | 203 |
| 221 test('has an empty package name', () { | 204 integration('has an empty package name', () { |
| 222 dir(appPath, [libPubspec("", "1.0.0")]).scheduleCreate(); | 205 dir(appPath, [libPubspec("", "1.0.0")]).scheduleCreate(); |
| 223 expectValidationError(name); | 206 expectValidationError(name); |
| 224 run(); | |
| 225 }); | 207 }); |
| 226 | 208 |
| 227 test('has a package name with an invalid character', () { | 209 integration('has a package name with an invalid character', () { |
| 228 dir(appPath, [libPubspec("test-pkg", "1.0.0")]).scheduleCreate(); | 210 dir(appPath, [libPubspec("test-pkg", "1.0.0")]).scheduleCreate(); |
| 229 expectValidationError(name); | 211 expectValidationError(name); |
| 230 run(); | |
| 231 }); | 212 }); |
| 232 | 213 |
| 233 test('has a package name that begins with a number', () { | 214 integration('has a package name that begins with a number', () { |
| 234 dir(appPath, [libPubspec("8ball", "1.0.0")]).scheduleCreate(); | 215 dir(appPath, [libPubspec("8ball", "1.0.0")]).scheduleCreate(); |
| 235 expectValidationError(name); | 216 expectValidationError(name); |
| 236 run(); | |
| 237 }); | 217 }); |
| 238 | 218 |
| 239 test('has a package name that contains upper-case letters', () { | 219 integration('has a package name that contains upper-case letters', () { |
| 240 dir(appPath, [libPubspec("TestPkg", "1.0.0")]).scheduleCreate(); | 220 dir(appPath, [libPubspec("TestPkg", "1.0.0")]).scheduleCreate(); |
| 241 expectValidationWarning(name); | 221 expectValidationWarning(name); |
| 242 run(); | |
| 243 }); | 222 }); |
| 244 | 223 |
| 245 test('has a package name that is a Dart reserved word', () { | 224 integration('has a package name that is a Dart reserved word', () { |
| 246 dir(appPath, [libPubspec("operator", "1.0.0")]).scheduleCreate(); | 225 dir(appPath, [libPubspec("operator", "1.0.0")]).scheduleCreate(); |
| 247 expectValidationError(name); | 226 expectValidationError(name); |
| 248 run(); | |
| 249 }); | 227 }); |
| 250 | 228 |
| 251 test('has a library name with an invalid character', () { | 229 integration('has a library name with an invalid character', () { |
| 252 dir(appPath, [ | 230 dir(appPath, [ |
| 253 libPubspec("test_pkg", "1.0.0"), | 231 libPubspec("test_pkg", "1.0.0"), |
| 254 dir("lib", [file("test-pkg.dart", "int i = 0;")]) | 232 dir("lib", [file("test-pkg.dart", "int i = 0;")]) |
| 255 ]).scheduleCreate(); | 233 ]).scheduleCreate(); |
| 256 expectValidationError(name); | 234 expectValidationError(name); |
| 257 run(); | |
| 258 }); | 235 }); |
| 259 | 236 |
| 260 test('has a library name that begins with a number', () { | 237 integration('has a library name that begins with a number', () { |
| 261 dir(appPath, [ | 238 dir(appPath, [ |
| 262 libPubspec("test_pkg", "1.0.0"), | 239 libPubspec("test_pkg", "1.0.0"), |
| 263 dir("lib", [file("8ball.dart", "int i = 0;")]) | 240 dir("lib", [file("8ball.dart", "int i = 0;")]) |
| 264 ]).scheduleCreate(); | 241 ]).scheduleCreate(); |
| 265 expectValidationError(name); | 242 expectValidationError(name); |
| 266 run(); | |
| 267 }); | 243 }); |
| 268 | 244 |
| 269 test('has a library name that contains upper-case letters', () { | 245 integration('has a library name that contains upper-case letters', () { |
| 270 dir(appPath, [ | 246 dir(appPath, [ |
| 271 libPubspec("test_pkg", "1.0.0"), | 247 libPubspec("test_pkg", "1.0.0"), |
| 272 dir("lib", [file("TestPkg.dart", "int i = 0;")]) | 248 dir("lib", [file("TestPkg.dart", "int i = 0;")]) |
| 273 ]).scheduleCreate(); | 249 ]).scheduleCreate(); |
| 274 expectValidationWarning(name); | 250 expectValidationWarning(name); |
| 275 run(); | |
| 276 }); | 251 }); |
| 277 | 252 |
| 278 test('has a library name that is a Dart reserved word', () { | 253 integration('has a library name that is a Dart reserved word', () { |
| 279 dir(appPath, [ | 254 dir(appPath, [ |
| 280 libPubspec("test_pkg", "1.0.0"), | 255 libPubspec("test_pkg", "1.0.0"), |
| 281 dir("lib", [file("operator.dart", "int i = 0;")]) | 256 dir("lib", [file("operator.dart", "int i = 0;")]) |
| 282 ]).scheduleCreate(); | 257 ]).scheduleCreate(); |
| 283 expectValidationError(name); | 258 expectValidationError(name); |
| 284 run(); | |
| 285 }); | 259 }); |
| 286 | 260 |
| 287 test('has a single library named differently than the package', () { | 261 integration('has a single library named differently than the package', () { |
| 288 file(join(appPath, "lib", "test_pkg.dart"), '').scheduleDelete(); | 262 file(join(appPath, "lib", "test_pkg.dart"), '').scheduleDelete(); |
| 289 dir(appPath, [ | 263 dir(appPath, [ |
| 290 dir("lib", [file("best_pkg.dart", "int i = 0;")]) | 264 dir("lib", [file("best_pkg.dart", "int i = 0;")]) |
| 291 ]).scheduleCreate(); | 265 ]).scheduleCreate(); |
| 292 expectValidationWarning(name); | 266 expectValidationWarning(name); |
| 293 run(); | |
| 294 }); | 267 }); |
| 295 | 268 |
| 296 test('has no lib directory', () { | 269 integration('has no lib directory', () { |
| 297 dir(join(appPath, "lib")).scheduleDelete(); | 270 dir(join(appPath, "lib")).scheduleDelete(); |
| 298 expectValidationError(lib); | 271 expectValidationError(lib); |
| 299 run(); | |
| 300 }); | 272 }); |
| 301 | 273 |
| 302 test('has an empty lib directory', () { | 274 integration('has an empty lib directory', () { |
| 303 file(join(appPath, "lib", "test_pkg.dart"), '').scheduleDelete(); | 275 file(join(appPath, "lib", "test_pkg.dart"), '').scheduleDelete(); |
| 304 expectValidationError(lib); | 276 expectValidationError(lib); |
| 305 run(); | |
| 306 }); | 277 }); |
| 307 | 278 |
| 308 test('has a lib directory containing only src', () { | 279 integration('has a lib directory containing only src', () { |
| 309 file(join(appPath, "lib", "test_pkg.dart"), '').scheduleDelete(); | 280 file(join(appPath, "lib", "test_pkg.dart"), '').scheduleDelete(); |
| 310 dir(appPath, [ | 281 dir(appPath, [ |
| 311 dir("lib", [ | 282 dir("lib", [ |
| 312 dir("src", [file("test_pkg.dart", "int i = 0;")]) | 283 dir("src", [file("test_pkg.dart", "int i = 0;")]) |
| 313 ]) | 284 ]) |
| 314 ]).scheduleCreate(); | 285 ]).scheduleCreate(); |
| 315 expectValidationError(lib); | 286 expectValidationError(lib); |
| 316 run(); | |
| 317 }); | 287 }); |
| 318 | 288 |
| 319 group('has a dependency with a non-hosted source', () { | 289 group('has a dependency with a non-hosted source', () { |
| 320 group('where a hosted version of that dependency exists', () { | 290 group('where a hosted version of that dependency exists', () { |
| 321 test("and should suggest the hosted package's primary version", () { | 291 integration("and should suggest the hosted package's primary " |
| 292 "version", () { |
| 322 useMockClient(new MockClient((request) { | 293 useMockClient(new MockClient((request) { |
| 323 expect(request.method, equals("GET")); | 294 expect(request.method, equals("GET")); |
| 324 expect(request.url.path, equals("/packages/foo.json")); | 295 expect(request.url.path, equals("/packages/foo.json")); |
| 325 | 296 |
| 326 return new Future.immediate(new http.Response(json.stringify({ | 297 return new Future.immediate(new http.Response(json.stringify({ |
| 327 "name": "foo", | 298 "name": "foo", |
| 328 "uploaders": ["nweiz@google.com"], | 299 "uploaders": ["nweiz@google.com"], |
| 329 "versions": ["3.0.0-pre", "2.0.0", "1.0.0"] | 300 "versions": ["3.0.0-pre", "2.0.0", "1.0.0"] |
| 330 }), 200)); | 301 }), 200)); |
| 331 })); | 302 })); |
| 332 | 303 |
| 333 dir(appPath, [ | 304 dir(appPath, [ |
| 334 libPubspec("test_pkg", "1.0.0", [ | 305 libPubspec("test_pkg", "1.0.0", [ |
| 335 {'git': 'git://github.com/dart-lang/foo'} | 306 {'git': 'git://github.com/dart-lang/foo'} |
| 336 ]) | 307 ]) |
| 337 ]).scheduleCreate(); | 308 ]).scheduleCreate(); |
| 338 | 309 |
| 339 expectLater(schedulePackageValidation(dependency), | 310 expectLater(schedulePackageValidation(dependency), |
| 340 pairOf(isEmpty, someElement(contains( | 311 pairOf(isEmpty, someElement(contains( |
| 341 ' foo: ">=2.0.0 <3.0.0"')))); | 312 ' foo: ">=2.0.0 <3.0.0"')))); |
| 342 | |
| 343 run(); | |
| 344 }); | 313 }); |
| 345 | 314 |
| 346 test("and should suggest the hosted package's prerelease version if " | 315 integration("and should suggest the hosted package's prerelease " |
| 347 "it's the only version available", () { | 316 "version if it's the only version available", () { |
| 348 useMockClient(new MockClient((request) { | 317 useMockClient(new MockClient((request) { |
| 349 expect(request.method, equals("GET")); | 318 expect(request.method, equals("GET")); |
| 350 expect(request.url.path, equals("/packages/foo.json")); | 319 expect(request.url.path, equals("/packages/foo.json")); |
| 351 | 320 |
| 352 return new Future.immediate(new http.Response(json.stringify({ | 321 return new Future.immediate(new http.Response(json.stringify({ |
| 353 "name": "foo", | 322 "name": "foo", |
| 354 "uploaders": ["nweiz@google.com"], | 323 "uploaders": ["nweiz@google.com"], |
| 355 "versions": ["3.0.0-pre", "2.0.0-pre"] | 324 "versions": ["3.0.0-pre", "2.0.0-pre"] |
| 356 }), 200)); | 325 }), 200)); |
| 357 })); | 326 })); |
| 358 | 327 |
| 359 dir(appPath, [ | 328 dir(appPath, [ |
| 360 libPubspec("test_pkg", "1.0.0", [ | 329 libPubspec("test_pkg", "1.0.0", [ |
| 361 {'git': 'git://github.com/dart-lang/foo'} | 330 {'git': 'git://github.com/dart-lang/foo'} |
| 362 ]) | 331 ]) |
| 363 ]).scheduleCreate(); | 332 ]).scheduleCreate(); |
| 364 | 333 |
| 365 expectLater(schedulePackageValidation(dependency), | 334 expectLater(schedulePackageValidation(dependency), |
| 366 pairOf(isEmpty, someElement(contains( | 335 pairOf(isEmpty, someElement(contains( |
| 367 ' foo: ">=3.0.0-pre <4.0.0"')))); | 336 ' foo: ">=3.0.0-pre <4.0.0"')))); |
| 368 | |
| 369 run(); | |
| 370 }); | 337 }); |
| 371 | 338 |
| 372 test("and should suggest a tighter constraint if the primary version " | 339 integration("and should suggest a tighter constraint if the primary " |
| 373 "is pre-1.0.0", () { | 340 "version is pre-1.0.0", () { |
| 374 useMockClient(new MockClient((request) { | 341 useMockClient(new MockClient((request) { |
| 375 expect(request.method, equals("GET")); | 342 expect(request.method, equals("GET")); |
| 376 expect(request.url.path, equals("/packages/foo.json")); | 343 expect(request.url.path, equals("/packages/foo.json")); |
| 377 | 344 |
| 378 return new Future.immediate(new http.Response(json.stringify({ | 345 return new Future.immediate(new http.Response(json.stringify({ |
| 379 "name": "foo", | 346 "name": "foo", |
| 380 "uploaders": ["nweiz@google.com"], | 347 "uploaders": ["nweiz@google.com"], |
| 381 "versions": ["0.0.1", "0.0.2"] | 348 "versions": ["0.0.1", "0.0.2"] |
| 382 }), 200)); | 349 }), 200)); |
| 383 })); | 350 })); |
| 384 | 351 |
| 385 dir(appPath, [ | 352 dir(appPath, [ |
| 386 libPubspec("test_pkg", "1.0.0", [ | 353 libPubspec("test_pkg", "1.0.0", [ |
| 387 {'git': 'git://github.com/dart-lang/foo'} | 354 {'git': 'git://github.com/dart-lang/foo'} |
| 388 ]) | 355 ]) |
| 389 ]).scheduleCreate(); | 356 ]).scheduleCreate(); |
| 390 | 357 |
| 391 expectLater(schedulePackageValidation(dependency), | 358 expectLater(schedulePackageValidation(dependency), |
| 392 pairOf(isEmpty, someElement(contains( | 359 pairOf(isEmpty, someElement(contains( |
| 393 ' foo: ">=0.0.2 <0.0.3"')))); | 360 ' foo: ">=0.0.2 <0.0.3"')))); |
| 394 | |
| 395 run(); | |
| 396 }); | 361 }); |
| 397 }); | 362 }); |
| 398 | 363 |
| 399 group('where no hosted version of that dependency exists', () { | 364 group('where no hosted version of that dependency exists', () { |
| 400 test("and should use the other source's version", () { | 365 integration("and should use the other source's version", () { |
| 401 useMockClient(new MockClient((request) { | 366 useMockClient(new MockClient((request) { |
| 402 expect(request.method, equals("GET")); | 367 expect(request.method, equals("GET")); |
| 403 expect(request.url.path, equals("/packages/foo.json")); | 368 expect(request.url.path, equals("/packages/foo.json")); |
| 404 | 369 |
| 405 return new Future.immediate(new http.Response("not found", 404)); | 370 return new Future.immediate(new http.Response("not found", 404)); |
| 406 })); | 371 })); |
| 407 | 372 |
| 408 dir(appPath, [ | 373 dir(appPath, [ |
| 409 libPubspec("test_pkg", "1.0.0", [ | 374 libPubspec("test_pkg", "1.0.0", [ |
| 410 { | 375 { |
| 411 'git': {'url': 'git://github.com/dart-lang/foo'}, | 376 'git': {'url': 'git://github.com/dart-lang/foo'}, |
| 412 'version': '>=1.0.0 <2.0.0' | 377 'version': '>=1.0.0 <2.0.0' |
| 413 } | 378 } |
| 414 ]) | 379 ]) |
| 415 ]).scheduleCreate(); | 380 ]).scheduleCreate(); |
| 416 | 381 |
| 417 expectLater(schedulePackageValidation(dependency), | 382 expectLater(schedulePackageValidation(dependency), |
| 418 pairOf(isEmpty, someElement(contains( | 383 pairOf(isEmpty, someElement(contains( |
| 419 ' foo: ">=1.0.0 <2.0.0"')))); | 384 ' foo: ">=1.0.0 <2.0.0"')))); |
| 420 | |
| 421 run(); | |
| 422 }); | 385 }); |
| 423 | 386 |
| 424 test("and should use the other source's unquoted version if it's " | 387 integration("and should use the other source's unquoted version if " |
| 425 "concrete", () { | 388 "it's concrete", () { |
| 426 useMockClient(new MockClient((request) { | 389 useMockClient(new MockClient((request) { |
| 427 expect(request.method, equals("GET")); | 390 expect(request.method, equals("GET")); |
| 428 expect(request.url.path, equals("/packages/foo.json")); | 391 expect(request.url.path, equals("/packages/foo.json")); |
| 429 | 392 |
| 430 return new Future.immediate(new http.Response("not found", 404)); | 393 return new Future.immediate(new http.Response("not found", 404)); |
| 431 })); | 394 })); |
| 432 | 395 |
| 433 dir(appPath, [ | 396 dir(appPath, [ |
| 434 libPubspec("test_pkg", "1.0.0", [ | 397 libPubspec("test_pkg", "1.0.0", [ |
| 435 { | 398 { |
| 436 'git': {'url': 'git://github.com/dart-lang/foo'}, | 399 'git': {'url': 'git://github.com/dart-lang/foo'}, |
| 437 'version': '0.2.3' | 400 'version': '0.2.3' |
| 438 } | 401 } |
| 439 ]) | 402 ]) |
| 440 ]).scheduleCreate(); | 403 ]).scheduleCreate(); |
| 441 | 404 |
| 442 expectLater(schedulePackageValidation(dependency), | 405 expectLater(schedulePackageValidation(dependency), |
| 443 pairOf(isEmpty, someElement(contains(' foo: 0.2.3')))); | 406 pairOf(isEmpty, someElement(contains(' foo: 0.2.3')))); |
| 444 | |
| 445 run(); | |
| 446 }); | 407 }); |
| 447 }); | 408 }); |
| 448 }); | 409 }); |
| 449 | 410 |
| 450 group('has an unconstrained dependency', () { | 411 group('has an unconstrained dependency', () { |
| 451 group('and it should not suggest a version', () { | 412 group('and it should not suggest a version', () { |
| 452 test("if there's no lockfile", () { | 413 integration("if there's no lockfile", () { |
| 453 dir(appPath, [ | 414 dir(appPath, [ |
| 454 libPubspec("test_pkg", "1.0.0", [ | 415 libPubspec("test_pkg", "1.0.0", [ |
| 455 {'hosted': 'foo'} | 416 {'hosted': 'foo'} |
| 456 ]) | 417 ]) |
| 457 ]).scheduleCreate(); | 418 ]).scheduleCreate(); |
| 458 | 419 |
| 459 expectLater(schedulePackageValidation(dependency), | 420 expectLater(schedulePackageValidation(dependency), |
| 460 pairOf(isEmpty, everyElement(isNot(contains("\n foo:"))))); | 421 pairOf(isEmpty, everyElement(isNot(contains("\n foo:"))))); |
| 461 | |
| 462 run(); | |
| 463 }); | 422 }); |
| 464 | 423 |
| 465 test("if the lockfile doesn't have an entry for the dependency", () { | 424 integration("if the lockfile doesn't have an entry for the " |
| 425 "dependency", () { |
| 466 dir(appPath, [ | 426 dir(appPath, [ |
| 467 libPubspec("test_pkg", "1.0.0", [ | 427 libPubspec("test_pkg", "1.0.0", [ |
| 468 {'hosted': 'foo'} | 428 {'hosted': 'foo'} |
| 469 ]), | 429 ]), |
| 470 file("pubspec.lock", json.stringify({ | 430 file("pubspec.lock", json.stringify({ |
| 471 'packages': { | 431 'packages': { |
| 472 'bar': { | 432 'bar': { |
| 473 'version': '1.2.3', | 433 'version': '1.2.3', |
| 474 'source': 'hosted', | 434 'source': 'hosted', |
| 475 'description': { | 435 'description': { |
| 476 'name': 'bar', | 436 'name': 'bar', |
| 477 'url': 'http://pub.dartlang.org' | 437 'url': 'http://pub.dartlang.org' |
| 478 } | 438 } |
| 479 } | 439 } |
| 480 } | 440 } |
| 481 })) | 441 })) |
| 482 ]).scheduleCreate(); | 442 ]).scheduleCreate(); |
| 483 | 443 |
| 484 expectLater(schedulePackageValidation(dependency), | 444 expectLater(schedulePackageValidation(dependency), |
| 485 pairOf(isEmpty, everyElement(isNot(contains("\n foo:"))))); | 445 pairOf(isEmpty, everyElement(isNot(contains("\n foo:"))))); |
| 486 | |
| 487 run(); | |
| 488 }); | 446 }); |
| 489 }); | 447 }); |
| 490 | 448 |
| 491 group('with a lockfile', () { | 449 group('with a lockfile', () { |
| 492 test('and it should suggest a constraint based on the locked ' | 450 integration('and it should suggest a constraint based on the locked ' |
| 493 'version', () { | 451 'version', () { |
| 494 dir(appPath, [ | 452 dir(appPath, [ |
| 495 libPubspec("test_pkg", "1.0.0", [ | 453 libPubspec("test_pkg", "1.0.0", [ |
| 496 {'hosted': 'foo'} | 454 {'hosted': 'foo'} |
| 497 ]), | 455 ]), |
| 498 file("pubspec.lock", json.stringify({ | 456 file("pubspec.lock", json.stringify({ |
| 499 'packages': { | 457 'packages': { |
| 500 'foo': { | 458 'foo': { |
| 501 'version': '1.2.3', | 459 'version': '1.2.3', |
| 502 'source': 'hosted', | 460 'source': 'hosted', |
| 503 'description': { | 461 'description': { |
| 504 'name': 'foo', | 462 'name': 'foo', |
| 505 'url': 'http://pub.dartlang.org' | 463 'url': 'http://pub.dartlang.org' |
| 506 } | 464 } |
| 507 } | 465 } |
| 508 } | 466 } |
| 509 })) | 467 })) |
| 510 ]).scheduleCreate(); | 468 ]).scheduleCreate(); |
| 511 | 469 |
| 512 expectLater(schedulePackageValidation(dependency), | 470 expectLater(schedulePackageValidation(dependency), |
| 513 pairOf(isEmpty, someElement(contains( | 471 pairOf(isEmpty, someElement(contains( |
| 514 ' foo: ">=1.2.3 <2.0.0"')))); | 472 ' foo: ">=1.2.3 <2.0.0"')))); |
| 515 | |
| 516 run(); | |
| 517 }); | 473 }); |
| 518 | 474 |
| 519 test('and it should suggest a concrete constraint if the locked ' | 475 integration('and it should suggest a concrete constraint if the locked ' |
| 520 'version is pre-1.0.0', () { | 476 'version is pre-1.0.0', () { |
| 521 dir(appPath, [ | 477 dir(appPath, [ |
| 522 libPubspec("test_pkg", "1.0.0", [ | 478 libPubspec("test_pkg", "1.0.0", [ |
| 523 {'hosted': 'foo'} | 479 {'hosted': 'foo'} |
| 524 ]), | 480 ]), |
| 525 file("pubspec.lock", json.stringify({ | 481 file("pubspec.lock", json.stringify({ |
| 526 'packages': { | 482 'packages': { |
| 527 'foo': { | 483 'foo': { |
| 528 'version': '0.1.2', | 484 'version': '0.1.2', |
| 529 'source': 'hosted', | 485 'source': 'hosted', |
| 530 'description': { | 486 'description': { |
| 531 'name': 'foo', | 487 'name': 'foo', |
| 532 'url': 'http://pub.dartlang.org' | 488 'url': 'http://pub.dartlang.org' |
| 533 } | 489 } |
| 534 } | 490 } |
| 535 } | 491 } |
| 536 })) | 492 })) |
| 537 ]).scheduleCreate(); | 493 ]).scheduleCreate(); |
| 538 | 494 |
| 539 expectLater(schedulePackageValidation(dependency), | 495 expectLater(schedulePackageValidation(dependency), |
| 540 pairOf(isEmpty, someElement(contains( | 496 pairOf(isEmpty, someElement(contains( |
| 541 ' foo: ">=0.1.2 <0.1.3"')))); | 497 ' foo: ">=0.1.2 <0.1.3"')))); |
| 542 | |
| 543 run(); | |
| 544 }); | 498 }); |
| 545 }); | 499 }); |
| 546 }); | 500 }); |
| 547 | 501 |
| 548 test('has a hosted dependency on itself', () { | 502 integration('has a hosted dependency on itself', () { |
| 549 dir(appPath, [ | 503 dir(appPath, [ |
| 550 libPubspec("test_pkg", "1.0.0", [ | 504 libPubspec("test_pkg", "1.0.0", [ |
| 551 {'hosted': {'name': 'test_pkg', 'version': '>=1.0.0'}} | 505 {'hosted': {'name': 'test_pkg', 'version': '>=1.0.0'}} |
| 552 ]) | 506 ]) |
| 553 ]).scheduleCreate(); | 507 ]).scheduleCreate(); |
| 554 | 508 |
| 555 expectValidationWarning(dependency); | 509 expectValidationWarning(dependency); |
| 556 | |
| 557 run(); | |
| 558 }); | 510 }); |
| 559 | 511 |
| 560 group('has a top-level directory named', () { | 512 group('has a top-level directory named', () { |
| 561 setUp(scheduleNormalPackage); | 513 setUp(scheduleNormalPackage); |
| 562 | 514 |
| 563 var names = ["tools", "tests", "docs", "examples", "sample", "samples"]; | 515 var names = ["tools", "tests", "docs", "examples", "sample", "samples"]; |
| 564 for (var name in names) { | 516 for (var name in names) { |
| 565 test('"$name"', () { | 517 integration('"$name"', () { |
| 566 dir(appPath, [dir(name)]).scheduleCreate(); | 518 dir(appPath, [dir(name)]).scheduleCreate(); |
| 567 expectValidationWarning(directory); | 519 expectValidationWarning(directory); |
| 568 run(); | |
| 569 }); | 520 }); |
| 570 } | 521 } |
| 571 }); | 522 }); |
| 572 }); | 523 }); |
| 573 } | 524 } |
| OLD | NEW |