-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.spec.js
171 lines (148 loc) · 5.15 KB
/
index.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
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
import { expect, describe, it } from 'vitest';
import lint from '@commitlint/lint';
import config from './index.cjs';
const { rules, parserPreset } = config;
expect.extend({
toBeValid(received) {
return {
pass: received.valid === true,
message: () => 'expected commitlint to be valid'
};
},
toBeInvalid(received) {
return {
pass: received.valid === false,
message: () => 'expected commitlint to be invalid'
};
},
toRaise(received, code) {
return {
pass: received.level === 2 && received.name === code,
message: () => `expected ${received} to be a commitlint error`
};
},
toWarn(received, code) {
return {
pass: received.level === 1 && received.name === code,
message: () => `expected ${received} to be a commitlint warning`
};
}
});
const warns = (code, message) => {
return async () => {
const result = await lint(message, rules, parserPreset);
expect(result).toBeValid();
const [warning] = result.warnings;
expect(warning).toWarn(code);
};
};
const raises = (code, message) => {
return async () => {
const result = await lint(message, rules, parserPreset);
expect(result).toBeInvalid();
const [error] = result.errors;
expect(error).toRaise(code);
};
};
describe('when providing some valid cases', () => {
const messages = [
'bootstrap: Initial commit.',
'ci: Update CI build file.',
'style: Reformat a service.',
'wip(message): Some message.\n\nWith a body',
'revert(fbb6553): Wrong major version.'
];
for (const message of messages) {
it('succeeds to validate', async () => {
const result = await lint(message, rules, parserPreset);
expect(result).toBeValid();
});
}
});
describe('rules', () => {
describe('body-leading-blank', () => {
describe('when body has no leading blank', () => {
const message = 'feat: A new feature.\nbody';
it('warns the user', warns('body-leading-blank', message));
});
});
describe('body-max-line-length', () => {
describe('when body exceeds the max line length of 100 characters', () => {
const message =
'refine: Some message.\n\nbody with multiple lines\nhas a message that is way too long and will break the line rule "line-max-length" by several characters';
it('fails to validate', raises('body-max-line-length', message));
});
});
describe('footer-leading-blank', () => {
describe('when footer has no leading blank', () => {
const message =
'chore: Some message.\n\nbody\nBREAKING CHANGE: It will be significant';
it('warns the user', warns('footer-leading-blank', message));
});
});
describe('footer-max-line-length', () => {
describe('when footer line is a little bit over 100 characters', () => {
const message =
'refactor: Some message.\n\nbody\n\nBREAKING CHANGE: footer with multiple lines\nhas a message that is way too long and will break the line rule "line-max-length" by several characters';
it('fails to validate', raises('footer-max-line-length', message));
});
});
describe('header-max-length', () => {
describe('when the header line exceed the max character limit', () => {
const message =
'release: Some message that is way too long and breaks the line max-length by several characters since the max is 100.';
it('fails to validate', raises('header-max-length', message));
});
});
describe('subject-case', () => {
describe('when subject case is invalid', () => {
const messages = ['security: some message.'];
messages.forEach(message => {
it('fails to validate', raises('subject-case', message));
});
});
});
describe('subject-empty', () => {
describe('when the subject is not present', () => {
const message = 'ci: ';
it('fails to validate', raises('subject-empty', message));
});
});
describe('subject-full-stop', () => {
describe('when no full stop is provided.', () => {
const message = 'a11y: Some message';
it('fails to validate', raises('subject-full-stop', message));
});
});
describe('type-case', () => {
describe('when the type is uppercased', () => {
const message = 'TEST: Some message.';
it('fails to validate', raises('type-case', message));
});
});
describe('type-empty', () => {
describe('when the type is empty', () => {
const message = 'Some message.';
it('fails to validate', raises('type-empty', message));
});
});
describe('type-enum', () => {
describe('when type is invalid', () => {
const message = 'wrongtype: Take an arrow in the knee.';
it('fails to validate', raises('type-enum', message));
});
describe('when type exists', () => {
const message = 'perf: Initial commit.';
it('succeeds to validate', async () => {
const result = await lint(message, rules, parserPreset);
expect(result).toBeValid();
});
});
});
describe('scope-case', () => {
describe('when the scope is uppercased', () => {
const message = 'perf(SCOPE): Some message.';
it('fails to validate', raises('scope-case', message));
});
});
});