Skip to content

Commit e108fb1

Browse files
committed
Added tests for optional manifest fields.
1 parent cb62dcd commit e108fb1

File tree

3 files changed

+155
-4
lines changed

3 files changed

+155
-4
lines changed

grunt.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ grunt.registerTask( "restore-repos", function() {
112112
});
113113
});
114114

115-
grunt.registerTask( "default", "lint" );
115+
grunt.registerTask( "default", "lint test" );
116116
grunt.registerTask( "setup", "setup-pluginsdb setup-retrydb setup-wordpress" );
117117
grunt.registerTask( "restore", "clean setup-retrydb docs restore-repos" );
118118

lib/service.js

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ function Repo() {
1515
this.path = config.repoDir + "/" + this.id;
1616
}
1717

18+
function isObject( obj ) {
19+
return ({}).toString.call( obj ) === "[object Object]";
20+
}
21+
1822
function isUrl( str ) {
1923
// TODO: URL validation
2024
return true;
@@ -92,7 +96,7 @@ extend( Repo.prototype, {
9296

9397
if ( !manifest.author ) {
9498
errors.push( "Missing required field: author." );
95-
} else if ( typeof manifest.author !== "object" ) {
99+
} else if ( !isObject( manifest.author ) ) {
96100
errors.push( "Invalid data type for author; must be an object." );
97101
} else if ( !manifest.author.name ) {
98102
errors.push( "Missing required field: author.name." );
@@ -138,7 +142,7 @@ extend( Repo.prototype, {
138142

139143
if ( !manifest.dependencies ) {
140144
errors.push( "Missing required field: dependencies." );
141-
} else if ( ({}).toString.call( manifest.dependencies ) !== "[object Object]" ) {
145+
} else if ( !isObject( manifest.dependencies ) ) {
142146
errors.push( "Invalid data type for dependencies; must be an object." );
143147
} else {
144148
if ( !manifest.dependencies.jquery ) {
@@ -211,7 +215,14 @@ extend( Repo.prototype, {
211215
errors.push( "Invalid data type for maintainers; must be an array." );
212216
} else {
213217
manifest.maintainers.forEach(function( maintainer, i ) {
214-
if ( typeof maintainer.name !== "string" ) {
218+
if ( !isObject( maintainer ) ) {
219+
errors.push( "Invalid data type for maintainers[" + i + "]; must be an object." );
220+
return;
221+
}
222+
223+
if ( !("name" in maintainer) ) {
224+
errors.push( "Missing required field: maintainers[" + i + "].name." );
225+
} else if ( typeof maintainer.name !== "string" ) {
215226
errors.push( "Invalid data type for maintainers[" + i + "].name; must be a string." );
216227
}
217228

test/service.js

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,147 @@ var tests = {
227227
fn( manifest, manifest.version, [
228228
"Invalid version range for dependency: jquery."
229229
]);
230+
},
231+
232+
"description - invalid type": function( manifest, fn ) {
233+
manifest.description = 5;
234+
fn( manifest, manifest.version, [
235+
"Invalid data type for description; must be a string."
236+
]);
237+
},
238+
239+
"keywords - invalid type": function( manifest, fn ) {
240+
manifest.keywords = "jquery plugin";
241+
fn( manifest, manifest.version, [
242+
"Invalid data type for keywords; must be an array."
243+
]);
244+
},
245+
246+
"keywords - keyword - invalid type": function( manifest, fn ) {
247+
manifest.keywords = [ "plugin", 5 ];
248+
fn( manifest, manifest.version, [
249+
"Invalid data type for keywords[1]; must be a string."
250+
]);
251+
},
252+
253+
"keywords - keyword - invalid characters": function( manifest, fn ) {
254+
manifest.keywords = [ "jquery plugin" ];
255+
fn( manifest, manifest.version, [
256+
"Invalid characters for keyword: jquery plugin."
257+
]);
258+
},
259+
260+
"homepage - invalid type": function( manifest, fn ) {
261+
manifest.homepage = 5;
262+
fn( manifest, manifest.version, [
263+
"Invalid data type for homepage; must be a string."
264+
]);
265+
},
266+
267+
// "homepage - invalid format": function( manifest, fn ) {
268+
// manifest.homepage = "example.com";
269+
// fn( manifest, manifest.version, [
270+
// "Invalid value for homepage."
271+
// ]);
272+
// },
273+
274+
"docs - invalid type": function( manifest, fn ) {
275+
manifest.docs = 5;
276+
fn( manifest, manifest.version, [
277+
"Invalid data type for docs; must be a string."
278+
]);
279+
},
280+
281+
// "docs - invalid format": function( manifest, fn ) {
282+
// manifest.docs = "example.com";
283+
// fn( manifest, manifest.version, [
284+
// "Invalid value for docs."
285+
// ]);
286+
// },
287+
288+
"demo - invalid type": function( manifest, fn ) {
289+
manifest.demo = 5;
290+
fn( manifest, manifest.version, [
291+
"Invalid data type for demo; must be a string."
292+
]);
293+
},
294+
295+
// "demo - invalid format": function( manifest, fn ) {
296+
// manifest.demo = "example.com";
297+
// fn( manifest, manifest.version, [
298+
// "Invalid value for demo."
299+
// ]);
300+
// },
301+
302+
"download - invalid type": function( manifest, fn ) {
303+
manifest.download = 5;
304+
fn( manifest, manifest.version, [
305+
"Invalid data type for download; must be a string."
306+
]);
307+
},
308+
309+
// "download - invalid format": function( manifest, fn ) {
310+
// manifest.download = "example.com";
311+
// fn( manifest, manifest.version, [
312+
// "Invalid value for download."
313+
// ]);
314+
// },
315+
316+
"maintainers - invalid type": function( manifest, fn ) {
317+
manifest.maintainers = "John";
318+
fn( manifest, manifest.version, [
319+
"Invalid data type for maintainers; must be an array."
320+
]);
321+
},
322+
323+
"maintainers - maintainer - invalid type": function( manifest, fn ) {
324+
manifest.maintainers = [ "John" ];
325+
fn( manifest, manifest.version, [
326+
"Invalid data type for maintainers[0]; must be an object."
327+
]);
328+
},
329+
330+
"maintainers - maintainer - empty object": function( manifest, fn ) {
331+
manifest.maintainers = [{}];
332+
fn( manifest, manifest.version, [
333+
"Missing required field: maintainers[0].name."
334+
]);
335+
},
336+
337+
"maintainers - maintainer - name - invalid type": function( manifest, fn ) {
338+
manifest.maintainers = [{ name: 5 }];
339+
fn( manifest, manifest.version, [
340+
"Invalid data type for maintainers[0].name; must be a string."
341+
]);
342+
},
343+
344+
"maintainers - maintainer - email - invalid type": function( manifest, fn ) {
345+
manifest.maintainers = [{ name: "John", email: 5 }];
346+
fn( manifest, manifest.version, [
347+
"Invalid data type for maintainers[0].email; must be a string."
348+
]);
349+
},
350+
351+
"manitainers - maintainer - email - invalid format": function( manifest, fn ) {
352+
manifest.maintainers = [{ name: "John", email: "john at example" }];
353+
fn( manifest, manifest.version, [
354+
"Invalid value for maintainers[0].email."
355+
]);
356+
},
357+
358+
"maintainers - maintainer - url - invalid type": function( manifest, fn ) {
359+
manifest.maintainers = [{ name: "John", url: 5 }];
360+
fn( manifest, manifest.version, [
361+
"Invalid data type for maintainers[0].url; must be a string."
362+
]);
230363
}
364+
365+
// "maintainers - maintainer - url - invalid format": function( manifest, fn ) {
366+
// manifest.maintainers = [{ name: "John", url: "example.com" }];
367+
// fn( manifest, manifest.version, [
368+
// "Invalid value for maintainers[0].url."
369+
// ]);
370+
// }
231371
};
232372

233373
exports.service = {};

0 commit comments

Comments
 (0)