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:io'; | 7 import 'dart:io'; |
8 import 'dart:json'; | 8 import 'dart:json'; |
9 | 9 |
10 import 'test_pub.dart'; | 10 import 'test_pub.dart'; |
11 import '../../../pkg/unittest/lib/unittest.dart'; | 11 import '../../../pkg/unittest/lib/unittest.dart'; |
12 import '../../../pkg/http/lib/http.dart' as http; | |
13 import '../../../pkg/http/lib/testing.dart'; | |
12 import '../../pub/entrypoint.dart'; | 14 import '../../pub/entrypoint.dart'; |
13 import '../../pub/io.dart'; | 15 import '../../pub/io.dart'; |
14 import '../../pub/validator.dart'; | 16 import '../../pub/validator.dart'; |
17 import '../../pub/validator/dependency.dart'; | |
15 import '../../pub/validator/lib.dart'; | 18 import '../../pub/validator/lib.dart'; |
16 import '../../pub/validator/license.dart'; | 19 import '../../pub/validator/license.dart'; |
17 import '../../pub/validator/name.dart'; | 20 import '../../pub/validator/name.dart'; |
18 import '../../pub/validator/pubspec_field.dart'; | 21 import '../../pub/validator/pubspec_field.dart'; |
19 | 22 |
20 void expectNoValidationError(ValidatorCreator fn) { | 23 void expectNoValidationError(ValidatorCreator fn) { |
21 expectLater(schedulePackageValidation(fn), pairOf(isEmpty, isEmpty)); | 24 expectLater(schedulePackageValidation(fn), pairOf(isEmpty, isEmpty)); |
22 } | 25 } |
23 | 26 |
24 void expectValidationError(ValidatorCreator fn) { | 27 void expectValidationError(ValidatorCreator fn) { |
25 expectLater(schedulePackageValidation(fn), pairOf(isNot(isEmpty), anything)); | 28 expectLater(schedulePackageValidation(fn), pairOf(isNot(isEmpty), anything)); |
26 } | 29 } |
27 | 30 |
28 void expectValidationWarning(ValidatorCreator fn) { | 31 void expectValidationWarning(ValidatorCreator fn) { |
29 expectLater(schedulePackageValidation(fn), pairOf(isEmpty, isNot(isEmpty))); | 32 expectLater(schedulePackageValidation(fn), pairOf(isEmpty, isNot(isEmpty))); |
30 } | 33 } |
31 | 34 |
35 Validator dependency(Entrypoint entrypoint) => | |
36 new DependencyValidator(entrypoint); | |
37 | |
32 Validator lib(Entrypoint entrypoint) => new LibValidator(entrypoint); | 38 Validator lib(Entrypoint entrypoint) => new LibValidator(entrypoint); |
33 | 39 |
34 Validator license(Entrypoint entrypoint) => new LicenseValidator(entrypoint); | 40 Validator license(Entrypoint entrypoint) => new LicenseValidator(entrypoint); |
35 | 41 |
36 Validator name(Entrypoint entrypoint) => new NameValidator(entrypoint); | 42 Validator name(Entrypoint entrypoint) => new NameValidator(entrypoint); |
37 | 43 |
38 Validator pubspecField(Entrypoint entrypoint) => | 44 Validator pubspecField(Entrypoint entrypoint) => |
39 new PubspecFieldValidator(entrypoint); | 45 new PubspecFieldValidator(entrypoint); |
40 | 46 |
41 void scheduleNormalPackage() => normalPackage.scheduleCreate(); | 47 void scheduleNormalPackage() => normalPackage.scheduleCreate(); |
42 | 48 |
43 main() { | 49 main() { |
44 group('should consider a package valid if it', () { | 50 group('should consider a package valid if it', () { |
45 setUp(scheduleNormalPackage); | 51 setUp(scheduleNormalPackage); |
46 | 52 |
47 test('looks normal', () { | 53 test('looks normal', () { |
48 dir(appPath, [libPubspec("test_pkg", "1.0.0")]).scheduleCreate(); | 54 dir(appPath, [libPubspec("test_pkg", "1.0.0")]).scheduleCreate(); |
55 expectNoValidationError(dependency); | |
56 expectNoValidationError(lib); | |
49 expectNoValidationError(license); | 57 expectNoValidationError(license); |
58 expectNoValidationError(name); | |
50 expectNoValidationError(pubspecField); | 59 expectNoValidationError(pubspecField); |
51 run(); | 60 run(); |
52 }); | 61 }); |
53 | 62 |
54 test('has a COPYING file', () { | 63 test('has a COPYING file', () { |
55 file(join(appPath, 'LICENSE'), '').scheduleDelete(); | 64 file(join(appPath, 'LICENSE'), '').scheduleDelete(); |
56 file(join(appPath, 'COPYING'), '').scheduleCreate(); | 65 file(join(appPath, 'COPYING'), '').scheduleCreate(); |
57 expectNoValidationError(license); | 66 expectNoValidationError(license); |
58 run(); | 67 run(); |
59 }); | 68 }); |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
95 test('has a non-Dart file in lib', () { | 104 test('has a non-Dart file in lib', () { |
96 dir(appPath, [ | 105 dir(appPath, [ |
97 libPubspec("test_pkg", "1.0.0"), | 106 libPubspec("test_pkg", "1.0.0"), |
98 dir("lib", [ | 107 dir("lib", [ |
99 file("thing.txt", "woo hoo") | 108 file("thing.txt", "woo hoo") |
100 ]) | 109 ]) |
101 ]).scheduleCreate(); | 110 ]).scheduleCreate(); |
102 expectNoValidationError(lib); | 111 expectNoValidationError(lib); |
103 run(); | 112 run(); |
104 }); | 113 }); |
114 | |
115 test('has an unconstrainted dependency on "unittest"', () { | |
Bob Nystrom
2012/12/21 00:11:46
"unconstrainted" -> "unconstrained"
nweiz
2012/12/21 01:01:50
Done.
| |
116 dir(appPath, [ | |
117 libPubspec("test_pkg", "1.0.0", [ | |
118 {'hosted': 'unittest'} | |
119 ]) | |
120 ]).scheduleCreate(); | |
121 expectNoValidationError(dependency); | |
122 run(); | |
123 }); | |
105 }); | 124 }); |
106 | 125 |
107 group('should consider a package invalid if it', () { | 126 group('should consider a package invalid if it', () { |
108 setUp(scheduleNormalPackage); | 127 setUp(scheduleNormalPackage); |
109 | 128 |
110 test('is missing the "homepage" field', () { | 129 test('is missing the "homepage" field', () { |
111 var package = package("test_pkg", "1.0.0"); | 130 var package = package("test_pkg", "1.0.0"); |
112 package.remove("homepage"); | 131 package.remove("homepage"); |
113 dir(appPath, [pubspec(package)]).scheduleCreate(); | 132 dir(appPath, [pubspec(package)]).scheduleCreate(); |
114 | 133 |
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
276 test('has a lib directory containing only src', () { | 295 test('has a lib directory containing only src', () { |
277 file(join(appPath, "lib", "test_pkg.dart"), '').scheduleDelete(); | 296 file(join(appPath, "lib", "test_pkg.dart"), '').scheduleDelete(); |
278 dir(appPath, [ | 297 dir(appPath, [ |
279 dir("lib", [ | 298 dir("lib", [ |
280 dir("src", [file("test_pkg.dart", "int i = 0;")]) | 299 dir("src", [file("test_pkg.dart", "int i = 0;")]) |
281 ]) | 300 ]) |
282 ]).scheduleCreate(); | 301 ]).scheduleCreate(); |
283 expectValidationError(lib); | 302 expectValidationError(lib); |
284 run(); | 303 run(); |
285 }); | 304 }); |
305 | |
306 group('has a dependency with a non-hosted source', () { | |
307 group('where a hosted version of that dependency exists', () { | |
308 test("and should suggest the hosted package's primary version", () { | |
309 useMockClient(new MockClient((request) { | |
310 expect(request.method, equals("GET")); | |
311 expect(request.url.path, equals("/packages/foo.json")); | |
312 | |
313 return new Future.immediate(new http.Response(JSON.stringify({ | |
314 "name": "foo", | |
315 "uploaders": ["nweiz@google.com"], | |
316 "versions": ["3.0.0-pre", "2.0.0", "1.0.0"] | |
317 }), 200)); | |
318 })); | |
319 | |
320 dir(appPath, [ | |
321 libPubspec("test_pkg", "1.0.0", [ | |
322 {'git': 'git://github.com/dart-lang/foo'} | |
323 ]) | |
324 ]).scheduleCreate(); | |
325 | |
326 expectLater(schedulePackageValidation(dependency), | |
327 pairOf(isEmpty, someElement(contains( | |
328 ' foo: ">=2.0.0 <3.0.0"')))); | |
329 | |
330 run(); | |
331 }); | |
332 | |
333 test("and should suggest the hosted package's prerelease version if it's " | |
Bob Nystrom
2012/12/21 00:11:46
Long line.
nweiz
2012/12/21 01:01:50
Done.
| |
334 "the only version available", () { | |
335 useMockClient(new MockClient((request) { | |
336 expect(request.method, equals("GET")); | |
337 expect(request.url.path, equals("/packages/foo.json")); | |
338 | |
339 return new Future.immediate(new http.Response(JSON.stringify({ | |
340 "name": "foo", | |
341 "uploaders": ["nweiz@google.com"], | |
342 "versions": ["3.0.0-pre", "2.0.0-pre"] | |
343 }), 200)); | |
344 })); | |
345 | |
346 dir(appPath, [ | |
347 libPubspec("test_pkg", "1.0.0", [ | |
348 {'git': 'git://github.com/dart-lang/foo'} | |
349 ]) | |
350 ]).scheduleCreate(); | |
351 | |
352 expectLater(schedulePackageValidation(dependency), | |
353 pairOf(isEmpty, someElement(contains( | |
354 ' foo: ">=3.0.0-pre <4.0.0"')))); | |
355 | |
356 run(); | |
357 }); | |
358 | |
359 test("and should suggest a single-version dependency if the primary " | |
360 "version is pre-1.0.0", () { | |
361 useMockClient(new MockClient((request) { | |
362 expect(request.method, equals("GET")); | |
363 expect(request.url.path, equals("/packages/foo.json")); | |
364 | |
365 return new Future.immediate(new http.Response(JSON.stringify({ | |
366 "name": "foo", | |
367 "uploaders": ["nweiz@google.com"], | |
368 "versions": ["0.0.1", "0.0.2"] | |
369 }), 200)); | |
370 })); | |
371 | |
372 dir(appPath, [ | |
373 libPubspec("test_pkg", "1.0.0", [ | |
374 {'git': 'git://github.com/dart-lang/foo'} | |
375 ]) | |
376 ]).scheduleCreate(); | |
377 | |
378 expectLater(schedulePackageValidation(dependency), | |
379 pairOf(isEmpty, someElement(contains(' foo: 0.0.2')))); | |
380 | |
381 run(); | |
382 }); | |
383 }); | |
384 | |
385 group('where no hosted version of that dependency exists', () { | |
386 test("and should use the other source's version", () { | |
387 useMockClient(new MockClient((request) { | |
388 expect(request.method, equals("GET")); | |
389 expect(request.url.path, equals("/packages/foo.json")); | |
390 | |
391 return new Future.immediate(new http.Response("not found", 404)); | |
392 })); | |
393 | |
394 dir(appPath, [ | |
395 libPubspec("test_pkg", "1.0.0", [ | |
396 { | |
397 'git': {'url': 'git://github.com/dart-lang/foo'}, | |
398 'version': '>=1.0.0 <2.0.0' | |
399 } | |
400 ]) | |
401 ]).scheduleCreate(); | |
402 | |
403 expectLater(schedulePackageValidation(dependency), | |
404 pairOf(isEmpty, someElement(contains( | |
405 ' foo: ">=1.0.0 <2.0.0"')))); | |
406 | |
407 run(); | |
408 }); | |
409 | |
410 test("and should use the other source's unquoted version if it's " | |
411 "concrete", () { | |
412 useMockClient(new MockClient((request) { | |
413 expect(request.method, equals("GET")); | |
414 expect(request.url.path, equals("/packages/foo.json")); | |
415 | |
416 return new Future.immediate(new http.Response("not found", 404)); | |
417 })); | |
418 | |
419 dir(appPath, [ | |
420 libPubspec("test_pkg", "1.0.0", [ | |
421 { | |
422 'git': {'url': 'git://github.com/dart-lang/foo'}, | |
423 'version': '0.2.3' | |
424 } | |
425 ]) | |
426 ]).scheduleCreate(); | |
427 | |
428 expectLater(schedulePackageValidation(dependency), | |
429 pairOf(isEmpty, someElement(contains(' foo: 0.2.3')))); | |
430 | |
431 run(); | |
432 }); | |
433 }); | |
434 }); | |
435 | |
436 group('has an unconstrained dependency', () { | |
437 group('and it should not suggest a version', () { | |
438 test("if there's no lockfile", () { | |
439 dir(appPath, [ | |
440 libPubspec("test_pkg", "1.0.0", [ | |
441 {'hosted': 'foo'} | |
442 ]) | |
443 ]).scheduleCreate(); | |
444 | |
445 expectLater(schedulePackageValidation(dependency), | |
446 pairOf(isEmpty, everyElement(isNot(contains("\n foo:"))))); | |
447 | |
448 run(); | |
449 }); | |
450 | |
451 test("if the lockfile doesn't have an entry for the dependency", () { | |
452 dir(appPath, [ | |
453 libPubspec("test_pkg", "1.0.0", [ | |
454 {'hosted': 'foo'} | |
455 ]), | |
456 file("pubspec.lock", JSON.stringify({ | |
457 'packages': { | |
458 'bar': { | |
459 'version': '1.2.3', | |
460 'source': 'hosted', | |
461 'description': { | |
462 'name': 'bar', | |
463 'url': 'http://pub.dartlang.org' | |
464 } | |
465 } | |
466 } | |
467 })) | |
468 ]).scheduleCreate(); | |
469 | |
470 expectLater(schedulePackageValidation(dependency), | |
471 pairOf(isEmpty, everyElement(isNot(contains("\n foo:"))))); | |
472 | |
473 run(); | |
474 }); | |
475 }); | |
476 | |
477 group('with a lockfile', () { | |
478 test('and it should suggest a constraint based on the locked ' | |
479 'version', () { | |
480 dir(appPath, [ | |
481 libPubspec("test_pkg", "1.0.0", [ | |
482 {'hosted': 'foo'} | |
483 ]), | |
484 file("pubspec.lock", JSON.stringify({ | |
485 'packages': { | |
486 'foo': { | |
487 'version': '1.2.3', | |
488 'source': 'hosted', | |
489 'description': { | |
490 'name': 'foo', | |
491 'url': 'http://pub.dartlang.org' | |
492 } | |
493 } | |
494 } | |
495 })) | |
496 ]).scheduleCreate(); | |
497 | |
498 expectLater(schedulePackageValidation(dependency), | |
499 pairOf(isEmpty, someElement(contains( | |
500 ' foo: ">=1.2.3 <2.0.0"')))); | |
501 | |
502 run(); | |
503 }); | |
504 | |
505 test('and it should suggest a concrete constraint if the locked ' | |
506 'version is pre-1.0.0', () { | |
507 dir(appPath, [ | |
508 libPubspec("test_pkg", "1.0.0", [ | |
509 {'hosted': 'foo'} | |
510 ]), | |
511 file("pubspec.lock", JSON.stringify({ | |
512 'packages': { | |
513 'foo': { | |
514 'version': '0.1.2', | |
515 'source': 'hosted', | |
516 'description': { | |
517 'name': 'foo', | |
518 'url': 'http://pub.dartlang.org' | |
519 } | |
520 } | |
521 } | |
522 })) | |
523 ]).scheduleCreate(); | |
524 | |
525 expectLater(schedulePackageValidation(dependency), | |
526 pairOf(isEmpty, someElement(contains(' foo: 0.1.2')))); | |
527 | |
528 run(); | |
529 }); | |
530 }); | |
531 }); | |
286 }); | 532 }); |
287 } | 533 } |
OLD | NEW |