Skip to content

Commit 98991cf

Browse files
committed
test
1 parent 97072b5 commit 98991cf

File tree

3 files changed

+118
-70
lines changed

3 files changed

+118
-70
lines changed

composables/project_manager.js

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import { useAppStore } from "@/stores/app.js"
2+
import { useInfraStore } from "@ogw_f/stores/infra"
3+
import { viewer_call } from "@/composables/viewer_call.js"
4+
import { useGeodeStore } from "@/stores/geode.js"
5+
import back_schemas from "@geode/opengeodeweb-back/opengeodeweb_back_schemas.json"
6+
import viewer_schemas from "@geode/opengeodeweb-viewer/opengeodeweb_viewer_schemas.json"
7+
8+
export function useProjectManager() {
9+
const appStore = useAppStore()
10+
const geode = useGeodeStore()
11+
12+
async function exportProject() {
13+
geode.start_request()
14+
try {
15+
await useInfraStore().create_connection()
16+
const snapshot = appStore.exportStore()
17+
18+
const schema = back_schemas.opengeodeweb_back.project.export_project
19+
const url = `${geode.base_url}${schema.route}`
20+
const method = schema.methods[0]
21+
22+
const response = await fetch(url, {
23+
method,
24+
headers: { "Content-Type": "application/json" },
25+
body: JSON.stringify({ snapshot }),
26+
})
27+
if (!response.ok) {
28+
throw new Error(`Export failed: ${response.statusText}`)
29+
}
30+
const blob = await response.blob()
31+
const filename =
32+
response.headers.get("new-file-name")
33+
const urlObject = URL.createObjectURL(blob)
34+
const a = document.createElement("a")
35+
a.href = urlObject
36+
a.download = filename
37+
a.click()
38+
URL.revokeObjectURL(urlObject)
39+
} finally {
40+
geode.stop_request()
41+
}
42+
}
43+
44+
async function importProjectFile(file) {
45+
geode.start_request()
46+
try {
47+
const snapshot = JSON.parse(await file.text())
48+
await useInfraStore().create_connection()
49+
50+
await viewer_call({
51+
schema: viewer_schemas.opengeodeweb_viewer.utils.import_project,
52+
params: {},
53+
})
54+
await viewer_call({
55+
schema: viewer_schemas.opengeodeweb_viewer.viewer.reset_visualization,
56+
params: {},
57+
})
58+
59+
await appStore.importStore(snapshot)
60+
} finally {
61+
geode.stop_request()
62+
}
63+
}
64+
65+
return { exportProject, importProjectFile }
66+
}

plugins/project_manager.js

Lines changed: 0 additions & 33 deletions
This file was deleted.
Lines changed: 52 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { beforeEach, describe, expect, test, vi } from "vitest"
22
import { setActivePinia, createPinia } from "pinia"
3-
import { viewer_call } from "@/composables/viewer_call.js"
3+
import { useProjectManager } from "@/composables/project_manager.js"
44

55
// Mocks
66
const mockAppStore = {
@@ -9,67 +9,82 @@ const mockAppStore = {
99
}
1010
const mockInfraStore = { create_connection: vi.fn() }
1111

12-
vi.mock("@/stores/app_store.js", () => ({ useAppStore: () => mockAppStore }))
12+
vi.mock("@/stores/app.js", () => ({ useAppStore: () => mockAppStore }))
1313
vi.mock("@ogw_f/stores/infra", () => ({ useInfraStore: () => mockInfraStore }))
1414
vi.mock("@/composables/viewer_call.js", () => ({
1515
default: vi.fn(),
1616
viewer_call: vi.fn(),
1717
}))
1818

19-
const projectManagerPlugin = {
20-
provide: {
21-
project: {
22-
export: vi.fn(),
23-
importFile: vi.fn(),
19+
vi.mock("@/stores/geode.js", () => ({
20+
useGeodeStore: () => ({
21+
base_url: "http://localhost:5000",
22+
start_request: vi.fn(),
23+
stop_request: vi.fn(),
24+
do_ping: vi.fn(),
25+
}),
26+
}))
27+
28+
vi.mock(
29+
"@geode/opengeodeweb-back/opengeodeweb_back_schemas.json",
30+
() => ({
31+
default: {
32+
opengeodeweb_back: {
33+
project: {
34+
export_project: { route: "/project/export_project", methods: ["POST"] },
35+
},
36+
},
2437
},
25-
},
26-
}
38+
}),
39+
)
40+
vi.mock(
41+
"@geode/opengeodeweb-viewer/opengeodeweb_viewer_schemas.json",
42+
() => ({
43+
default: {
44+
opengeodeweb_viewer: {
45+
utils: { import_project: { rpc: "utils.import_project" } },
46+
viewer: { reset_visualization: { rpc: "viewer.reset_visualization" } },
47+
},
48+
},
49+
}),
50+
)
2751

2852
beforeEach(() => setActivePinia(createPinia()))
2953

30-
describe("ProjectManager plugin", () => {
54+
describe("ProjectManager composable", () => {
3155
test("exportProject triggers download", async () => {
3256
const mockElement = { href: "", download: "", click: vi.fn() }
3357
vi.stubGlobal("document", { createElement: () => mockElement })
3458
vi.stubGlobal("URL", {
3559
createObjectURL: () => "blob:url",
3660
revokeObjectURL: vi.fn(),
3761
})
62+
vi.stubGlobal(
63+
"fetch",
64+
vi.fn(async () => ({
65+
ok: true,
66+
blob: async () =>
67+
new Blob(["zipcontent"], { type: "application/zip" }),
68+
headers: { get: () => "project_123.zip" },
69+
})),
70+
)
71+
72+
const { exportProject } = useProjectManager()
73+
await exportProject()
3874

39-
projectManagerPlugin.provide.project.export = async () => {
40-
const snapshot = mockAppStore.exportStore()
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-
await projectManagerPlugin.provide.project.export()
5275
expect(mockAppStore.exportStore).toHaveBeenCalled()
76+
expect(fetch).toHaveBeenCalledTimes(1)
5377
expect(mockElement.click).toHaveBeenCalled()
5478
})
5579

5680
test("importProjectFile loads snapshot", async () => {
57-
projectManagerPlugin.provide.project.importFile = async (file) => {
58-
const raw = await file.text()
59-
const snapshot = JSON.parse(raw)
60-
await mockInfraStore.create_connection()
61-
viewer_call({})
62-
console.log(
63-
"[TEST] viewer_call:",
64-
viewer_call.mock?.calls,
65-
viewer_call.mock?.calls?.length || 0,
66-
)
67-
await mockAppStore.importStore(snapshot)
68-
}
81+
const { importProjectFile } = useProjectManager()
82+
6983
const file = { text: () => Promise.resolve('{"dataBase":{"db":{}}}') }
70-
await projectManagerPlugin.provide.project.importFile(file)
84+
await importProjectFile(file)
85+
7186
expect(mockInfraStore.create_connection).toHaveBeenCalled()
72-
expect(viewer_call).toHaveBeenCalled()
87+
expect((await import("@/composables/viewer_call.js")).viewer_call).toHaveBeenCalled()
7388
expect(mockAppStore.importStore).toHaveBeenCalled()
7489
})
7590
})

0 commit comments

Comments
 (0)