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 index 83485ebdcc352d05713bbc31b15e1e82c8c0ee32..5d810c8dbc24daa83ec0394e146fd83115a66f81 100644 --- 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 @@ -78,7 +78,7 @@ describe('ExaremeService', () => { expect( data.rawdata['data'][0]['leftacgganteriorcingulategyrus'], - ).toBeCloseTo(4.197, 3); + ).toBeCloseTo(4.197, 2); }); }); }); diff --git a/api/src/engine/connectors/exareme/tests/e2e/naive-bayes.e2e-spec.ts b/api/src/engine/connectors/exareme/tests/e2e/naive-bayes.e2e-spec.ts index 7c664d7088314109b042a781f4a068a21dc3ff75..a8565ab4c9f8e68cc3eb1c4791d8d5c5841006f2 100644 --- a/api/src/engine/connectors/exareme/tests/e2e/naive-bayes.e2e-spec.ts +++ b/api/src/engine/connectors/exareme/tests/e2e/naive-bayes.e2e-spec.ts @@ -1,9 +1,9 @@ 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 { RawResult } from '../../../../models/result/raw-result.model'; import { createExperiment, generateNumber, diff --git a/api/src/engine/connectors/exareme/tests/e2e/one-way-anova.e2e-spec.ts b/api/src/engine/connectors/exareme/tests/e2e/one-way-anova.e2e-spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..e8361797cd5805a1f84e4e8601d110e8ef344a9e --- /dev/null +++ b/api/src/engine/connectors/exareme/tests/e2e/one-way-anova.e2e-spec.ts @@ -0,0 +1,65 @@ +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 { RawResult } from '../../../../models/result/raw-result.model'; +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 = `anova-1way-${generateNumber()}`; + const algorithmId = 'ANOVA_ONEWAY'; + + const input: ExperimentCreateInput = { + name: modelSlug, + variables: ['lefthippocampus'], + coVariables: ['ppmicategory'], + datasets: TEST_PATHOLOGIES.dementia.datasets + .filter((d) => d.code === 'ppmi') + .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(4); + }); + }); +}); diff --git a/api/src/engine/connectors/exareme/tests/e2e/pca.e2e-spec.ts b/api/src/engine/connectors/exareme/tests/e2e/pca.e2e-spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..7fc57c4b76f9b4f834cfc8dc5d063bd6f5e19732 --- /dev/null +++ b/api/src/engine/connectors/exareme/tests/e2e/pca.e2e-spec.ts @@ -0,0 +1,71 @@ +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 { RawResult } from '../../../../models/result/raw-result.model'; +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 = `pca-${generateNumber()}`; + const algorithmId = 'PCA'; + + const input: ExperimentCreateInput = { + name: modelSlug, + variables: ['lefthippocampus', 'rightthalamusproper', 'leftthalamusproper'], + 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: 'standardize', value: ['false'] }, + { id: 'coding', value: ['null'] }, + ], + }, + 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(4); + const data = experimentResult.results[0] as RawResult; + + expect(data.rawdata['data']['eigenvalues'][1]).toBeCloseTo(0.433, 3); + }); + }); +}); diff --git a/api/src/engine/connectors/exareme/tests/e2e/pearson-correlation.e2e-spec.ts b/api/src/engine/connectors/exareme/tests/e2e/pearson-correlation.e2e-spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..14821462cc633ec53b21979067e076b031914a63 --- /dev/null +++ b/api/src/engine/connectors/exareme/tests/e2e/pearson-correlation.e2e-spec.ts @@ -0,0 +1,73 @@ +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 { RawResult } from '../../../../models/result/raw-result.model'; +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 = `pearson-${generateNumber()}`; + const algorithmId = 'PEARSON_CORRELATION'; + + const input: ExperimentCreateInput = { + name: modelSlug, + variables: ['righthippocampus'], + 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: 'standardize', value: ['false'] }, + { id: 'coding', value: ['null'] }, + ], + }, + 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']['Pearson correlation coefficient'][0][0], + ).toBeCloseTo(0.924, 3); + }); + }); +}); diff --git a/api/src/engine/connectors/exareme/tests/e2e/t-test-independant.e2e-spec.ts b/api/src/engine/connectors/exareme/tests/e2e/t-test-independant.e2e-spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..c7ce2bf958de8947a00ae17c48be33a10d99409a --- /dev/null +++ b/api/src/engine/connectors/exareme/tests/e2e/t-test-independant.e2e-spec.ts @@ -0,0 +1,101 @@ +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 { RawResult } from '../../../../models/result/raw-result.model'; +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 = `ttest-idp-${generateNumber()}`; + const algorithmId = 'TTEST_INDEPENDENT'; + + const input: ExperimentCreateInput = { + name: modelSlug, + variables: [ + 'rightpcggposteriorcingulategyrus', + 'leftpcggposteriorcingulategyrus', + 'rightacgganteriorcingulategyrus', + 'leftacgganteriorcingulategyrus', + 'rightmcggmiddlecingulategyrus', + 'leftmcggmiddlecingulategyrus', + 'rightphgparahippocampalgyrus', + ], + coVariables: ['gender'], + 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: 'xlevels', + value: ['M', 'F'], + }, + { + id: 'testvalue', + value: ['3.0'], + }, + { + id: 'hypothesis', + value: ['greaterthan'], + }, + { + id: 'effectsize', + value: ['1'], + }, + { + id: 'ci', + value: ['1'], + }, + { + id: 'meandiff', + value: ['1'], + }, + ], + }, + 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]['t_value']).toBeCloseTo(18.477, 3); + }); + }); +}); diff --git a/api/src/engine/connectors/exareme/tests/e2e/t-test-one-sample.e2e-spec.ts b/api/src/engine/connectors/exareme/tests/e2e/t-test-one-sample.e2e-spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..65c2f282fe18472731be20459e781db61dd2f151 --- /dev/null +++ b/api/src/engine/connectors/exareme/tests/e2e/t-test-one-sample.e2e-spec.ts @@ -0,0 +1,89 @@ +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 { RawResult } from '../../../../models/result/raw-result.model'; +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 = `ttest-1s-${generateNumber()}`; + const algorithmId = 'TTEST_ONESAMPLE'; + + const input: ExperimentCreateInput = { + name: modelSlug, + variables: ['righthippocampus', '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: 'testvalue', + value: ['3.0'], + }, + { + id: 'hypothesis', + value: ['different'], + }, + { + id: 'effectsize', + value: ['1'], + }, + { + id: 'ci', + value: ['1'], + }, + { + id: 'meandiff', + value: ['1'], + }, + ], + }, + 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]['t_value']).toBeCloseTo(8.155, 3); + }); + }); +}); diff --git a/api/src/engine/connectors/exareme/tests/e2e/t-test-paired.e2e-spec.ts b/api/src/engine/connectors/exareme/tests/e2e/t-test-paired.e2e-spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..be5c049dc3fd7e5434c06522ceb2fd1ea7725da7 --- /dev/null +++ b/api/src/engine/connectors/exareme/tests/e2e/t-test-paired.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 { RawResult } from '../../../../models/result/raw-result.model'; +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 = `ttest-paired-${generateNumber()}`; + const algorithmId = 'TTEST_PAIRED'; + + const input: ExperimentCreateInput = { + name: modelSlug, + variables: ['lefthippocampus', 'righthippocampus'], + 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: 'hypothesis', + value: ['different'], + }, + ], + }, + 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; + + console.log(data.rawdata['data']); + + //expect(data.rawdata['data'][0]['t_value']).toBeCloseTo(-63.2, 3); + }); + }); +}); diff --git a/api/src/engine/connectors/exareme/tests/e2e/two-way-anova.e2e-spec.ts b/api/src/engine/connectors/exareme/tests/e2e/two-way-anova.e2e-spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..4a465ed14561a43406a4519beea07de90396fd22 --- /dev/null +++ b/api/src/engine/connectors/exareme/tests/e2e/two-way-anova.e2e-spec.ts @@ -0,0 +1,89 @@ +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 { RawResult } from '../../../../models/result/raw-result.model'; +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 = `anova-2way-${generateNumber()}`; + const algorithmId = 'ANOVA'; + + const input: ExperimentCreateInput = { + name: modelSlug, + variables: ['lefthippocampus'], + 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: 'bins', + value: ['40'], + }, + { + id: 'iterations_max_number', + value: ['20'], + }, + { + id: 'sstype', + value: ['2'], + }, + { + id: 'outputformat', + value: ['pfa'], + }, + { + id: 'design', + value: ['additive'], + }, + ], + }, + 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]['sumofsquares']).toBeCloseTo(34.196, 3); + }); + }); +});