forked from sindresorhus/np
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathprerequisite-tasks.js
244 lines (223 loc) · 8.49 KB
/
prerequisite-tasks.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
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
import test from 'ava';
import execaStub from 'execa_test_double';
import mockery from 'mockery';
import version from '../source/version';
import {SilentRenderer} from './fixtures/listr-renderer';
let testedModule;
const run = async listr => {
listr.setRenderer(SilentRenderer);
await listr.run();
};
test.before(() => {
mockery.registerMock('execa', execaStub.execa);
mockery.enable({
useCleanCache: true,
warnOnReplace: false,
warnOnUnregistered: false
});
testedModule = require('../source/prerequisite-tasks');
});
test.beforeEach(() => {
execaStub.resetStub();
});
test.serial('public-package published on npm registry: should fail when npm registry not pingable', async t => {
execaStub.createStub([{
command: 'npm ping',
exitCode: 1,
exitCodeName: 'EPERM',
stdout: '',
stderr: 'failed'
}]);
await t.throwsAsync(run(testedModule('1.0.0', {name: 'test'}, {})),
{message: 'Connection to npm registry failed'});
t.true(SilentRenderer.tasks.some(task => task.title === 'Ping npm registry' && task.hasFailed()));
});
test.serial('private package: should disable task pinging npm registry', async t => {
execaStub.createStub([
{
command: 'git rev-parse --quiet --verify refs/tags/v2.0.0',
exitCode: 0,
stdout: ''
}
]);
await run(testedModule('2.0.0', {name: 'test', version: '1.0.0', private: true}, {yarn: false}));
t.true(SilentRenderer.tasks.some(task => task.title === 'Ping npm registry' && !task.isEnabled()));
});
test.serial('external registry: should disable task pinging npm registry', async t => {
execaStub.createStub([
{
command: 'git rev-parse --quiet --verify refs/tags/v2.0.0',
exitCode: 0,
stdout: ''
}
]);
await run(testedModule('2.0.0', {name: 'test', version: '1.0.0', publishConfig: {registry: 'http://my.io'}},
{yarn: false}));
t.true(SilentRenderer.tasks.some(task => task.title === 'Ping npm registry' && !task.isEnabled()));
});
test.serial('should fail when npm version does not match range in `package.json`', async t => {
execaStub.createStub([
{
command: 'npm --version',
exitCode: 0,
stdout: '6.0.0'
},
{
command: 'git rev-parse --quiet --verify refs/tags/v2.0.0',
exitCode: 0,
stdout: ''
}
]);
const depRange = require('../package.json').engines.npm;
await t.throwsAsync(run(testedModule('2.0.0', {name: 'test', version: '1.0.0'}, {yarn: false})),
{message: `Please upgrade to npm${depRange}`});
t.true(SilentRenderer.tasks.some(task => task.title === 'Check npm version' && task.hasFailed()));
});
test.serial('should fail when yarn version does not match range in `package.json`', async t => {
execaStub.createStub([
{
command: 'yarn --version',
exitCode: 0,
stdout: '1.0.0'
},
{
command: 'git rev-parse --quiet --verify refs/tags/v2.0.0',
exitCode: 0,
stdout: ''
}
]);
const depRange = require('../package.json').engines.yarn;
await t.throwsAsync(run(testedModule('2.0.0', {name: 'test', version: '1.0.0'}, {yarn: true})),
{message: `Please upgrade to yarn${depRange}`});
t.true(SilentRenderer.tasks.some(task => task.title === 'Check yarn version' && task.hasFailed()));
});
test.serial('should fail when user is not authenticated at npm registry', async t => {
execaStub.createStub([
{
command: 'npm whoami',
exitCode: 0,
stdout: 'sindresorhus'
},
{
command: 'npm access ls-collaborators test',
exitCode: 0,
stdout: '{"sindresorhus": "read"}'
}
]);
process.env.NODE_ENV = 'P';
await t.throwsAsync(run(testedModule('2.0.0', {name: 'test', version: '1.0.0'}, {yarn: false})),
{message: 'You do not have write permissions required to publish this package.'});
process.env.NODE_ENV = 'test';
t.true(SilentRenderer.tasks.some(task => task.title === 'Verify user is authenticated' && task.hasFailed()));
});
test.serial('should fail when user is not authenticated at external registry', async t => {
execaStub.createStub([
{
command: 'npm whoami --registry http://my.io',
exitCode: 0,
stdout: 'sindresorhus'
},
{
command: 'npm access ls-collaborators test --registry http://my.io',
exitCode: 0,
stdout: '{"sindresorhus": "read"}'
}
]);
process.env.NODE_ENV = 'P';
await t.throwsAsync(run(testedModule('2.0.0', {name: 'test', version: '1.0.0', publishConfig: {registry: 'http://my.io'}}, {yarn: false})),
{message: 'You do not have write permissions required to publish this package.'});
process.env.NODE_ENV = 'test';
t.true(SilentRenderer.tasks.some(task => task.title === 'Verify user is authenticated' && task.hasFailed()));
});
test.serial('private package: should disable task `verify user is authenticated`', async t => {
execaStub.createStub([
{
command: 'git rev-parse --quiet --verify refs/tags/v2.0.0',
exitCode: 0,
stdout: ''
}
]);
process.env.NODE_ENV = 'P';
await run(testedModule('2.0.0', {name: 'test', version: '1.0.0', private: true}, {yarn: false}));
process.env.NODE_ENV = 'test';
t.true(SilentRenderer.tasks.some(task => task.title === 'Verify user is authenticated' && !task.isEnabled()));
});
test.serial('should fail when git version does not match range in `package.json`', async t => {
execaStub.createStub([
{
command: 'git version',
exitCode: 0,
stdout: 'git version 1.0.0'
}
]);
const depRange = require('../package.json').engines.git;
await t.throwsAsync(run(testedModule('2.0.0', {name: 'test', version: '1.0.0'}, {yarn: false})),
{message: `Please upgrade to git${depRange}`});
t.true(SilentRenderer.tasks.some(task => task.title === 'Check git version' && task.hasFailed()));
});
test.serial('should fail when git remote does not exists', async t => {
execaStub.createStub([
{
command: 'git ls-remote origin HEAD',
exitCode: 1,
exitCodeName: 'EPERM',
stderr: 'not found'
}
]);
await t.throwsAsync(run(testedModule('2.0.0', {name: 'test', version: '1.0.0'}, {yarn: false})),
{message: 'not found'});
t.true(SilentRenderer.tasks.some(task => task.title === 'Check git remote' && task.hasFailed()));
});
test.serial('should fail when version is invalid', async t => {
await t.throwsAsync(run(testedModule('DDD', {name: 'test', version: '1.0.0'}, {yarn: false})),
{message: `Version should be either ${version.SEMVER_INCREMENTS.join(', ')}, or a valid semver version.`});
t.true(SilentRenderer.tasks.some(task => task.title === 'Validate version' && task.hasFailed()));
});
test.serial('should fail when version is lower as latest version', async t => {
await t.throwsAsync(run(testedModule('0.1.0', {name: 'test', version: '1.0.0'}, {yarn: false})),
{message: 'New version `0.1.0` should be higher than current version `1.0.0`'});
t.true(SilentRenderer.tasks.some(task => task.title === 'Validate version' && task.hasFailed()));
});
test.serial('should fail when prerelease version of public package without dist tag given', async t => {
await t.throwsAsync(run(testedModule('2.0.0-1', {name: 'test', version: '1.0.0'}, {yarn: false})),
{message: 'You must specify a dist-tag using --tag when publishing a pre-release version. This prevents accidentally tagging unstable versions as "latest". https://docs.npmjs.com/cli/dist-tag'});
t.true(SilentRenderer.tasks.some(task => task.title === 'Check for pre-release version' && task.hasFailed()));
});
test.serial('should not fail when prerelease version of public package with dist tag given', async t => {
execaStub.createStub([
{
command: 'git rev-parse --quiet --verify refs/tags/v2.0.0',
stdout: ''
}
]);
await t.notThrowsAsync(run(testedModule('2.0.0-1', {name: 'test', version: '1.0.0'}, {yarn: false, tag: 'pre'})));
});
test.serial('should not fail when prerelease version of private package without dist tag given', async t => {
execaStub.createStub([
{
command: 'git rev-parse --quiet --verify refs/tags/v2.0.0',
stdout: ''
}
]);
await t.notThrowsAsync(run(testedModule('2.0.0-1', {name: 'test', version: '1.0.0', private: true}, {yarn: false})));
});
test.serial('should fail when git tag already exists', async t => {
execaStub.createStub([
{
command: 'git rev-parse --quiet --verify refs/tags/v2.0.0',
stdout: 'vvb'
}
]);
await t.throwsAsync(run(testedModule('2.0.0', {name: 'test', version: '1.0.0'}, {yarn: false})),
{message: 'Git tag `v2.0.0` already exists.'});
t.true(SilentRenderer.tasks.some(task => task.title === 'Check git tag existence' && task.hasFailed()));
});
test.serial('checks should pass', async t => {
execaStub.createStub([
{
command: 'git rev-parse --quiet --verify refs/tags/v2.0.0',
stdout: ''
}
]);
await t.notThrowsAsync(run(testedModule('2.0.0', {name: 'test', version: '1.0.0'}, {yarn: false})));
});