From a56d52e8984ef95b2000e470effbac5f0093d1fa Mon Sep 17 00:00:00 2001 From: Felix Neubauer Date: Mon, 4 May 2026 16:23:27 +0200 Subject: [PATCH 01/10] fix typing errors and add CSV import tests --- meta_configurator/e2e/csvImport.spec.ts | 50 +++ .../e2e/test-fixtures/data_people.csv | 3 + meta_configurator/e2e/utilsCsvImport.ts | 41 +++ .../components/CombinedEditorComponent.vue | 20 +- .../panels/ai-prompts/AiPromptsTemplate.vue | 5 +- .../panels/code-editor/setupAnnotations.ts | 7 +- .../setupLinkToSelectionAndData.ts | 2 +- .../panels/gui-editor/PropertiesPanel.vue | 12 +- .../panels/gui-editor/PropertyMetadata.vue | 6 +- .../panels/gui-editor/SchemaInfoOverlay.vue | 4 +- .../gui-editor/configTreeNodeResolver.ts | 23 +- .../gui-editor/properties/BooleanProperty.vue | 2 +- .../gui-editor/properties/EnumProperty.vue | 2 +- .../gui-editor/properties/NumberProperty.vue | 2 +- .../properties/OneOfSelectionProperty.vue | 4 +- .../properties/OntologyUriProperty.vue | 2 +- .../gui-editor/properties/StringProperty.vue | 2 +- .../list-analysis/ListAnalysisPanel.vue | 2 +- .../panels/rdf/__tests__/rdfPanel.test.ts | 291 +++++++++--------- .../rmlMappingServiceStandard.test.ts | 28 ++ .../rdf/rdf-authoring/RdfTripleToolbar.vue | 4 +- .../rdf/sparql-editor/SparqlQueryTab.vue | 6 +- .../rdf/sparql-editor/SparqlResultTab.vue | 4 +- .../visualizer/RdfVisualizerGraphPanel.vue | 4 +- .../rdf/visualizer/useRdfVisualizerGraph.ts | 6 +- .../SchemaExternalReferenceNode.vue | 2 +- .../schema-diagram/schemaDiagramTypes.ts | 2 +- .../src/components/toolbar/ModeSelector.vue | 9 +- .../src/components/toolbar/SearchBar.vue | 11 +- .../toolbar/TopToolbarMenuButtons.vue | 20 +- .../dialogs/csvimport/ImportCsvDialog.vue | 43 ++- .../__tests__/csvImportTypes.test.ts | 44 +++ .../dialogs/csvimport/csvImportTypes.ts | 6 +- .../csvimport/delimiterSeparatorUtils.ts | 6 +- .../dialogs/csvimport/importCsvUtils.ts | 9 +- .../dialogs/csvimport/writeCsvToData.ts | 14 +- .../data-mapping/DataMappingDialog.vue | 6 +- .../components/toolbar/fetchExampleSchemas.ts | 11 +- .../src/components/toolbar/menuItems.ts | 1 + .../toolbar/resolveSchemaReferences.ts | 14 +- .../jsonata/dataMappingServiceJsonata.ts | 8 +- .../__tests__/formatRegistry.test.ts | 2 +- .../src/dataformats/pathIndexLinkYaml.ts | 6 +- .../src/packaged-schemas/schemaCollection.ts | 3 + .../standard/rmlMappingServiceStandard.ts | 15 +- .../__tests__/jsonSchemaVisitor.test.ts | 80 ++--- .../__tests__/metaSchemaBuilder.test.ts | 16 +- .../schemaGraphConstructorArrays.test.ts | 106 +++---- ...chemaGraphConstructorBasicFeatures.test.ts | 125 ++++---- .../schemaGraphConstructorComposition.test.ts | 150 ++++----- ...schemaGraphConstructorConditionals.test.ts | 30 +- .../schemaGraphConstructorEnum.test.ts | 62 ++-- .../schema/graph-representation/typeUtils.ts | 4 +- .../graph-representation/updateGraph.ts | 11 +- .../src/schema/jsonSchemaWrapper.ts | 6 +- meta_configurator/src/schema/mergeAllOfs.ts | 4 +- .../src/schema/metaSchemaBuilder.ts | 64 ++-- .../src/schema/schemaLazyResolver.ts | 10 +- .../src/schema/schemaReadingUtils.ts | 4 +- .../src/schema/validationService.ts | 18 +- .../src/schema/writeDefaultsToData.ts | 17 +- meta_configurator/src/settings/useSettings.ts | 2 +- .../src/types/cytoscape-cose-bilkent.d.ts | 1 + .../src/utility/codeGenerationUtils.ts | 6 +- .../dataExportServiceHandlebars.ts | 4 +- .../__tests__/schemaToMarkdown.test.ts | 5 +- .../src/utility/readFileContent.ts | 5 +- meta_configurator/src/utility/toastService.ts | 4 + meta_configurator/src/utility/trimData.ts | 3 + meta_configurator/src/vue-shim.d.ts | 4 + meta_configurator/src/vue-shim.ts | 4 - 71 files changed, 901 insertions(+), 608 deletions(-) create mode 100644 meta_configurator/e2e/csvImport.spec.ts create mode 100644 meta_configurator/e2e/test-fixtures/data_people.csv create mode 100644 meta_configurator/e2e/utilsCsvImport.ts create mode 100644 meta_configurator/src/components/toolbar/dialogs/csvimport/__tests__/csvImportTypes.test.ts create mode 100644 meta_configurator/src/packaged-schemas/schemaCollection.ts create mode 100644 meta_configurator/src/types/cytoscape-cose-bilkent.d.ts create mode 100644 meta_configurator/src/vue-shim.d.ts delete mode 100644 meta_configurator/src/vue-shim.ts diff --git a/meta_configurator/e2e/csvImport.spec.ts b/meta_configurator/e2e/csvImport.spec.ts new file mode 100644 index 000000000..8e1bf5225 --- /dev/null +++ b/meta_configurator/e2e/csvImport.spec.ts @@ -0,0 +1,50 @@ +import {test, expect} from '@playwright/test'; +import {openApp} from './utils'; +import {tpGetData} from './utilsTestPanel'; +import { + expandImportOptions, + openCsvImportDialog, + setColumnPath, + setCsvTablePath, + submitCsvImport, + uploadCsvFile, +} from './utilsCsvImport'; +import {SessionMode} from '../src/store/sessionMode'; + +test('Import CSV as standalone table with default paths', async ({page}) => { + await openApp(page, 'settings_testpanel.json'); + + await openCsvImportDialog(page); + await uploadCsvFile(page, 'data_people.csv'); + + // submit without changing any options — default table path comes from the filename + await submitCsvImport(page); + + // filename "data_people.csv" → stringToIdentifier strips underscores → key is "datapeople" + const data = await tpGetData(page, SessionMode.DataEditor); + expect(data).toHaveProperty('datapeople'); + expect(data.datapeople).toHaveLength(2); + expect(data.datapeople[0]).toMatchObject({name: 'Alice', city: 'Berlin', role: 'Engineer'}); + expect(data.datapeople[1]).toMatchObject({name: 'Bob', city: 'Munich', role: 'Designer'}); +}); + +test('Import CSV with custom table path and renamed column', async ({page}) => { + await openApp(page, 'settings_testpanel.json'); + + await openCsvImportDialog(page); + await uploadCsvFile(page, 'data_people.csv'); + + await expandImportOptions(page); + await setCsvTablePath(page, 'people'); + await setColumnPath(page, 'city', 'location'); + + await submitCsvImport(page); + + const data = await tpGetData(page, SessionMode.DataEditor); + expect(data).toEqual({ + people: [ + {name: 'Alice', location: 'Berlin', role: 'Engineer'}, + {name: 'Bob', location: 'Munich', role: 'Designer'}, + ], + }); +}); diff --git a/meta_configurator/e2e/test-fixtures/data_people.csv b/meta_configurator/e2e/test-fixtures/data_people.csv new file mode 100644 index 000000000..d9cf33143 --- /dev/null +++ b/meta_configurator/e2e/test-fixtures/data_people.csv @@ -0,0 +1,3 @@ +name,city,role +Alice,Berlin,Engineer +Bob,Munich,Designer diff --git a/meta_configurator/e2e/utilsCsvImport.ts b/meta_configurator/e2e/utilsCsvImport.ts new file mode 100644 index 000000000..81d2dddbd --- /dev/null +++ b/meta_configurator/e2e/utilsCsvImport.ts @@ -0,0 +1,41 @@ +import {Page} from 'playwright'; +import {expect} from '@playwright/test'; +import path from 'node:path'; + +const fixturesDir = path.resolve(process.cwd(), 'e2e/test-fixtures'); + +export async function openCsvImportDialog(page: Page) { + await page.locator('#import-data').click(); + await page.getByRole('menuitem', {name: 'Import CSV Data'}).click(); + await expect(page.getByRole('dialog', {name: 'Import CSV'})).toBeVisible(); +} + +export async function uploadCsvFile(page: Page, filename: string) { + const fileChooserPromise = page.waitForEvent('filechooser'); + await page.getByTestId('csv-select-file').click(); + const fileChooser = await fileChooserPromise; + await fileChooser.setFiles(path.join(fixturesDir, filename)); + // wait for the Import button to appear, confirming the CSV was parsed + await expect(page.getByTestId('csv-submit-import')).toBeVisible(); +} + +export async function expandImportOptions(page: Page) { + await page.getByTestId('csv-import-options-toggle').click(); +} + +export async function setCsvTablePath(page: Page, tablePath: string) { + const input = page.getByTestId('csv-table-path-input'); + await input.clear(); + await input.fill(tablePath); +} + +export async function setColumnPath(page: Page, columnName: string, newPath: string) { + const input = page.getByTestId(`csv-column-path-${columnName}`); + await input.clear(); + await input.fill(newPath); +} + +export async function submitCsvImport(page: Page) { + await page.getByTestId('csv-submit-import').click(); + await expect(page.getByRole('dialog', {name: 'Import CSV'})).not.toBeVisible(); +} diff --git a/meta_configurator/src/components/CombinedEditorComponent.vue b/meta_configurator/src/components/CombinedEditorComponent.vue index 18234f0e1..5fd9ebbff 100644 --- a/meta_configurator/src/components/CombinedEditorComponent.vue +++ b/meta_configurator/src/components/CombinedEditorComponent.vue @@ -3,7 +3,7 @@ Main component of the application. Combines the code editor and the gui editor. --> diff --git a/meta_configurator/src/components/panels/rdf/sparql-editor/SparqlQueryTab.vue b/meta_configurator/src/components/panels/rdf/sparql-editor/SparqlQueryTab.vue index 9b586b2d9..9ef741b42 100644 --- a/meta_configurator/src/components/panels/rdf/sparql-editor/SparqlQueryTab.vue +++ b/meta_configurator/src/components/panels/rdf/sparql-editor/SparqlQueryTab.vue @@ -9,7 +9,7 @@ }, }">
- + Use AI assistance to generate SPARQL queries @@ -119,6 +119,10 @@ const emit = defineEmits<{ (e: 'run-query'): void; (e: 'open-visualization-help'): void; }>(); + +function updateActiveAccordion(value: string | string[] | null | undefined) { + emit('update:activeAccordion', Array.isArray(value) ? (value[0] ?? null) : (value ?? null)); +}