From dc7eee26bc51a190db2a86daa01df3fbfa7388dc Mon Sep 17 00:00:00 2001 From: John Chilton Date: Sat, 4 Jul 2020 12:37:49 -0400 Subject: [PATCH] Encapulate datatypes logic into reusable, tested module. --- .../scripts/components/Datatypes/factory.js | 7 +++++ .../scripts/components/Datatypes/index.js | 1 + .../components/Datatypes/index.test.js | 27 +++++++++++++++++++ .../scripts/components/Datatypes/model.js | 13 +++++++++ .../scripts/components/Datatypes/services.js | 12 +++++++++ .../components/Datatypes/test_fixtures.js | 10 +++++++ .../scripts/components/ToolRecommendation.vue | 9 ++++--- .../components/Workflow/Editor/Index.vue | 13 ++++----- .../components/Workflow/Editor/Node.vue | 6 ++--- .../components/Workflow/Editor/NodeInput.vue | 4 +-- .../Workflow/Editor/Recommendations.vue | 7 ++--- .../Workflow/Editor/modules/services.js | 12 --------- .../Workflow/Editor/modules/terminals.js | 7 ++--- .../qunit/tests/workflow_editor_tests.js | 12 ++++----- 14 files changed, 97 insertions(+), 43 deletions(-) create mode 100644 client/galaxy/scripts/components/Datatypes/factory.js create mode 100644 client/galaxy/scripts/components/Datatypes/index.js create mode 100644 client/galaxy/scripts/components/Datatypes/index.test.js create mode 100644 client/galaxy/scripts/components/Datatypes/model.js create mode 100644 client/galaxy/scripts/components/Datatypes/services.js create mode 100644 client/galaxy/scripts/components/Datatypes/test_fixtures.js diff --git a/client/galaxy/scripts/components/Datatypes/factory.js b/client/galaxy/scripts/components/Datatypes/factory.js new file mode 100644 index 00000000000..19637145afb --- /dev/null +++ b/client/galaxy/scripts/components/Datatypes/factory.js @@ -0,0 +1,7 @@ +import { DatatypesMapperModel } from "./model.js"; +import { getDatatypes } from "./services"; + +export async function getDatatypesMapper() { + const typesAndMapping = await getDatatypes(); + return new DatatypesMapperModel(typesAndMapping); +} diff --git a/client/galaxy/scripts/components/Datatypes/index.js b/client/galaxy/scripts/components/Datatypes/index.js new file mode 100644 index 00000000000..3350500fd3b --- /dev/null +++ b/client/galaxy/scripts/components/Datatypes/index.js @@ -0,0 +1 @@ +export { getDatatypesMapper } from "./factory.js"; diff --git a/client/galaxy/scripts/components/Datatypes/index.test.js b/client/galaxy/scripts/components/Datatypes/index.test.js new file mode 100644 index 00000000000..bf895148209 --- /dev/null +++ b/client/galaxy/scripts/components/Datatypes/index.test.js @@ -0,0 +1,27 @@ +import axios from "axios"; +import MockAdapter from "axios-mock-adapter"; + +import { getDatatypesMapper } from "./index"; +import { typesAndMappingResponse } from "./test_fixtures"; + +describe("Datatypes/index.js", () => { + let axiosMock; + + beforeEach(() => { + axiosMock = new MockAdapter(axios); + }); + + afterEach(() => { + axiosMock.restore(); + }); + + describe("getDatatypesMapper", () => { + it("should fetch logic from API for comparing datatypes in a hierarchy", async () => { + axiosMock.onGet(`/api/datatypes/types_and_mapping`).reply(200, typesAndMappingResponse); + await getDatatypesMapper().then((mapper) => { + expect(mapper.isSubType("txt", "data")).to.equals(true); + expect(mapper.isSubType("data", "txt")).to.equals(false); + }); + }); + }); +}); diff --git a/client/galaxy/scripts/components/Datatypes/model.js b/client/galaxy/scripts/components/Datatypes/model.js new file mode 100644 index 00000000000..1039dd96d20 --- /dev/null +++ b/client/galaxy/scripts/components/Datatypes/model.js @@ -0,0 +1,13 @@ +export class DatatypesMapperModel { + constructor(typesAndMapping) { + this.datatypes = typesAndMapping.datatypes; + this.datatypesMapping = typesAndMapping.datatypes_mapping; + } + + isSubType(child, parent) { + const mapping = this.datatypesMapping; + child = mapping.ext_to_class_name[child]; + parent = mapping.ext_to_class_name[parent]; + return mapping.class_to_classes[child] && parent in mapping.class_to_classes[child]; + } +} diff --git a/client/galaxy/scripts/components/Datatypes/services.js b/client/galaxy/scripts/components/Datatypes/services.js new file mode 100644 index 00000000000..f6ba04aa71f --- /dev/null +++ b/client/galaxy/scripts/components/Datatypes/services.js @@ -0,0 +1,12 @@ +import axios from "axios"; +import { rethrowSimple } from "utils/simple-error"; +import { getAppRoot } from "onload/loadConfig"; + +export async function getDatatypes() { + try { + const request = await axios.get(`${getAppRoot()}api/datatypes/types_and_mapping`); + return request.data; + } catch (e) { + rethrowSimple(e); + } +} diff --git a/client/galaxy/scripts/components/Datatypes/test_fixtures.js b/client/galaxy/scripts/components/Datatypes/test_fixtures.js new file mode 100644 index 00000000000..39897c7480a --- /dev/null +++ b/client/galaxy/scripts/components/Datatypes/test_fixtures.js @@ -0,0 +1,10 @@ +import DatatypesMappingJson from "qunit/test-data/json/datatypes.mapping.json"; +import DatatypesJson from "qunit/test-data/json/datatypes.json"; +import { DatatypesMapperModel } from "./model.js"; + +export const typesAndMappingResponse = { + datatypes: DatatypesJson, + datatypes_mapping: DatatypesMappingJson, +}; + +export const testDatatypesMapper = new DatatypesMapperModel(typesAndMappingResponse); diff --git a/client/galaxy/scripts/components/ToolRecommendation.vue b/client/galaxy/scripts/components/ToolRecommendation.vue index 3ccfc00b891..65a06946727 100644 --- a/client/galaxy/scripts/components/ToolRecommendation.vue +++ b/client/galaxy/scripts/components/ToolRecommendation.vue @@ -17,7 +17,8 @@