Skip to content

Commit 121eec7

Browse files
committed
test: add and update tests
1 parent 326eb87 commit 121eec7

8 files changed

Lines changed: 161 additions & 26 deletions

File tree

src/renderer/components/history.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ export class GistHistoryDialog extends React.Component<
145145
);
146146
}
147147

148-
private renderRevisionItem = (revision: GistRevision, index: number) => {
148+
private renderRevisionItem = (revision: GistRevision) => {
149149
const date = new Date(revision.date).toLocaleString();
150150
const shortSha = revision.sha.substring(0, 7);
151151
const isActive = this.props.activeRevision === revision.sha;

src/renderer/components/version-select.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ type ListEntry =
4545
| { type: 'header'; label: string }
4646
| { type: 'item'; item: RunnableVersion; originalIndex: number };
4747

48-
const HEADER_HEIGHT = 28;
4948
const ITEM_HEIGHT = 30;
5049

5150
const FixedSizeListItem = ({ index, data, style }: ListChildComponentProps) => {

src/renderer/utils/sort-versions.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,11 @@ export function semverCompare(
4545
a !== null && b !== null && a.compareMain(b) === 0;
4646

4747
// Check that major.minor.patch are the same for a and b.
48-
if (a === 'v3.0.0' || b === 'v2.0.0') throw new Error('hey');
4948
if (
5049
sameMain(pA, pB) &&
5150
pA?.prerelease.length !== 0 &&
5251
pB?.prerelease.length !== 0
5352
) {
54-
if (a === 'v3.0.0' || b === 'v3.0.0') throw new Error('hey');
5553
return preCompare(pA?.prerelease as string[], pB?.prerelease as string[]);
5654
}
5755

tests/renderer/components/dialog-add-version.spec.tsx

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ describe('AddVersionDialog component', () => {
2929

3030
act(() => {
3131
instance.setState({
32-
isValidVersion: true,
32+
isValidName: true,
3333
isValidElectron: true,
3434
folderPath: mockFile,
3535
});
@@ -41,7 +41,7 @@ describe('AddVersionDialog component', () => {
4141

4242
act(() => {
4343
instance.setState({
44-
isValidVersion: false,
44+
isValidName: false,
4545
isValidElectron: true,
4646
folderPath: mockFile,
4747
});
@@ -53,7 +53,7 @@ describe('AddVersionDialog component', () => {
5353

5454
act(() => {
5555
instance.setState({
56-
isValidVersion: true,
56+
isValidName: true,
5757
isValidElectron: true,
5858
existingLocalVersion: {
5959
version: '2.2.2',
@@ -111,7 +111,7 @@ describe('AddVersionDialog component', () => {
111111
});
112112
});
113113

114-
describe('onChangeVersion()', () => {
114+
describe('onChangeName()', () => {
115115
it('handles valid input', () => {
116116
store.isAddVersionDialogShowing = true;
117117
const { instance } = renderClassComponentWithInstanceRef(
@@ -120,12 +120,12 @@ describe('AddVersionDialog component', () => {
120120
);
121121

122122
act(() => {
123-
instance.onChangeVersion({
123+
instance.onChangeName({
124124
target: { value: '3.3.3' },
125125
} as any);
126126
});
127-
expect(instance.state.isValidVersion).toBe(true);
128-
expect(instance.state.version).toBe('3.3.3');
127+
expect(instance.state.isValidName).toBe(true);
128+
expect(instance.state.name).toBe('3.3.3');
129129
});
130130

131131
it('handles invalid input', () => {
@@ -136,16 +136,16 @@ describe('AddVersionDialog component', () => {
136136
);
137137

138138
act(() => {
139-
instance.onChangeVersion({ target: { value: 'foo' } } as any);
139+
instance.onChangeName({ target: { value: ' ' } } as any);
140140
});
141-
expect(instance.state.isValidVersion).toBe(false);
142-
expect(instance.state.version).toBe('foo');
141+
expect(instance.state.isValidName).toBe(false);
142+
expect(instance.state.name).toBe(' ');
143143

144144
act(() => {
145-
instance.onChangeVersion({ target: {} } as any);
145+
instance.onChangeName({ target: {} } as any);
146146
});
147-
expect(instance.state.isValidVersion).toBe(false);
148-
expect(instance.state.version).toBe('');
147+
expect(instance.state.isValidName).toBe(false);
148+
expect(instance.state.name).toBe('');
149149
});
150150
});
151151

@@ -171,7 +171,7 @@ describe('AddVersionDialog component', () => {
171171

172172
act(() => {
173173
instance.setState({
174-
version: '3.3.3',
174+
name: '3.3.3',
175175
folderPath: '/test/path',
176176
});
177177
});
@@ -182,7 +182,7 @@ describe('AddVersionDialog component', () => {
182182
expect(store.addLocalVersion).toHaveBeenCalledWith(
183183
expect.objectContaining({
184184
localPath: '/test/path',
185-
version: '3.3.3',
185+
name: '3.3.3',
186186
}),
187187
);
188188
});
@@ -198,7 +198,7 @@ describe('AddVersionDialog component', () => {
198198
instance.setState({
199199
isValidElectron: true,
200200
folderPath: '/test/path',
201-
version: '3.3.3',
201+
name: '3.3.3',
202202
existingLocalVersion: {
203203
version: '2.2.2',
204204
localPath: '/test/path',

tests/renderer/components/settings-electron.spec.tsx

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,8 @@ describe('ElectronSettings component', () => {
6464
{
6565
source: VersionSource.local,
6666
state: InstallState.installed,
67-
version: '3.0.0',
67+
version: '0.0.0-local.123',
68+
name: 'My Local Build',
6869
},
6970
{
7071
source: VersionSource.remote,
@@ -94,14 +95,16 @@ describe('ElectronSettings component', () => {
9495

9596
const localVer1: RunnableVersion = {
9697
state: InstallState.installed,
97-
version: '3.0.0-nightly.1',
98+
version: '0.0.0-local.1',
9899
source: VersionSource.local,
100+
name: 'Build One',
99101
};
100102

101103
const localVer2: RunnableVersion = {
102104
state: InstallState.installed,
103-
version: '3.0.0',
105+
version: '0.0.0-local.2',
104106
source: VersionSource.local,
107+
name: 'Build Two',
105108
};
106109

107110
store.versions['3.0.0-nightly.1'] = localVer1;
@@ -146,6 +149,7 @@ describe('ElectronSettings component', () => {
146149
source: VersionSource.local,
147150
state: InstallState.missing,
148151
version,
152+
name: 'Missing Build',
149153
};
150154
store.versions = { version: ver };
151155
store.versionsToShow = [ver];

tests/renderer/components/version-select.spec.tsx

Lines changed: 81 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {
1212
import {
1313
VersionSelect,
1414
filterItems,
15+
getItemDisplayText,
1516
getItemIcon,
1617
getItemLabel,
1718
renderItem,
@@ -78,20 +79,62 @@ describe('VersionSelect component', () => {
7879

7980
const { queryAllByTestId } = render(item);
8081

82+
expect(queryAllByTestId('disabled-menu-item')).toHaveLength(0);
83+
});
84+
it('does not disable local versions even when disableDownload returns true', () => {
85+
vi.mocked(disableDownload).mockReturnValueOnce(true);
86+
87+
const localVersion: RunnableVersion = {
88+
...mockVersion1,
89+
source: local,
90+
state: installed,
91+
name: 'My Build',
92+
};
93+
94+
const item = renderItem(localVersion, {
95+
handleClick: () => ({}),
96+
index: 0,
97+
modifiers: { active: true, disabled: false, matchesPredicate: true },
98+
query: '',
99+
})!;
100+
101+
const { queryAllByTestId } = render(item);
102+
81103
expect(queryAllByTestId('disabled-menu-item')).toHaveLength(0);
82104
});
83105
});
84106

85-
describe('getItemLabel()', () => {
107+
describe('getItemDisplayText()', () => {
108+
it('returns name for local versions', () => {
109+
const input: RunnableVersion = {
110+
...mockVersion1,
111+
source: local,
112+
state: installed,
113+
name: 'My Debug Build',
114+
};
115+
expect(getItemDisplayText(input)).toBe('My Debug Build');
116+
});
117+
118+
it('returns "Local Build" for local versions without a name', () => {
119+
const input: RunnableVersion = {
120+
...mockVersion1,
121+
source: local,
122+
state: installed,
123+
};
124+
expect(getItemDisplayText(input)).toBe('Local Build');
125+
});
126+
127+
it('returns version string for remote versions', () => {
128+
expect(getItemDisplayText(mockVersion1)).toBe(mockVersion1.version);
129+
});
86130
it('returns the correct label for an available local version', () => {
87131
const input: RunnableVersion = {
88132
...mockVersion1,
89133
state: installed,
90134
source: local,
91135
};
92136

93-
expect(getItemLabel(input)).toBe('Local');
94-
expect(getItemLabel({ ...input, name: 'Hi' })).toBe('Hi');
137+
expect(getItemLabel(input)).toBe('Local Build');
95138
});
96139

97140
it('returns the correct label for an unavailable local version', () => {
@@ -167,6 +210,41 @@ describe('VersionSelect component', () => {
167210
expect(filterItems('3', versions)).toEqual(expected);
168211
});
169212

213+
it('sorts local versions before remote versions', () => {
214+
const localVer = {
215+
version: '0.0.0-local.123',
216+
source: local,
217+
name: 'My Build',
218+
} as RunnableVersion;
219+
220+
const versions = [
221+
{ version: '14.3.0' },
222+
localVer,
223+
{ version: '3.0.0' },
224+
] as RunnableVersion[];
225+
226+
const result = filterItems('build', versions);
227+
// Only the local version matches 'build' (via name)
228+
expect(result).toEqual([localVer]);
229+
});
230+
231+
it('matches local versions by name', () => {
232+
const localVer = {
233+
version: '0.0.0-local.123',
234+
source: local,
235+
name: 'My Debug Build',
236+
} as RunnableVersion;
237+
238+
const versions = [
239+
{ version: '14.3.0' },
240+
localVer,
241+
{ version: '3.0.0' },
242+
] as RunnableVersion[];
243+
244+
const result = filterItems('debug', versions);
245+
expect(result).toEqual([localVer]);
246+
});
247+
170248
it('sorts in descending order when the query is non-numeric', () => {
171249
const versions = [
172250
{ version: '3.0.0' },

tests/renderer/state.spec.ts

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,38 @@ describe('AppState', () => {
270270
appState.showUndownloadedVersions = true;
271271
expect(appState.versionsToShow.length).toEqual(mockVersionsArray.length);
272272
});
273+
274+
it('always includes local versions regardless of filters', () => {
275+
const localVersion: RunnableVersion = {
276+
source: VersionSource.local,
277+
state: InstallState.installed,
278+
version: '0.0.0-local.123',
279+
name: 'My Build',
280+
};
281+
282+
appState.versions['0.0.0-local.123'] = localVersion;
283+
284+
// Local versions should appear even when channels exclude everything
285+
appState.channelsToShow = ['Unsupported' as any];
286+
const versions = appState.versionsToShow;
287+
expect(versions).toContainEqual(localVersion);
288+
expect(versions.length).toEqual(1);
289+
});
290+
291+
it('lists local versions before remote versions', () => {
292+
const localVersion: RunnableVersion = {
293+
source: VersionSource.local,
294+
state: InstallState.installed,
295+
version: '0.0.0-local.123',
296+
name: 'My Build',
297+
};
298+
299+
appState.versions['0.0.0-local.123'] = localVersion;
300+
appState.channelsToShow = [ElectronReleaseChannel.stable];
301+
302+
const versions = appState.versionsToShow;
303+
expect(versions[0]).toEqual(localVersion);
304+
});
273305
});
274306

275307
describe('showChannels()', () => {

tests/renderer/utils/sort-versions.spec.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,4 +63,28 @@ describe('sort-versions', () => {
6363
makeVersion('v2.0.0-nightly.20200101'),
6464
]);
6565
});
66+
67+
it('handles non-semver local version keys gracefully', () => {
68+
const localVersion: RunnableVersion = {
69+
source: VersionSource.local,
70+
state: InstallState.installed,
71+
version: '0.0.0-local.1234567890',
72+
name: 'My Build',
73+
};
74+
75+
const unsorted: RunnableVersion[] = [
76+
makeVersion('v1.0.0'),
77+
localVersion,
78+
makeVersion('v3.0.0'),
79+
makeVersion('v2.0.0'),
80+
];
81+
82+
const sorted = sortVersions([...unsorted]);
83+
84+
// Local version key (0.0.0-local.xxx) sorts after real semver
85+
expect(sorted[0]).toStrictEqual(makeVersion('v3.0.0'));
86+
expect(sorted[1]).toStrictEqual(makeVersion('v2.0.0'));
87+
expect(sorted[2]).toStrictEqual(makeVersion('v1.0.0'));
88+
expect(sorted[3]).toStrictEqual(localVersion);
89+
});
6690
});

0 commit comments

Comments
 (0)