Skip to content

Commit 6185f87

Browse files
committed
fix(cockpit): fix test mocks for healthStore.poll after activation
poll() uses Promise.allSettled but crashes synchronously on Object.values(undefined.services) when getServicesHealth returns undefined. Fix: add proper mock return values for getLiveness, getServicesHealth and getActiveConfig in both test files.
1 parent 9f1a1a8 commit 6185f87

4 files changed

Lines changed: 17 additions & 4 deletions

File tree

edge/cockpit/src/features/station-config/composables/__tests__/useConfigEditor.test.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ vi.mock('../../../system-health/api/healthRepository', () => ({
2121
}))
2222

2323
import * as configRepository from '../../api/configRepository'
24+
import * as healthRepository from '../../../system-health/api/healthRepository'
2425

2526
const STORAGE = { storage_type: 'filesystem', target_directory: 'data' }
2627

@@ -69,6 +70,8 @@ beforeEach(() => {
6970
;(configRepository.saveConfig as ReturnType<typeof vi.fn>).mockResolvedValue(undefined)
7071
;(configRepository.deleteConfig as ReturnType<typeof vi.fn>).mockResolvedValue(undefined)
7172
;(configRepository.getActiveConfig as ReturnType<typeof vi.fn>).mockResolvedValue(null)
73+
;(healthRepository.getLiveness as ReturnType<typeof vi.fn>).mockResolvedValue(true)
74+
;(healthRepository.getServicesHealth as ReturnType<typeof vi.fn>).mockResolvedValue({ services: {} })
7275
})
7376

7477
// ─── isDirty ────────────────────────────────────────────────────────────────

edge/cockpit/src/features/station-config/composables/useConfigEditor.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -196,8 +196,7 @@ export function useConfigEditor({
196196
activating.value = name
197197
try {
198198
await configRepository.activateConfig(name)
199-
const config = configs.value.find((c: any) => c.station_name === name) ?? null
200-
healthStore.setActiveConfigName(name, config)
199+
await healthStore.poll()
201200
notify(`Config "${name}" activated`)
202201
} catch (e: any) {
203202
const detail = e?.response?.data?.detail

edge/cockpit/src/features/system-health/stores/healthStore.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,9 @@ export const useHealthStore = defineStore('health', () => {
4646
if (timer !== null) { clearInterval(timer); timer = null }
4747
}
4848

49-
function setActiveConfigName(name: string | null, config: StationConfig | null = null) {
49+
function setActiveConfigName(name: string | null) {
5050
activeConfigName.value = name
51-
activeConfig.value = name === null ? null : config
51+
if (name === null) activeConfig.value = null
5252
}
5353

5454
return {

edge/cockpit/src/pages/__tests__/TechnicianPage.test.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,12 @@ vi.mock('../../features/station-config/api/configRepository', () => ({
1414
createConfig: vi.fn(),
1515
saveConfig: vi.fn(),
1616
deleteConfig: vi.fn(),
17+
getActiveConfig: vi.fn(),
18+
}))
19+
20+
vi.mock('../../features/system-health/api/healthRepository', () => ({
21+
getLiveness: vi.fn(),
22+
getServicesHealth: vi.fn(),
1723
}))
1824

1925
vi.mock('../../features/station-config/api/discoveryRepository', () => ({
@@ -25,6 +31,7 @@ vi.mock('../../features/station-config/api/discoveryRepository', () => ({
2531

2632
import * as configRepository from '../../features/station-config/api/configRepository'
2733
import * as discoveryRepository from '../../features/station-config/api/discoveryRepository'
34+
import * as healthRepository from '../../features/system-health/api/healthRepository'
2835

2936
const vuetify = createVuetify({ components, directives })
3037

@@ -81,6 +88,9 @@ beforeEach(() => {
8188
configRepository.createConfig.mockResolvedValue(undefined)
8289
configRepository.saveConfig.mockResolvedValue(undefined)
8390
configRepository.deleteConfig.mockResolvedValue(undefined)
91+
configRepository.getActiveConfig.mockResolvedValue(null)
92+
healthRepository.getLiveness.mockResolvedValue(true)
93+
healthRepository.getServicesHealth.mockResolvedValue({ services: {} })
8494
discoveryRepository.getCamerasAvailable.mockResolvedValue({ cameras: DISCOVERY_DEFAULTS.cameras })
8595
discoveryRepository.getModelsAvailable.mockResolvedValue({ models: DISCOVERY_DEFAULTS.models })
8696
discoveryRepository.getConfigOptions.mockResolvedValue(DISCOVERY_DEFAULTS.options)
@@ -157,6 +167,7 @@ describe('TechnicianView', () => {
157167
it('calls activateConfig on Activate button click for non-active config', async () => {
158168
const CONFIG_2 = { ...CONFIG_1, station_name: 'config_2' }
159169
configRepository.getConfigs.mockResolvedValue([CONFIG_1, CONFIG_2])
170+
configRepository.getActiveConfig.mockResolvedValue(CONFIG_2)
160171
// config_1 is active, config_2 is not
161172

162173
const wrapper = mountView()

0 commit comments

Comments
 (0)