-
Notifications
You must be signed in to change notification settings - Fork 67
Expand file tree
/
Copy pathchangelog.spec.ts
More file actions
168 lines (136 loc) · 6.48 KB
/
changelog.spec.ts
File metadata and controls
168 lines (136 loc) · 6.48 KB
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
import {existsSync, readFileSync} from 'fs';
import {GitClient} from '../../utils/git/git-client.js';
import semver from 'semver';
import {cleanTestTmpDir, dedent} from '../../utils/testing/index.js';
import {Changelog, splitMarker} from './changelog.js';
import {getMockGitClient} from '../../utils/testing/index.js';
import {MergeMode} from '../../utils/git/repository-merge-mode.js';
describe('Changelog', () => {
let changelog: Changelog;
let gitClient: GitClient;
beforeEach(() => {
cleanTestTmpDir();
gitClient = getMockGitClient(
{
mergeMode: MergeMode.TEAM_ONLY,
owner: 'angular',
name: 'dev-infra-test',
mainBranchName: 'main',
},
/* useSandboxGitClient */ false,
);
spyOn(GitClient, 'get').and.resolveTo(gitClient);
changelog = Changelog.getChangelogFilePaths(gitClient);
});
it('throws an error if it cannot find the anchor containing the version for an entry', () => {
expect(() =>
Changelog.prependEntryToChangelogFile(gitClient, 'does not have version <a> tag'),
).toThrow();
});
it('throws an error if it cannot determine the version for an entry', () => {
expect(() =>
Changelog.prependEntryToChangelogFile(gitClient, createChangelogEntry('NotSemVer')),
).toThrow();
});
it('concatenates the changelog entries into the changelog file with the split marker between', () => {
Changelog.prependEntryToChangelogFile(gitClient, createChangelogEntry('1.0.0'));
Changelog.prependEntryToChangelogFile(gitClient, createChangelogEntry('2.0.0'));
Changelog.prependEntryToChangelogFile(gitClient, createChangelogEntry('3.0.0'));
expect(readFileAsString(changelog.filePath)).toBe(
dedent`
<a name="3.0.0"></a>
${splitMarker}
<a name="2.0.0"></a>
${splitMarker}
<a name="1.0.0"></a>
`.trim(),
);
Changelog.moveEntriesPriorToVersionToArchive(gitClient, new semver.SemVer('3.0.0'));
expect(readFileAsString(changelog.archiveFilePath)).toBe(
dedent`
<a name="2.0.0"></a>
${splitMarker}
<a name="1.0.0"></a>
`.trim(),
);
expect(readFileAsString(changelog.filePath)).toBe(`<a name="3.0.0"></a>`);
});
describe('adds entries to the changelog', () => {
it('creates a new changelog file if one does not exist.', () => {
expect(existsSync(changelog.filePath)).toBe(false);
Changelog.prependEntryToChangelogFile(gitClient, createChangelogEntry('0.0.0'));
expect(existsSync(changelog.filePath)).toBe(true);
});
it('should not include a split marker when only one changelog entry is in the changelog.', () => {
Changelog.prependEntryToChangelogFile(gitClient, createChangelogEntry('0.0.0'));
expect(readFileAsString(changelog.filePath)).not.toContain(splitMarker);
});
it('separates multiple changelog entries using a standard split marker', () => {
for (let i = 0; i < 2; i++) {
Changelog.prependEntryToChangelogFile(gitClient, createChangelogEntry(`0.0.${i}`));
}
expect(readFileAsString(changelog.filePath)).toContain(splitMarker);
});
});
describe('adds entries to the changelog archive', () => {
it('only updates or creates the changelog archive if necessary', () => {
Changelog.prependEntryToChangelogFile(gitClient, createChangelogEntry('1.0.0'));
expect(existsSync(changelog.archiveFilePath)).toBe(false);
Changelog.moveEntriesPriorToVersionToArchive(gitClient, new semver.SemVer('1.0.0'));
expect(existsSync(changelog.archiveFilePath)).toBe(false);
Changelog.moveEntriesPriorToVersionToArchive(gitClient, new semver.SemVer('2.0.0'));
expect(existsSync(changelog.archiveFilePath)).toBe(true);
});
it('from the primary changelog older than a provided version', () => {
Changelog.prependEntryToChangelogFile(
gitClient,
createChangelogEntry('1.0.0', 'This is version 1'),
);
Changelog.prependEntryToChangelogFile(
gitClient,
createChangelogEntry('2.0.0', 'This is version 2'),
);
Changelog.prependEntryToChangelogFile(
gitClient,
createChangelogEntry('3.0.0', 'This is version 3'),
);
Changelog.moveEntriesPriorToVersionToArchive(gitClient, new semver.SemVer('3.0.0'));
expect(readFileAsString(changelog.archiveFilePath)).toContain('version 1');
expect(readFileAsString(changelog.archiveFilePath)).toContain('version 2');
expect(readFileAsString(changelog.archiveFilePath)).not.toContain('version 3');
});
});
describe('removes entries for all prereleases of major or minor versions', () => {
it('only removes the prerelease entries from the matching minor versions', () => {
Changelog.prependEntryToChangelogFile(gitClient, createChangelogEntry('1.0.0-next.0'));
Changelog.prependEntryToChangelogFile(gitClient, createChangelogEntry('1.0.0'));
Changelog.prependEntryToChangelogFile(gitClient, createChangelogEntry('1.1.0-next.0'));
Changelog.prependEntryToChangelogFile(gitClient, createChangelogEntry('1.1.0-rc.0'));
Changelog.removePrereleaseEntriesForVersion(gitClient, new semver.SemVer('1.1.0'));
expect(readFileAsString(changelog.filePath)).toContain('1.0.0-next.0');
expect(readFileAsString(changelog.filePath)).toContain('1.0.0');
expect(readFileAsString(changelog.filePath)).not.toContain('1.1.0-next.0');
expect(readFileAsString(changelog.filePath)).not.toContain('1.1.0-rc.0');
});
it('only removes the prerelease entries from the matching major versions', () => {
Changelog.prependEntryToChangelogFile(gitClient, createChangelogEntry('1.0.0-next.0'));
Changelog.prependEntryToChangelogFile(gitClient, createChangelogEntry('1.0.0'));
Changelog.prependEntryToChangelogFile(gitClient, createChangelogEntry('2.0.0-next.0'));
Changelog.prependEntryToChangelogFile(gitClient, createChangelogEntry('2.0.0-rc.0'));
Changelog.removePrereleaseEntriesForVersion(gitClient, new semver.SemVer('2.0.0'));
expect(readFileAsString(changelog.filePath)).toContain('1.0.0-next.0');
expect(readFileAsString(changelog.filePath)).toContain('1.0.0');
expect(readFileAsString(changelog.filePath)).not.toContain('2.0.0-next.0');
expect(readFileAsString(changelog.filePath)).not.toContain('2.0.0-rc.0');
});
});
});
function readFileAsString(file: string) {
return readFileSync(file, {encoding: 'utf8'});
}
function createChangelogEntry(version: string, content = '') {
return dedent`
<a name="${version}"></a>
${content}
`;
}