/
help-search.js
118 lines (99 loc) · 3.24 KB
/
help-search.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
const t = require('tap')
const { join } = require('path')
const { fake: mockNpm } = require('../../fixtures/mock-npm')
const ansicolors = require('ansicolors')
const OUTPUT = []
const output = (msg) => {
OUTPUT.push(msg)
}
const config = {
long: false,
}
const npmHelpErr = null
const npm = mockNpm({
color: false,
config,
flatOptions: {
long: false,
},
usage: 'npm test usage',
exec: async () => {
if (npmHelpErr)
throw npmHelpErr
},
output,
})
let globRoot = null
const globDir = {
'npm-exec.md': 'the exec command\nhelp has multiple lines of exec help\none of them references exec',
'npm-something.md': 'another\ncommand you run\nthat\nreferences exec\nand has multiple lines\nwith no matches\nthat will be ignored\nand another line\nthat does have exec as well',
'npm-run-script.md': 'the scripted run-script command runs scripts\nand has lines\nsome of which dont match the string run\nor script\nscript',
'npm-install.md': 'does a thing in a script\nif a thing does not exist in a thing you run\nto install it and run it maybe in a script',
'npm-help.md': 'will run the `help-search` command if you need to run it to help you search',
'npm-help-search.md': 'is the help search command\nthat you get if you run help-search',
'npm-useless.md': 'exec\nexec',
'npm-more-useless.md': 'exec exec',
'npm-extra-useless.md': 'exec\nexec\nexec',
}
const glob = (p, cb) =>
cb(null, Object.keys(globDir).map((file) => join(globRoot, file)))
const HelpSearch = t.mock('../../../lib/commands/help-search.js', {
glob,
})
const helpSearch = new HelpSearch(npm)
t.test('npm help-search', async t => {
globRoot = t.testdir(globDir)
t.teardown(() => {
OUTPUT.length = 0
globRoot = null
})
await helpSearch.exec(['exec'])
t.match(OUTPUT, /Top hits for "exec"/, 'outputs results')
})
t.test('npm help-search multiple terms', async t => {
globRoot = t.testdir(globDir)
t.teardown(() => {
OUTPUT.length = 0
globRoot = null
})
await helpSearch.exec(['run', 'script'])
t.match(OUTPUT, /Top hits for/, 'outputs results')
t.match(OUTPUT, /run:\d+ script:\d+/, 'shows hit counts for both terms')
})
t.test('npm help-search long output', async t => {
globRoot = t.testdir(globDir)
config.long = true
t.teardown(() => {
OUTPUT.length = 0
config.long = false
globRoot = null
})
await helpSearch.exec(['exec'])
t.match(OUTPUT, /has multiple lines of exec help/, 'outputs detailed results')
})
t.test('npm help-search long output with color', async t => {
globRoot = t.testdir(globDir)
config.long = true
npm.color = true
t.teardown(() => {
OUTPUT.length = 0
config.long = false
npm.color = false
globRoot = null
})
await helpSearch.exec(['help-search'])
const highlightedText = ansicolors.bgBlack(ansicolors.red('help-search'))
t.equal(OUTPUT.some((line) => line.includes(highlightedText)), true, 'returned highlighted search terms')
})
t.test('npm help-search no args', async t => {
t.rejects(helpSearch.exec([]), /npm help-search/, 'outputs usage')
})
t.test('npm help-search no matches', async t => {
globRoot = t.testdir(globDir)
t.teardown(() => {
OUTPUT.length = 0
globRoot = null
})
await helpSearch.exec(['asdfasdf'])
t.match(OUTPUT, /No matches/)
})