robeaux 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gruntfile.js +43 -0
- data/Makefile +11 -2
- data/README.markdown +2 -0
- data/css/main.css +1 -0
- data/css/style.css +113 -24
- data/css/themes/blackboard.css +1 -0
- data/css/themes/dark.css +1 -0
- data/css/themes/gray.css +1 -0
- data/css/themes/whiteboard.css +1 -0
- data/images/bullet-connections-2.png +0 -0
- data/images/bullet-connections.png +0 -0
- data/images/bullet-devices-2.png +0 -0
- data/images/bullet-devices.png +0 -0
- data/images/devices-image-2.png +0 -0
- data/images/devices-image.png +0 -0
- data/images/logo-robeaux.png +0 -0
- data/images/robots-icon_03.png +0 -0
- data/index.html +15 -8
- data/js/controllers/widget_editor_ctrl.js +44 -0
- data/js/controllers/widgets_ctrl.js +40 -0
- data/js/directives/widget.js +50 -0
- data/js/router.js +5 -0
- data/js/services/themes.js +9 -5
- data/js/services/widgets.js +86 -0
- data/js/vendor/angular-route.min.js +1 -2
- data/js/vendor/angular.min.js +208 -206
- data/js/widgets/attitude.html +32 -0
- data/js/widgets/attitude.js +27 -0
- data/js/widgets/mindwave.html +51 -0
- data/js/widgets/mindwave.js +23 -0
- data/less/app.less +21 -0
- data/less/objects/buttons.less +32 -0
- data/less/objects/connections.less +28 -0
- data/less/objects/device.less +30 -0
- data/less/objects/forms.less +29 -0
- data/less/objects/list.less +27 -0
- data/less/objects/nav.less +33 -0
- data/less/objects/robot.less +43 -0
- data/less/objects/themes.less +18 -0
- data/less/objects/widgets.less +85 -0
- data/less/support/buttons.less +39 -0
- data/less/support/container.less +9 -0
- data/less/support/forms.less +18 -0
- data/less/support/mixins.less +3 -0
- data/less/themes/blackboard.less +158 -0
- data/less/themes/dark.less +148 -0
- data/less/themes/default.less +52 -0
- data/less/themes/gray.less +121 -0
- data/less/themes/whiteboard.less +152 -0
- data/less/vendor/elements.less +156 -0
- data/less/vendor/normalize.less +425 -0
- data/less/vendor/semantic-grid.less +67 -0
- data/less/views/devices.less +47 -0
- data/less/views/robots.less +132 -0
- data/less/views/themes.less +31 -0
- data/less/views/widgets.less +50 -0
- data/package.json +6 -3
- data/partials/device.html +66 -57
- data/partials/index.html +12 -6
- data/partials/robot.html +104 -51
- data/partials/themes.html +32 -29
- data/partials/widget_editor.html +68 -0
- data/robeaux.gemspec +1 -1
- data/test/controllers/device_commands_ctrl.js +129 -0
- data/test/controllers/device_events_ctrl.js +82 -0
- data/test/controllers/index_ctrl.js +48 -0
- data/test/controllers/nav_ctrl.js +40 -0
- data/test/controllers/robot_commands_ctrl.js +127 -0
- data/test/controllers/robot_ctrl.js +62 -0
- data/test/controllers/themes_ctrl.js +96 -0
- data/test/controllers/widget_editor_ctrl.js +111 -0
- data/test/controllers/widgets_ctrl.js +74 -0
- data/test/functions/functions.js +30 -0
- data/test/karma.conf.js +3 -7
- data/test/karma_test_all.conf.js +23 -0
- data/test/karma_test_controllers.conf.js +19 -0
- data/test/karma_test_functions.conf.js +14 -0
- data/test/karma_test_services.conf.js +17 -0
- data/test/services/themes.js +122 -0
- data/test/services/widgets.js +104 -0
- data/test/support/themes.json +9 -0
- data/test/support/widgets.json +18 -0
- data/test/vendor/angular-mocks.js +13 -13
- data/test/vendor/jquery.js +8 -8
- metadata +69 -3
- data/test/main.js +0 -248
@@ -0,0 +1,68 @@
|
|
1
|
+
<div class="row">
|
2
|
+
<div class="widgets">
|
3
|
+
<div class="sidebar">
|
4
|
+
<h2>Widgets</h2>
|
5
|
+
|
6
|
+
<div class="new-widget">
|
7
|
+
<input type="text" ng-model="name" placeholder="new widget name">
|
8
|
+
<button ng-click="add(name)" class="btn btn-device">add</button>
|
9
|
+
</div>
|
10
|
+
|
11
|
+
<div class="list">
|
12
|
+
<div class="widget"
|
13
|
+
ng-repeat="widget in widgets.list"
|
14
|
+
ng-click="edit(widget)"
|
15
|
+
ng-class="{selected: (editing === widget)}">
|
16
|
+
{{widget.name}}
|
17
|
+
<span class="close" ng-if="widget.custom" ng-click="widgets.remove(widget.name)">✖</span>
|
18
|
+
</div>
|
19
|
+
</div>
|
20
|
+
</div>
|
21
|
+
|
22
|
+
|
23
|
+
<div class="editor">
|
24
|
+
<div class="attrs">
|
25
|
+
<label>
|
26
|
+
<strong>Attrs:</strong>
|
27
|
+
<small>Attributes to be defined when instantiating the widget. They will be available in the script as <code>attrs</code>.</small>
|
28
|
+
</label>
|
29
|
+
|
30
|
+
<div class="attrs-list">
|
31
|
+
<span ng-repeat="attr in editing.attrs" ng-click="removeAttr($index)">
|
32
|
+
{{ attr }}
|
33
|
+
{{ $last ? '' : ', ' }}
|
34
|
+
</span>
|
35
|
+
</div>
|
36
|
+
|
37
|
+
<div class="new-attr">
|
38
|
+
<input type="text" ng-disabled="!editing" ng-model="newAttr">
|
39
|
+
<button ng-disabled="!editing" ng-click="addAttr()" class="btn btn-device">Add Attribute</button>
|
40
|
+
</div>
|
41
|
+
</div>
|
42
|
+
|
43
|
+
<div class="field">
|
44
|
+
<label>
|
45
|
+
<strong>Template:</strong>
|
46
|
+
<small>The code you put here will be used as a template for an Angular directive.</small>
|
47
|
+
</label>
|
48
|
+
|
49
|
+
<textarea id="template" ng-disabled="!editing" ng-model="editing.template" ng-blur="widgets.save()" placeholder="write your template here">
|
50
|
+
</textarea>
|
51
|
+
</div>
|
52
|
+
|
53
|
+
<div class="field">
|
54
|
+
<label>
|
55
|
+
<strong>Script:</strong>
|
56
|
+
<small>The code you put here will be used as a <code>link</code> function for an Angular directive.</small>
|
57
|
+
</label>
|
58
|
+
<textarea ng-disabled="!editing" ng-model="editing.script" ng-blur="widgets.save()" placeholder="write your javascript here">
|
59
|
+
</textarea>
|
60
|
+
</div>
|
61
|
+
</div>
|
62
|
+
|
63
|
+
<div class="footer">
|
64
|
+
<button class="btn btn-save" ng-click="widgets.save()">save</button>
|
65
|
+
<button class="btn btn-reset" ng-click="widgets.reset()">reset</button>
|
66
|
+
</div>
|
67
|
+
</div>
|
68
|
+
</div>
|
data/robeaux.gemspec
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = "robeaux"
|
5
|
-
s.version = "0.
|
5
|
+
s.version = "0.3.0"
|
6
6
|
s.platform = Gem::Platform::RUBY
|
7
7
|
s.authors = ["Ron Evans", "Adrian Zankich", "Ari Lerner", "Mario Ricalde", "Daniel Fischer", "Andrew Stewart"]
|
8
8
|
s.email = ["artoo@hybridgroup.com"]
|
@@ -0,0 +1,129 @@
|
|
1
|
+
describe("Testing Controllers", function() {
|
2
|
+
describe('Controller DeviceCommandsCtrl:', function() {
|
3
|
+
|
4
|
+
beforeEach(module('robeaux'));
|
5
|
+
|
6
|
+
var $scope, $rootScope, $httpBackend, $timeout, testController;
|
7
|
+
|
8
|
+
beforeEach(inject(function($injector) {
|
9
|
+
$timeout = $injector.get('$timeout');
|
10
|
+
$httpBackend = $injector.get('$httpBackend');
|
11
|
+
$rootScope = $injector.get('$rootScope');
|
12
|
+
$scope = $rootScope.$new();
|
13
|
+
|
14
|
+
var $controller = $injector.get('$controller');
|
15
|
+
|
16
|
+
testController = function() {
|
17
|
+
return $controller('DeviceCommandsCtrl', {
|
18
|
+
'$scope': $scope
|
19
|
+
});
|
20
|
+
};
|
21
|
+
var controller = testController();
|
22
|
+
|
23
|
+
jasmine.getJSONFixtures().fixturesPath='base/test/support';
|
24
|
+
|
25
|
+
var data = loadJSONFixtures('myDevice.json')['myDevice.json'];
|
26
|
+
|
27
|
+
$scope.device = data[0];
|
28
|
+
$scope.device.results = [];
|
29
|
+
$scope.device.params = [{ name: '', value: '', type: 'string' }];
|
30
|
+
}));
|
31
|
+
|
32
|
+
afterEach(function() {
|
33
|
+
$httpBackend.verifyNoOutstandingExpectation();
|
34
|
+
$httpBackend.verifyNoOutstandingRequest();
|
35
|
+
});
|
36
|
+
|
37
|
+
describe('command:', function() {
|
38
|
+
it('should be an empty string', function (){
|
39
|
+
expect($scope.command).toBe("");
|
40
|
+
});
|
41
|
+
});
|
42
|
+
|
43
|
+
describe('command types:', function() {
|
44
|
+
it('should be an array of string, boolean and number', function (){
|
45
|
+
var command_types = [ 'string', 'boolean', 'number' ];
|
46
|
+
expect($scope.types).toEqual(command_types);
|
47
|
+
});
|
48
|
+
});
|
49
|
+
|
50
|
+
describe('isDisabled:', function() {
|
51
|
+
it('should return true if command is empty', function (){
|
52
|
+
expect($scope.isDisabled()).toBe(true);
|
53
|
+
});
|
54
|
+
|
55
|
+
it('should return false if command exist', function (){
|
56
|
+
$scope.command = 'test_command'
|
57
|
+
expect($scope.isDisabled()).toBe(false);
|
58
|
+
});
|
59
|
+
});
|
60
|
+
|
61
|
+
describe('addParam:', function() {
|
62
|
+
it('should add params if last', function (){
|
63
|
+
expect($scope.device.params.length).toBe(1)
|
64
|
+
$scope.addParam($scope.device);
|
65
|
+
expect($scope.device.params.length).toBe(2)
|
66
|
+
});
|
67
|
+
|
68
|
+
it('should not add params if not last', function (){
|
69
|
+
expect($scope.device.params.length).toBe(1)
|
70
|
+
$scope.addParam();
|
71
|
+
expect($scope.device.params.length).toBe(1)
|
72
|
+
});
|
73
|
+
});
|
74
|
+
|
75
|
+
describe('removeParam:', function() {
|
76
|
+
it('should remove param if there is more than one', function (){
|
77
|
+
$scope.device.params = [
|
78
|
+
{ name: '', value: '', type: 'string' },
|
79
|
+
{ name: '', value: '', type: 'string' }
|
80
|
+
];
|
81
|
+
|
82
|
+
expect($scope.device.params.length).toBe(2)
|
83
|
+
$scope.removeParam($scope.device);
|
84
|
+
expect($scope.device.params.length).toBe(1)
|
85
|
+
});
|
86
|
+
|
87
|
+
it('should not remove param if there just one', function (){
|
88
|
+
$scope.device.params = [
|
89
|
+
{ name: '', value: '', type: 'string' }
|
90
|
+
];
|
91
|
+
|
92
|
+
expect($scope.device.params.length).toBe(1)
|
93
|
+
$scope.removeParam($scope.device);
|
94
|
+
expect($scope.device.params.length).toBe(1)
|
95
|
+
});
|
96
|
+
|
97
|
+
it('should remove the correct param passed to the function', function (){
|
98
|
+
$scope.device.params = [
|
99
|
+
{ name: 'param1', value: 'value1', type: 'string' },
|
100
|
+
{ name: 'param2', value: 'value2', type: 'string' }
|
101
|
+
];
|
102
|
+
|
103
|
+
var param_to_remove = { name: 'param1', value: 'value1', type: 'string' };
|
104
|
+
var param_to_keep = { name: 'param2', value: 'value2', type: 'string' };
|
105
|
+
|
106
|
+
expect($scope.device.params[0]).toEqual(param_to_remove)
|
107
|
+
$scope.removeParam(param_to_remove);
|
108
|
+
expect($scope.device.params[0]).toEqual(param_to_keep)
|
109
|
+
});
|
110
|
+
});
|
111
|
+
|
112
|
+
describe('submit:', function() {
|
113
|
+
it('should run command and return results', function (){
|
114
|
+
$scope.robot = {'name':"myRobot"};
|
115
|
+
$scope.device.name = "led";
|
116
|
+
$scope.command = "brightness";
|
117
|
+
$scope.device.params = [{'name': 'brightness', 'value': 255, 'type':'string'}];
|
118
|
+
var params = {'brightness': 255};
|
119
|
+
var data= {'result': "brightness is 255"};
|
120
|
+
|
121
|
+
$scope.submit();
|
122
|
+
$httpBackend.expectPOST('/api/robots/myRobot/devices/led/commands/brightness', params).respond(data);
|
123
|
+
$httpBackend.flush();
|
124
|
+
expect($scope.device.results[0]).toEqual({'result': "brightness is 255"})
|
125
|
+
});
|
126
|
+
});
|
127
|
+
|
128
|
+
});
|
129
|
+
});
|
@@ -0,0 +1,82 @@
|
|
1
|
+
describe("Testing Controllers", function() {
|
2
|
+
describe('Controller DeviceEventsCtrl:', function() {
|
3
|
+
|
4
|
+
beforeEach(module('robeaux'));
|
5
|
+
|
6
|
+
var $scope, $rootScope, $httpBackend, $timeout, testController;
|
7
|
+
|
8
|
+
beforeEach(inject(function($injector) {
|
9
|
+
$timeout = $injector.get('$timeout');
|
10
|
+
$httpBackend = $injector.get('$httpBackend');
|
11
|
+
$rootScope = $injector.get('$rootScope');
|
12
|
+
$scope = $rootScope.$new();
|
13
|
+
|
14
|
+
var $controller = $injector.get('$controller');
|
15
|
+
|
16
|
+
testController = function() {
|
17
|
+
return $controller('DeviceEventsCtrl', {
|
18
|
+
'$scope': $scope
|
19
|
+
});
|
20
|
+
};
|
21
|
+
var controller = testController();
|
22
|
+
|
23
|
+
jasmine.getJSONFixtures().fixturesPath='base/test/support';
|
24
|
+
|
25
|
+
var data = loadJSONFixtures('myDevice.json')['myDevice.json'];
|
26
|
+
|
27
|
+
$scope.robot = {'name':"myRobot"};
|
28
|
+
$scope.eventName = "";
|
29
|
+
$scope.device = data[0];
|
30
|
+
$scope.device.events = null;
|
31
|
+
$scope.device.listeners = null;
|
32
|
+
}));
|
33
|
+
|
34
|
+
afterEach(function() {
|
35
|
+
$httpBackend.verifyNoOutstandingExpectation();
|
36
|
+
$httpBackend.verifyNoOutstandingRequest();
|
37
|
+
});
|
38
|
+
|
39
|
+
describe('listen:', function() {
|
40
|
+
it('should add a listener for an event and clear eventName', function (){
|
41
|
+
expect($scope.device.listeners).toBe(null);
|
42
|
+
$scope.eventName = "listen_event";
|
43
|
+
$scope.listen();
|
44
|
+
expect($scope.device.listeners['listen_event']).not.toBe(null);
|
45
|
+
expect($scope.eventName).toBe("");
|
46
|
+
});
|
47
|
+
|
48
|
+
it('should listen to multiple events', function (){
|
49
|
+
expect($scope.device.listeners).toBe(null);
|
50
|
+
|
51
|
+
$scope.eventName = "first_event";
|
52
|
+
$scope.listen();
|
53
|
+
$scope.eventName = "second_event";
|
54
|
+
$scope.listen();
|
55
|
+
$scope.eventName = "third_event";
|
56
|
+
$scope.listen();
|
57
|
+
|
58
|
+
expect($scope.device.listeners['first_event']).not.toBe(null);
|
59
|
+
expect($scope.device.listeners['second_event']).not.toBe(null);
|
60
|
+
expect($scope.device.listeners['third_event']).not.toBe(null);
|
61
|
+
});
|
62
|
+
});
|
63
|
+
|
64
|
+
describe('remove:', function() {
|
65
|
+
it('should remove listener', function (){
|
66
|
+
expect($scope.device.listeners).toBe(null);
|
67
|
+
|
68
|
+
$scope.eventName = "listen_event";
|
69
|
+
$scope.listen();
|
70
|
+
expect($scope.device.listeners['listen_event']).not.toBe(null);
|
71
|
+
|
72
|
+
$scope.remove("listen_event")
|
73
|
+
|
74
|
+
expect($scope.device.listeners['listen_event']).toBe(undefined);
|
75
|
+
|
76
|
+
});
|
77
|
+
});
|
78
|
+
|
79
|
+
|
80
|
+
|
81
|
+
});
|
82
|
+
});
|
@@ -0,0 +1,48 @@
|
|
1
|
+
describe("Testing Controllers", function() {
|
2
|
+
describe('Controller IndexCtrl:', function() {
|
3
|
+
|
4
|
+
beforeEach(module('robeaux'));
|
5
|
+
|
6
|
+
var $scope, $rootScope, $httpBackend, $location, $timeout, testController, data;
|
7
|
+
|
8
|
+
beforeEach(inject(function($injector) {
|
9
|
+
$timeout = $injector.get('$timeout');
|
10
|
+
$httpBackend = $injector.get('$httpBackend');
|
11
|
+
$rootScope = $injector.get('$rootScope');
|
12
|
+
$location = $injector.get('$location');
|
13
|
+
$scope = $rootScope.$new();
|
14
|
+
|
15
|
+
var $controller = $injector.get('$controller');
|
16
|
+
|
17
|
+
testController = function() {
|
18
|
+
return $controller('IndexCtrl', {
|
19
|
+
'$scope': $scope
|
20
|
+
});
|
21
|
+
};
|
22
|
+
|
23
|
+
var controller = testController();
|
24
|
+
|
25
|
+
jasmine.getJSONFixtures().fixturesPath='base/test/support';
|
26
|
+
data = loadJSONFixtures('robots.json')['robots.json'];
|
27
|
+
$httpBackend.expect('GET', '/api/robots').respond(data);
|
28
|
+
$httpBackend.flush();
|
29
|
+
}));
|
30
|
+
|
31
|
+
afterEach(function() {
|
32
|
+
$httpBackend.verifyNoOutstandingExpectation();
|
33
|
+
$httpBackend.verifyNoOutstandingRequest();
|
34
|
+
});
|
35
|
+
|
36
|
+
it('should get array of robots', function() {
|
37
|
+
expect($scope.robots).toEqual(data.robots);
|
38
|
+
});
|
39
|
+
|
40
|
+
describe('details:', function() {
|
41
|
+
it('should redirect to robot show page', function() {
|
42
|
+
expect($location.path()).toEqual('');
|
43
|
+
$scope.details(data.robots[0].name);
|
44
|
+
expect($location.path()).toEqual('/robots/' + data.robots[0].name);
|
45
|
+
});
|
46
|
+
});
|
47
|
+
});
|
48
|
+
});
|
@@ -0,0 +1,40 @@
|
|
1
|
+
describe("Testing Controllers", function() {
|
2
|
+
describe('Controller NavCtrl:', function() {
|
3
|
+
|
4
|
+
beforeEach(module('robeaux'));
|
5
|
+
|
6
|
+
var $scope, $rootScope, $httpBackend, $location, $timeout, testController;
|
7
|
+
|
8
|
+
beforeEach(inject(function($injector) {
|
9
|
+
$timeout = $injector.get('$timeout');
|
10
|
+
$httpBackend = $injector.get('$httpBackend');
|
11
|
+
$rootScope = $injector.get('$rootScope');
|
12
|
+
$location = $injector.get('$location');
|
13
|
+
$scope = $rootScope.$new();
|
14
|
+
|
15
|
+
var $controller = $injector.get('$controller');
|
16
|
+
|
17
|
+
testController = function() {
|
18
|
+
return $controller('NavCtrl', {
|
19
|
+
'$scope': $scope
|
20
|
+
});
|
21
|
+
};
|
22
|
+
|
23
|
+
var controller = testController();
|
24
|
+
}));
|
25
|
+
|
26
|
+
afterEach(function() {
|
27
|
+
$httpBackend.verifyNoOutstandingExpectation();
|
28
|
+
$httpBackend.verifyNoOutstandingRequest();
|
29
|
+
});
|
30
|
+
|
31
|
+
describe('active:', function() {
|
32
|
+
it('should return if current path is the same as the location path', function() {
|
33
|
+
$location.path('robots');
|
34
|
+
|
35
|
+
expect($scope.active('robots')).toEqual(true);
|
36
|
+
expect($scope.active('robots/myRobot')).toEqual(false);
|
37
|
+
});
|
38
|
+
});
|
39
|
+
});
|
40
|
+
});
|
@@ -0,0 +1,127 @@
|
|
1
|
+
describe("Testing Controllers", function() {
|
2
|
+
describe('Controller RobotCommandsCtrl:', function() {
|
3
|
+
|
4
|
+
beforeEach(module('robeaux'));
|
5
|
+
|
6
|
+
var $scope, $rootScope, $httpBackend, $timeout, $routeParams, testController;
|
7
|
+
var $injector = angular.injector(['robeaux', 'ng']);
|
8
|
+
|
9
|
+
beforeEach(inject(function($injector) {
|
10
|
+
$timeout = $injector.get('$timeout');
|
11
|
+
$httpBackend = $injector.get('$httpBackend');
|
12
|
+
$rootScope = $injector.get('$rootScope');
|
13
|
+
$routeParams = $injector.get('$routeParams');
|
14
|
+
$scope = $rootScope.$new();
|
15
|
+
|
16
|
+
var $controller = $injector.get('$controller');
|
17
|
+
|
18
|
+
testController = function() {
|
19
|
+
return $controller('RobotCommandsCtrl', {
|
20
|
+
'$scope': $scope
|
21
|
+
});
|
22
|
+
};
|
23
|
+
var controller = testController();
|
24
|
+
|
25
|
+
jasmine.getJSONFixtures().fixturesPath='base/test/support';
|
26
|
+
var data = loadJSONFixtures('myRobot.json')['myRobot.json'];
|
27
|
+
$scope.robot = data.robot;
|
28
|
+
$scope.robot.params = [ { name: '', value: '', type: 'string' } ];
|
29
|
+
$scope.robot.results = [];
|
30
|
+
}));
|
31
|
+
|
32
|
+
afterEach(function() {
|
33
|
+
$httpBackend.verifyNoOutstandingExpectation();
|
34
|
+
$httpBackend.verifyNoOutstandingRequest();
|
35
|
+
});
|
36
|
+
|
37
|
+
describe('command:', function() {
|
38
|
+
it('should be an empty string', function (){
|
39
|
+
expect($scope.command).toBe("");
|
40
|
+
});
|
41
|
+
});
|
42
|
+
|
43
|
+
describe('command types:', function() {
|
44
|
+
it('should be an array of string, boolean and number', function (){
|
45
|
+
var command_types = [ 'string', 'boolean', 'number' ];
|
46
|
+
expect($scope.types).toEqual(command_types);
|
47
|
+
});
|
48
|
+
});
|
49
|
+
|
50
|
+
describe('isDisabled:', function() {
|
51
|
+
it('should return true if command is empty', function (){
|
52
|
+
expect($scope.isDisabled()).toBe(true);
|
53
|
+
});
|
54
|
+
|
55
|
+
it('should return false if command exist', function (){
|
56
|
+
$scope.command = 'test_command'
|
57
|
+
expect($scope.isDisabled()).toBe(false);
|
58
|
+
});
|
59
|
+
});
|
60
|
+
|
61
|
+
describe('addParam:', function() {
|
62
|
+
it('should add params if last', function (){
|
63
|
+
expect($scope.robot.params.length).toBe(1)
|
64
|
+
$scope.addParam($scope.robot);
|
65
|
+
expect($scope.robot.params.length).toBe(2)
|
66
|
+
});
|
67
|
+
|
68
|
+
it('should not add params if not last', function (){
|
69
|
+
expect($scope.robot.params.length).toBe(1)
|
70
|
+
$scope.addParam();
|
71
|
+
expect($scope.robot.params.length).toBe(1)
|
72
|
+
});
|
73
|
+
});
|
74
|
+
|
75
|
+
describe('removeParam:', function() {
|
76
|
+
it('should remove param if there is more than one', function (){
|
77
|
+
$scope.robot.params = [
|
78
|
+
{ name: '', value: '', type: 'string' },
|
79
|
+
{ name: '', value: '', type: 'string' }
|
80
|
+
];
|
81
|
+
|
82
|
+
expect($scope.robot.params.length).toBe(2)
|
83
|
+
$scope.removeParam($scope.robot);
|
84
|
+
expect($scope.robot.params.length).toBe(1)
|
85
|
+
});
|
86
|
+
|
87
|
+
it('should not remove param if there just one', function (){
|
88
|
+
$scope.robot.params = [
|
89
|
+
{ name: '', value: '', type: 'string' }
|
90
|
+
];
|
91
|
+
|
92
|
+
expect($scope.robot.params.length).toBe(1)
|
93
|
+
$scope.removeParam($scope.robot);
|
94
|
+
expect($scope.robot.params.length).toBe(1)
|
95
|
+
});
|
96
|
+
|
97
|
+
it('should remove the correct param passed to the function', function (){
|
98
|
+
$scope.robot.params = [
|
99
|
+
{ name: 'param1', value: 'value1', type: 'string' },
|
100
|
+
{ name: 'param2', value: 'value2', type: 'string' }
|
101
|
+
];
|
102
|
+
|
103
|
+
var param_to_remove = { name: 'param1', value: 'value1', type: 'string' };
|
104
|
+
var param_to_keep = { name: 'param2', value: 'value2', type: 'string' };
|
105
|
+
|
106
|
+
expect($scope.robot.params[0]).toEqual(param_to_remove)
|
107
|
+
$scope.removeParam(param_to_remove);
|
108
|
+
expect($scope.robot.params[0]).toEqual(param_to_keep)
|
109
|
+
});
|
110
|
+
});
|
111
|
+
|
112
|
+
describe('submit:', function() {
|
113
|
+
it('should run command and return results', function (){
|
114
|
+
$scope.robot.name = "myRobot";
|
115
|
+
$scope.command = "relax";
|
116
|
+
$scope.robot.params= [{'name': 'relax', 'value':'true', 'type':'string'}];
|
117
|
+
var params = {'relax': 'true'};
|
118
|
+
var data= {'result': "myRobot says relax"};
|
119
|
+
|
120
|
+
$scope.submit();
|
121
|
+
$httpBackend.expectPOST('/api/robots/myRobot/commands/relax', params).respond(data);
|
122
|
+
$httpBackend.flush();
|
123
|
+
expect($scope.robot.results).toEqual([{'result': "myRobot says relax"}])
|
124
|
+
});
|
125
|
+
});
|
126
|
+
});
|
127
|
+
});
|
@@ -0,0 +1,62 @@
|
|
1
|
+
describe("Testing Controllers", function() {
|
2
|
+
describe('Controller RobotCtrl:', function() {
|
3
|
+
|
4
|
+
beforeEach(module('robeaux'));
|
5
|
+
|
6
|
+
var $scope, $rootScope, $httpBackend, $timeout, $routeParams, testController;
|
7
|
+
|
8
|
+
beforeEach(inject(function($injector) {
|
9
|
+
$timeout = $injector.get('$timeout');
|
10
|
+
$httpBackend = $injector.get('$httpBackend');
|
11
|
+
$rootScope = $injector.get('$rootScope');
|
12
|
+
$routeParams = $injector.get('$routeParams');
|
13
|
+
$scope = $rootScope.$new();
|
14
|
+
|
15
|
+
var $controller = $injector.get('$controller');
|
16
|
+
|
17
|
+
testController = function() {
|
18
|
+
return $controller('RobotCtrl', {
|
19
|
+
'$scope': $scope
|
20
|
+
|
21
|
+
});
|
22
|
+
};
|
23
|
+
var controller = testController();
|
24
|
+
|
25
|
+
jasmine.getJSONFixtures().fixturesPath='base/test/support';
|
26
|
+
$httpBackend.expect('GET', '/api/robots/' + $routeParams.robot).respond(loadJSONFixtures('myRobot.json')['myRobot.json']);
|
27
|
+
$httpBackend.flush();
|
28
|
+
|
29
|
+
}));
|
30
|
+
|
31
|
+
afterEach(function() {
|
32
|
+
$httpBackend.verifyNoOutstandingExpectation();
|
33
|
+
$httpBackend.verifyNoOutstandingRequest();
|
34
|
+
});
|
35
|
+
|
36
|
+
it('should get robot details', function() {
|
37
|
+
var data = loadJSONFixtures('myRobot.json')['myRobot.json'];
|
38
|
+
data.robot.params = [ { name: '', value: '', type: 'string' } ];
|
39
|
+
data.robot.results = [];
|
40
|
+
expect($scope.robot).toEqual(data.robot);
|
41
|
+
});
|
42
|
+
|
43
|
+
describe('select:', function() {
|
44
|
+
it('should select a device', function (){
|
45
|
+
var robotArray= [{"name": "robo1"},{"name":"robo2"}];
|
46
|
+
$scope.robot = robotArray;
|
47
|
+
$scope.select($scope.robot[1]);
|
48
|
+
expect($scope.robot[1]).toEqual($scope.device);
|
49
|
+
expect($scope.robot[0]).toNotEqual($scope.device);
|
50
|
+
});
|
51
|
+
});
|
52
|
+
|
53
|
+
describe('selected:', function() {
|
54
|
+
it('should return if device is still selected', function (){
|
55
|
+
var robotArray= [{"name": "robo1"},{"name":"robo2"}];
|
56
|
+
$scope.robot = robotArray;
|
57
|
+
$scope.select($scope.robot);
|
58
|
+
expect($scope.selected($scope.robot)).toBeTruthy();
|
59
|
+
});
|
60
|
+
});
|
61
|
+
});
|
62
|
+
});
|
@@ -0,0 +1,96 @@
|
|
1
|
+
describe("Testing Controllers", function() {
|
2
|
+
describe('Controller ThemesCtrl:', function() {
|
3
|
+
|
4
|
+
beforeEach(module('robeaux'));
|
5
|
+
|
6
|
+
var $scope, $rootScope, $httpBackend, $timeout, $routeParams, testController, data;
|
7
|
+
|
8
|
+
beforeEach(inject(function($injector) {
|
9
|
+
localStorage.clear();
|
10
|
+
$timeout = $injector.get('$timeout');
|
11
|
+
$httpBackend = $injector.get('$httpBackend');
|
12
|
+
$rootScope = $injector.get('$rootScope');
|
13
|
+
$routeParams = $injector.get('$routeParams');
|
14
|
+
$scope = $rootScope.$new();
|
15
|
+
$scope.themes = $injector.get('Themes')
|
16
|
+
|
17
|
+
var $controller = $injector.get('$controller');
|
18
|
+
|
19
|
+
testController = function() {
|
20
|
+
return $controller('ThemesCtrl', {
|
21
|
+
'$scope': $scope
|
22
|
+
|
23
|
+
});
|
24
|
+
};
|
25
|
+
var controller = testController();
|
26
|
+
jasmine.getJSONFixtures().fixturesPath='base/test/support';
|
27
|
+
data = loadJSONFixtures('themes.json')['themes.json'];
|
28
|
+
|
29
|
+
}));
|
30
|
+
|
31
|
+
afterEach(function() {
|
32
|
+
$scope.themes = null;
|
33
|
+
$httpBackend.verifyNoOutstandingExpectation();
|
34
|
+
$httpBackend.verifyNoOutstandingRequest();
|
35
|
+
});
|
36
|
+
|
37
|
+
it('should get array of themes', function() {
|
38
|
+
expect($scope.themes.list).toEqual(data.themes);
|
39
|
+
});
|
40
|
+
|
41
|
+
describe('add:', function() {
|
42
|
+
it('should not add theme with empty name', function() {
|
43
|
+
expect($scope.themes.list.length).toEqual(5);
|
44
|
+
$scope.add('');
|
45
|
+
expect($scope.themes.list.length).toEqual(5);
|
46
|
+
$scope.add();
|
47
|
+
expect($scope.themes.list.length).toEqual(5);
|
48
|
+
});
|
49
|
+
|
50
|
+
it('should not add theme if name already exist', function() {
|
51
|
+
expect($scope.themes.list.length).toEqual(5);
|
52
|
+
$scope.add('artoo');
|
53
|
+
expect($scope.themes.list.length).toEqual(5);
|
54
|
+
});
|
55
|
+
|
56
|
+
it('should add theme', function() {
|
57
|
+
expect($scope.themes.list.length).toEqual(5);
|
58
|
+
$scope.add('first theme');
|
59
|
+
expect($scope.themes.list.length).toEqual(6);
|
60
|
+
});
|
61
|
+
|
62
|
+
it('should add theme and put it on edit mode', function() {
|
63
|
+
expect($scope.editing).toEqual(null);
|
64
|
+
$scope.add('second theme');
|
65
|
+
expect($scope.editing.name).toEqual('second theme');
|
66
|
+
});
|
67
|
+
});
|
68
|
+
|
69
|
+
describe('edit:', function() {
|
70
|
+
it('should not set theme on edit mode if is not a custom theme', function() {
|
71
|
+
expect($scope.editing).toEqual(null);
|
72
|
+
$scope.edit(data.themes[0].name)
|
73
|
+
expect($scope.editing).toEqual(null);
|
74
|
+
});
|
75
|
+
|
76
|
+
it('should not set theme on edit mode if theme is already being edited', function() {
|
77
|
+
expect($scope.editing).toEqual(null);
|
78
|
+
$scope.add('third theme')
|
79
|
+
expect($scope.editing.name).toEqual('third theme');
|
80
|
+
|
81
|
+
$scope.edit('third theme');
|
82
|
+
expect($scope.editing).toEqual(null);
|
83
|
+
});
|
84
|
+
});
|
85
|
+
|
86
|
+
describe('remove:', function() {
|
87
|
+
it('should remove theme', function() {
|
88
|
+
expect($scope.themes.list.length).toEqual(5);
|
89
|
+
$scope.remove('artoo');
|
90
|
+
expect($scope.themes.list.length).toEqual(4);
|
91
|
+
});
|
92
|
+
});
|
93
|
+
|
94
|
+
|
95
|
+
});
|
96
|
+
});
|