From efaffa98a1624791206a3701fd1109446411d6c9 Mon Sep 17 00:00:00 2001 From: stevereis <stevereis93@gmail.com> Date: Mon, 22 Nov 2021 18:01:11 +0100 Subject: [PATCH] WIP add test algorithm exareme --- .../{tests => interfaces}/test-utilities.ts | 4 + .../exareme/tests/e2e/3c.e2e-spec.ts | 74 ++++++++++++++++ .../calibration-belt.e2e-spec.ts | 7 +- .../exareme/tests/e2e/cart.e2e-spec.ts | 72 ++++++++++++++++ .../e2e/descriptiveStatistics.e2e-spec.ts | 70 ++++++++++++++++ .../exareme/tests/e2e/id3.e2e-spec.ts | 71 ++++++++++++++++ .../exareme/tests/e2e/k-means.e2e-spec.ts | 84 +++++++++++++++++++ .../tests/e2e/kaplan-meier.e2e-spec.ts | 84 +++++++++++++++++++ .../tests/e2e/linear-regression.e2e-spec.ts | 82 ++++++++++++++++++ .../tests/e2e/logistic-regression.e2e-spec.ts | 72 ++++++++++++++++ .../tests/e2e/multiple-histograms.e2e-spec.ts | 66 +++++++++++++++ 11 files changed, 683 insertions(+), 3 deletions(-) rename api/src/engine/connectors/exareme/{tests => interfaces}/test-utilities.ts (94%) create mode 100644 api/src/engine/connectors/exareme/tests/e2e/3c.e2e-spec.ts rename api/src/engine/connectors/exareme/tests/{units => e2e}/calibration-belt.e2e-spec.ts (91%) create mode 100644 api/src/engine/connectors/exareme/tests/e2e/cart.e2e-spec.ts create mode 100644 api/src/engine/connectors/exareme/tests/e2e/descriptiveStatistics.e2e-spec.ts create mode 100644 api/src/engine/connectors/exareme/tests/e2e/id3.e2e-spec.ts create mode 100644 api/src/engine/connectors/exareme/tests/e2e/k-means.e2e-spec.ts create mode 100644 api/src/engine/connectors/exareme/tests/e2e/kaplan-meier.e2e-spec.ts create mode 100644 api/src/engine/connectors/exareme/tests/e2e/linear-regression.e2e-spec.ts create mode 100644 api/src/engine/connectors/exareme/tests/e2e/logistic-regression.e2e-spec.ts create mode 100644 api/src/engine/connectors/exareme/tests/e2e/multiple-histograms.e2e-spec.ts diff --git a/api/src/engine/connectors/exareme/tests/test-utilities.ts b/api/src/engine/connectors/exareme/interfaces/test-utilities.ts similarity index 94% rename from api/src/engine/connectors/exareme/tests/test-utilities.ts rename to api/src/engine/connectors/exareme/interfaces/test-utilities.ts index 116863a..2ad1c79 100644 --- a/api/src/engine/connectors/exareme/tests/test-utilities.ts +++ b/api/src/engine/connectors/exareme/interfaces/test-utilities.ts @@ -68,10 +68,14 @@ const uid = (): string => return v.toString(16); }); +const generateNumber = (): string => { + return Math.round(Math.random() * 10000).toString(); +}; export { createExperiment, uid, waitForResult, + generateNumber, TEST_PATHOLOGIES, TIMEOUT_DURATION_SECONDS, }; diff --git a/api/src/engine/connectors/exareme/tests/e2e/3c.e2e-spec.ts b/api/src/engine/connectors/exareme/tests/e2e/3c.e2e-spec.ts new file mode 100644 index 0000000..26a9cc1 --- /dev/null +++ b/api/src/engine/connectors/exareme/tests/e2e/3c.e2e-spec.ts @@ -0,0 +1,74 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { AppModule } from '../../../../../main/app.module'; +import { ENGINE_SERVICE } from '../../../../engine.constants'; +import { IEngineService } from '../../../../engine.interfaces'; +import { ExperimentCreateInput } from '../../../../models/experiment/input/experiment-create.input'; +import { + createExperiment, + generateNumber, + TEST_PATHOLOGIES, + TIMEOUT_DURATION_SECONDS, + waitForResult, +} from '../../interfaces/test-utilities'; + +jest.setTimeout(1000 * TIMEOUT_DURATION_SECONDS); + +describe('ExaremeService', () => { + let exaremeService: IEngineService; + + beforeEach(async () => { + const moduleRef: TestingModule = await Test.createTestingModule({ + imports: [AppModule], + }).compile(); + + exaremeService = await moduleRef.resolve<IEngineService>(ENGINE_SERVICE); + }); + + const modelSlug = `3c-${generateNumber()}`; + const algorithmId = 'THREE_C'; + + const input: ExperimentCreateInput = { + name: modelSlug, + variables: ['lefthippocampus', 'righthippocampus', 'leftcaudate'], + coVariables: ['gender', 'agegroup'], + datasets: TEST_PATHOLOGIES.dementia.datasets + .filter((d) => d.code === 'ppmi' || d.code === 'edsd') + .map((d) => d.code), + domain: TEST_PATHOLOGIES.dementia.code, + algorithm: { + id: algorithmId, + type: 'string', + parameters: [ + { id: 'dx', value: ['alzheimerbroadcategory'] }, + { id: 'c2_feature_selection_method', value: ['RF'] }, + { id: 'c2_num_clusters_method', value: ['Euclidean'] }, + { id: 'c2_num_clusters', value: ['6'] }, + { id: 'c2_clustering_method', value: ['Euclidean'] }, + { id: 'c3_feature_selection_method', value: ['RF'] }, + { id: 'c3_classification_method', value: ['RF'] }, + ], + }, + filter: '', + }; + + describe('Integration Test for experiment API', () => { + it(`create ${algorithmId}`, async () => { + const experiment = await createExperiment(input, exaremeService); + + expect(experiment).toBeTruthy(); + expect(experiment?.status).toStrictEqual('pending'); + + expect(experiment?.id).toBeTruthy(); + + const experimentResult = await waitForResult( + experiment?.id ?? '', + exaremeService, + ); + + expect(experimentResult).toBeTruthy(); + expect(experimentResult.status).toStrictEqual('success'); + + expect(experimentResult.results.length).toBeGreaterThanOrEqual(1); + }); + }); +}); diff --git a/api/src/engine/connectors/exareme/tests/units/calibration-belt.e2e-spec.ts b/api/src/engine/connectors/exareme/tests/e2e/calibration-belt.e2e-spec.ts similarity index 91% rename from api/src/engine/connectors/exareme/tests/units/calibration-belt.e2e-spec.ts rename to api/src/engine/connectors/exareme/tests/e2e/calibration-belt.e2e-spec.ts index 34d674b..377b4ec 100644 --- a/api/src/engine/connectors/exareme/tests/units/calibration-belt.e2e-spec.ts +++ b/api/src/engine/connectors/exareme/tests/e2e/calibration-belt.e2e-spec.ts @@ -5,10 +5,11 @@ import { IEngineService } from '../../../../engine.interfaces'; import { ExperimentCreateInput } from '../../../../models/experiment/input/experiment-create.input'; import { createExperiment, + generateNumber, TEST_PATHOLOGIES, TIMEOUT_DURATION_SECONDS, waitForResult, -} from '../test-utilities'; +} from '../../interfaces/test-utilities'; jest.setTimeout(1000 * TIMEOUT_DURATION_SECONDS); @@ -23,7 +24,7 @@ describe('ExaremeService', () => { exaremeService = await moduleRef.resolve<IEngineService>(ENGINE_SERVICE); }); - const modelSlug = `calibration-belt-${Math.round(Math.random() * 10000)}`; + const modelSlug = `calibration-belt-${generateNumber()}`; const algorithmId = 'CALIBRATION_BELT'; const input: ExperimentCreateInput = { @@ -80,7 +81,7 @@ describe('ExaremeService', () => { expect(experimentResult.status).toStrictEqual('success'); expect(experimentResult).toBeTruthy(); - expect(experimentResult.results).toHaveLength(1); + expect(experimentResult.results.length).toBeGreaterThanOrEqual(1); }); }); }); diff --git a/api/src/engine/connectors/exareme/tests/e2e/cart.e2e-spec.ts b/api/src/engine/connectors/exareme/tests/e2e/cart.e2e-spec.ts new file mode 100644 index 0000000..b6a10af --- /dev/null +++ b/api/src/engine/connectors/exareme/tests/e2e/cart.e2e-spec.ts @@ -0,0 +1,72 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { RawResult } from 'src/engine/models/result/raw-result.model'; +import { AppModule } from '../../../../../main/app.module'; +import { ENGINE_SERVICE } from '../../../../engine.constants'; +import { IEngineService } from '../../../../engine.interfaces'; +import { ExperimentCreateInput } from '../../../../models/experiment/input/experiment-create.input'; +import { + createExperiment, + generateNumber, + TEST_PATHOLOGIES, + TIMEOUT_DURATION_SECONDS, + waitForResult, +} from '../../interfaces/test-utilities'; + +jest.setTimeout(1000 * TIMEOUT_DURATION_SECONDS); + +describe('ExaremeService', () => { + let exaremeService: IEngineService; + + beforeEach(async () => { + const moduleRef: TestingModule = await Test.createTestingModule({ + imports: [AppModule], + }).compile(); + + exaremeService = await moduleRef.resolve<IEngineService>(ENGINE_SERVICE); + }); + const modelSlug = `cart-${generateNumber()}`; + const algorithmId = 'CART'; + + const input: ExperimentCreateInput = { + name: modelSlug, + coVariables: ['lefthippocampus', 'righthippocampus'], + variables: ['alzheimerbroadcategory'], + datasets: TEST_PATHOLOGIES.dementia.datasets + .filter((d) => d.code !== 'fake_longitudinal') + .map((d) => d.code), + domain: TEST_PATHOLOGIES.dementia.code, + algorithm: { + id: algorithmId, + type: 'string', + parameters: [ + { id: 'max_depth', value: ['3'] }, + { id: 'no_split_points', value: ['10'] }, + ], + }, + filter: '', + }; + + describe('Integration Test for experiment API', () => { + it(`create ${algorithmId}`, async () => { + const experiment = await createExperiment(input, exaremeService); + + expect(experiment).toBeTruthy(); + expect(experiment?.status).toStrictEqual('pending'); + + expect(experiment?.id).toBeTruthy(); + + const experimentResult = await waitForResult( + experiment?.id ?? '', + exaremeService, + ); + + expect(experimentResult).toBeTruthy(); + expect(experimentResult.status).toStrictEqual('success'); + + expect(experimentResult.results.length).toBeGreaterThanOrEqual(1); + const r0 = experimentResult.results[0] as RawResult; + + expect(r0?.rawdata['data'].gain).toEqual(0.6142216049382716); + }); + }); +}); diff --git a/api/src/engine/connectors/exareme/tests/e2e/descriptiveStatistics.e2e-spec.ts b/api/src/engine/connectors/exareme/tests/e2e/descriptiveStatistics.e2e-spec.ts new file mode 100644 index 0000000..96fb1c2 --- /dev/null +++ b/api/src/engine/connectors/exareme/tests/e2e/descriptiveStatistics.e2e-spec.ts @@ -0,0 +1,70 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { GroupsResult } from 'src/engine/models/result/groups-result.model'; +import { TableResult } from 'src/engine/models/result/table-result.model'; +import { AppModule } from '../../../../../main/app.module'; +import { ENGINE_SERVICE } from '../../../../engine.constants'; +import { IEngineService } from '../../../../engine.interfaces'; +import { ExperimentCreateInput } from '../../../../models/experiment/input/experiment-create.input'; +import { + createExperiment, + generateNumber, + TEST_PATHOLOGIES, + TIMEOUT_DURATION_SECONDS, + waitForResult, +} from '../../interfaces/test-utilities'; + +jest.setTimeout(1000 * TIMEOUT_DURATION_SECONDS); + +describe('ExaremeService', () => { + let exaremeService: IEngineService; + + beforeEach(async () => { + const moduleRef: TestingModule = await Test.createTestingModule({ + imports: [AppModule], + }).compile(); + + exaremeService = await moduleRef.resolve<IEngineService>(ENGINE_SERVICE); + }); + const modelSlug = `statistics-${generateNumber()}`; + const algorithmId = 'DESCRIPTIVE_STATS'; + + const input: ExperimentCreateInput = { + name: modelSlug, + variables: ['lefthippocampus', 'alzheimerbroadcategory'], + datasets: TEST_PATHOLOGIES.dementia.datasets + .filter((d) => d.code !== 'fake_longitudinal') + .map((d) => d.code), + domain: TEST_PATHOLOGIES.dementia.code, + algorithm: { + id: algorithmId, + type: 'string', + parameters: [], + }, + filter: '', + }; + + describe('Integration Test for experiment API', () => { + it(`create ${algorithmId}`, async () => { + const experiment = await createExperiment(input, exaremeService); + + expect(experiment).toBeTruthy(); + expect(experiment?.status).toStrictEqual('pending'); + + expect(experiment?.id).toBeTruthy(); + + const experimentResult = await waitForResult( + experiment?.id ?? '', + exaremeService, + ); + + expect(experimentResult).toBeTruthy(); + expect(experimentResult.status).toStrictEqual('success'); + + expect(experimentResult.results.length).toBeGreaterThanOrEqual(1); + const r0 = experimentResult.results[0] as GroupsResult; + const table = r0.groups[0].results[0] as TableResult; + + expect(table.data[0][2]).toEqual(474); + }); + }); +}); diff --git a/api/src/engine/connectors/exareme/tests/e2e/id3.e2e-spec.ts b/api/src/engine/connectors/exareme/tests/e2e/id3.e2e-spec.ts new file mode 100644 index 0000000..b13fc5f --- /dev/null +++ b/api/src/engine/connectors/exareme/tests/e2e/id3.e2e-spec.ts @@ -0,0 +1,71 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { GroupsResult } from 'src/engine/models/result/groups-result.model'; +import { RawResult } from 'src/engine/models/result/raw-result.model'; +import { TableResult } from 'src/engine/models/result/table-result.model'; +import { AppModule } from '../../../../../main/app.module'; +import { ENGINE_SERVICE } from '../../../../engine.constants'; +import { IEngineService } from '../../../../engine.interfaces'; +import { ExperimentCreateInput } from '../../../../models/experiment/input/experiment-create.input'; +import { + createExperiment, + generateNumber, + TEST_PATHOLOGIES, + TIMEOUT_DURATION_SECONDS, + waitForResult, +} from '../../interfaces/test-utilities'; + +jest.setTimeout(1000 * TIMEOUT_DURATION_SECONDS); + +describe('ExaremeService', () => { + let exaremeService: IEngineService; + + beforeEach(async () => { + const moduleRef: TestingModule = await Test.createTestingModule({ + imports: [AppModule], + }).compile(); + + exaremeService = await moduleRef.resolve<IEngineService>(ENGINE_SERVICE); + }); + const modelSlug = `id3-${generateNumber()}`; + const algorithmId = 'ID3'; + + const input: ExperimentCreateInput = { + name: modelSlug, + variables: ['alzheimerbroadcategory'], + coVariables: ['gender', 'agegroup'], + datasets: TEST_PATHOLOGIES.dementia.datasets + .filter((d) => d.code !== 'fake_longitudinal') + .map((d) => d.code), + domain: TEST_PATHOLOGIES.dementia.code, + algorithm: { + id: algorithmId, + type: 'string', + parameters: [{ id: 'iterations_max_number', value: ['20'] }], + }, + filter: '', + }; + + describe('Integration Test for experiment API', () => { + it(`create ${algorithmId}`, async () => { + const experiment = await createExperiment(input, exaremeService); + + expect(experiment).toBeTruthy(); + expect(experiment?.status).toStrictEqual('pending'); + + expect(experiment?.id).toBeTruthy(); + + const experimentResult = await waitForResult( + experiment?.id ?? '', + exaremeService, + ); + + expect(experimentResult).toBeTruthy(); + expect(experimentResult.status).toStrictEqual('success'); + + expect(experimentResult.results.length).toBeGreaterThanOrEqual(2); + const data = experimentResult.results[0] as RawResult; + + expect(data.rawdata['data']['data'][0][2]).toEqual('+80y'); + }); + }); +}); diff --git a/api/src/engine/connectors/exareme/tests/e2e/k-means.e2e-spec.ts b/api/src/engine/connectors/exareme/tests/e2e/k-means.e2e-spec.ts new file mode 100644 index 0000000..83485eb --- /dev/null +++ b/api/src/engine/connectors/exareme/tests/e2e/k-means.e2e-spec.ts @@ -0,0 +1,84 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { RawResult } from 'src/engine/models/result/raw-result.model'; +import { AppModule } from '../../../../../main/app.module'; +import { ENGINE_SERVICE } from '../../../../engine.constants'; +import { IEngineService } from '../../../../engine.interfaces'; +import { ExperimentCreateInput } from '../../../../models/experiment/input/experiment-create.input'; +import { + createExperiment, + generateNumber, + TEST_PATHOLOGIES, + TIMEOUT_DURATION_SECONDS, + waitForResult, +} from '../../interfaces/test-utilities'; + +jest.setTimeout(1000 * TIMEOUT_DURATION_SECONDS); + +describe('ExaremeService', () => { + let exaremeService: IEngineService; + + beforeEach(async () => { + const moduleRef: TestingModule = await Test.createTestingModule({ + imports: [AppModule], + }).compile(); + + exaremeService = await moduleRef.resolve<IEngineService>(ENGINE_SERVICE); + }); + const modelSlug = `kmeans-${generateNumber()}`; + const algorithmId = 'KMEANS'; + + const input: ExperimentCreateInput = { + name: modelSlug, + variables: ['leftacgganteriorcingulategyrus', 'rightcerebellumexterior'], + coVariables: ['alzheimerbroadcategory'], + datasets: TEST_PATHOLOGIES.dementia.datasets + .filter((d) => d.code !== 'fake_longitudinal') + .map((d) => d.code), + domain: TEST_PATHOLOGIES.dementia.code, + algorithm: { + id: algorithmId, + type: 'string', + parameters: [ + { + id: 'k', + value: ['4'], + }, + { + id: 'e', + value: ['1'], + }, + { + id: 'iterations_max_number', + value: ['1000'], + }, + ], + }, + filter: '', + }; + + describe('Integration Test for experiment API', () => { + it(`create ${algorithmId}`, async () => { + const experiment = await createExperiment(input, exaremeService); + + expect(experiment).toBeTruthy(); + expect(experiment?.status).toStrictEqual('pending'); + + expect(experiment?.id).toBeTruthy(); + + const experimentResult = await waitForResult( + experiment?.id ?? '', + exaremeService, + ); + + expect(experimentResult).toBeTruthy(); + expect(experimentResult.status).toStrictEqual('success'); + + expect(experimentResult.results.length).toBeGreaterThanOrEqual(1); + const data = experimentResult.results[0] as RawResult; + + expect( + data.rawdata['data'][0]['leftacgganteriorcingulategyrus'], + ).toBeCloseTo(4.197, 3); + }); + }); +}); diff --git a/api/src/engine/connectors/exareme/tests/e2e/kaplan-meier.e2e-spec.ts b/api/src/engine/connectors/exareme/tests/e2e/kaplan-meier.e2e-spec.ts new file mode 100644 index 0000000..03f9932 --- /dev/null +++ b/api/src/engine/connectors/exareme/tests/e2e/kaplan-meier.e2e-spec.ts @@ -0,0 +1,84 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { ParamType } from 'src/engine/models/experiment/input/algorithm-parameter.input'; +import { RawResult } from 'src/engine/models/result/raw-result.model'; +import { AppModule } from '../../../../../main/app.module'; +import { ENGINE_SERVICE } from '../../../../engine.constants'; +import { IEngineService } from '../../../../engine.interfaces'; +import { ExperimentCreateInput } from '../../../../models/experiment/input/experiment-create.input'; +import { + createExperiment, + generateNumber, + TEST_PATHOLOGIES, + TIMEOUT_DURATION_SECONDS, + waitForResult, +} from '../../interfaces/test-utilities'; + +jest.setTimeout(1000 * TIMEOUT_DURATION_SECONDS); + +describe('ExaremeService', () => { + let exaremeService: IEngineService; + + beforeEach(async () => { + const moduleRef: TestingModule = await Test.createTestingModule({ + imports: [AppModule], + }).compile(); + + exaremeService = await moduleRef.resolve<IEngineService>(ENGINE_SERVICE); + }); + const modelSlug = `kaplan-meier-${generateNumber()}`; + const algorithmId = 'KAPLAN_MEIER'; + + const input: ExperimentCreateInput = { + name: modelSlug, + variables: ['alzheimerbroadcategory'], + coVariables: ['apoe4'], + datasets: TEST_PATHOLOGIES.dementia.datasets + .filter((d) => d.code !== 'fake_longitudinal') + .map((d) => d.code), + domain: TEST_PATHOLOGIES.dementia.code, + algorithm: { + id: algorithmId, + type: 'string', + parameters: [ + { + id: 'outcome_pos', + value: ['AD'], + }, + { + id: 'outcome_neg', + value: ['MCI'], + }, + { + id: 'max_age', + value: ['100'], + }, + { + id: 'total_duration', + value: ['1100'], + }, + ], + }, + filter: '', + }; + + describe('Integration Test for experiment API', () => { + it(`create ${algorithmId}`, async () => { + const experiment = await createExperiment(input, exaremeService); + + expect(experiment).toBeTruthy(); + expect(experiment?.status).toStrictEqual('pending'); + + expect(experiment?.id).toBeTruthy(); + + const experimentResult = await waitForResult( + experiment?.id ?? '', + exaremeService, + ); + + expect(experimentResult).toBeTruthy(); + expect(experimentResult.status).toStrictEqual('success'); + + expect(experimentResult.results.length).toBeGreaterThanOrEqual(1); + }); + }); +}); diff --git a/api/src/engine/connectors/exareme/tests/e2e/linear-regression.e2e-spec.ts b/api/src/engine/connectors/exareme/tests/e2e/linear-regression.e2e-spec.ts new file mode 100644 index 0000000..fbb5ab6 --- /dev/null +++ b/api/src/engine/connectors/exareme/tests/e2e/linear-regression.e2e-spec.ts @@ -0,0 +1,82 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { RawResult } from 'src/engine/models/result/raw-result.model'; +import { AppModule } from '../../../../../main/app.module'; +import { ENGINE_SERVICE } from '../../../../engine.constants'; +import { IEngineService } from '../../../../engine.interfaces'; +import { ExperimentCreateInput } from '../../../../models/experiment/input/experiment-create.input'; +import { + createExperiment, + generateNumber, + TEST_PATHOLOGIES, + TIMEOUT_DURATION_SECONDS, + waitForResult, +} from '../../interfaces/test-utilities'; + +jest.setTimeout(1000 * TIMEOUT_DURATION_SECONDS); + +describe('ExaremeService', () => { + let exaremeService: IEngineService; + + beforeEach(async () => { + const moduleRef: TestingModule = await Test.createTestingModule({ + imports: [AppModule], + }).compile(); + + exaremeService = await moduleRef.resolve<IEngineService>(ENGINE_SERVICE); + }); + const modelSlug = `linear-${generateNumber()}`; + const algorithmId = 'LINEAR_REGRESSION'; + + const input: ExperimentCreateInput = { + name: modelSlug, + variables: ['lefthippocampus'], + coVariables: ['leftpcuprecuneus'], + datasets: TEST_PATHOLOGIES.dementia.datasets + .filter((d) => d.code !== 'fake_longitudinal') + .map((d) => d.code), + domain: TEST_PATHOLOGIES.dementia.code, + algorithm: { + id: algorithmId, + type: 'string', + parameters: [ + { + id: 'referencevalues', + value: ['[{"name":"alzheimerbroadcategory","val":"Other"}]'], + }, + { + id: 'encodingparameter', + value: ['dummycoding'], + }, + ], + }, + filter: + '{"condition":"AND","rules":[{"id":"subjectageyears","field":"subjectageyears","type":"integer","input":"number","operator":"greater","value":"65"}],"valid":true}', + }; + + describe('Integration Test for experiment API', () => { + it(`create ${algorithmId}`, async () => { + const experiment = await createExperiment(input, exaremeService); + + expect(experiment).toBeTruthy(); + expect(experiment?.status).toStrictEqual('pending'); + + expect(experiment?.id).toBeTruthy(); + + const experimentResult = await waitForResult( + experiment?.id ?? '', + exaremeService, + ); + + expect(experimentResult).toBeTruthy(); + expect(experimentResult.status).toStrictEqual('success'); + + expect(experimentResult.results.length).toBeGreaterThanOrEqual(1); + const data = experimentResult.results[0] as RawResult; + + expect(data.rawdata['data']['coefficients'][0]['estimate']).toBeCloseTo( + 0.986, + 3, + ); + }); + }); +}); diff --git a/api/src/engine/connectors/exareme/tests/e2e/logistic-regression.e2e-spec.ts b/api/src/engine/connectors/exareme/tests/e2e/logistic-regression.e2e-spec.ts new file mode 100644 index 0000000..1ea5e53 --- /dev/null +++ b/api/src/engine/connectors/exareme/tests/e2e/logistic-regression.e2e-spec.ts @@ -0,0 +1,72 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { RawResult } from 'src/engine/models/result/raw-result.model'; +import { AppModule } from '../../../../../main/app.module'; +import { ENGINE_SERVICE } from '../../../../engine.constants'; +import { IEngineService } from '../../../../engine.interfaces'; +import { ExperimentCreateInput } from '../../../../models/experiment/input/experiment-create.input'; +import { + createExperiment, + generateNumber, + TEST_PATHOLOGIES, + TIMEOUT_DURATION_SECONDS, + waitForResult, +} from '../../interfaces/test-utilities'; + +jest.setTimeout(1000 * TIMEOUT_DURATION_SECONDS); + +describe('ExaremeService', () => { + let exaremeService: IEngineService; + + beforeEach(async () => { + const moduleRef: TestingModule = await Test.createTestingModule({ + imports: [AppModule], + }).compile(); + + exaremeService = await moduleRef.resolve<IEngineService>(ENGINE_SERVICE); + }); + const modelSlug = `logistic-${generateNumber()}`; + const algorithmId = 'LOGISTIC_REGRESSION'; + + const input: ExperimentCreateInput = { + name: modelSlug, + variables: ['gender'], + coVariables: ['lefthippocampus'], + datasets: TEST_PATHOLOGIES.dementia.datasets + .filter((d) => d.code !== 'fake_longitudinal') + .map((d) => d.code), + domain: TEST_PATHOLOGIES.dementia.code, + algorithm: { + id: algorithmId, + type: 'string', + parameters: [ + { id: 'positive_level', value: ['M'] }, + { id: 'negative_level', value: ['F'] }, + ], + }, + filter: '', + }; + + describe('Integration Test for experiment API', () => { + it(`create ${algorithmId}`, async () => { + const experiment = await createExperiment(input, exaremeService); + + expect(experiment).toBeTruthy(); + expect(experiment?.status).toStrictEqual('pending'); + + expect(experiment?.id).toBeTruthy(); + + const experimentResult = await waitForResult( + experiment?.id ?? '', + exaremeService, + ); + + expect(experimentResult).toBeTruthy(); + expect(experimentResult.status).toStrictEqual('success'); + + expect(experimentResult.results.length).toBeGreaterThanOrEqual(1); + const data = experimentResult.results[0] as RawResult; + + expect(data.rawdata['data']['Coefficients'][0]).toBeCloseTo(-7.628, 3); + }); + }); +}); diff --git a/api/src/engine/connectors/exareme/tests/e2e/multiple-histograms.e2e-spec.ts b/api/src/engine/connectors/exareme/tests/e2e/multiple-histograms.e2e-spec.ts new file mode 100644 index 0000000..28c7fb4 --- /dev/null +++ b/api/src/engine/connectors/exareme/tests/e2e/multiple-histograms.e2e-spec.ts @@ -0,0 +1,66 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { RawResult } from 'src/engine/models/result/raw-result.model'; +import { AppModule } from '../../../../../main/app.module'; +import { ENGINE_SERVICE } from '../../../../engine.constants'; +import { IEngineService } from '../../../../engine.interfaces'; +import { ExperimentCreateInput } from '../../../../models/experiment/input/experiment-create.input'; +import { + createExperiment, + generateNumber, + TEST_PATHOLOGIES, + TIMEOUT_DURATION_SECONDS, + waitForResult, +} from '../../interfaces/test-utilities'; + +jest.setTimeout(1000 * TIMEOUT_DURATION_SECONDS); + +describe('ExaremeService', () => { + let exaremeService: IEngineService; + + beforeEach(async () => { + const moduleRef: TestingModule = await Test.createTestingModule({ + imports: [AppModule], + }).compile(); + + exaremeService = await moduleRef.resolve<IEngineService>(ENGINE_SERVICE); + }); + const modelSlug = `histograms-${generateNumber()}`; + const algorithmId = 'MULTIPLE_HISTOGRAMS'; + + const input: ExperimentCreateInput = { + name: modelSlug, + variables: ['lefthippocampus'], + coVariables: ['gender', 'alzheimerbroadcategory'], + datasets: TEST_PATHOLOGIES.dementia.datasets + .filter((d) => d.code !== 'fake_longitudinal') + .map((d) => d.code), + domain: TEST_PATHOLOGIES.dementia.code, + algorithm: { + id: algorithmId, + type: 'string', + parameters: [{ id: 'bins', value: ['{ "lefthippocampus" : 35 }'] }], + }, + filter: '', + }; + + describe('Integration Test for experiment API', () => { + it(`create ${algorithmId}`, async () => { + const experiment = await createExperiment(input, exaremeService); + + expect(experiment).toBeTruthy(); + expect(experiment?.status).toStrictEqual('pending'); + + expect(experiment?.id).toBeTruthy(); + + const experimentResult = await waitForResult( + experiment?.id ?? '', + exaremeService, + ); + + expect(experimentResult).toBeTruthy(); + expect(experimentResult.status).toStrictEqual('success'); + + expect(experimentResult.results.length).toBeGreaterThanOrEqual(3); + }); + }); +}); -- GitLab