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 pubspec_test; | 5 library pubspec_test; |
6 | 6 |
7 import 'package:unittest/unittest.dart'; | 7 import 'package:unittest/unittest.dart'; |
8 | 8 |
9 import '../lib/src/pubspec.dart'; | 9 import '../lib/src/pubspec.dart'; |
10 import '../lib/src/source.dart'; | 10 import '../lib/src/source.dart'; |
(...skipping 11 matching lines...) Expand all Loading... | |
22 } | 22 } |
23 String packageName(description) => 'foo'; | 23 String packageName(description) => 'foo'; |
24 } | 24 } |
25 | 25 |
26 main() { | 26 main() { |
27 initConfig(); | 27 initConfig(); |
28 group('parse()', () { | 28 group('parse()', () { |
29 var sources = new SourceRegistry(); | 29 var sources = new SourceRegistry(); |
30 sources.register(new MockSource()); | 30 sources.register(new MockSource()); |
31 | 31 |
32 expectFormatError(String pubspec) { | 32 var throwsPubspecException = |
33 expect(() => new Pubspec.parse(null, pubspec, sources), | 33 throwsA(new isInstanceOf<PubspecException>('PubspecException')); |
34 throwsFormatException); | 34 |
35 expectPubspecException(String contents, fn(Pubspec pubspec)) { | |
36 var pubspec = new Pubspec.parse(contents, sources); | |
37 expect(() => fn(pubspec), throwsPubspecException); | |
35 } | 38 } |
36 | 39 |
40 test("doesn't eagerly throw an error for an invalid field", () { | |
41 // Shouldn't throw an error. | |
42 new Pubspec.parse('version: not a semver', sources); | |
43 }); | |
44 | |
45 test("eagerly throws an error if the pubspec name doesn't match the " | |
46 "expected name", () { | |
47 expect(() => new Pubspec.parse("name: foo", sources, expectedName: 'bar'), | |
48 throwsPubspecException); | |
49 }); | |
50 | |
51 test("eagerly throws an error if the pubspec doesn't have a name and an " | |
52 "expected name is passed", () { | |
53 expect(() => new Pubspec.parse("{}", sources, expectedName: 'bar'), | |
54 throwsPubspecException); | |
55 }); | |
56 | |
37 test("allows a version constraint for dependencies", () { | 57 test("allows a version constraint for dependencies", () { |
38 var pubspec = new Pubspec.parse(null, ''' | 58 var pubspec = new Pubspec.parse(''' |
39 dependencies: | 59 dependencies: |
40 foo: | 60 foo: |
41 mock: ok | 61 mock: ok |
42 version: ">=1.2.3 <3.4.5" | 62 version: ">=1.2.3 <3.4.5" |
43 ''', sources); | 63 ''', sources); |
44 | 64 |
45 var foo = pubspec.dependencies[0]; | 65 var foo = pubspec.dependencies[0]; |
46 expect(foo.name, equals('foo')); | 66 expect(foo.name, equals('foo')); |
47 expect(foo.constraint.allows(new Version(1, 2, 3)), isTrue); | 67 expect(foo.constraint.allows(new Version(1, 2, 3)), isTrue); |
48 expect(foo.constraint.allows(new Version(1, 2, 5)), isTrue); | 68 expect(foo.constraint.allows(new Version(1, 2, 5)), isTrue); |
49 expect(foo.constraint.allows(new Version(3, 4, 5)), isFalse); | 69 expect(foo.constraint.allows(new Version(3, 4, 5)), isFalse); |
50 }); | 70 }); |
51 | 71 |
52 test("allows an empty dependencies map", () { | 72 test("allows an empty dependencies map", () { |
53 var pubspec = new Pubspec.parse(null, ''' | 73 var pubspec = new Pubspec.parse(''' |
54 dependencies: | 74 dependencies: |
55 ''', sources); | 75 ''', sources); |
56 | 76 |
57 expect(pubspec.dependencies, isEmpty); | 77 expect(pubspec.dependencies, isEmpty); |
58 }); | 78 }); |
59 | 79 |
60 test("allows a version constraint for dev dependencies", () { | 80 test("allows a version constraint for dev dependencies", () { |
61 var pubspec = new Pubspec.parse(null, ''' | 81 var pubspec = new Pubspec.parse(''' |
62 dev_dependencies: | 82 dev_dependencies: |
63 foo: | 83 foo: |
64 mock: ok | 84 mock: ok |
65 version: ">=1.2.3 <3.4.5" | 85 version: ">=1.2.3 <3.4.5" |
66 ''', sources); | 86 ''', sources); |
67 | 87 |
68 var foo = pubspec.devDependencies[0]; | 88 var foo = pubspec.devDependencies[0]; |
69 expect(foo.name, equals('foo')); | 89 expect(foo.name, equals('foo')); |
70 expect(foo.constraint.allows(new Version(1, 2, 3)), isTrue); | 90 expect(foo.constraint.allows(new Version(1, 2, 3)), isTrue); |
71 expect(foo.constraint.allows(new Version(1, 2, 5)), isTrue); | 91 expect(foo.constraint.allows(new Version(1, 2, 5)), isTrue); |
72 expect(foo.constraint.allows(new Version(3, 4, 5)), isFalse); | 92 expect(foo.constraint.allows(new Version(3, 4, 5)), isFalse); |
73 }); | 93 }); |
74 | 94 |
75 test("allows an empty dev dependencies map", () { | 95 test("allows an empty dev dependencies map", () { |
76 var pubspec = new Pubspec.parse(null, ''' | 96 var pubspec = new Pubspec.parse(''' |
77 dev_dependencies: | 97 dev_dependencies: |
78 ''', sources); | 98 ''', sources); |
79 | 99 |
80 expect(pubspec.devDependencies, isEmpty); | 100 expect(pubspec.devDependencies, isEmpty); |
81 }); | 101 }); |
82 | 102 |
83 test("allows an unknown source", () { | 103 test("allows an unknown source", () { |
84 var pubspec = new Pubspec.parse(null, ''' | 104 var pubspec = new Pubspec.parse(''' |
85 dependencies: | 105 dependencies: |
86 foo: | 106 foo: |
87 unknown: blah | 107 unknown: blah |
88 ''', sources); | 108 ''', sources); |
89 | 109 |
90 var foo = pubspec.dependencies[0]; | 110 var foo = pubspec.dependencies[0]; |
91 expect(foo.name, equals('foo')); | 111 expect(foo.name, equals('foo')); |
92 expect(foo.source, equals('unknown')); | 112 expect(foo.source, equals('unknown')); |
93 }); | 113 }); |
94 | 114 |
95 test("throws if a package is in dependencies and dev_dependencies", () { | 115 test("throws if a package is in dependencies and dev_dependencies", () { |
96 expectFormatError(''' | 116 var contents = ''' |
97 dependencies: | 117 dependencies: |
98 foo: | 118 foo: |
99 mock: ok | 119 mock: ok |
100 dev_dependencies: | 120 dev_dependencies: |
101 foo: | 121 foo: |
102 mock: ok | 122 mock: ok |
103 '''); | 123 '''; |
124 expectPubspecException(contents, (pubspec) => pubspec.dependencies); | |
125 expectPubspecException(contents, (pubspec) => pubspec.devDependencies); | |
104 }); | 126 }); |
105 | 127 |
106 test("throws if it dependes on itself", () { | 128 test("throws if it dependes on itself", () { |
107 expectFormatError(''' | 129 expectPubspecException(''' |
108 name: myapp | 130 name: myapp |
109 dependencies: | 131 dependencies: |
110 myapp: | 132 myapp: |
111 mock: ok | 133 mock: ok |
112 '''); | 134 ''', (pubspec) => pubspec.dependencies); |
113 }); | 135 }); |
114 | 136 |
115 test("throws if it has a dev dependency on itself", () { | 137 test("throws if it has a dev dependency on itself", () { |
116 expectFormatError(''' | 138 expectPubspecException(''' |
117 name: myapp | 139 name: myapp |
118 dev_dependencies: | 140 dev_dependencies: |
119 myapp: | 141 myapp: |
120 mock: ok | 142 mock: ok |
121 '''); | 143 ''', (pubspec) => pubspec.devDependencies); |
122 }); | 144 }); |
123 | 145 |
124 test("throws if the description isn't valid", () { | 146 test("throws if the description isn't valid", () { |
125 expectFormatError(''' | 147 expectPubspecException(''' |
126 dependencies: | 148 dependencies: |
127 foo: | 149 foo: |
128 mock: bad | 150 mock: bad |
129 '''); | 151 ''', (pubspec) => pubspec.dependencies); |
130 }); | 152 }); |
131 | 153 |
132 test("throws if dependency version is not a string", () { | 154 test("throws if dependency version is not a string", () { |
133 expectFormatError(''' | 155 expectPubspecException(''' |
134 dependencies: | 156 dependencies: |
135 foo: | 157 foo: |
136 mock: ok | 158 mock: ok |
137 version: 1.2 | 159 version: 1.2 |
138 '''); | 160 ''', (pubspec) => pubspec.dependencies); |
139 }); | 161 }); |
140 | 162 |
141 test("throws if version is not a version constraint", () { | 163 test("throws if version is not a version constraint", () { |
142 expectFormatError(''' | 164 expectPubspecException(''' |
143 dependencies: | 165 dependencies: |
144 foo: | 166 foo: |
145 mock: ok | 167 mock: ok |
146 version: not constraint | 168 version: not constraint |
147 '''); | 169 ''', (pubspec) => pubspec.dependencies); |
148 }); | 170 }); |
149 | 171 |
150 test("throws if 'name' is not a string", () { | 172 test("throws if 'name' is not a string", () { |
151 expectFormatError('name: [not, a, string]'); | 173 expectPubspecException('name: [not, a, string]', |
174 (pubspec) => pubspec.name); | |
152 }); | 175 }); |
153 | 176 |
154 test("throws if version is not a string", () { | 177 test("throws if version is not a string", () { |
155 expectFormatError(''' | 178 expectPubspecException('version: 1.0', (pubspec) => pubspec.version); |
156 version: 1.0 | |
157 '''); | |
158 }); | 179 }); |
159 | 180 |
160 test("throws if version is not a version", () { | 181 test("throws if version is not a version", () { |
161 expectFormatError(''' | 182 expectPubspecException('version: not version', |
162 version: not version | 183 (pubspec) => pubspec.version); |
163 '''); | |
164 }); | |
165 | |
166 test("throws if 'homepage' is not a string", () { | |
167 expectFormatError('homepage:'); | |
168 expectFormatError('homepage: [not, a, string]'); | |
169 }); | |
170 | |
171 test("throws if 'homepage' doesn't have an HTTP scheme", () { | |
172 new Pubspec.parse(null, 'homepage: http://ok.com', sources); | |
173 new Pubspec.parse(null, 'homepage: https://also-ok.com', sources); | |
174 | |
175 expectFormatError('homepage: ftp://badscheme.com'); | |
176 expectFormatError('homepage: javascript:alert("!!!")'); | |
177 expectFormatError('homepage: data:image/png;base64,somedata'); | |
178 expectFormatError('homepage: no-scheme.com'); | |
179 }); | |
180 | |
181 test("throws if 'documentation' is not a string", () { | |
182 expectFormatError('documentation:'); | |
183 expectFormatError('documentation: [not, a, string]'); | |
184 }); | |
185 | |
186 test("throws if 'documentation' doesn't have an HTTP scheme", () { | |
187 new Pubspec.parse(null, 'documentation: http://ok.com', sources); | |
188 new Pubspec.parse(null, 'documentation: https://also-ok.com', sources); | |
189 | |
190 expectFormatError('documentation: ftp://badscheme.com'); | |
191 expectFormatError('documentation: javascript:alert("!!!")'); | |
192 expectFormatError('documentation: data:image/png;base64,somedata'); | |
193 expectFormatError('documentation: no-scheme.com'); | |
194 }); | |
195 | |
196 test("throws if 'authors' is not a string or a list of strings", () { | |
197 new Pubspec.parse(null, 'authors: ok fine', sources); | |
198 new Pubspec.parse(null, 'authors: [also, ok, fine]', sources); | |
199 | |
200 expectFormatError('authors: 123'); | |
201 expectFormatError('authors: {not: {a: string}}'); | |
202 expectFormatError('authors: [ok, {not: ok}]'); | |
203 }); | |
204 | |
205 test("throws if 'author' is not a string", () { | |
206 new Pubspec.parse(null, 'author: ok fine', sources); | |
207 | |
208 expectFormatError('author: 123'); | |
209 expectFormatError('author: {not: {a: string}}'); | |
210 expectFormatError('author: [not, ok]'); | |
211 }); | |
212 | |
213 test("throws if both 'author' and 'authors' are present", () { | |
214 expectFormatError('{author: abe, authors: ted}'); | |
Bob Nystrom
2013/09/23 17:11:22
Can you move all of these tests over to validator?
nweiz
2013/09/23 22:06:10
Done.
| |
215 }); | 184 }); |
216 | 185 |
217 test("throws if a transformer isn't a string or map", () { | 186 test("throws if a transformer isn't a string or map", () { |
218 expectFormatError('{transformers: 12}'); | 187 expectPubspecException('transformers: 12', |
219 expectFormatError('{transformers: [12]}'); | 188 (pubspec) => pubspec.transformers); |
189 expectPubspecException('transformers: [12]', | |
190 (pubspec) => pubspec.transformers); | |
220 }); | 191 }); |
221 | 192 |
222 test("throws if a transformer's configuration isn't a map", () { | 193 test("throws if a transformer's configuration isn't a map", () { |
223 expectFormatError('{transformers: {pkg: 12}}'); | 194 expectPubspecException('transformers: {pkg: 12}', |
195 (pubspec) => pubspec.transformers); | |
224 }); | 196 }); |
225 | 197 |
226 test("allows comment-only files", () { | 198 test("allows comment-only files", () { |
227 var pubspec = new Pubspec.parse(null, ''' | 199 var pubspec = new Pubspec.parse(''' |
228 # No external dependencies yet | 200 # No external dependencies yet |
229 # Including for completeness | 201 # Including for completeness |
230 # ...and hoping the spec expands to include details about author, version, etc | 202 # ...and hoping the spec expands to include details about author, version, etc |
231 # See http://www.dartlang.org/docs/pub-package-manager/ for details | 203 # See http://www.dartlang.org/docs/pub-package-manager/ for details |
232 ''', sources); | 204 ''', sources); |
233 expect(pubspec.version, equals(Version.none)); | 205 expect(pubspec.version, equals(Version.none)); |
234 expect(pubspec.dependencies, isEmpty); | 206 expect(pubspec.dependencies, isEmpty); |
235 }); | 207 }); |
236 | 208 |
237 group("environment", () { | 209 group("environment", () { |
238 test("defaults to any SDK constraint if environment is omitted", () { | 210 test("defaults to any SDK constraint if environment is omitted", () { |
239 var pubspec = new Pubspec.parse(null, '', sources); | 211 var pubspec = new Pubspec.parse('', sources); |
240 expect(pubspec.environment.sdkVersion, equals(VersionConstraint.any)); | 212 expect(pubspec.environment.sdkVersion, equals(VersionConstraint.any)); |
241 }); | 213 }); |
242 | 214 |
243 test("allows an empty environment map", () { | 215 test("allows an empty environment map", () { |
244 var pubspec = new Pubspec.parse(null, ''' | 216 var pubspec = new Pubspec.parse(''' |
245 environment: | 217 environment: |
246 ''', sources); | 218 ''', sources); |
247 expect(pubspec.environment.sdkVersion, equals(VersionConstraint.any)); | 219 expect(pubspec.environment.sdkVersion, equals(VersionConstraint.any)); |
248 }); | 220 }); |
249 | 221 |
250 test("throws if the environment value isn't a map", () { | 222 test("throws if the environment value isn't a map", () { |
251 expectFormatError(''' | 223 expectPubspecException('environment: []', |
252 environment: [] | 224 (pubspec) => pubspec.environment); |
253 '''); | |
254 }); | 225 }); |
255 | 226 |
256 test("allows a version constraint for the sdk", () { | 227 test("allows a version constraint for the sdk", () { |
257 var pubspec = new Pubspec.parse(null, ''' | 228 var pubspec = new Pubspec.parse(''' |
258 environment: | 229 environment: |
259 sdk: ">=1.2.3 <2.3.4" | 230 sdk: ">=1.2.3 <2.3.4" |
260 ''', sources); | 231 ''', sources); |
261 expect(pubspec.environment.sdkVersion, | 232 expect(pubspec.environment.sdkVersion, |
262 equals(new VersionConstraint.parse(">=1.2.3 <2.3.4"))); | 233 equals(new VersionConstraint.parse(">=1.2.3 <2.3.4"))); |
263 }); | 234 }); |
264 | 235 |
265 test("throws if the sdk isn't a string", () { | 236 test("throws if the sdk isn't a string", () { |
266 expectFormatError(''' | 237 expectPubspecException('environment: {sdk: []}', |
267 environment: | 238 (pubspec) => pubspec.environment); |
268 sdk: [] | 239 expectPubspecException('environment: {sdk: 1.0}', |
269 '''); | 240 (pubspec) => pubspec.environment); |
270 }); | 241 }); |
271 | 242 |
272 test("throws if the sdk is not a string", () { | |
273 expectFormatError(''' | |
274 environment: | |
275 sdk: 1.0 | |
276 '''); | |
277 }); | |
278 | |
279 test("throws if the sdk isn't a valid version constraint", () { | 243 test("throws if the sdk isn't a valid version constraint", () { |
280 expectFormatError(''' | 244 expectPubspecException('environment: {sdk: "oopies"}', |
281 environment: | 245 (pubspec) => pubspec.environment); |
282 sdk: "oopies" | |
283 '''); | |
284 }); | 246 }); |
285 }); | 247 }); |
286 }); | 248 }); |
287 } | 249 } |
OLD | NEW |