From 10a586ba1a75f4c83f8b8c5d587c6897e91a2f55 Mon Sep 17 00:00:00 2001 From: Detailleur <detailleur@fortiss.org> Date: Tue, 6 Jul 2021 10:10:38 +0200 Subject: [PATCH] [NRRPLT-8288] test import experiments --- src/mocks/mock_bibi_configuration.bibi | 15 +++++++++++ src/mocks/mock_experiment_configuration.exc | 26 +++++++++++++++++++ src/mocks/mock_husky_event.json | 10 +++++++ src/mocks/mock_scan_storage_response.json | 4 +++ src/mocks/mock_zip_responses.json | 11 ++++++++ src/services/__tests__/dialog-service.test.js | 11 ++++---- .../import-experiment-service.test.js | 17 +++++++++--- .../files/import-experiment-service.js | 11 ++++---- 8 files changed, 91 insertions(+), 14 deletions(-) create mode 100644 src/mocks/mock_bibi_configuration.bibi create mode 100644 src/mocks/mock_experiment_configuration.exc create mode 100644 src/mocks/mock_husky_event.json create mode 100644 src/mocks/mock_scan_storage_response.json create mode 100644 src/mocks/mock_zip_responses.json diff --git a/src/mocks/mock_bibi_configuration.bibi b/src/mocks/mock_bibi_configuration.bibi new file mode 100644 index 0000000..5cf4752 --- /dev/null +++ b/src/mocks/mock_bibi_configuration.bibi @@ -0,0 +1,15 @@ +<ns1:bibi + xmlns:ns1="http://schemas.humanbrainproject.eu/SP10/2014/BIBI" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + <ns1:brainModel> + <ns1:file>braitenberg.py</ns1:file> + <ns1:populations from="0" population="sensors" to="5" xsi:type="ns1:Range" /> + <ns1:populations from="5" population="actors" to="8" xsi:type="ns1:Range" /> + <ns1:populations from="0" population="record" to="8" xsi:type="ns1:Range" /> + </ns1:brainModel> + <ns1:bodyModel robotId="husky">husky_model/model.sdf</ns1:bodyModel> + <ns1:transferFunction src="all_neurons_spike_monitor.py" xsi:type="ns1:PythonTransferFunction" /> + <ns1:transferFunction src="left_wheel_neuron_rate_monitor.py" xsi:type="ns1:PythonTransferFunction" /> + <ns1:transferFunction src="linear_twist.py" xsi:type="ns1:PythonTransferFunction" /> + <ns1:transferFunction src="eye_sensor_transmit.py" xsi:type="ns1:PythonTransferFunction" /> +</ns1:bibi> \ No newline at end of file diff --git a/src/mocks/mock_experiment_configuration.exc b/src/mocks/mock_experiment_configuration.exc new file mode 100644 index 0000000..c818ddf --- /dev/null +++ b/src/mocks/mock_experiment_configuration.exc @@ -0,0 +1,26 @@ +<ExD + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns="http://schemas.humanbrainproject.eu/SP10/2014/ExDConfig" xsi:schemaLocation="http://schemas.humanbrainproject.eu/SP10/2014/ExDConfig ../ExDConfFile.xsd"> + <name>Holodeck Husky Braitenberg experiment</name> + <thumbnail>ExDXMLExample.jpg</thumbnail> + <description>This experiment loads the Husky robot from Clearpath Robotics in the Holodeck environment. + If the user starts the experiment, the Braitenberg vehicle network is executed + and the robot will turn around itself in place, until the camera detects a red color. Then, + the robot will move towards the colored object. In this experiment, the user can interact + and change the color of both screens by clicking on them with the right mouse button.</description> + <tags>husky robotics holodeck braitenberg</tags> + <timeout>840</timeout> + <configuration type="3d-settings" src="ExDXMLExample.ini" /> + <configuration type="brainvisualizer" src="brainvisualizer.json" /> + <configuration type="user-interaction-settings" src="ExDXMLExample.uis" /> + <maturity>production</maturity> + <environmentModel src="virtual_room.sdf"> + <robotPose robotId="husky" x="0.0" y="0.0" z="0.5" roll="0.0" pitch="-0.0" yaw="3.14159265359" /> + </environmentModel> + <bibiConf src="bibi_configuration.bibi" /> + <cameraPose> + <cameraPosition x="5.056825994369357" y="-1.0210998541555323" z="2.697598759953974" /> + <cameraLookAt x="0" y="0" z="0.49999" /> + </cameraPose> + <cloneDate>2021-07-05T15:20:29</cloneDate> +</ExD> \ No newline at end of file diff --git a/src/mocks/mock_husky_event.json b/src/mocks/mock_husky_event.json new file mode 100644 index 0000000..89e1ad9 --- /dev/null +++ b/src/mocks/mock_husky_event.json @@ -0,0 +1,10 @@ +[ + { + "webkitRelativePath": "./mock_experiment_configuration.exc", + "type": "exc" + }, + { + "webkitRelativePath": "./mock_bibi_configuration.bibi", + "type": "bibi" + } +] \ No newline at end of file diff --git a/src/mocks/mock_scan_storage_response.json b/src/mocks/mock_scan_storage_response.json new file mode 100644 index 0000000..afd252c --- /dev/null +++ b/src/mocks/mock_scan_storage_response.json @@ -0,0 +1,4 @@ +{ + "deletedFolders":[0,1], + "addedFolders": [2] +} \ No newline at end of file diff --git a/src/mocks/mock_zip_responses.json b/src/mocks/mock_zip_responses.json new file mode 100644 index 0000000..a255a09 --- /dev/null +++ b/src/mocks/mock_zip_responses.json @@ -0,0 +1,11 @@ +[ + { + "zipBaseFolderName": "0", + "destFolderName": "1" + + }, + { + "zipBaseFolderName": "0", + "destFolderName": "2" + } +] \ No newline at end of file diff --git a/src/services/__tests__/dialog-service.test.js b/src/services/__tests__/dialog-service.test.js index dce12be..5f384e4 100644 --- a/src/services/__tests__/dialog-service.test.js +++ b/src/services/__tests__/dialog-service.test.js @@ -27,7 +27,7 @@ test('should emit an event on network error', () => { jest.spyOn(DialogService.instance, 'networkError').mockImplementation(() => { return Promise.resolve(); }); - let NetworkError = MockDialog + let NetworkError = MockDialog; let confirmNetworkError = (startingNetwork) => { expect(startingNetwork).toEqual(NetworkError); @@ -47,7 +47,7 @@ test('should emit an event on data error', () => { jest.spyOn(DialogService.instance, 'dataError').mockImplementation(() => { return Promise.resolve(); }); - let DataError = MockDialog + let DataError = MockDialog; let confirmDataError = (startingData) => { expect(startingData).toEqual(DataError); @@ -67,7 +67,7 @@ test('should emit an event on simulation error', () => { jest.spyOn(DialogService.instance, 'simulationError').mockImplementation(() => { return Promise.resolve(); }); - let SimulationError = MockDialog + let SimulationError = MockDialog; let confirmSimulationError = (startingSimulation) => { expect(startingSimulation).toEqual(SimulationError); @@ -87,7 +87,7 @@ test('should emit an event on progress notification', () => { jest.spyOn(DialogService.instance, 'progressNotification').mockImplementation(() => { return Promise.resolve(); }); - let ProgressNotification = MockDialog + let ProgressNotification = MockDialog; let confirmProgressNotification = (startingProgress) => { expect(startingProgress).toEqual(ProgressNotification); @@ -107,8 +107,7 @@ test('should emit an event on warning notification', () => { jest.spyOn(DialogService.instance, 'warningNotification').mockImplementation(() => { return Promise.resolve(); }); - - let WarningNotification = MockDialog + let WarningNotification = MockDialog; let confirmWarningNotification = (startingWarning) => { expect(startingWarning).toEqual(WarningNotification); diff --git a/src/services/experiments/files/__tests__/import-experiment-service.test.js b/src/services/experiments/files/__tests__/import-experiment-service.test.js index b6163b4..e48cefb 100644 --- a/src/services/experiments/files/__tests__/import-experiment-service.test.js +++ b/src/services/experiments/files/__tests__/import-experiment-service.test.js @@ -5,9 +5,9 @@ import '@testing-library/jest-dom'; import 'jest-fetch-mock'; import ImportExperimentService from '../import-experiment-service'; -import MockEvent from '../../../../mocks/mock-event' -import MockResponse from '../../../../mocks/mock-response' -import MockResponses from '../../../../mocks/mock-responses' + +import MockScanStorageResponse from '../../../../mocks/mock_scan_storage_response.json'; +import MockZipResponses from '../../../../mocks/mock_zip_responses.json'; test('makes sure that invoking the constructor fails with the right message', () => { expect(() => { @@ -18,3 +18,14 @@ test('makes sure that invoking the constructor fails with the right message', () }).toThrowError(Error('Use ImportExperimentService.instance')); }); +test('makes sure zip responses are encapsulated in an object', async () => { + let importZipResponses = {zipBaseFolderName:['0', '0'], destFolderName:['1', '2'], numberOfZips: 2}; + expect(await ImportExperimentService.instance.getImportZipResponses( + MockZipResponses.map((response) => new Response(JSON.stringify(response))))).toStrictEqual(importZipResponses); +}); + +test('makes sure storage response is prepared', async () => { + let scanStorageResponse = {deletedFoldersNumber:2, addedFoldersNumber:1, deletedFolders:'0, 1', addedFolders:'2' }; + expect(await ImportExperimentService.instance.getScanStorageResponse( + new Response(JSON.stringify(MockScanStorageResponse)))).toStrictEqual(scanStorageResponse); +}); \ No newline at end of file diff --git a/src/services/experiments/files/import-experiment-service.js b/src/services/experiments/files/import-experiment-service.js index e726c3a..28ea5bf 100644 --- a/src/services/experiments/files/import-experiment-service.js +++ b/src/services/experiments/files/import-experiment-service.js @@ -9,7 +9,7 @@ const scanStorageURL = `${config.api.proxy.url}${endpoints.proxy.storage.scanSto /** * The Import Experiment Service performs the requests (Extract), - * processes data such as zip or folder (Transform), + * processes data such as zip or folder (Transform), * and passes them to the Import Experiment Component (Load). * Errors are handled by communicating witht he Error Handler Service. */ @@ -53,13 +53,13 @@ export default class ImportExperimentService extends HttpService { return _instance; } - getImportZipResponses(responses) { + async getImportZipResponses(responses) { let importZipResponses = { zipBaseFolderName: [], destFolderName: [] }; importZipResponses.numberOfZips = responses.length; - responses.forEach(async response =>{ + await responses.forEach(async response =>{ response = await response.json(); importZipResponses['zipBaseFolderName'].push(response['zipBaseFolderName']); importZipResponses['destFolderName'].push(response['destFolderName']); @@ -91,6 +91,7 @@ export default class ImportExperimentService extends HttpService { } let promises = []; Array.from(files).forEach(file => { + console.log(file); promises.push( new Promise((resolve, reject) => { let reader = new FileReader(); @@ -140,7 +141,7 @@ export default class ImportExperimentService extends HttpService { }); } - readZippedExperimentExperiment(event) { + readZippedExperiment(event) { let files = event.target.files; let zipFiles = []; Array.from(files).forEach(file => { @@ -157,7 +158,7 @@ export default class ImportExperimentService extends HttpService { } importZippedExperiment(event) { - let promises = this.readZippedExperimentExperiment(event) + let promises = this.readZippedExperiment(event) .then(zipContents => zipContents.map(zipContent => this.httpRequestPOST(importExperimentURL, zipContent, options) -- GitLab