diff --git a/webapp/src/tests/unit/allComponents.spec.js b/webapp/src/tests/unit/allComponents.spec.js index 83c3aded..05572d19 100644 --- a/webapp/src/tests/unit/allComponents.spec.js +++ b/webapp/src/tests/unit/allComponents.spec.js @@ -1,7 +1,7 @@ import { describe, it, expect, beforeEach, afterEach, afterAll, vi } from "vitest"; import { shallowMount, flushPromises } from "@vue/test-utils"; import { createTestingPinia } from "@pinia/testing"; -import { markRaw } from "vue"; +import { componentOverrides } from "./overrides"; /** * @file Automated component smoke testing suite. @@ -9,6 +9,7 @@ import { markRaw } from "vue"; * shallow mount on each. This acts as a first line of defense to catch * fatal DOM runtime errors, missing dependencies, or script crashes * before they reach production. + * @requires overrides.js for component-specific prop and mock configurations. */ /** * Vite eagerly grabs all .vue components, explicitly excluding the experimental folder. @@ -20,211 +21,15 @@ const componentModules = import.meta.glob( ); /** - * IMPORTANT - * Skip list, add here components that have their own test .spec.js file + * @note IMPORTANT: Skip list, add here components that have their own test .spec.js file * */ const skipList = ["loggingContent.vue"]; -/** - * Map filenames to the specific props or mocks required - * Not all components ask for props - * If a component has unmet props or global mocks setup.js is set to fail the test - **/ -const componentOverrides = { - "serverSpecifiedPropertyControl.vue": { - props: { - propertyData: {}, - propertyName: "", - thingName: "", - }, - global: { - mocks: { - wotStore: { - thingDescriptions: { - test_thing: { - properties: { - test_property_1: {}, - test_property_2: {}, - }, - }, - }, - }, - }, - }, - }, - - "slideScanContent.vue": { - global: { - mocks: { - wotStore: { - thingDescriptions: { - test_thing: { - properties: { - test_property_1: {}, - test_property_2: {}, - }, - }, - }, - }, - }, - }, - }, - - "slideScanControls.vue": { - global: { - mocks: { - wotStore: { - thingDescriptions: { - test_thing: { - properties: { - test_property_1: {}, - test_property_2: {}, - }, - }, - }, - }, - }, - }, - }, - - "miniStreamDisplay.vue": { - props: { streamId: "testProp" }, - }, - "streamContent.vue": { - props: { streamId: "testProp" }, - }, - "paginateLinks.vue": { - props: { totalPages: 5, currentPage: 1 }, - }, - "simpleAccordion.vue": { - props: { title: "Test Accordion Title" }, - }, - "tabContent.vue": { - props: { tabID: "tab-1", currentTab: "tab-1" }, - }, - "tabIcon.vue": { - props: { tabID: "tab-1", currentTab: "tab-1" }, - }, - "actionButton.vue": { - props: { action: "test-action", thing: "test-thing" }, - }, - "actionLogDisplay.vue": { - props: { taskStatus: "", log: [] }, - }, - "endActionButton.vue": { - props: { url: "http://microscope.local/api/v3" }, - }, - "endpointButton.vue": { - props: { url: "http://microscope.local/api/v3" }, - }, - "matrixDisplay.vue": { - props: { matrix: [] }, - }, - "actionProgressBar.vue": { - props: { taskStatus: "" }, - }, - "actionStatusModal.vue": { - props: { - title: "", - log: [], - canTerminate: true, - taskRunning: true, - taskStarted: true, - taskStatus: "", - }, - }, - "inputFromSchema.vue": { - props: { dataSchema: {} }, - }, - - "propertyControl.vue": { - props: { - propertyName: "", - thingName: "test_thing", - dataSchema: {}, - }, - - mocks: { - wotStore: { - thingDescriptions: { - test_thing: { - actions: {}, - properties: {}, - }, - }, - }, - }, - }, - "serverSpecifiedActionButton.vue": { - props: { - actionData: {}, - elements: {}, - propertyData: {}, - action: "test-action", - thing: "test-thing", - }, - }, - "serverSpecifiedInterface.vue": { - props: { elements: [] }, - }, - "calibrationWizardTask.vue": { - props: { steps: [] }, - }, - "singleStepTask.vue": { - props: { - stepComponent: markRaw({ template: '
' }), - }, - }, - "actionTab.vue": { - props: { - action: "test-action", - thing: "test-thing", - taskId: "", - taskUrl: "", - }, - }, - "galleryCard.vue": { - props: { itemData: {} }, - }, - "openSeadragonViewer.vue": { - props: { - src: "", - brightness: 0, - contrast: 0, - saturation: 0, - }, - }, - "cameraCalibrationSettings.vue": { - props: { cameraUri: "" }, - }, - - "galleryContent.vue": { - global: { - mocks: { - readThingProperty: vi.fn(() => []), - }, - }, - }, - - "CSMCalibrationSettings.vue": { - global: { - mocks: { - thingDescriptions: { - csm: { - actions: {}, - }, - }, - }, - }, - }, -}; - /** * Test description this is a fast unit test * The objective of this testing is find early * component loading issues like bad component setups */ - describe("Unit Test", () => { let wrapper; diff --git a/webapp/src/tests/unit/overrides.js b/webapp/src/tests/unit/overrides.js new file mode 100644 index 00000000..cc07fb8f --- /dev/null +++ b/webapp/src/tests/unit/overrides.js @@ -0,0 +1,188 @@ +import { markRaw } from "vue"; + +/** + * @file Component-specific overrides for unit testing. + * @description Map filenames to the specific props or mocks required + * Not all components ask for props + * If a component has unmet props or global mocks setup.js is set to fail the test + **/ +export const componentOverrides = { + "serverSpecifiedPropertyControl.vue": { + props: { + propertyData: {}, + propertyName: "", + thingName: "", + }, + global: { + mocks: { + wotStore: { + thingDescriptions: { + test_thing: { + properties: { + test_property_1: {}, + test_property_2: {}, + }, + }, + }, + }, + }, + }, + }, + + "slideScanContent.vue": { + global: { + mocks: { + wotStore: { + thingDescriptions: { + test_thing: { + properties: { + test_property_1: {}, + test_property_2: {}, + }, + }, + }, + }, + }, + }, + }, + + "slideScanControls.vue": { + global: { + mocks: { + wotStore: { + thingDescriptions: { + test_thing: { + properties: { + test_property_1: {}, + test_property_2: {}, + }, + }, + }, + }, + }, + }, + }, + + "miniStreamDisplay.vue": { + props: { streamId: "testProp" }, + }, + "streamContent.vue": { + props: { streamId: "testProp" }, + }, + "paginateLinks.vue": { + props: { totalPages: 5, currentPage: 1 }, + }, + "simpleAccordion.vue": { + props: { title: "Test Accordion Title" }, + }, + "tabContent.vue": { + props: { tabID: "tab-1", currentTab: "tab-1" }, + }, + "tabIcon.vue": { + props: { tabID: "tab-1", currentTab: "tab-1" }, + }, + "actionButton.vue": { + props: { action: "test-action", thing: "test-thing" }, + }, + "actionLogDisplay.vue": { + props: { taskStatus: "", log: [] }, + }, + "endActionButton.vue": { + props: { url: "http://microscope.local/api/v3" }, + }, + "endpointButton.vue": { + props: { url: "http://microscope.local/api/v3" }, + }, + "matrixDisplay.vue": { + props: { matrix: [] }, + }, + "actionProgressBar.vue": { + props: { taskStatus: "" }, + }, + "actionStatusModal.vue": { + props: { + title: "", + log: [], + canTerminate: true, + taskRunning: true, + taskStarted: true, + taskStatus: "", + }, + }, + "inputFromSchema.vue": { + props: { dataSchema: {} }, + }, + + "propertyControl.vue": { + props: { + propertyName: "", + thingName: "test_thing", + dataSchema: {}, + }, + + mocks: { + wotStore: { + thingDescriptions: { + test_thing: { + actions: {}, + properties: {}, + }, + }, + }, + }, + }, + "serverSpecifiedActionButton.vue": { + props: { + actionData: {}, + elements: {}, + propertyData: {}, + action: "test-action", + thing: "test-thing", + }, + }, + "serverSpecifiedInterface.vue": { + props: { elements: [] }, + }, + "calibrationWizardTask.vue": { + props: { steps: [] }, + }, + "singleStepTask.vue": { + props: { + stepComponent: markRaw({ template: '
' }), + }, + }, + "actionTab.vue": { + props: { + action: "test-action", + thing: "test-thing", + taskId: "", + taskUrl: "", + }, + }, + "galleryCard.vue": { + props: { itemData: {} }, + }, + "openSeadragonViewer.vue": { + props: { + src: "", + brightness: 0, + contrast: 0, + saturation: 0, + }, + }, + "cameraCalibrationSettings.vue": { + props: { cameraUri: "" }, + }, + + "CSMCalibrationSettings.vue": { + global: { + mocks: { + thingDescriptions: { + csm: { + actions: {}, + }, + }, + }, + }, + }, +};