UNPKG

2.27 kBtext/coffeescriptView Raw
1
2jsyaml = window.jsyaml if window?.jsyaml?
3jsyaml = require 'js-yaml' if not jsyaml
4
5common = require './common'
6schemas = require '../schema'
7
8exports.validate = validate = (obj) ->
9 tv4 = window?.tv4
10 tv4 = require 'tv4' if not tv4
11
12 tv4.reset()
13 for name, schema of schemas
14 tv4.addSchema schema.id, schema
15
16 results = tv4.validateMultiple obj, 'testsfile.json'
17 results.passed = false if results.missing.length
18 return results
19
20normalize = (suite) ->
21 # Default name to topic
22 suite.name = suite.topic if not suite.name
23 suite.cases = [] if not suite.cases
24
25 return suite
26
27exports.create = (base) ->
28 return normalize base
29
30exports.loadYAML = loadYAML = (data) ->
31 suites = []
32 suite = jsyaml.safeLoadAll data, (doc) ->
33 suites.push normalize(doc)
34 return suites
35
36loadHTTP = (url, callback) ->
37 if common.isBrowser()
38 req = new XMLHttpRequest();
39 req.addEventListener 'load', () ->
40 suites = loadYAML @responseText
41 return callback null, suites
42 req.addEventListener 'error', () ->
43 return callback new Error "Failed to load #{url}: #{@statusText}"
44 req.open "get", url, true
45 req.send()
46
47 else
48 throw new Error 'fbpspec.testsuite: Loading over HTTP not supported on node.js'
49
50getFileSync = (test, callback) ->
51 fs = require 'fs'
52 path = require 'path'
53
54 stat = fs.statSync test
55 if stat.isDirectory()
56 files = ( path.join(test, f) for f in fs.readdirSync(test) when f.indexOf('.yaml') != -1 )
57 return getSuitesSync files
58 else
59 c = fs.readFileSync test
60 return loadYAML c
61
62# FIXME: get rid of this...
63exports.getSuitesSync = getSuitesSync = (tests) ->
64 tests = [ tests ] if not Array.isArray tests
65
66 suites = []
67 for test in tests
68 suites = suites.concat getFileSync(test)
69 return suites
70
71exports.getSuites = (tests, callback) ->
72 tests = [ tests ] if not Array.isArray tests
73
74 loadTest = (test, cb) =>
75 if common.startsWith test, 'http://' or common.startsWith 'https://'
76 return loadHTTP test, cb
77 else
78 return cb null, getFileSync(test)
79
80 common.asyncSeries tests, loadTest, (err, suitesList) ->
81 return callback err if err
82 # flatten list
83 suites = []
84 for ss in suitesList
85 for s in ss
86 suites.push s
87 return callback null, suites