forked from jondot/hygen
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmetaverse.spec.js
151 lines (143 loc) · 4.37 KB
/
metaverse.spec.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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
jest.mock('enquirer', () => ({
prompt: null
}))
const SKIP_ON_WINDOWS = process.platform === 'win32' ? ['shell'] : []
const L = require('lodash')
const path = require('path')
const dirCompare = require('dir-compare')
const opts = { compareContent: true }
const fs = require('fs-extra')
const enquirer = require('enquirer')
const { runner } = require('../index')
const Logger = require('../logger')
const logger = new Logger(console.log)
const fail = () => {
throw new Error('set up prompt in testing')
}
const dir = m => path.join(__dirname, 'metaverse', m)
const metaverse = (folder, cmds, promptResponse = null) =>
it(folder, async () => {
const metaDir = dir(folder)
console.log('metaverse test in:', metaDir)
const config = {
templates: '_templates',
cwd: metaDir,
exec: (action, body) => {
const opts = body && body.length > 0 ? { input: body } : {}
return require('execa').shell(action, opts)
},
logger,
createPrompter: () => require('enquirer')
}
// await fs.remove(path.join(metaDir, 'given'))
console.log('before', fs.readdirSync(metaDir))
for (let cmd of cmds) {
console.log('testing', cmd)
if (
process.platform === 'win32' &&
L.find(SKIP_ON_WINDOWS, c => L.head(cmd) === c)
) {
console.log(`skipping ${cmd} (windows!)`)
await fs.remove(path.join(metaDir, 'expected', L.head(cmd)))
continue
}
enquirer.prompt = fail
if (promptResponse) {
const last = L.last(cmd)
if (L.isObject(last)) {
cmd = L.take(cmd, cmd.length - 1)
enquirer.prompt = () =>
Promise.resolve({ ...promptResponse, ...last })
} else {
enquirer.prompt = () => Promise.resolve(promptResponse)
}
}
const res = await runner(cmd, config)
res.actions.forEach(a => {
a.timing = -1
a.subject = a.subject.replace(/.*hygen\/src/, '')
})
expect(res).toMatchSnapshot(cmd.join(' '))
}
const givenDir = path.join(metaDir, 'given')
const expectedDir = path.join(metaDir, 'expected')
console.log('after', {
[givenDir]: fs.readdirSync(givenDir),
[expectedDir]: fs.readdirSync(expectedDir)
})
const res = dirCompare.compareSync(givenDir, expectedDir, opts)
res.diffSet = L.filter(res.diffSet, d => d.state !== 'equal')
if (!res.same) {
console.log(res)
}
expect(res.same).toEqual(true)
})
describe('metaverse', () => {
beforeEach(() => {
enquirer.prompt = fail
})
metaverse('hygen-extension', [['hygen-js', 'new']], { overwrite: true })
metaverse(
'hygen-templates',
[
['init', 'self'],
['overwrite-yes', 'base'],
['overwrite-yes', 'over'],
['overwrite-no', 'base'],
['overwrite-no', 'over', { overwrite: false }],
['mailer', 'new'],
['worker', 'new', '--name', 'foo'],
['shell', 'new', '--name', 'foo'],
['inflection', 'new', '--name', 'person'],
['conditional-rendering', 'new', '--notGiven'],
['add-unless-exists', 'new', '--message', 'foo'],
[
'cli-prefill-prompt-vars',
'new',
'--message-from-cli',
'hello-from-cli'
],
['cli-prefill-prompt-vars', 'name-is-special', 'foobar'],
[
'cli-prefill-prompt-vars',
'falsy-values-are-ok',
'foobar',
'--include_something',
'false'
],
['recursive-prompt', 'new'],
['positional-name', 'new', 'acmecorp'],
['existing-params', 'new', '--email', '[email protected]'],
[
'existing-params',
'new-params-alias',
'--email',
],
[
'index-js-existing-params',
'new',
'--email',
],
[
'index-js-existing-params',
'new-params-alias',
'--email',
]
],
// this is all of the responses enquirer gives out from _all_ tests, ever.
// it's best to just keep it that way to be simple, and each prompt-dealing test
// has its own set of uniquely named variables.
{
// generic for all tests
name: 'message',
message: 'foo',
overwrite: true,
// recursive-prompt
email: '[email protected]',
emailConfirmation: '[email protected]'
}
)
})