diff --git a/.github/workflows/test_cypress.yml b/.github/workflows/test_cypress.yml index c8d2e6525f..8977b37d9d 100644 --- a/.github/workflows/test_cypress.yml +++ b/.github/workflows/test_cypress.yml @@ -14,6 +14,9 @@ on: jobs: test: runs-on: ubuntu-latest + env: + # Set electron language to german so request use "accept-language: de" header + ELECTRON_EXTRA_LAUNCH_ARGS: --lang=de timeout-minutes: 10 steps: - name: Cache local Maven repository diff --git a/backend/src/main/java/com/bakdata/conquery/io/jetty/ConqueryErrorExceptionMapper.java b/backend/src/main/java/com/bakdata/conquery/io/jetty/ConqueryErrorExceptionMapper.java index 50625b48d1..a6799fc534 100644 --- a/backend/src/main/java/com/bakdata/conquery/io/jetty/ConqueryErrorExceptionMapper.java +++ b/backend/src/main/java/com/bakdata/conquery/io/jetty/ConqueryErrorExceptionMapper.java @@ -1,16 +1,20 @@ package com.bakdata.conquery.io.jetty; -import com.bakdata.conquery.models.error.ConqueryError; import jakarta.ws.rs.core.MediaType; import jakarta.ws.rs.core.Response; import jakarta.ws.rs.ext.ExceptionMapper; +import com.bakdata.conquery.models.error.ConqueryError; +import com.bakdata.conquery.models.error.SimpleErrorInfo; + public class ConqueryErrorExceptionMapper implements ExceptionMapper { @Override public Response toResponse(ConqueryError exception) { - return Response.status(Response.Status.BAD_REQUEST.getStatusCode()) - .type(MediaType.APPLICATION_JSON_TYPE) - .entity(exception) - .build(); + SimpleErrorInfo plain = exception.asPlain(); + + return Response.status(Response.Status.BAD_REQUEST.getStatusCode()) + .type(MediaType.APPLICATION_JSON_TYPE) + .entity(plain) + .build(); } } diff --git a/backend/src/main/java/com/bakdata/conquery/models/error/ConqueryError.java b/backend/src/main/java/com/bakdata/conquery/models/error/ConqueryError.java index ca21fc24d5..4776520c58 100644 --- a/backend/src/main/java/com/bakdata/conquery/models/error/ConqueryError.java +++ b/backend/src/main/java/com/bakdata/conquery/models/error/ConqueryError.java @@ -2,12 +2,14 @@ import java.util.Set; import java.util.UUID; +import jakarta.validation.constraints.NotNull; import c10n.C10N; import com.bakdata.conquery.io.cps.CPSBase; import com.bakdata.conquery.io.cps.CPSType; import com.bakdata.conquery.models.forms.util.Alignment; import com.bakdata.conquery.models.forms.util.Resolution; +import com.bakdata.conquery.models.i18n.I18n; import com.bakdata.conquery.models.identifiable.ids.Id; import com.bakdata.conquery.models.query.entity.Entity; import com.bakdata.conquery.util.VariableDefaultValue; @@ -15,7 +17,6 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonTypeInfo; -import jakarta.validation.constraints.NotNull; import lombok.Data; import lombok.Getter; import lombok.NoArgsConstructor; @@ -79,7 +80,7 @@ public final String getCode() { @JsonIgnore @ToString.Include public final String getMessage() { - return getMessageTemplate(C10N.get(ErrorMessages.class)); + return getMessageTemplate(C10N.get(ErrorMessages.class, I18n.LOCALE.get())); } @JsonIgnore diff --git a/cypress/e2e/frontend/test_1_runQuery.cy.js b/cypress/e2e/frontend/test_1_runQuery.cy.js index 50e7f69f37..d56997f407 100644 --- a/cypress/e2e/frontend/test_1_runQuery.cy.js +++ b/cypress/e2e/frontend/test_1_runQuery.cy.js @@ -61,6 +61,30 @@ describe("Run query", () => { cy.get('@leftPaneContainer').contains('Keine Anfragen / Formulare gefunden') }); + + it("Check user error message", () => { + cy.get('[data-test-id="right-pane-container"] >div:visible').as("queryEditor"); + + // Drag concept to editor + cy.contains("MultiConnector").trigger("dragstart").trigger("dragleave"); + cy.get("@queryEditor") + .trigger("dragenter") + .trigger("dragover") + .trigger("drop") + .trigger("dragend"); + + // Switch to secondary id mode + cy.get("@queryEditor").contains("Secondary Id").click() + + // Exclude only concept from secondary id to create an invalid query + cy.get("@queryEditor").find('[data-test-id="secondary-id-toggle"]').click() + + // Start query + cy.get("@queryEditor").find('[data-test-id="query-runner-button"]').click(); + + // Check for specific user error message + cy.get('[data-test-id="query-runner"]').contains("Die ausgewählte Analyseebenen konnte in keinem der ausgewählten Konzepten gefunden werden.") + }) }); describe("Reference list", () => { diff --git a/cypress/plugins/index.js b/cypress/plugins/index.js index 59b2bab6e4..4c119e1b59 100644 --- a/cypress/plugins/index.js +++ b/cypress/plugins/index.js @@ -19,4 +19,11 @@ module.exports = (on, config) => { // `on` is used to hook into various events Cypress emits // `config` is the resolved Cypress config + on('before:browser:launch', (browser = {}, launchOptions) => { + if (browser.family === 'chromium') { + launchOptions.args.push('--lang=de_DE'); + } + return launchOptions; + }); + } diff --git a/cypress/support/test_data/sid.secondaryId.json b/cypress/support/test_data/sid.secondaryId.json new file mode 100644 index 0000000000..c903fd7e0c --- /dev/null +++ b/cypress/support/test_data/sid.secondaryId.json @@ -0,0 +1,5 @@ +{ + "description": "SecondaryId for Dicing", + "label": "Secondary Id", + "name": "sid" +} \ No newline at end of file diff --git a/cypress/support/test_data/table1.csv b/cypress/support/test_data/table1.csv index f2acb0ce6b..09cd0f2290 100644 --- a/cypress/support/test_data/table1.csv +++ b/cypress/support/test_data/table1.csv @@ -1,2 +1,2 @@ -id,STRING -1,abc \ No newline at end of file +id,sid,STRING +1,a,abc \ No newline at end of file diff --git a/cypress/support/test_data/table1.import.json b/cypress/support/test_data/table1.import.json index 281aac393e..cba65f8f41 100644 --- a/cypress/support/test_data/table1.import.json +++ b/cypress/support/test_data/table1.import.json @@ -8,6 +8,12 @@ "inputType": "STRING", "operation": "COPY" }, + { + "inputColumn": "sid", + "name": "sid", + "inputType": "STRING", + "operation": "COPY" + }, { "inputColumn": "STRING", "name": "STRING", diff --git a/cypress/support/test_data/table1.table.json b/cypress/support/test_data/table1.table.json index 8175103b5a..e43bb1e98e 100644 --- a/cypress/support/test_data/table1.table.json +++ b/cypress/support/test_data/table1.table.json @@ -5,6 +5,11 @@ "name": "id", "type": "STRING" }, + { + "name": "sid", + "type": "STRING", + "secondaryId": "sid" + }, { "name": "STRING", "type": "STRING" diff --git a/frontend/src/js/query-runner/QueryRunner.tsx b/frontend/src/js/query-runner/QueryRunner.tsx index 296b46be41..30ff07863b 100644 --- a/frontend/src/js/query-runner/QueryRunner.tsx +++ b/frontend/src/js/query-runner/QueryRunner.tsx @@ -67,7 +67,7 @@ const QueryRunner = ({ ); return ( - + { const { t } = useTranslation(); - if (queryRunner.startQuery.error) { + const error = queryRunner.startQuery.error; + if (error) { + // Maybe use type guard here + if (typeof error === "string" && error.trim().length > 0) + return { type: "error", value: error }; return { type: "error", value: t("queryRunner.startError") }; } else if (queryRunner.stopQuery.error) { return { type: "error", value: t("queryRunner.stopError") }; diff --git a/frontend/src/js/standard-query-editor/QueryNodeActions.tsx b/frontend/src/js/standard-query-editor/QueryNodeActions.tsx index 930efc0c52..39e1007a97 100644 --- a/frontend/src/js/standard-query-editor/QueryNodeActions.tsx +++ b/frontend/src/js/standard-query-editor/QueryNodeActions.tsx @@ -112,6 +112,7 @@ const QueryNodeActions = (props: Props) => { { e.stopPropagation(); props.onToggleSecondaryIdExclude(props.andIdx, props.orIdx); diff --git a/pom.xml b/pom.xml index 935b4718d3..77ac1b6926 100644 --- a/pom.xml +++ b/pom.xml @@ -48,8 +48,7 @@ org.apache.maven.plugins maven-compiler-plugin - ${java.required} - ${java.required} + ${java.required} true diff --git a/scripts/load_e2e_data.sh b/scripts/load_e2e_data.sh index 7ab6c404d0..fd31706c22 100755 --- a/scripts/load_e2e_data.sh +++ b/scripts/load_e2e_data.sh @@ -33,7 +33,10 @@ echo "Creating mappings" curl --fail -X POST "$admin_api/datasets/dataset1/internToExtern" -H "$h_ct" -H "$h_auth" -d "@./cypress/support/test_data/mapping.mapping.json" sleep 3 - # TODO secondary ID +echo "Creating secondary ids" +curl --fail -X POST "$admin_api/datasets/dataset1/secondaryId" -H "$h_ct" -H "$h_auth" -d "@./cypress/support/test_data/sid.secondaryId.json" +sleep 1 + echo "Creating tables" for table_json in `ls ./cypress/support/test_data/*.table.json` do