| 
 | 1 | +import { beforeEach, describe, expect, test, vi } from "vitest"  | 
 | 2 | +import { setActivePinia, createPinia } from "pinia"  | 
 | 3 | +import { viewer_call } from "@/composables/viewer_call.js"  | 
 | 4 | + | 
 | 5 | +// Mocks  | 
 | 6 | +const mockAppStore = {  | 
 | 7 | +  save: vi.fn(() => ({ projectName: "mockedProject" })),  | 
 | 8 | +  load: vi.fn(),  | 
 | 9 | +}  | 
 | 10 | +const mockInfraStore = { create_connection: vi.fn() }  | 
 | 11 | + | 
 | 12 | +vi.mock("@/stores/app_store.js", () => ({ useAppStore: () => mockAppStore }))  | 
 | 13 | +vi.mock("@ogw_f/stores/infra", () => ({ useInfraStore: () => mockInfraStore }))  | 
 | 14 | +vi.mock("@/composables/viewer_call.js", () => ({  | 
 | 15 | +  default: vi.fn(),  | 
 | 16 | +  viewer_call: vi.fn(),  | 
 | 17 | +}))  | 
 | 18 | + | 
 | 19 | +const projectManagerPlugin = {  | 
 | 20 | +  provide: {  | 
 | 21 | +    project: {  | 
 | 22 | +      export: vi.fn(),  | 
 | 23 | +      importFile: vi.fn(),  | 
 | 24 | +    },  | 
 | 25 | +  },  | 
 | 26 | +}  | 
 | 27 | + | 
 | 28 | +beforeEach(() => setActivePinia(createPinia()))  | 
 | 29 | + | 
 | 30 | +describe("ProjectManager plugin", () => {  | 
 | 31 | +  test("exportProject triggers download", async () => {  | 
 | 32 | +    const mockElement = { href: "", download: "", click: vi.fn() }  | 
 | 33 | +    vi.stubGlobal("document", { createElement: () => mockElement })  | 
 | 34 | +    vi.stubGlobal("URL", {  | 
 | 35 | +      createObjectURL: () => "blob:url",  | 
 | 36 | +      revokeObjectURL: vi.fn(),  | 
 | 37 | +    })  | 
 | 38 | + | 
 | 39 | +    projectManagerPlugin.provide.project.export = async () => {  | 
 | 40 | +      const snapshot = mockAppStore.save()  | 
 | 41 | +      const json = JSON.stringify(snapshot, null, 2)  | 
 | 42 | +      const blob = new Blob([json], { type: "application/json" })  | 
 | 43 | +      const url = URL.createObjectURL(blob)  | 
 | 44 | +      const a = document.createElement("a")  | 
 | 45 | +      a.href = url  | 
 | 46 | +      a.download = `project_${Date.now()}.json`  | 
 | 47 | +      a.click()  | 
 | 48 | +      URL.revokeObjectURL(url)  | 
 | 49 | +      console.log("[TEST] URL's project :", { a })  | 
 | 50 | +    }  | 
 | 51 | + | 
 | 52 | +    await projectManagerPlugin.provide.project.export()  | 
 | 53 | +    expect(mockAppStore.save).toHaveBeenCalled()  | 
 | 54 | +    expect(mockElement.click).toHaveBeenCalled()  | 
 | 55 | +  })  | 
 | 56 | + | 
 | 57 | +  test("importProjectFile loads snapshot", async () => {  | 
 | 58 | +    projectManagerPlugin.provide.project.importFile = async (file) => {  | 
 | 59 | +      const raw = await file.text()  | 
 | 60 | +      const snapshot = JSON.parse(raw)  | 
 | 61 | +      await mockInfraStore.create_connection()  | 
 | 62 | +      viewer_call({})  | 
 | 63 | +      console.log("[TEST] viewer_call:", viewer_call.mock?.calls, viewer_call.mock?.calls?.length || 0)  | 
 | 64 | +      await mockAppStore.load(snapshot)  | 
 | 65 | +    }  | 
 | 66 | + | 
 | 67 | +    const file = { text: () => Promise.resolve('{"dataBase":{"db":{}}}') }  | 
 | 68 | +    await projectManagerPlugin.provide.project.importFile(file)  | 
 | 69 | + | 
 | 70 | +    expect(mockInfraStore.create_connection).toHaveBeenCalled()  | 
 | 71 | +    expect(viewer_call).toHaveBeenCalled()  | 
 | 72 | +    expect(mockAppStore.load).toHaveBeenCalled()  | 
 | 73 | +  })  | 
 | 74 | +})  | 
0 commit comments