diff --git a/src/renderer/__mocks__/state-mocks.ts b/src/renderer/__mocks__/state-mocks.ts index d625cf808..4b3eb4232 100644 --- a/src/renderer/__mocks__/state-mocks.ts +++ b/src/renderer/__mocks__/state-mocks.ts @@ -50,6 +50,7 @@ export const mockGitHubCloudAccount: Account = { token: 'token-123-456' as Token, hostname: Constants.DEFAULT_AUTH_OPTIONS.hostname, user: mockGitifyUser, + version: 'latest', }; export const mockGitHubEnterpriseServerAccount: Account = { diff --git a/src/renderer/utils/auth/utils.test.ts b/src/renderer/utils/auth/utils.test.ts index 48561fd17..deb736b04 100644 --- a/src/renderer/utils/auth/utils.test.ts +++ b/src/renderer/utils/auth/utils.test.ts @@ -253,6 +253,30 @@ describe('renderer/utils/auth/utils.ts', () => { }); }); + it('extractHostVersion', () => { + expect(auth.extractHostVersion(null)).toBe('latest'); + + expect(auth.extractHostVersion('foo')).toBe(null); + + expect(auth.extractHostVersion('3')).toBe('3.0.0'); + + expect(auth.extractHostVersion('3.15')).toBe('3.15.0'); + + expect(auth.extractHostVersion('3.15.0')).toBe('3.15.0'); + + expect(auth.extractHostVersion('3.15.0-beta1')).toBe('3.15.0'); + + expect(auth.extractHostVersion('enterprise-server@3')).toBe('3.0.0'); + + expect(auth.extractHostVersion('enterprise-server@3.15')).toBe('3.15.0'); + + expect(auth.extractHostVersion('enterprise-server@3.15.0')).toBe('3.15.0'); + + expect(auth.extractHostVersion('enterprise-server@3.15.0-beta1')).toBe( + '3.15.0', + ); + }); + it('getDeveloperSettingsURL', () => { expect( auth.getDeveloperSettingsURL({ diff --git a/src/renderer/utils/auth/utils.ts b/src/renderer/utils/auth/utils.ts index d79fcbce0..09f3adda2 100644 --- a/src/renderer/utils/auth/utils.ts +++ b/src/renderer/utils/auth/utils.ts @@ -1,6 +1,7 @@ import { BrowserWindow } from '@electron/remote'; import { format } from 'date-fns'; import log from 'electron-log'; +import semver from 'semver'; import type { Account, AuthCode, @@ -165,8 +166,9 @@ export async function refreshAccount(account: Account): Promise { avatar: res.data.avatar_url, }; - // Refresh platform version - account.version = res.headers['x-github-enterprise-version'] ?? 'latest'; + account.version = extractHostVersion( + res.headers['x-github-enterprise-version'], + ); } catch (error) { log.error('Failed to refresh account', error); } @@ -174,6 +176,14 @@ export async function refreshAccount(account: Account): Promise { return account; } +export function extractHostVersion(version: string | null): string { + if (version) { + return semver.valid(semver.coerce(version)); + } + + return 'latest'; +} + export function getDeveloperSettingsURL(account: Account): Link { const settingsURL = new URL(`https://${account.hostname}`); diff --git a/src/renderer/utils/features.test.ts b/src/renderer/utils/features.test.ts index 35b4cb980..b2a31885a 100644 --- a/src/renderer/utils/features.test.ts +++ b/src/renderer/utils/features.test.ts @@ -26,21 +26,12 @@ describe('renderer/utils/features.ts', () => { it('should return true for GitHub Enterprise Server >= v3.13', () => { const account = { ...mockGitHubEnterpriseServerAccount, - version: '3.13.3', + version: '3.13.0', }; expect(isMarkAsDoneFeatureSupported(account)).toBe(true); }); - it('should return false for GitHub Enterprise Server when partial version available', () => { - const account = { - ...mockGitHubEnterpriseServerAccount, - version: '3', - }; - - expect(isMarkAsDoneFeatureSupported(account)).toBe(false); - }); - it('should return false for GitHub Enterprise Server when no version available', () => { const account = { ...mockGitHubEnterpriseServerAccount, @@ -70,21 +61,12 @@ describe('renderer/utils/features.ts', () => { it('should return true for GitHub Enterprise Server >= v3.12', () => { const account = { ...mockGitHubEnterpriseServerAccount, - version: '3.12.3', + version: '3.12.0', }; expect(isAnsweredDiscussionFeatureSupported(account)).toBe(true); }); - it('should return false for GitHub Enterprise Server when partial version available', () => { - const account = { - ...mockGitHubEnterpriseServerAccount, - version: '3', - }; - - expect(isAnsweredDiscussionFeatureSupported(account)).toBe(false); - }); - it('should return false for GitHub Enterprise Server when no version available', () => { const account = { ...mockGitHubEnterpriseServerAccount, diff --git a/src/renderer/utils/features.ts b/src/renderer/utils/features.ts index 88e90bff3..cf6d3301f 100644 --- a/src/renderer/utils/features.ts +++ b/src/renderer/utils/features.ts @@ -11,7 +11,7 @@ import { isEnterpriseServerHost } from './helpers'; export function isMarkAsDoneFeatureSupported(account: Account): boolean { if (isEnterpriseServerHost(account.hostname)) { if (account.version) { - return semver.gte(semver.coerce(account.version), '3.13.0'); + return semver.gte(account.version, '3.13.0'); } return false; @@ -30,7 +30,7 @@ export function isAnsweredDiscussionFeatureSupported( ): boolean { if (isEnterpriseServerHost(account.hostname)) { if (account.version) { - return semver.gte(semver.coerce(account.version), '3.12.0'); + return semver.gte(account.version, '3.12.0'); } return false;