diff --git a/lib/gui/components/drive-selector/controllers/drive-selector.js b/lib/gui/components/drive-selector/controllers/drive-selector.js index 3dfee3c7..085aa5a5 100644 --- a/lib/gui/components/drive-selector/controllers/drive-selector.js +++ b/lib/gui/components/drive-selector/controllers/drive-selector.js @@ -18,18 +18,14 @@ const _ = require('lodash'); -module.exports = function($uibModalInstance, DriveSelectorStateService, DriveScannerService) { +module.exports = function($uibModalInstance, DriveScannerService, SelectionStateModel) { /** * @summary The drive selector state * @property * @type Object - * - * @description - * The state has been splitted from the controller for - * testability purposes. */ - this.state = DriveSelectorStateService; + this.state = SelectionStateModel; /** * @summary The drive scanner service @@ -53,7 +49,7 @@ module.exports = function($uibModalInstance, DriveSelectorStateService, DriveSca * DriveSelectorController.closeModal(); */ this.closeModal = function() { - const selectedDrive = DriveSelectorStateService.getSelectedDrive(); + const selectedDrive = SelectionStateModel.getDrive(); // Sanity check to cover the case where a drive is selected, // the drive is then unplugged from the computer and the modal diff --git a/lib/gui/components/drive-selector/drive-selector.js b/lib/gui/components/drive-selector/drive-selector.js index 641de3d9..c6831c10 100644 --- a/lib/gui/components/drive-selector/drive-selector.js +++ b/lib/gui/components/drive-selector/drive-selector.js @@ -30,7 +30,6 @@ const DriveSelector = angular.module(MODULE_NAME, [ ]); DriveSelector.controller('DriveSelectorController', require('./controllers/drive-selector')); -DriveSelector.service('DriveSelectorStateService', require('./services/drive-selector-state')); DriveSelector.service('DriveSelectorService', require('./services/drive-selector')); module.exports = MODULE_NAME; diff --git a/lib/gui/components/drive-selector/services/drive-selector-state.js b/lib/gui/components/drive-selector/services/drive-selector-state.js deleted file mode 100644 index 30c95827..00000000 --- a/lib/gui/components/drive-selector/services/drive-selector-state.js +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright 2016 Resin.io - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -'use strict'; - -const _ = require('lodash'); - -module.exports = function(SelectionStateModel) { - let self = this; - - /** - * @summary Toggle select drive - * @function - * @public - * - * @param {Object} drive - drive - * - * @example - * DriveSelectorController.toggleSelectDrive({ drive }); - */ - this.toggleSelectDrive = function(drive) { - if (this.isSelectedDrive(drive)) { - SelectionStateModel.removeDrive(); - } else { - SelectionStateModel.setDrive(drive); - } - }; - - /** - * @summary Check if a drive is the selected one - * @function - * @public - * - * @param {Object} drive - drive - * @returns {Boolean} whether the drive is selected - * - * @example - * if (DriveSelectorController.isSelectedDrive({ drive })) { - * console.log('The drive is selected!'); - * } - */ - this.isSelectedDrive = function(drive) { - if (!_.has(drive, 'device')) { - return false; - } - - return drive.device === _.get(self.getSelectedDrive(), 'device'); - }; - - /** - * @summary Get selected drive - * @function - * @public - * - * @returns {Object} selected drive - * - * @example - * const drive = DriveSelectorStateService.getSelectedDrive(); - */ - this.getSelectedDrive = SelectionStateModel.getDrive; - - /** - * @summary Has a selected drive - * @function - * @public - * - * @returns {Boolean} whether there is a selected drive - * - * @example - * if (DriveSelectorStateService.hasSelectedDrive()) { - * console.log('There is a selected drive'); - * } - */ - this.hasSelectedDrive = SelectionStateModel.hasDrive; - -}; diff --git a/lib/gui/components/drive-selector/templates/drive-selector-modal.tpl.html b/lib/gui/components/drive-selector/templates/drive-selector-modal.tpl.html index 5e7b8566..e0b49966 100644 --- a/lib/gui/components/drive-selector/templates/drive-selector-modal.tpl.html +++ b/lib/gui/components/drive-selector/templates/drive-selector-modal.tpl.html @@ -6,12 +6,12 @@ @@ -19,5 +19,5 @@ diff --git a/lib/gui/models/selection-state.js b/lib/gui/models/selection-state.js index d2ca8309..d4b439fe 100644 --- a/lib/gui/models/selection-state.js +++ b/lib/gui/models/selection-state.js @@ -51,6 +51,26 @@ SelectionStateModel.service('SelectionStateModel', function() { selection.drive = drive; }; + /** + * @summary Toggle set drive + * @function + * @public + * + * @param {Object} drive - drive + * + * @example + * SelectionStateModel.toggleSetDrive({ + * device: '/dev/disk2' + * }); + */ + this.toggleSetDrive = function(drive) { + if (self.isCurrentDrive(drive)) { + self.removeDrive(); + } else { + self.setDrive(drive); + } + }; + /** * @summary Set a image * @function @@ -192,7 +212,11 @@ SelectionStateModel.service('SelectionStateModel', function() { * } */ this.isCurrentDrive = function(drive) { - return angular.equals(self.getDrive(), drive); + if (!drive || !drive.device) { + return false; + } + + return drive.device === _.get(self.getDrive(), 'device'); }; }); diff --git a/tests/gui/components/drive-selector.spec.js b/tests/gui/components/drive-selector.spec.js deleted file mode 100644 index 41c6a703..00000000 --- a/tests/gui/components/drive-selector.spec.js +++ /dev/null @@ -1,180 +0,0 @@ -'use strict'; - -const m = require('mochainon'); -const angular = require('angular'); -require('angular-mocks'); - -describe('Browser: DriveSelector', function() { - - beforeEach(angular.mock.module( - require('../../../lib/gui/components/drive-selector/drive-selector') - )); - - describe('DriveSelectorStateService', function() { - - let DriveSelectorStateService; - let SelectionStateModel; - - beforeEach(angular.mock.inject(function(_DriveSelectorStateService_, _SelectionStateModel_) { - DriveSelectorStateService = _DriveSelectorStateService_; - SelectionStateModel = _SelectionStateModel_; - })); - - beforeEach(function() { - SelectionStateModel.clear(); - }); - - describe('.toggleSelectDrive()', function() { - - it('should be able to toggle a drive', function() { - const drive = { - device: '/dev/disk2', - name: 'USB Drive', - size: '16GB' - }; - - m.chai.expect(DriveSelectorStateService.getSelectedDrive()).to.not.exist; - DriveSelectorStateService.toggleSelectDrive(drive); - m.chai.expect(DriveSelectorStateService.getSelectedDrive()).to.deep.equal(drive); - DriveSelectorStateService.toggleSelectDrive(drive); - m.chai.expect(DriveSelectorStateService.getSelectedDrive()).to.not.exist; - }); - - it('should be able to change the current selected drive', function() { - const drive1 = { - device: '/dev/disk2', - name: 'USB Drive', - size: '16GB' - }; - - const drive2 = { - device: '/dev/disk3', - name: 'SDCARD Reader', - size: '4GB' - }; - - DriveSelectorStateService.toggleSelectDrive(drive1); - m.chai.expect(DriveSelectorStateService.getSelectedDrive()).to.deep.equal(drive1); - DriveSelectorStateService.toggleSelectDrive(drive2); - m.chai.expect(DriveSelectorStateService.getSelectedDrive()).to.deep.equal(drive2); - }); - - }); - - describe('.isSelectedDrive()', function() { - - it('should always return false if no drive', function() { - const drive = { - device: '/dev/disk2', - name: 'USB Drive', - size: '16GB' - }; - - SelectionStateModel.removeDrive(); - m.chai.expect(DriveSelectorStateService.isSelectedDrive(drive)).to.be.false; - }); - - it('should return true if the selected drive matches', function() { - const drive = { - device: '/dev/disk2', - name: 'USB Drive', - size: '16GB' - }; - - DriveSelectorStateService.toggleSelectDrive(drive); - m.chai.expect(DriveSelectorStateService.isSelectedDrive(drive)).to.be.true; - }); - - it('should return false if the selected drive does not match', function() { - const drive1 = { - device: '/dev/disk2', - name: 'USB Drive', - size: '16GB' - }; - - const drive2 = { - device: '/dev/disk3', - name: 'SDCARD Reader', - size: '4GB' - }; - - DriveSelectorStateService.toggleSelectDrive(drive1); - m.chai.expect(DriveSelectorStateService.isSelectedDrive(drive2)).to.be.false; - }); - - it('should return false if there is no selected drive and an empty object is passed', function() { - SelectionStateModel.removeDrive(); - m.chai.expect(DriveSelectorStateService.isSelectedDrive({})).to.be.false; - }); - - it('should return true if the drive is selected in SelectionStateModel', function() { - const drive = { - device: '/dev/disk2', - name: 'USB Drive', - size: '16GB' - }; - - SelectionStateModel.setDrive(drive); - m.chai.expect(DriveSelectorStateService.isSelectedDrive(drive)).to.be.true; - }); - - }); - - describe('.getSelectedDrive()', function() { - - it('should return undefined if no selected drive', function() { - SelectionStateModel.removeDrive(); - const drive = DriveSelectorStateService.getSelectedDrive(); - m.chai.expect(drive).to.not.exist; - }); - - it('should return undefined if the selected drive is an empty object', function() { - SelectionStateModel.setDrive({}); - const drive = DriveSelectorStateService.getSelectedDrive(); - m.chai.expect(drive).to.not.exist; - }); - - it('should return the selected drive if there is one', function() { - const selectedDrive = { - device: '/dev/disk2', - name: 'USB Drive', - size: '16GB' - }; - - DriveSelectorStateService.toggleSelectDrive(selectedDrive); - const drive = DriveSelectorStateService.getSelectedDrive(); - m.chai.expect(drive).to.deep.equal(selectedDrive); - }); - - }); - - describe('.hasSelectedDrive()', function() { - - it('should return false if no selected drive', function() { - SelectionStateModel.removeDrive(); - const hasDrive = DriveSelectorStateService.hasSelectedDrive(); - m.chai.expect(hasDrive).to.be.false; - }); - - it('should return false if the selected drive is an empty object', function() { - SelectionStateModel.setDrive({}); - const hasDrive = DriveSelectorStateService.hasSelectedDrive(); - m.chai.expect(hasDrive).to.be.false; - }); - - it('should return true if there is a selected drive', function() { - DriveSelectorStateService.toggleSelectDrive({ - device: '/dev/disk2', - name: 'USB Drive', - size: '16GB' - }); - - const hasDrive = DriveSelectorStateService.hasSelectedDrive(); - m.chai.expect(hasDrive).to.be.true; - }); - - }); - - }); - -}); diff --git a/tests/gui/models/selection-state.spec.js b/tests/gui/models/selection-state.spec.js index 15d4133d..1d17609d 100644 --- a/tests/gui/models/selection-state.spec.js +++ b/tests/gui/models/selection-state.spec.js @@ -251,6 +251,14 @@ describe('Browser: SelectionState', function() { }); }); + it('should return false if an undefined value is passed', function() { + m.chai.expect(SelectionStateModel.isCurrentDrive()).to.be.false; + }); + + it('should return false if an empty object is passed', function() { + m.chai.expect(SelectionStateModel.isCurrentDrive({})).to.be.false; + }); + it('should return true given the exact same drive', function() { m.chai.expect(SelectionStateModel.isCurrentDrive({ device: '/dev/sdb', @@ -285,7 +293,7 @@ describe('Browser: SelectionState', function() { })).to.be.false; }); - it('should return false if the description changes', function() { + it('should return true if the description changes', function() { m.chai.expect(SelectionStateModel.isCurrentDrive({ device: '/dev/sdb', description: 'DataTraveler 3.0', @@ -293,7 +301,7 @@ describe('Browser: SelectionState', function() { mountpoint: '/media/UNTITLED', name: '/dev/sdb', system: false - })).to.be.false; + })).to.be.true; }); }); @@ -304,6 +312,14 @@ describe('Browser: SelectionState', function() { SelectionStateModel.removeDrive(); }); + it('should return false if an undefined value is passed', function() { + m.chai.expect(SelectionStateModel.isCurrentDrive()).to.be.false; + }); + + it('should return false if an empty object is passed', function() { + m.chai.expect(SelectionStateModel.isCurrentDrive({})).to.be.false; + }); + it('should return false for anything', function() { m.chai.expect(SelectionStateModel.isCurrentDrive({ @@ -321,6 +337,66 @@ describe('Browser: SelectionState', function() { }); + describe('.toggleSetDrive()', function() { + + describe('given a selected drive', function() { + + beforeEach(function() { + this.drive = { + device: '/dev/sdb', + description: 'DataTraveler 2.0', + size: '7.3G', + mountpoint: '/media/UNTITLED', + name: '/dev/sdb', + system: false + }; + + SelectionStateModel.setDrive(this.drive); + }); + + it('should be able to remove the drive', function() { + m.chai.expect(SelectionStateModel.hasDrive()).to.be.true; + SelectionStateModel.toggleSetDrive(this.drive); + m.chai.expect(SelectionStateModel.hasDrive()).to.be.false; + }); + + it('should be able to replace the drive', function() { + const drive = { + device: '/dev/disk2', + name: 'USB Drive', + size: '16GB' + }; + + m.chai.expect(SelectionStateModel.getDrive()).to.deep.equal(this.drive); + SelectionStateModel.toggleSetDrive(drive); + m.chai.expect(SelectionStateModel.getDrive()).to.deep.equal(drive); + m.chai.expect(SelectionStateModel.getDrive()).to.not.deep.equal(this.drive); + }); + + }); + + describe('given no selected drive', function() { + + beforeEach(function() { + SelectionStateModel.removeDrive(); + }); + + it('should set the drive', function() { + const drive = { + device: '/dev/disk2', + name: 'USB Drive', + size: '16GB' + }; + + m.chai.expect(SelectionStateModel.hasDrive()).to.be.false; + SelectionStateModel.toggleSetDrive(drive); + m.chai.expect(SelectionStateModel.getDrive()).to.deep.equal(drive); + }); + + }); + + }); + }); });