-
-
Notifications
You must be signed in to change notification settings - Fork 4.5k
/
valid-packages-test.js
109 lines (99 loc) · 3.29 KB
/
valid-packages-test.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
"use strict";
var assert = require("assert"),
path = require("path"),
fs = require("fs"),
glob = require("glob"),
vows = require("vows"),
jsv = require("JSV").JSV.createEnvironment();
function parse(json_file, ignore_missing, ignore_parse_fail) {
var content;
try {
content = fs.readFileSync(json_file, 'utf8');
} catch (err1) {
if (!ignore_missing) {
assert.ok(0, json_file + " doesn't exist!");
}
return null;
}
try {
return JSON.parse(content);
} catch (err2) {
if (!ignore_parse_fail) {
assert.ok(0, json_file + " failed to parse");
}
return null;
}
}
function pkg_name(json_file) {
return json_file.split("/")[3];
}
function pretty_error(err) {
return err.message + " (" + err.details + "): " +
err.schemaUri.split("#")[1];
}
// load up those files
var packages = glob.sync("./ajax/libs/*/").map(function (pkg) {
return pkg + "package.json";
}),
schemata = glob.sync("./test/schemata/*.json").map(function (schema) {
return jsv.createSchema(parse(schema));
}),
suite = vows.describe('Package structure');
packages.map(function (pkg) {
var package_vows = {"topic": pkg},
pname = pkg_name(pkg),
context = {};
package_vows[pname + " has package.json"] = function (pkg) {
assert.ok(fs.existsSync(pkg), pkg_name(pkg) + " missing!");
};
package_vows[pname + " package.json is well-formed"] = function (pkg) {
assert.ok(parse(pkg, true),
pkg_name(pkg) + " malformed!");
};
package_vows[pname + " package.json is valid"] = function (pkg) {
var pkg_obj = parse(pkg, true, true),
valid = false,
errors;
if (pkg_obj === null) {
// we already know about the problem
return;
}
errors = schemata.map(function (schema) {
var schema_errors = schema.validate(pkg_obj).errors;
if (!schema_errors.length) {
valid = true;
} else {
return {
name: schema._attributes.name,
errors: schema_errors
};
}
return null;
});
if (!valid) {
assert.ok(valid,
[pkg_name(pkg) + " didn't parse as any known format:"].concat(
errors
.filter(function (schema) {
return schema !== null;
})
.map(function (schema) {
return "\t » " + schema.name +
"\n\t\t" +
schema.errors.map(pretty_error).join("\n\t\t");
})
)
.join("\n"));
}
};
package_vows[pname + ": filename from package.json exists"] = function (pkg) {
var json = parse(pkg, true, true);
var filePath = "./ajax/libs/" + json.name + "/"+ json.version
+ "/" + json.filename;
assert.ok(fs.existsSync(filePath),
filePath +" does not exist but is referenced in package.json!");
};
context[pname] = package_vows;
suite.addBatch(context);
});
suite.export(module);