Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 45 additions & 4 deletions electron/src/services/update/update.service.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,13 @@ describe('UpdateService', () => {
html_url:
'https://github.com/altaskur/OpenTimeTracker/releases/tag/v2.0.0',
body: 'Release notes for v2.0.0',
draft: false,
prerelease: false,
};

mockFetch.mockResolvedValue({
ok: true,
json: () => Promise.resolve(mockRelease),
json: () => Promise.resolve([mockRelease]),
});

const result = await updateService.checkForUpdates();
Expand All @@ -43,11 +45,13 @@ describe('UpdateService', () => {
html_url:
'https://github.com/altaskur/OpenTimeTracker/releases/tag/v1.0.0',
body: 'Current version notes',
draft: false,
prerelease: false,
};

mockFetch.mockResolvedValue({
ok: true,
json: () => Promise.resolve(mockRelease),
json: () => Promise.resolve([mockRelease]),
});

const result = await updateService.checkForUpdates();
Expand All @@ -62,11 +66,13 @@ describe('UpdateService', () => {
html_url:
'https://github.com/altaskur/OpenTimeTracker/releases/tag/v0.9.0',
body: 'Old version notes',
draft: false,
prerelease: false,
};

mockFetch.mockResolvedValue({
ok: true,
json: () => Promise.resolve(mockRelease),
json: () => Promise.resolve([mockRelease]),
});

const result = await updateService.checkForUpdates();
Expand Down Expand Up @@ -103,18 +109,51 @@ describe('UpdateService', () => {
html_url:
'https://github.com/altaskur/OpenTimeTracker/releases/tag/2.0.0',
body: 'Notes',
draft: false,
prerelease: false,
};

mockFetch.mockResolvedValue({
ok: true,
json: () => Promise.resolve(mockRelease),
json: () => Promise.resolve([mockRelease]),
});

const result = await updateService.checkForUpdates();

expect(result.updateAvailable).toBe(true);
expect(result.version).toBe('2.0.0');
});

it('should ignore draft releases', async () => {
const mockReleases = [
{
tag_name: 'v2.0.0',
html_url:
'https://github.com/altaskur/OpenTimeTracker/releases/tag/v2.0.0',
body: 'Draft release',
draft: true,
prerelease: false,
},
{
tag_name: 'v1.0.0',
html_url:
'https://github.com/altaskur/OpenTimeTracker/releases/tag/v1.0.0',
body: 'Release notes',
draft: false,
prerelease: false,
},
];

mockFetch.mockResolvedValue({
ok: true,
json: () => Promise.resolve(mockReleases),
});

const result = await updateService.checkForUpdates();

expect(result.updateAvailable).toBe(false);
expect(result.version).toBe('1.0.0');
});
});

describe('getReleaseByTag', () => {
Expand All @@ -124,6 +163,8 @@ describe('UpdateService', () => {
html_url:
'https://github.com/altaskur/OpenTimeTracker/releases/tag/v1.0.0',
body: 'Release notes for v1.0.0',
draft: false,
prerelease: false,
};

mockFetch.mockResolvedValue({
Expand Down
19 changes: 14 additions & 5 deletions electron/src/services/update/update.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,13 @@ interface GitHubRelease {
tag_name: string;
html_url: string;
body: string;
draft: boolean;
prerelease: boolean;
}

export class UpdateService {
private readonly GITHUB_API_URL =
'https://api.github.com/repos/altaskur/OpenTimeTracker/releases/latest';
'https://api.github.com/repos/altaskur/OpenTimeTracker/releases';

async checkForUpdates(): Promise<UpdateCheckResult> {
try {
Expand All @@ -31,8 +33,15 @@ export class UpdateService {
return { updateAvailable: false, version: '', url: '' };
}

const release = (await response.json()) as GitHubRelease;
const latestVersion = release.tag_name.replace(/^v/, '');
const releases = (await response.json()) as GitHubRelease[];
// Filter out drafts, but allow prereleases since we are in alpha
const latestRelease = releases.find((r) => !r.draft);

if (!latestRelease) {
return { updateAvailable: false, version: '', url: '' };
}

const latestVersion = latestRelease.tag_name.replace(/^v/, '');
const currentVersion = app.getVersion();

const updateAvailable =
Expand All @@ -41,8 +50,8 @@ export class UpdateService {
return {
updateAvailable,
version: latestVersion,
url: release.html_url,
releaseNotes: release.body,
url: latestRelease.html_url,
releaseNotes: latestRelease.body,
};
} catch (error) {
console.error('Error checking for updates:', error);
Expand Down