diff --git a/src/mocks/mock_bibi_configuration.bibi b/src/mocks/mock_bibi_configuration.bibi new file mode 100644 index 0000000000000000000000000000000000000000..5cf47527e7fb56a7212b821f7912536609e11d0a --- /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 0000000000000000000000000000000000000000..c818ddfdf805b3f8ce72f84337db5b538a83bd0b --- /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 0000000000000000000000000000000000000000..89e1ad9cb985355da42a7619574084fd65ae3516 --- /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 0000000000000000000000000000000000000000..afd252ca68505ea50bfbfee034c3c318579ef324 --- /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 0000000000000000000000000000000000000000..a255a0985dcef21706bbc399693f53d7006be465 --- /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 dce12befa2b01295109d20924aba3cb0fad7d527..5f384e40fc433245f4c830d07aff878a56bdd150 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 b6163b4d7e67a98829db4b38b5dd41cedd332e0f..e48cefb9b8a5810a223767cb932222f0d0c69757 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 e726c3a9c3dffcf6e1b8713634c4c9000275d842..28ea5bf2f392ca08144d87c592ae0b9b09e10c97 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)