diff --git a/app/components/Viewer/TreeObject.vue b/app/components/Viewer/TreeObject.vue index 069d9c7e..151581a9 100644 --- a/app/components/Viewer/TreeObject.vue +++ b/app/components/Viewer/TreeObject.vue @@ -23,11 +23,9 @@ return } const { added, removed } = compareSelections(current, previous) - - added.forEach((item) => { - dataStyleStore.setVisibility(item.id, true) - }) - + for (const item of added) { + await dataStyleStore.setVisibility(item.id, true) + } for (const item of removed) { await dataStyleStore.setVisibility(item.id, false) } diff --git a/app/composables/project_manager.js b/app/composables/project_manager.js index fbafeb21..7590090f 100644 --- a/app/composables/project_manager.js +++ b/app/composables/project_manager.js @@ -51,6 +51,7 @@ export function useProjectManager() { await viewerStore.request( viewer_schemas.opengeodeweb_viewer.viewer.reset_visualization, {}, + undefined, ) treeviewStore.clear() diff --git a/app/stores/viewer.js b/app/stores/viewer.js index 97fe83ae..b424bc22 100644 --- a/app/stores/viewer.js +++ b/app/stores/viewer.js @@ -7,6 +7,8 @@ import { appMode } from "@ogw_front/utils/app_mode" import { viewer_call } from "../../internal/utils/viewer_call" import { useInfraStore } from "@ogw_front/stores/infra" +const request_timeout = 10 * 1000 + export const useViewerStore = defineStore("viewer", { state: () => ({ default_local_port: "1234", @@ -117,9 +119,14 @@ export const useViewerStore = defineStore("viewer", { connectImageStream(validClient.getConnection().getSession()) viewerStore.client = validClient clientToConnect.endBusy() - viewer_call(viewerStore, { - schema: schemas.opengeodeweb_viewer.viewer.reset_visualization, - }) + viewer_call( + viewerStore, + { + schema: + schemas.opengeodeweb_viewer.viewer.reset_visualization, + }, + { timeout: undefined }, + ) viewerStore.status = Status.CONNECTED resolve() }) @@ -148,7 +155,7 @@ export const useViewerStore = defineStore("viewer", { await this.ws_connect() console.log("[VIEWER] Viewer connected successfully") }, - request(schema, params = {}, callbacks = {}) { + request(schema, params = {}, callbacks = {}, timeout = request_timeout) { console.log("[VIEWER] Request:", schema.$id) return viewer_call( @@ -163,6 +170,7 @@ export const useViewerStore = defineStore("viewer", { } }, }, + timeout, ) }, }, diff --git a/app/utils/default_styles.js b/app/utils/default_styles.js index 58a61bde..09942b26 100644 --- a/app/utils/default_styles.js +++ b/app/utils/default_styles.js @@ -1,5 +1,4 @@ // Global variables - const points_defaultVisibility = true const edges_defaultVisibility = true const cells_defaultVisibility = true diff --git a/internal/utils/viewer_call.js b/internal/utils/viewer_call.js index 72c23978..241c0bef 100644 --- a/internal/utils/viewer_call.js +++ b/internal/utils/viewer_call.js @@ -4,7 +4,12 @@ import { useFeedbackStore } from "@ogw_front/stores/feedback" export function viewer_call( microservice, { schema, params = {} }, - { request_error_function, response_function, response_error_function } = {}, + { + request_error_function, + response_function, + response_error_function, + timeout, + } = {}, ) { const feedbackStore = useFeedbackStore() @@ -20,12 +25,13 @@ export function viewer_call( const client = microservice.client - return new Promise((resolve, reject) => { + const promise = new Promise((resolve, reject) => { if (!client.getConnection) { resolve() return } microservice.start_request() + client .getConnection() .getSession() @@ -60,6 +66,14 @@ export function viewer_call( microservice.stop_request() }) }) + if (timeout !== undefined && timeout > 0) { + const timeoutPromise = setTimeout(() => { + reject(`${schema.$id}: Timed out after ${timeout}ms, ${schema} ${params}`) + }, timeout) + return Promise.race([promise, timeoutPromise]) + } else { + return promise + } } export default viewer_call diff --git a/tests/integration/microservices/back/requirements.txt b/tests/integration/microservices/back/requirements.txt index 3cbc7045..bd3a3ef5 100644 --- a/tests/integration/microservices/back/requirements.txt +++ b/tests/integration/microservices/back/requirements.txt @@ -5,4 +5,3 @@ # pip-compile --output-file=tests/integration/microservices/back/requirements.txt tests/integration/microservices/back/requirements.in # -opengeodeweb-back==6.*,>=6.1.0rc2 diff --git a/tests/integration/microservices/viewer/requirements.txt b/tests/integration/microservices/viewer/requirements.txt index 39137326..4d097394 100644 --- a/tests/integration/microservices/viewer/requirements.txt +++ b/tests/integration/microservices/viewer/requirements.txt @@ -5,4 +5,3 @@ # pip-compile --output-file=tests/integration/microservices/viewer/requirements.txt tests/integration/microservices/viewer/requirements.in # -opengeodeweb-viewer==1.*,>=1.15.0 diff --git a/tests/integration/setup.js b/tests/integration/setup.js index 480d9784..5703d0ea 100644 --- a/tests/integration/setup.js +++ b/tests/integration/setup.js @@ -25,14 +25,8 @@ import { // Local constants const data_folder = path.join("tests", "integration", "data") -async function setupIntegrationTests(file_name, geode_object) { - const pinia = createTestingPinia({ - stubActions: false, - createSpy: vi.fn, - }) - setActivePinia(pinia) +async function runMicroservices() { const geodeStore = useGeodeStore() - // const hybridViewerStore = useHybridViewerStore() const infraStore = useInfraStore() const viewerStore = useViewerStore() infraStore.app_mode = appMode.BROWSER @@ -61,11 +55,22 @@ async function setupIntegrationTests(file_name, geode_object) { geodeStore.default_local_port = back_port viewerStore.default_local_port = viewer_port console.log("after ports") + + return { back_port, viewer_port, project_folder_path } +} + +async function setupIntegrationTests(file_name, geode_object) { + const pinia = createTestingPinia({ + stubActions: false, + createSpy: vi.fn, + }) + setActivePinia(pinia) + const viewerStore = useViewerStore() + + const { back_port, viewer_port, project_folder_path } = + await runMicroservices() await viewerStore.ws_connect() - // await hybridViewerStore.initHybridViewer() - console.log("after hybridViewerStore.initHybridViewer") - // await viewerStore.ws_connect() const id = await importFile(file_name, geode_object) expect(viewerStore.status).toBe(Status.CONNECTED) console.log("end of setupIntegrationTests") @@ -91,4 +96,4 @@ afterAll(() => { delete global.WebSocket }) -export { setupIntegrationTests } +export { runMicroservices, setupIntegrationTests } diff --git a/tests/integration/stores/data_style/mesh/cells.nuxt.test.js b/tests/integration/stores/data_style/mesh/cells.nuxt.test.js index ab449825..c9dadb6b 100644 --- a/tests/integration/stores/data_style/mesh/cells.nuxt.test.js +++ b/tests/integration/stores/data_style/mesh/cells.nuxt.test.js @@ -172,4 +172,13 @@ describe("Mesh cells", () => { } }) }) + + test("Cells apply default style", async () => { + const dataStyleStore = useDataStyleStore() + const viewerStore = useViewerStore() + const result = dataStyleStore.applyMeshCellsStyle(id) + expect(result).toBeInstanceOf(Promise) + await result + expect(viewerStore.status).toBe(Status.CONNECTED) + }) }) diff --git a/tests/integration/stores/data_style/mesh/edges.nuxt.test.js b/tests/integration/stores/data_style/mesh/edges.nuxt.test.js index 02004893..64cea744 100644 --- a/tests/integration/stores/data_style/mesh/edges.nuxt.test.js +++ b/tests/integration/stores/data_style/mesh/edges.nuxt.test.js @@ -154,5 +154,13 @@ describe("Mesh edges", () => { expect(viewerStore.status).toBe(Status.CONNECTED) } }) + test("Edges apply style", async () => { + const dataStyleStore = useDataStyleStore() + const viewerStore = useViewerStore() + const result = dataStyleStore.applyMeshEdgesStyle(id) + expect(result).toBeInstanceOf(Promise) + await result + expect(viewerStore.status).toBe(Status.CONNECTED) + }) }) }) diff --git a/tests/integration/stores/data_style/mesh/points.nuxt.test.js b/tests/integration/stores/data_style/mesh/points.nuxt.test.js index dd0aff00..f48e857a 100644 --- a/tests/integration/stores/data_style/mesh/points.nuxt.test.js +++ b/tests/integration/stores/data_style/mesh/points.nuxt.test.js @@ -155,4 +155,13 @@ describe("Mesh points", () => { expect(viewerStore.status).toBe(Status.CONNECTED) }) }) + + test("Points apply default style", async () => { + const dataStyleStore = useDataStyleStore() + const viewerStore = useViewerStore() + const result = dataStyleStore.applyMeshPointsStyle(id) + expect(result).toBeInstanceOf(Promise) + await result + expect(viewerStore.status).toBe(Status.CONNECTED) + }) }) diff --git a/tests/integration/stores/data_style/mesh/polygons.nuxt.test.js b/tests/integration/stores/data_style/mesh/polygons.nuxt.test.js index 51ee6254..a7408b95 100644 --- a/tests/integration/stores/data_style/mesh/polygons.nuxt.test.js +++ b/tests/integration/stores/data_style/mesh/polygons.nuxt.test.js @@ -176,4 +176,13 @@ describe("Mesh polygons", () => { } }) }) + + test("Polygons apply default style", async () => { + const dataStyleStore = useDataStyleStore() + const viewerStore = useViewerStore() + const result = dataStyleStore.applyMeshPolygonsStyle(id) + expect(result).toBeInstanceOf(Promise) + await result + expect(viewerStore.status).toBe(Status.CONNECTED) + }) }) diff --git a/tests/integration/stores/data_style/mesh/polyhedra.nuxt.test.js b/tests/integration/stores/data_style/mesh/polyhedra.nuxt.test.js index c83202f3..ed3ba99f 100644 --- a/tests/integration/stores/data_style/mesh/polyhedra.nuxt.test.js +++ b/tests/integration/stores/data_style/mesh/polyhedra.nuxt.test.js @@ -164,4 +164,13 @@ describe("Mesh polyhedra", () => { ) expect(viewerStore.status).toBe(Status.CONNECTED) }) + + test("Polyhedra apply default style", async () => { + const dataStyleStore = useDataStyleStore() + const viewerStore = useViewerStore() + const result = dataStyleStore.applyMeshPolyhedraStyle(id) + expect(result).toBeInstanceOf(Promise) + await result + expect(viewerStore.status).toBe(Status.CONNECTED) + }) }) diff --git a/tests/integration/stores/data_style/model/blocks.nuxt.test.js b/tests/integration/stores/data_style/model/blocks.nuxt.test.js index a402e4be..79613c00 100644 --- a/tests/integration/stores/data_style/model/blocks.nuxt.test.js +++ b/tests/integration/stores/data_style/model/blocks.nuxt.test.js @@ -74,29 +74,42 @@ describe("Model blocks", () => { }) }) - // describe("Blocks color", () => { - // test("Color red", async () => { - // const dataStyleStore = useDataStyleStore() - // const viewerStore = useViewerStore() - // const dataStore = useDataStore() - // const block_ids = await dataStore.getBlocksGeodeIds(id) - // const block_viewer_ids = dataStore.getMeshComponentsViewerIds(id, block_ids) - // const color = { r: 255, g: 0, b: 0 } - // const spy = vi.spyOn(viewerStore, "request") - // await dataStyleStore.setModelBlocksColor(id, block_ids, color) - // expect(spy).toHaveBeenCalledWith( - // model_blocks_schemas.color, - // { id, block_ids: block_viewer_ids, color }, - // { - // response_function: expect.any(Function), - // }, - // ) - // for (const block_id of block_ids) { - // expect(dataStyleStore.modelBlockColor(id, block_id)).toStrictEqual( - // color, - // ) - // } - // expect(viewerStore.status).toBe(Status.CONNECTED) - // }) - // }) + describe("Blocks color", () => { + test("Color red", async () => { + const dataStyleStore = useDataStyleStore() + const viewerStore = useViewerStore() + const dataStore = useDataStore() + const block_ids = await dataStore.getBlocksGeodeIds(id) + const block_viewer_ids = await dataStore.getMeshComponentsViewerIds( + id, + block_ids, + ) + const color = { r: 255, g: 0, b: 0 } + const spy = vi.spyOn(viewerStore, "request") + await dataStyleStore.setModelBlocksColor(id, block_ids, color) + expect(spy).toHaveBeenCalledWith( + model_blocks_schemas.color, + { id, block_ids: block_viewer_ids, color }, + { + response_function: expect.any(Function), + }, + ) + for (const block_id of block_ids) { + expect(dataStyleStore.modelBlockColor(id, block_id)).toStrictEqual( + color, + ) + } + expect(viewerStore.status).toBe(Status.CONNECTED) + }) + }) + describe("Blocks style", () => { + test("Blocks apply style", async () => { + const dataStyleStore = useDataStyleStore() + const viewerStore = useViewerStore() + const result = dataStyleStore.applyModelBlocksStyle(id) + expect(result).toBeInstanceOf(Promise) + await result + expect(viewerStore.status).toBe(Status.CONNECTED) + }) + }) }) diff --git a/tests/integration/stores/data_style/model/corners.nuxt.test.js b/tests/integration/stores/data_style/model/corners.nuxt.test.js index 5804db71..da16637e 100644 --- a/tests/integration/stores/data_style/model/corners.nuxt.test.js +++ b/tests/integration/stores/data_style/model/corners.nuxt.test.js @@ -105,4 +105,15 @@ describe("Model corners", () => { expect(viewerStore.status).toBe(Status.CONNECTED) }) }) + + describe("Corner style", () => { + test("Corners apply style", async () => { + const dataStyleStore = useDataStyleStore() + const viewerStore = useViewerStore() + const result = dataStyleStore.applyModelCornersStyle(id) + expect(result).toBeInstanceOf(Promise) + await result + expect(viewerStore.status).toBe(Status.CONNECTED) + }) + }) }) diff --git a/tests/integration/stores/data_style/model/edges.nuxt.test.js b/tests/integration/stores/data_style/model/edges.nuxt.test.js index 49d7f447..08d020d4 100644 --- a/tests/integration/stores/data_style/model/edges.nuxt.test.js +++ b/tests/integration/stores/data_style/model/edges.nuxt.test.js @@ -58,4 +58,14 @@ describe("Model edges", () => { expect(viewerStore.status).toBe(Status.CONNECTED) }) }) + describe("Edges style", () => { + test("Edges apply style", async () => { + const dataStyleStore = useDataStyleStore() + const viewerStore = useViewerStore() + const result = dataStyleStore.applyModelEdgesStyle(id) + expect(result).toBeInstanceOf(Promise) + await result + expect(viewerStore.status).toBe(Status.CONNECTED) + }) + }) }) diff --git a/tests/integration/stores/data_style/model/lines.nuxt.test.js b/tests/integration/stores/data_style/model/lines.nuxt.test.js index 4b8b03d0..a3f5cc64 100644 --- a/tests/integration/stores/data_style/model/lines.nuxt.test.js +++ b/tests/integration/stores/data_style/model/lines.nuxt.test.js @@ -97,4 +97,14 @@ describe("Model lines", () => { expect(viewerStore.status).toBe(Status.CONNECTED) }) }) + describe("Lines style", () => { + test("Lines apply style", async () => { + const dataStyleStore = useDataStyleStore() + const viewerStore = useViewerStore() + const result = dataStyleStore.applyModelLinesStyle(id) + expect(result).toBeInstanceOf(Promise) + await result + expect(viewerStore.status).toBe(Status.CONNECTED) + }) + }) }) diff --git a/tests/integration/stores/data_style/model/points.nuxt.test.js b/tests/integration/stores/data_style/model/points.nuxt.test.js index a9c1f832..022b1240 100644 --- a/tests/integration/stores/data_style/model/points.nuxt.test.js +++ b/tests/integration/stores/data_style/model/points.nuxt.test.js @@ -75,4 +75,14 @@ describe("Model points", () => { expect(viewerStore.status).toBe(Status.CONNECTED) }) }) + describe("Points style", () => { + test("Points apply style", async () => { + const dataStyleStore = useDataStyleStore() + const viewerStore = useViewerStore() + const result = dataStyleStore.applyModelPointsStyle(id) + expect(result).toBeInstanceOf(Promise) + await result + expect(viewerStore.status).toBe(Status.CONNECTED) + }) + }) }) diff --git a/tests/integration/stores/data_style/model/surfaces.nuxt.test.js b/tests/integration/stores/data_style/model/surfaces.nuxt.test.js index 7ae88ffb..a32f5604 100644 --- a/tests/integration/stores/data_style/model/surfaces.nuxt.test.js +++ b/tests/integration/stores/data_style/model/surfaces.nuxt.test.js @@ -109,4 +109,14 @@ describe("Model surfaces", () => { expect(viewerStore.status).toBe(Status.CONNECTED) }) }) + describe("Surfaces style", () => { + test("Surfaces apply style", async () => { + const dataStyleStore = useDataStyleStore() + const viewerStore = useViewerStore() + const result = dataStyleStore.applyModelSurfacesStyle(id) + expect(result).toBeInstanceOf(Promise) + await result + expect(viewerStore.status).toBe(Status.CONNECTED) + }) + }) }) diff --git a/tests/integration/stores/viewer.nuxt.test.js b/tests/integration/stores/viewer.nuxt.test.js new file mode 100644 index 00000000..60b21236 --- /dev/null +++ b/tests/integration/stores/viewer.nuxt.test.js @@ -0,0 +1,61 @@ +// Global imports + +// Third party imports +import { setActivePinia } from "pinia" +import { createTestingPinia } from "@pinia/testing" +import { describe, test, expect, beforeEach, vi } from "vitest" + +import opengeodeweb_viewer_schemas from "@geode/opengeodeweb-viewer/opengeodeweb_viewer_schemas.json" + +// Local imports +import { useViewerStore } from "@ogw_front/stores/viewer" +import Status from "@ogw_front/utils/status" + +import { runMicroservices } from "../../integration/setup" + +beforeEach(() => { + const pinia = createTestingPinia({ + stubActions: false, + createSpy: vi.fn, + }) + setActivePinia(pinia) +}) + +describe("Viewer Store", () => { + describe("actions", () => { + describe("ws_connect", () => { + test("ws_connect", async () => { + await runMicroservices() + const viewerStore = useViewerStore() + await viewerStore.ws_connect() + expect(viewerStore.status).toBe(Status.CONNECTED) + }, 25000) + }) + describe("connect", () => { + test("connect", async () => { + await runMicroservices() + const viewerStore = useViewerStore() + await viewerStore.connect() + expect(viewerStore.status).toBe(Status.CONNECTED) + }, 25000) + }) + + describe("request", () => { + test("request", async () => { + const schema = + opengeodeweb_viewer_schemas.opengeodeweb_viewer.viewer.render + await runMicroservices() + const viewerStore = useViewerStore() + const timeout = 1 + const params = {} + expect(() => + viewerStore + .request(schema, params, {}, timeout) + .rejects.toThrow( + `${schema.$id}: Timed out after ${timeout}ms, ${schema} ${params}`, + ), + ) + }, 25000) + }) + }) +}) diff --git a/tests/unit/stores/Viewer.nuxt.test.js b/tests/unit/stores/Viewer.nuxt.test.js index 0e609af1..247af109 100644 --- a/tests/unit/stores/Viewer.nuxt.test.js +++ b/tests/unit/stores/Viewer.nuxt.test.js @@ -1,5 +1,4 @@ // Global imports -import path from "path" // Third party imports import { setActivePinia } from "pinia" @@ -16,13 +15,10 @@ import { } from "vitest" import { WebSocket } from "ws" - // Local imports import { useViewerStore } from "@ogw_front/stores/viewer" import { useInfraStore } from "@ogw_front/stores/infra" - import { appMode } from "@ogw_front/utils/app_mode" -import Status from "@ogw_front/utils/status" // Mock navigator.locks API const mockLockRequest = vi.fn().mockImplementation(async (name, callback) => { @@ -121,9 +117,10 @@ describe("Viewer Store", () => { describe("base_url", () => { test("test app_mode DESKTOP", () => { const infraStore = useInfraStore() + const viewerStore = useViewerStore() infraStore.app_mode = appMode.DESKTOP infraStore.domain_name = "localhost" - // expect(viewerStore.base_url).toBe("ws://localhost:1234/ws") + expect(viewerStore.base_url).toBe("ws://localhost:1234/ws") }) test("test app_mode CLOUD", () => { @@ -162,24 +159,6 @@ describe("Viewer Store", () => { }) }) describe("actions", () => { - // test("ws_connect", async () => { - // const infraStore = useInfraStore() - // const viewerStore = useViewerStore() - // infraStore.app_mode = appMode.BROWSER - // const viewer_path = path.join( - // executable_path( - // path.join("tests", "integration", "microservices", "viewer"), - // ), - // executable_name("opengeodeweb_viewer"), - // ) - // const viewer_port = await run_viewer(viewer_path, { - // port: 1234, - // data_folder_path: "./data", - // }) - // viewerStore.default_local_port = viewer_port - // await viewerStore.ws_connect() - // expect(viewerStore.status).toBe(Status.CONNECTED) - // }, 10000) describe("toggle_picking_mode", () => { test("test true", async () => { const viewerStore = useViewerStore()