[refactor] replace manual semver operations with semver package

Replace custom compareVersions and isSemVer functions with the robust semver package to handle version comparisons more reliably. This addresses edge cases and follows industry standards for semantic version handling.
This commit is contained in:
bymyself
2025-08-06 13:43:42 -07:00
committed by Christian Byrne
parent 85aa89da45
commit 9da2a5b6de
8 changed files with 99 additions and 104 deletions

View File

@@ -4,7 +4,6 @@ import { beforeEach, describe, expect, it, vi } from 'vitest'
import { useReleaseStore } from '@/stores/releaseStore'
// Mock the dependencies
vi.mock('@/utils/formatUtil')
vi.mock('@/utils/envUtil')
vi.mock('@/services/releaseService')
vi.mock('@/stores/settingStore')
@@ -107,18 +106,16 @@ describe('useReleaseStore', () => {
})
it('should show update button (shouldShowUpdateButton)', async () => {
const { compareVersions } = await import('@/utils/formatUtil')
vi.mocked(compareVersions).mockReturnValue(1) // newer version available
store.releases = [mockRelease]
// Mock system version to be older than release version
mockSystemStatsStore.systemStats.system.comfyui_version = '1.0.0'
store.releases = [mockRelease] // mockRelease has version 1.2.0
expect(store.shouldShowUpdateButton).toBe(true)
})
it('should not show update button when no new version', async () => {
const { compareVersions } = await import('@/utils/formatUtil')
vi.mocked(compareVersions).mockReturnValue(-1) // current version is newer
store.releases = [mockRelease]
// Mock system version to be newer than release version
mockSystemStatsStore.systemStats.system.comfyui_version = '1.3.0'
store.releases = [mockRelease] // mockRelease has version 1.2.0
expect(store.shouldShowUpdateButton).toBe(false)
})
})
@@ -137,8 +134,8 @@ describe('useReleaseStore', () => {
})
it('should show toast for medium/high attention releases', async () => {
const { compareVersions } = await import('@/utils/formatUtil')
vi.mocked(compareVersions).mockReturnValue(1)
// Mock system version to be older than release version
mockSystemStatsStore.systemStats.system.comfyui_version = '1.0.0'
// Need multiple releases for hasMediumOrHighAttention to work
const mediumRelease = {
@@ -152,16 +149,17 @@ describe('useReleaseStore', () => {
})
it('should show red dot for new versions', async () => {
const { compareVersions } = await import('@/utils/formatUtil')
vi.mocked(compareVersions).mockReturnValue(1)
// Mock system version to be older than release version
mockSystemStatsStore.systemStats.system.comfyui_version = '1.0.0'
store.releases = [mockRelease] // mockRelease has version 1.2.0
expect(store.shouldShowRedDot).toBe(true)
})
it('should show popup for latest version', async () => {
// Mock system version to match release version
mockSystemStatsStore.systemStats.system.comfyui_version = '1.2.0'
const { compareVersions } = await import('@/utils/formatUtil')
vi.mocked(compareVersions).mockReturnValue(0)
store.releases = [mockRelease] // mockRelease has version 1.2.0
expect(store.shouldShowPopup).toBe(true)
})
@@ -174,7 +172,8 @@ describe('useReleaseStore', () => {
expect(mockReleaseService.getReleases).toHaveBeenCalledWith({
project: 'comfyui',
current_version: '1.0.0',
form_factor: 'git-windows'
form_factor: 'git-windows',
locale: 'en'
})
})
})
@@ -188,23 +187,25 @@ describe('useReleaseStore', () => {
})
it('should not show toast even with new version available', async () => {
const { compareVersions } = await import('@/utils/formatUtil')
vi.mocked(compareVersions).mockReturnValue(1)
// Mock system version to be older than release version
mockSystemStatsStore.systemStats.system.comfyui_version = '1.0.0'
store.releases = [mockRelease] // mockRelease has version 1.2.0
expect(store.shouldShowToast).toBe(false)
})
it('should not show red dot even with new version available', async () => {
const { compareVersions } = await import('@/utils/formatUtil')
vi.mocked(compareVersions).mockReturnValue(1)
// Mock system version to be older than release version
mockSystemStatsStore.systemStats.system.comfyui_version = '1.0.0'
store.releases = [mockRelease] // mockRelease has version 1.2.0
expect(store.shouldShowRedDot).toBe(false)
})
it('should not show popup even for latest version', async () => {
// Mock system version to match release version
mockSystemStatsStore.systemStats.system.comfyui_version = '1.2.0'
const { compareVersions } = await import('@/utils/formatUtil')
vi.mocked(compareVersions).mockReturnValue(0)
store.releases = [mockRelease] // mockRelease has version 1.2.0
expect(store.shouldShowPopup).toBe(false)
})
@@ -233,7 +234,8 @@ describe('useReleaseStore', () => {
expect(mockReleaseService.getReleases).toHaveBeenCalledWith({
project: 'comfyui',
current_version: '1.0.0',
form_factor: 'git-windows'
form_factor: 'git-windows',
locale: 'en'
})
expect(store.releases).toEqual([mockRelease])
})
@@ -247,7 +249,8 @@ describe('useReleaseStore', () => {
expect(mockReleaseService.getReleases).toHaveBeenCalledWith({
project: 'comfyui',
current_version: '1.0.0',
form_factor: 'desktop-mac'
form_factor: 'desktop-mac',
locale: 'en'
})
})
@@ -373,8 +376,8 @@ describe('useReleaseStore', () => {
return null
})
const { compareVersions } = await import('@/utils/formatUtil')
vi.mocked(compareVersions).mockReturnValue(1)
// Mock system version to be older than release version
mockSystemStatsStore.systemStats.system.comfyui_version = '1.0.0'
const mediumRelease = { ...mockRelease, attention: 'medium' as const }
store.releases = [
@@ -387,29 +390,27 @@ describe('useReleaseStore', () => {
})
it('should show red dot for new versions', async () => {
const { compareVersions } = await import('@/utils/formatUtil')
vi.mocked(compareVersions).mockReturnValue(1)
mockSettingStore.get.mockImplementation((key: string) => {
if (key === 'Comfy.Notification.ShowVersionUpdates') return true
return null
})
store.releases = [mockRelease]
// Mock system version to be older than release version
mockSystemStatsStore.systemStats.system.comfyui_version = '1.0.0'
store.releases = [mockRelease] // mockRelease has version 1.2.0
expect(store.shouldShowRedDot).toBe(true)
})
it('should show popup for latest version', async () => {
mockSystemStatsStore.systemStats.system.comfyui_version = '1.2.0' // Same as release
mockSettingStore.get.mockImplementation((key: string) => {
if (key === 'Comfy.Notification.ShowVersionUpdates') return true
return null
})
const { compareVersions } = await import('@/utils/formatUtil')
vi.mocked(compareVersions).mockReturnValue(0) // versions are equal (latest version)
store.releases = [mockRelease]
// Mock system version to match release version
mockSystemStatsStore.systemStats.system.comfyui_version = '1.2.0' // Same as release
store.releases = [mockRelease] // mockRelease has version 1.2.0
expect(store.shouldShowPopup).toBe(true)
})
@@ -465,8 +466,8 @@ describe('useReleaseStore', () => {
})
it('should show toast when conditions are met', async () => {
const { compareVersions } = await import('@/utils/formatUtil')
vi.mocked(compareVersions).mockReturnValue(1)
// Mock system version to be older than release version
mockSystemStatsStore.systemStats.system.comfyui_version = '1.0.0'
// Need multiple releases for hasMediumOrHighAttention
const mediumRelease = {
@@ -480,16 +481,17 @@ describe('useReleaseStore', () => {
})
it('should show red dot when new version available', async () => {
const { compareVersions } = await import('@/utils/formatUtil')
vi.mocked(compareVersions).mockReturnValue(1)
// Mock system version to be older than release version
mockSystemStatsStore.systemStats.system.comfyui_version = '1.0.0'
store.releases = [mockRelease] // mockRelease has version 1.2.0
expect(store.shouldShowRedDot).toBe(true)
})
it('should show popup for latest version', async () => {
// Mock system version to match release version
mockSystemStatsStore.systemStats.system.comfyui_version = '1.2.0'
const { compareVersions } = await import('@/utils/formatUtil')
vi.mocked(compareVersions).mockReturnValue(0)
store.releases = [mockRelease] // mockRelease has version 1.2.0
expect(store.shouldShowPopup).toBe(true)
})
@@ -502,8 +504,8 @@ describe('useReleaseStore', () => {
})
it('should NOT show toast even when all other conditions are met', async () => {
const { compareVersions } = await import('@/utils/formatUtil')
vi.mocked(compareVersions).mockReturnValue(1)
// Mock system version to be older than release version
mockSystemStatsStore.systemStats.system.comfyui_version = '1.0.0'
// Set up all conditions that would normally show toast
const mediumRelease = {
@@ -517,15 +519,16 @@ describe('useReleaseStore', () => {
})
it('should NOT show red dot even when new version available', async () => {
const { compareVersions } = await import('@/utils/formatUtil')
vi.mocked(compareVersions).mockReturnValue(1)
// Mock system version to be older than release version
mockSystemStatsStore.systemStats.system.comfyui_version = '1.0.0'
store.releases = [mockRelease] // mockRelease has version 1.2.0
expect(store.shouldShowRedDot).toBe(false)
})
it('should NOT show toast regardless of attention level', async () => {
const { compareVersions } = await import('@/utils/formatUtil')
vi.mocked(compareVersions).mockReturnValue(1)
// Mock system version to be older than release version
mockSystemStatsStore.systemStats.system.comfyui_version = '1.0.0'
// Test with high attention releases
const highRelease = {
@@ -544,8 +547,8 @@ describe('useReleaseStore', () => {
})
it('should NOT show red dot even with high attention release', async () => {
const { compareVersions } = await import('@/utils/formatUtil')
vi.mocked(compareVersions).mockReturnValue(1)
// Mock system version to be older than release version
mockSystemStatsStore.systemStats.system.comfyui_version = '1.0.0'
store.releases = [{ ...mockRelease, attention: 'high' as const }]
@@ -553,9 +556,9 @@ describe('useReleaseStore', () => {
})
it('should NOT show popup even for latest version', async () => {
// Mock system version to match release version
mockSystemStatsStore.systemStats.system.comfyui_version = '1.2.0'
const { compareVersions } = await import('@/utils/formatUtil')
vi.mocked(compareVersions).mockReturnValue(0)
store.releases = [mockRelease] // mockRelease has version 1.2.0
expect(store.shouldShowPopup).toBe(false)
})