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