1 |
|
2 | jsyaml = window.jsyaml if window?.jsyaml?
|
3 | jsyaml = require 'js-yaml' if not jsyaml
|
4 |
|
5 | common = require './common'
|
6 | schemas = require '../schema'
|
7 |
|
8 | exports.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 |
|
20 | normalize = (suite) ->
|
21 |
|
22 | suite.name = suite.topic if not suite.name
|
23 | suite.cases = [] if not suite.cases
|
24 |
|
25 | return suite
|
26 |
|
27 | exports.create = (base) ->
|
28 | return normalize base
|
29 |
|
30 | exports.loadYAML = loadYAML = (data) ->
|
31 | suites = []
|
32 | suite = jsyaml.safeLoadAll data, (doc) ->
|
33 | suites.push normalize(doc)
|
34 | return suites
|
35 |
|
36 | loadHTTP = (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 |
|
50 | getFileSync = (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 |
|
63 | exports.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 |
|
71 | exports.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 |
|
83 | suites = []
|
84 | for ss in suitesList
|
85 | for s in ss
|
86 | suites.push s
|
87 | return callback null, suites
|