UNPKG

2.62 kBJavaScriptView Raw
1'use strict'
2
3const fs = require('fs')
4const path = require('path')
5// const diff = require('variable-diff')
6// const disparity = require('disparity')
7const debug = require('debug')('snap-shot')
8const la = require('lazy-ass')
9const is = require('check-more-types')
10const mkdirp = require('mkdirp')
11const vm = require('vm')
12const {validate} = require('validate-by-example')
13
14const cwd = process.cwd()
15const fromCurrentFolder = path.relative.bind(null, cwd)
16const snapshotsFolder = fromCurrentFolder('__snapshots__')
17
18function loadSnaps (snapshotPath) {
19 const full = require.resolve(snapshotPath)
20 if (!fs.existsSync(snapshotPath)) {
21 return {}
22 }
23
24 const sandbox = {
25 exports: {}
26 }
27 const source = fs.readFileSync(full, 'utf8')
28 try {
29 vm.runInNewContext(source, sandbox)
30 return sandbox.exports
31 } catch (e) {
32 console.error('Could not load file', full)
33 console.error(source)
34 console.error(e)
35 return {}
36 }
37}
38
39function fileForSpec (specFile) {
40 const specName = path.basename(specFile)
41 const filename = path.join(snapshotsFolder, specName + '.schema-shot')
42 return path.resolve(filename)
43}
44
45function loadSnapshots (specFile) {
46 la(is.unemptyString(specFile), 'missing specFile name', specFile)
47 const filename = fileForSpec(specFile)
48 debug('loading snapshots from %s', filename)
49 let snapshots = {}
50 if (fs.existsSync(filename)) {
51 snapshots = loadSnaps(filename)
52 } else {
53 debug('could not find snapshots file %s', filename)
54 }
55 return snapshots
56}
57
58function saveSnapshots (specFile, snapshots) {
59 mkdirp.sync(snapshotsFolder)
60 const filename = fileForSpec(specFile)
61 const specRelativeName = fromCurrentFolder(specFile)
62 debug('saving snapshots into %s for %s', filename, specRelativeName)
63
64 let s = ''
65 Object.keys(snapshots).forEach(testName => {
66 const value = snapshots[testName]
67 const serialized = JSON.stringify(value, null, 2)
68 s += `exports['${testName}'] = ${serialized}\n\n`
69 })
70 fs.writeFileSync(filename, s, 'utf8')
71 return snapshots
72}
73
74// expected = schema we expect value to adhere to
75function raiseIfDifferent ({value, expected, specName}) {
76 const result = validate(expected, value)
77 if (!result.valid) {
78 la(is.array(result.errors), 'invalid errors', result)
79
80 const text = result.errors.map(o => `${o.field}: ${o.message}`).join('\n')
81 debug('Test "%s" snapshot difference', specName)
82 const msg = `schema difference\n${text}`
83 console.log(msg)
84 throw new Error(msg)
85 }
86}
87
88module.exports = {
89 readFileSync: fs.readFileSync,
90 fromCurrentFolder,
91 loadSnapshots,
92 saveSnapshots,
93 raiseIfDifferent
94}