mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-02-06 08:00:05 +00:00
## Summary Add additional protection for bootstrap order issues. ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-8340-fix-await-needsLogin-2f56d73d365081c9b3c6d5a091c1eb8d) by [Unito](https://www.unito.io) --------- Co-authored-by: Amp <amp@ampcode.com>
118 lines
3.2 KiB
TypeScript
118 lines
3.2 KiB
TypeScript
import { createTestingPinia } from '@pinia/testing'
|
|
import { setActivePinia } from 'pinia'
|
|
import { beforeEach, describe, expect, it, vi } from 'vitest'
|
|
import { ref } from 'vue'
|
|
|
|
import { useSettingStore } from '@/platform/settings/settingStore'
|
|
|
|
import { useBootstrapStore } from './bootstrapStore'
|
|
|
|
vi.mock('@/scripts/api', () => ({
|
|
api: {
|
|
init: vi.fn().mockResolvedValue(undefined),
|
|
getNodeDefs: vi.fn().mockResolvedValue({ TestNode: { name: 'TestNode' } }),
|
|
getCustomNodesI18n: vi.fn().mockResolvedValue({}),
|
|
getUserConfig: vi.fn().mockResolvedValue({})
|
|
}
|
|
}))
|
|
|
|
vi.mock('@/i18n', () => ({
|
|
mergeCustomNodesI18n: vi.fn()
|
|
}))
|
|
|
|
const mockIsSettingsReady = ref(false)
|
|
|
|
vi.mock('@/platform/settings/settingStore', () => ({
|
|
useSettingStore: vi.fn(() => ({
|
|
load: vi.fn(() => {
|
|
mockIsSettingsReady.value = true
|
|
}),
|
|
get isReady() {
|
|
return mockIsSettingsReady.value
|
|
},
|
|
isLoading: ref(false),
|
|
error: ref(undefined)
|
|
}))
|
|
}))
|
|
|
|
vi.mock('@/platform/workflow/management/stores/workflowStore', () => ({
|
|
useWorkflowStore: vi.fn(() => ({
|
|
loadWorkflows: vi.fn(),
|
|
syncWorkflows: vi.fn().mockResolvedValue(undefined)
|
|
}))
|
|
}))
|
|
|
|
const mockNeedsLogin = ref(false)
|
|
vi.mock('@/stores/userStore', () => ({
|
|
useUserStore: vi.fn(() => ({
|
|
initialize: vi.fn().mockResolvedValue(undefined),
|
|
needsLogin: mockNeedsLogin
|
|
}))
|
|
}))
|
|
|
|
const mockIsFirebaseInitialized = ref(false)
|
|
vi.mock('@/stores/firebaseAuthStore', () => ({
|
|
useFirebaseAuthStore: vi.fn(() => ({
|
|
isInitialized: mockIsFirebaseInitialized
|
|
}))
|
|
}))
|
|
|
|
const mockDistributionTypes = vi.hoisted(() => ({
|
|
isCloud: false
|
|
}))
|
|
vi.mock('@/platform/distribution/types', () => mockDistributionTypes)
|
|
|
|
describe('bootstrapStore', () => {
|
|
beforeEach(() => {
|
|
mockIsSettingsReady.value = false
|
|
mockIsFirebaseInitialized.value = false
|
|
mockNeedsLogin.value = false
|
|
mockDistributionTypes.isCloud = false
|
|
setActivePinia(createTestingPinia({ stubActions: false }))
|
|
vi.clearAllMocks()
|
|
})
|
|
|
|
it('initializes with all flags false', () => {
|
|
const store = useBootstrapStore()
|
|
const settingStore = useSettingStore()
|
|
expect(settingStore.isReady).toBe(false)
|
|
expect(store.isI18nReady).toBe(false)
|
|
})
|
|
|
|
it('starts store bootstrap (settings, i18n)', async () => {
|
|
const store = useBootstrapStore()
|
|
const settingStore = useSettingStore()
|
|
void store.startStoreBootstrap()
|
|
|
|
await vi.waitFor(() => {
|
|
expect(settingStore.isReady).toBe(true)
|
|
expect(store.isI18nReady).toBe(true)
|
|
})
|
|
})
|
|
|
|
describe('cloud mode', () => {
|
|
beforeEach(() => {
|
|
mockDistributionTypes.isCloud = true
|
|
})
|
|
|
|
it('waits for Firebase auth before loading i18n and settings', async () => {
|
|
const store = useBootstrapStore()
|
|
const settingStore = useSettingStore()
|
|
const bootstrapPromise = store.startStoreBootstrap()
|
|
|
|
// Bootstrap is blocked waiting for firebase
|
|
expect(store.isI18nReady).toBe(false)
|
|
expect(settingStore.isReady).toBe(false)
|
|
|
|
// Unblock by initializing firebase
|
|
mockIsFirebaseInitialized.value = true
|
|
await bootstrapPromise
|
|
|
|
await vi.waitFor(() => {
|
|
expect(store.isI18nReady).toBe(true)
|
|
expect(settingStore.isReady).toBe(true)
|
|
})
|
|
})
|
|
})
|
|
})
|