puppet-herald 0.1.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -7
- data/.rubocop.yml +31 -0
- data/.rubocop_todo.yml +6 -0
- data/.travis.yml +7 -7
- data/Gemfile +5 -9
- data/README.md +152 -16
- data/Rakefile +67 -6
- data/bin/puppet-herald +1 -1
- data/config.ru +2 -2
- data/db/migrate/20141211165540_create_nodes.rb +5 -3
- data/db/migrate/20141211171305_create_reports.rb +12 -10
- data/db/migrate/20141211171326_create_log_entries.rb +9 -7
- data/db/schema.rb +24 -26
- data/lib/puppet-herald.rb +59 -21
- data/lib/puppet-herald/app/api.rb +111 -0
- data/lib/puppet-herald/app/configuration.rb +70 -0
- data/lib/puppet-herald/app/frontend.rb +61 -0
- data/lib/puppet-herald/{views → app/views}/app.erb +5 -8
- data/lib/puppet-herald/{views → app/views}/err500.erb +1 -4
- data/lib/puppet-herald/application.rb +27 -0
- data/lib/puppet-herald/cli.rb +66 -45
- data/lib/puppet-herald/client.rb +33 -0
- data/lib/puppet-herald/database.rb +84 -40
- data/lib/puppet-herald/javascript.rb +23 -17
- data/lib/puppet-herald/models/log-entry.rb +10 -3
- data/lib/puppet-herald/models/node.rb +15 -5
- data/lib/puppet-herald/models/report.rb +70 -63
- data/lib/puppet-herald/public/app.js +9 -8
- data/lib/puppet-herald/public/components/directives/status-button.html +1 -1
- data/lib/puppet-herald/public/components/directives/status-button.js +5 -3
- data/lib/puppet-herald/public/components/filters/filters.js +9 -4
- data/lib/puppet-herald/public/components/page.js +34 -0
- data/lib/puppet-herald/public/node/node.html +3 -1
- data/lib/puppet-herald/public/node/node.js +7 -4
- data/lib/puppet-herald/public/nodes/nodes.js +3 -2
- data/lib/puppet-herald/public/report/report.html +4 -1
- data/lib/puppet-herald/public/report/report.js +5 -3
- data/lib/puppet-herald/stubs/puppet.rb +20 -9
- data/lib/puppet-herald/version.rb +17 -7
- data/package.json +8 -3
- data/puppet-herald.gemspec +3 -6
- data/spec/integration/application_spec.rb +175 -0
- data/spec/integration/models/node_spec.rb +4 -4
- data/spec/integration/models/report_spec.rb +7 -7
- data/spec/spec_helper.rb +12 -7
- data/spec/support/active_record.rb +6 -10
- data/spec/support/reconnectdb.rb +13 -0
- data/spec/unit/puppet-herald/cli_spec.rb +45 -13
- data/spec/unit/puppet-herald/client_spec.rb +23 -0
- data/spec/unit/puppet-herald/database_spec.rb +8 -9
- data/spec/unit/puppet-herald/javascript_spec.rb +8 -13
- data/spec/unit/puppet-herald_spec.rb +4 -4
- data/test/javascript/karma.conf.js +43 -5
- data/test/javascript/src/app_test.js +90 -0
- data/test/javascript/src/components/artifact/artifact-directive_test.js +36 -0
- data/test/javascript/src/components/artifact/artifact_test.js +64 -0
- data/test/javascript/src/components/directives/status-button_test.js +159 -0
- data/test/javascript/src/components/filters/filters_test.js +35 -0
- data/test/javascript/src/node/node_test.js +87 -0
- data/test/javascript/src/nodes/nodes_test.js +56 -0
- data/test/javascript/src/report/report_test.js +94 -0
- metadata +98 -68
- data/lib/puppet-herald/app.rb +0 -103
- data/lib/puppet-herald/public/components/artifact/artifact-directive_test.js +0 -17
- data/spec/integration/app_spec.rb +0 -21
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'webmock/rspec'
|
3
|
+
require 'puppet-herald/client'
|
4
|
+
|
5
|
+
describe PuppetHerald::Client, '.process' do
|
6
|
+
let(:payload) { { :zz => 65, :yh => 12 } }
|
7
|
+
let(:expected) { payload.to_yaml }
|
8
|
+
before :each do
|
9
|
+
stub_request(:post, "#{address}/api/v1/reports").with(:body => expected).
|
10
|
+
to_return(:body => "{id: 1}", :status => 201)
|
11
|
+
end
|
12
|
+
subject { client.process payload }
|
13
|
+
context 'on defaults' do
|
14
|
+
let(:address) { 'localhost:11303' }
|
15
|
+
let(:client) { PuppetHerald::Client.new }
|
16
|
+
it { expect(subject).to be_truthy }
|
17
|
+
end
|
18
|
+
context 'on other host:port' do
|
19
|
+
let(:address) { 'master.secure.vm:8082' }
|
20
|
+
let(:client) { PuppetHerald::Client.new('master.secure.vm', 8082) }
|
21
|
+
it { expect(subject).to be_truthy }
|
22
|
+
end
|
23
|
+
end
|
@@ -1,34 +1,33 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
require 'puppet-herald'
|
3
|
-
require 'puppet-herald/database'
|
4
3
|
|
5
4
|
describe PuppetHerald::Database, '.spec' do
|
6
5
|
let(:tempdir) { Dir.tmpdir }
|
7
6
|
let(:echo) { false }
|
8
|
-
subject { PuppetHerald::
|
7
|
+
subject { PuppetHerald::database::spec echo }
|
9
8
|
context 'with invalid dbconn' do
|
10
9
|
before :each do
|
11
|
-
PuppetHerald::
|
10
|
+
PuppetHerald::database::dbconn = "#{tempdir}/non-existing.db"
|
12
11
|
end
|
13
12
|
it { expect { subject }.to raise_error(RuntimeError, /Invalid database connection string given/) }
|
14
13
|
end
|
15
14
|
context 'using sqlite' do
|
16
15
|
context 'with non existing database' do
|
17
16
|
before :each do
|
18
|
-
PuppetHerald::
|
17
|
+
PuppetHerald::database::dbconn = 'sqlite:///non-existing/non-existing.db'
|
19
18
|
end
|
20
19
|
it { expect { subject }.to raise_error(Errno::ENOENT, /No such file or directory/) }
|
21
20
|
end
|
22
21
|
context 'with creatable database file' do
|
23
22
|
before :each do
|
24
|
-
PuppetHerald::
|
23
|
+
PuppetHerald::database::dbconn = "sqlite://#{tempdir}/non-existing.db"
|
25
24
|
end
|
26
25
|
its(:class) { should be Hash }
|
27
26
|
its(:size) { should eq 2 }
|
28
27
|
context 'while echoing!!' do
|
29
28
|
let(:echo) { true }
|
30
29
|
before :each do
|
31
|
-
PuppetHerald::
|
30
|
+
PuppetHerald::database::logger.level = Logger::FATAL
|
32
31
|
end
|
33
32
|
its(:class) { should be Hash }
|
34
33
|
its(:size) { should eq 2 }
|
@@ -37,17 +36,17 @@ describe PuppetHerald::Database, '.spec' do
|
|
37
36
|
end
|
38
37
|
context 'using postgres' do
|
39
38
|
before :each do
|
40
|
-
PuppetHerald::
|
39
|
+
PuppetHerald::database::dbconn = "postgres://abc@localhost:6543/adb"
|
41
40
|
end
|
42
41
|
context 'with non existing passfile' do
|
43
42
|
before :each do
|
44
|
-
PuppetHerald::
|
43
|
+
PuppetHerald::database::passfile = "/non-existing/passfile"
|
45
44
|
end
|
46
45
|
it { expect { subject }.to raise_error(Errno::ENOENT, /No such file or directory/) }
|
47
46
|
end
|
48
47
|
context 'with existing passfile' do
|
49
48
|
before :each do
|
50
|
-
PuppetHerald::
|
49
|
+
PuppetHerald::database::passfile = __FILE__
|
51
50
|
end
|
52
51
|
its(:class) { should be Hash }
|
53
52
|
its(:size) { should eq 7 }
|
@@ -3,16 +3,14 @@ require 'puppet-herald'
|
|
3
3
|
require 'puppet-herald/javascript'
|
4
4
|
|
5
5
|
describe PuppetHerald::Javascript, '.files' do
|
6
|
+
subject { PuppetHerald::Javascript.new }
|
6
7
|
context 'running in dev environment' do
|
7
8
|
before :each do
|
8
|
-
expect(PuppetHerald).to receive(:
|
9
|
+
expect(PuppetHerald).to receive(:in_dev?).twice.and_return true
|
9
10
|
expect(Dir).to receive(:glob).twice.and_return(['aaa.js', 'a/bbb.js', 'ccc_test.js'])
|
10
|
-
|
11
|
+
subject.files
|
11
12
|
end
|
12
|
-
|
13
|
-
PuppetHerald::Javascript::class_variable_set '@@files', nil
|
14
|
-
end
|
15
|
-
let(:files) { PuppetHerald::Javascript::files }
|
13
|
+
let(:files) { subject.files }
|
16
14
|
it { files.size.should eq 2 }
|
17
15
|
it { files.should include 'aaa.js' }
|
18
16
|
it { files.should_not include 'ccc_test.js' }
|
@@ -20,14 +18,11 @@ describe PuppetHerald::Javascript, '.files' do
|
|
20
18
|
|
21
19
|
context 'running in prod environment' do
|
22
20
|
before :each do
|
23
|
-
expect(PuppetHerald).to receive(:
|
21
|
+
expect(PuppetHerald).to receive(:in_dev?).twice.and_return false
|
24
22
|
expect(Dir).to receive(:glob).once.and_return(['aaa.js', 'a/bbb.js', 'ccc_test.js'])
|
25
|
-
|
26
|
-
end
|
27
|
-
after :each do
|
28
|
-
PuppetHerald::Javascript::class_variable_set '@@files', nil
|
23
|
+
subject.files
|
29
24
|
end
|
30
|
-
let(:files) {
|
25
|
+
let(:files) { subject.files }
|
31
26
|
it { files.size.should eq 2 }
|
32
27
|
it { files.should include 'aaa.js' }
|
33
28
|
it { files.should_not include 'ccc_test.js' }
|
@@ -35,7 +30,7 @@ describe PuppetHerald::Javascript, '.files' do
|
|
35
30
|
end
|
36
31
|
|
37
32
|
describe PuppetHerald::Javascript, '.uglify' do
|
38
|
-
subject { PuppetHerald::Javascript
|
33
|
+
subject { PuppetHerald::Javascript.new.uglify 'myapp.js.map' }
|
39
34
|
|
40
35
|
it { subject.size.should eq 2 }
|
41
36
|
it { subject['js'].should_not be_empty }
|
@@ -37,8 +37,8 @@ describe PuppetHerald do
|
|
37
37
|
describe '.environment' do
|
38
38
|
it { subject::environment.should eq(:production) }
|
39
39
|
end
|
40
|
-
describe '.
|
41
|
-
it { subject.should
|
40
|
+
describe '.in_prod?' do
|
41
|
+
it { subject.should be_in_prod }
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
@@ -49,8 +49,8 @@ describe PuppetHerald do
|
|
49
49
|
describe '.environment' do
|
50
50
|
it { subject::environment.should eq(:dev) }
|
51
51
|
end
|
52
|
-
describe '.
|
53
|
-
it { subject.should
|
52
|
+
describe '.in_prod?' do
|
53
|
+
it { subject.should be_in_dev }
|
54
54
|
end
|
55
55
|
end
|
56
56
|
end
|
@@ -1,13 +1,51 @@
|
|
1
1
|
module.exports = function(config) {
|
2
2
|
config.set({
|
3
|
+
|
4
|
+
basePath: '../..',
|
5
|
+
|
6
|
+
singleRun: true,
|
7
|
+
|
3
8
|
frameworks: ['jasmine'],
|
4
9
|
|
10
|
+
reporters: ['story', 'coverage'],
|
11
|
+
|
12
|
+
preprocessors: {
|
13
|
+
// source files, that you wanna generate coverage for
|
14
|
+
// do not include tests or libraries
|
15
|
+
// (these files will be instrumented by Istanbul)
|
16
|
+
'lib/puppet-herald/public/**/*.js': ['coverage'],
|
17
|
+
'lib/puppet-herald/public/**/*.html': ['ng-html2js']
|
18
|
+
},
|
19
|
+
|
20
|
+
// optionally, configure the reporter
|
21
|
+
coverageReporter: {
|
22
|
+
dir : 'coverage/javascript',
|
23
|
+
reporters: [
|
24
|
+
// reporters not supporting the `file` property
|
25
|
+
{ type: 'html', subdir: 'report-html' },
|
26
|
+
// reporters supporting the `file` property, use `subdir` to directly
|
27
|
+
// output them in the `dir` directory
|
28
|
+
{ type: 'cobertura', subdir: '.', file: 'cobertura.txt' },
|
29
|
+
{ type: 'text', subdir: '.', file: 'text.txt' },
|
30
|
+
{ type: 'text-summary', subdir: '.', file: 'text-summary.txt' },
|
31
|
+
]
|
32
|
+
},
|
33
|
+
|
34
|
+
ngHtml2JsPreprocessor: {
|
35
|
+
// strip this from the file path
|
36
|
+
stripPrefix: 'lib/puppet-herald/public/',
|
37
|
+
},
|
38
|
+
|
5
39
|
files: [
|
6
|
-
'
|
7
|
-
'
|
8
|
-
'
|
9
|
-
'
|
10
|
-
'
|
40
|
+
'node_modules/angular/angular.js',
|
41
|
+
'node_modules/angular-loader/angular-loader.js',
|
42
|
+
'node_modules/angular-mocks/angular-mocks.js',
|
43
|
+
'node_modules/angular-route/angular-route.js',
|
44
|
+
'node_modules/moment/moment.js',
|
45
|
+
'node_modules/angular-moment/angular-moment.js',
|
46
|
+
'lib/puppet-herald/public/**/*.js',
|
47
|
+
'lib/puppet-herald/public/**/*.html',
|
48
|
+
'test/javascript/src/**/*.js'
|
11
49
|
]
|
12
50
|
});
|
13
51
|
};
|
@@ -0,0 +1,90 @@
|
|
1
|
+
'use strict';
|
2
|
+
|
3
|
+
describe('herald module', function() {
|
4
|
+
beforeEach(module('herald'));
|
5
|
+
|
6
|
+
describe('AppController', function() {
|
7
|
+
var controller, scope, Page;
|
8
|
+
beforeEach(inject(function(_$controller_, _Page_) {
|
9
|
+
var $controller = _$controller_;
|
10
|
+
scope = {};
|
11
|
+
controller = $controller('AppController', { $scope: scope });
|
12
|
+
Page = _Page_;
|
13
|
+
}));
|
14
|
+
|
15
|
+
it('should have a `null` as page set by default', function() {
|
16
|
+
expect(controller.page).toEqual(null);
|
17
|
+
});
|
18
|
+
|
19
|
+
it('should have a ("Nodes", null) as page set, if Page.title("Nodes") was called before', function() {
|
20
|
+
Page.title('Nodes');
|
21
|
+
expect(controller.page).toEqual("Nodes");
|
22
|
+
expect(controller.target).toEqual(undefined);
|
23
|
+
});
|
24
|
+
|
25
|
+
it('should have a ("Report", 1234567) as page set, if Page.title("Report", 1234567) was called before', function() {
|
26
|
+
Page.title('Report', 1234567);
|
27
|
+
expect(controller.page).toEqual("Report");
|
28
|
+
expect(controller.target).toEqual(1234567);
|
29
|
+
});
|
30
|
+
|
31
|
+
it('should have a ("Node", "master") as page set, if Page.title("Node", "master", " - ") was called before', function() {
|
32
|
+
Page.title('Node', "master", ' - ');
|
33
|
+
expect(controller.page).toEqual("Node");
|
34
|
+
expect(controller.target).toEqual('master');
|
35
|
+
});
|
36
|
+
|
37
|
+
});
|
38
|
+
|
39
|
+
describe('routes mapping', function() {
|
40
|
+
|
41
|
+
var $route, $location, $rootScope, navigateTo;
|
42
|
+
beforeEach(module('nodes/nodes.html'));
|
43
|
+
beforeEach(module('node/node.html'));
|
44
|
+
beforeEach(module('report/report.html'));
|
45
|
+
beforeEach(inject(function(_$route_, _$location_, _$rootScope_) {
|
46
|
+
$route = _$route_;
|
47
|
+
$location = _$location_;
|
48
|
+
$rootScope = _$rootScope_;
|
49
|
+
navigateTo = function(address) {
|
50
|
+
expect($route.current).toBeUndefined();
|
51
|
+
$location.path(address);
|
52
|
+
$rootScope.$digest();
|
53
|
+
};
|
54
|
+
}));
|
55
|
+
|
56
|
+
it('should map NodesController for unknown address', function() {
|
57
|
+
expect($route.routes[null].redirectTo).toEqual('/nodes');
|
58
|
+
});
|
59
|
+
it('should map NodesController if given "/nodes"', function() {
|
60
|
+
expect($route.routes['/nodes'].controller).toBe('NodesController');
|
61
|
+
});
|
62
|
+
|
63
|
+
it('should navigate to "/nodes" if given "/" a address', function() {
|
64
|
+
navigateTo('/');
|
65
|
+
expect($route.current.controller).toBe('NodesController');
|
66
|
+
expect($route.current.originalPath).toBe('/nodes');
|
67
|
+
});
|
68
|
+
|
69
|
+
it('should navigate to "/nodes" if given "/non-existing-link-0" a address', function() {
|
70
|
+
navigateTo('/non-existing-link-0');
|
71
|
+
expect($route.current.controller).toBe('NodesController');
|
72
|
+
expect($route.current.originalPath).toBe('/nodes');
|
73
|
+
});
|
74
|
+
|
75
|
+
it('should navigate to "/node/1" if given "/node/1" a address', function() {
|
76
|
+
navigateTo('/node/1');
|
77
|
+
expect($route.current.controller).toBe('NodeController');
|
78
|
+
expect($route.current.originalPath).toBe('/node/:nodeId');
|
79
|
+
expect($route.current.pathParams.nodeId).toBe('1');
|
80
|
+
});
|
81
|
+
|
82
|
+
it('should navigate to "/report/1" if given "/report/1" a address', function() {
|
83
|
+
navigateTo('/report/1');
|
84
|
+
expect($route.current.controller).toBe('ReportController');
|
85
|
+
expect($route.current.originalPath).toBe('/report/:reportId');
|
86
|
+
expect($route.current.pathParams.reportId).toBe('1');
|
87
|
+
});
|
88
|
+
|
89
|
+
});
|
90
|
+
});
|
@@ -0,0 +1,36 @@
|
|
1
|
+
'use strict';
|
2
|
+
|
3
|
+
describe('herald.artifact module', function() {
|
4
|
+
beforeEach(module('herald.artifact'));
|
5
|
+
|
6
|
+
describe('app-version directive', function() {
|
7
|
+
|
8
|
+
var $controller, $compile, $rootScope;
|
9
|
+
// Store references to $rootScope and $compile
|
10
|
+
// so they are available to all tests in this describe block
|
11
|
+
beforeEach(inject(function(_$compile_, _$controller_, _$rootScope_){
|
12
|
+
// The injector unwraps the underscores (_) from around the parameter names when matching
|
13
|
+
$compile = _$compile_;
|
14
|
+
$controller = _$controller_;
|
15
|
+
$rootScope = _$rootScope_;
|
16
|
+
}));
|
17
|
+
|
18
|
+
it('should print current version', function() {
|
19
|
+
|
20
|
+
inject(function($compile, $rootScope, $injector) {
|
21
|
+
// Set up the mock http service responses
|
22
|
+
var $httpBackend = $injector.get('$httpBackend');
|
23
|
+
// backend definition common for all tests
|
24
|
+
var authRequestHandler = $httpBackend.when('GET', '/version.json')
|
25
|
+
.respond({version: 'TEST_VER'});
|
26
|
+
$httpBackend.expectGET('/version.json');
|
27
|
+
|
28
|
+
var element = $compile('<div><span app-version></span></div>')($rootScope);
|
29
|
+
expect(element.text()).toEqual('{{ artifact.version }}');
|
30
|
+
// fire all the watches, so the scope expression {{ artifact.version }} will be evaluated
|
31
|
+
$rootScope.$digest();
|
32
|
+
expect(element.text()).toEqual('0.0.0');
|
33
|
+
});
|
34
|
+
});
|
35
|
+
});
|
36
|
+
});
|
@@ -0,0 +1,64 @@
|
|
1
|
+
'use strict';
|
2
|
+
|
3
|
+
describe('herald.artifact module', function() {
|
4
|
+
beforeEach(module('herald.artifact'));
|
5
|
+
|
6
|
+
describe('ArtifactController', function() {
|
7
|
+
|
8
|
+
var $httpBackend, $rootScope, createController, authRequestHandler;
|
9
|
+
|
10
|
+
var mockValues = {
|
11
|
+
version: 'TEST_VER',
|
12
|
+
homepage: 'http://example.org/herald',
|
13
|
+
summary: 'herald',
|
14
|
+
package: 'herald',
|
15
|
+
license: 'Apache 2.0',
|
16
|
+
name: 'Puppet Herald'
|
17
|
+
};
|
18
|
+
|
19
|
+
beforeEach(inject(function($injector) {
|
20
|
+
|
21
|
+
// Set up the mock http service responses
|
22
|
+
$httpBackend = $injector.get('$httpBackend');
|
23
|
+
// backend definition common for all tests
|
24
|
+
authRequestHandler = $httpBackend.when('GET', '/version.json')
|
25
|
+
.respond(mockValues);
|
26
|
+
|
27
|
+
// Get hold of a scope (i.e. the root scope)
|
28
|
+
$rootScope = $injector.get('$rootScope');
|
29
|
+
// The $controller service is used to create instances of controllers
|
30
|
+
var $controller = $injector.get('$controller');
|
31
|
+
|
32
|
+
createController = function() {
|
33
|
+
$httpBackend.expectGET('/version.json');
|
34
|
+
var controller = $controller('ArtifactController', {'$scope' : $rootScope });
|
35
|
+
$httpBackend.flush();
|
36
|
+
return controller;
|
37
|
+
};
|
38
|
+
}));
|
39
|
+
|
40
|
+
afterEach(function() {
|
41
|
+
$httpBackend.verifyNoOutstandingExpectation();
|
42
|
+
$httpBackend.verifyNoOutstandingRequest();
|
43
|
+
});
|
44
|
+
|
45
|
+
it('should fetch version of artifact', function() {
|
46
|
+
expect(createController().version).toBe(mockValues.version);
|
47
|
+
});
|
48
|
+
it('should fetch homepage of artifact', function() {
|
49
|
+
expect(createController().homepage).toBe(mockValues.homepage);
|
50
|
+
});
|
51
|
+
it('should fetch package of artifact', function() {
|
52
|
+
expect(createController().package).toBe(mockValues.package);
|
53
|
+
});
|
54
|
+
it('should fetch summary of artifact', function() {
|
55
|
+
expect(createController().summary).toBe(mockValues.summary);
|
56
|
+
});
|
57
|
+
it('should fetch license of artifact', function() {
|
58
|
+
expect(createController().license).toBe(mockValues.license);
|
59
|
+
});
|
60
|
+
it('should fetch name of artifact', function() {
|
61
|
+
expect(createController().name).toBe(mockValues.name);
|
62
|
+
});
|
63
|
+
});
|
64
|
+
});
|
@@ -0,0 +1,159 @@
|
|
1
|
+
'use strict';
|
2
|
+
|
3
|
+
describe('herald.directives module', function() {
|
4
|
+
beforeEach(module('herald.directives'));
|
5
|
+
|
6
|
+
describe('herald.directives.status-button module', function() {
|
7
|
+
|
8
|
+
beforeEach(module('herald.directives.status-button'));
|
9
|
+
|
10
|
+
describe('StatusButtonController', function() {
|
11
|
+
var controller, scope, location;
|
12
|
+
|
13
|
+
beforeEach(inject(function($injector) {
|
14
|
+
var $controller = $injector.get('$controller');
|
15
|
+
var $rootScope = $injector.get('$rootScope');
|
16
|
+
location = $injector.get('$location');
|
17
|
+
$rootScope.$on('$locationChangeStart', function(event, args) {
|
18
|
+
event.preventDefault();
|
19
|
+
})
|
20
|
+
var $scope = {};
|
21
|
+
scope = $scope;
|
22
|
+
controller = $controller('StatusButtonController', { $scope: $scope });
|
23
|
+
}));
|
24
|
+
|
25
|
+
it('should navigate to "/node/112" after issuing navigate() function', function() {
|
26
|
+
spyOn(location, 'path').and.returnValue(null);
|
27
|
+
expect(scope.navigate('/node/:id', 112)).toBe(undefined);
|
28
|
+
expect(location.path).toHaveBeenCalledWith('/node/112');
|
29
|
+
});
|
30
|
+
|
31
|
+
});
|
32
|
+
|
33
|
+
describe('colorizeStatus filter', function() {
|
34
|
+
|
35
|
+
var colorizeStatus;
|
36
|
+
|
37
|
+
beforeEach(inject(function($injector) {
|
38
|
+
var $filter = $injector.get('$filter');
|
39
|
+
colorizeStatus = $filter('colorizeStatus');
|
40
|
+
}));
|
41
|
+
|
42
|
+
it('should returns "default" when given null', function() {
|
43
|
+
expect(colorizeStatus(null)).toEqual('default');
|
44
|
+
});
|
45
|
+
it('should returns "default" when given undefined', function() {
|
46
|
+
expect(colorizeStatus(undefined)).toEqual('default');
|
47
|
+
});
|
48
|
+
it('should returns "default" when given undefined', function() {
|
49
|
+
expect(colorizeStatus('unknown')).toEqual('default');
|
50
|
+
});
|
51
|
+
it('should returns "success" when given "unchanged"', function() {
|
52
|
+
expect(colorizeStatus('unchanged')).toEqual('success');
|
53
|
+
});
|
54
|
+
it('should returns "info" when given "changed"', function() {
|
55
|
+
expect(colorizeStatus('changed')).toEqual('info');
|
56
|
+
});
|
57
|
+
it('should returns "danger" when given "failed"', function() {
|
58
|
+
expect(colorizeStatus('failed')).toEqual('danger');
|
59
|
+
});
|
60
|
+
it('should returns "warning" when given "pending"', function() {
|
61
|
+
expect(colorizeStatus('pending')).toEqual('warning');
|
62
|
+
});
|
63
|
+
});
|
64
|
+
|
65
|
+
describe('iconizeStatus filter', function() {
|
66
|
+
|
67
|
+
var iconizeStatus;
|
68
|
+
|
69
|
+
beforeEach(inject(function($injector) {
|
70
|
+
var $filter = $injector.get('$filter');
|
71
|
+
iconizeStatus = $filter('iconizeStatus');
|
72
|
+
}));
|
73
|
+
|
74
|
+
it('should returns "sign" when given null', function() {
|
75
|
+
expect(iconizeStatus(null)).toEqual('sign');
|
76
|
+
});
|
77
|
+
it('should returns "sign" when given undefined', function() {
|
78
|
+
expect(iconizeStatus(undefined)).toEqual('sign');
|
79
|
+
});
|
80
|
+
it('should returns "sign" when given undefined', function() {
|
81
|
+
expect(iconizeStatus('unknown')).toEqual('sign');
|
82
|
+
});
|
83
|
+
it('should returns "ok" when given "unchanged"', function() {
|
84
|
+
expect(iconizeStatus('unchanged')).toEqual('ok');
|
85
|
+
});
|
86
|
+
it('should returns "pencil" when given "changed"', function() {
|
87
|
+
expect(iconizeStatus('changed')).toEqual('pencil');
|
88
|
+
});
|
89
|
+
it('should returns "remove" when given "failed"', function() {
|
90
|
+
expect(iconizeStatus('failed')).toEqual('remove');
|
91
|
+
});
|
92
|
+
it('should returns "asterisk" when given "pending"', function() {
|
93
|
+
expect(iconizeStatus('pending')).toEqual('asterisk');
|
94
|
+
});
|
95
|
+
});
|
96
|
+
|
97
|
+
describe('ngStatusButton directive', function() {
|
98
|
+
|
99
|
+
var elm, scope, button;
|
100
|
+
beforeEach(module('components/directives/status-button.html'));
|
101
|
+
beforeEach(inject(function($rootScope, $compile){
|
102
|
+
var tpl = '<ng-status-button status="node.status" id="node.id" route="\'/node/:id\'"></ng-status-button>';
|
103
|
+
elm = angular.element(tpl);
|
104
|
+
scope = $rootScope;
|
105
|
+
$compile(elm)(scope);
|
106
|
+
scope.$digest();
|
107
|
+
button = elm.find('button');
|
108
|
+
}));
|
109
|
+
|
110
|
+
describe('with scope without any values', function() {
|
111
|
+
|
112
|
+
it('should embed a one element of type "button"', function() {
|
113
|
+
expect(button.length).toBe(1);
|
114
|
+
});
|
115
|
+
it('should embed an element with class "btn-default"', function() {
|
116
|
+
expect(button.hasClass('btn-default')).toBe(true);
|
117
|
+
});
|
118
|
+
it('should embed an element with class "glyphicon-sign"', function() {
|
119
|
+
expect(button.hasClass('glyphicon-sign')).toBe(true);
|
120
|
+
});
|
121
|
+
it('should embed a button with text " "', function() {
|
122
|
+
expect(button.text()).toEqual(' ');
|
123
|
+
});
|
124
|
+
|
125
|
+
});
|
126
|
+
|
127
|
+
describe('with values { status: "unchanged", id: 16 } given', function() {
|
128
|
+
|
129
|
+
beforeEach(function() {
|
130
|
+
scope.$apply(function() {
|
131
|
+
scope.node = {
|
132
|
+
status: "unchanged",
|
133
|
+
id: 16
|
134
|
+
};
|
135
|
+
});
|
136
|
+
});
|
137
|
+
|
138
|
+
it('should embed a one element of type "button"', function() {
|
139
|
+
expect(button.length).toBe(1);
|
140
|
+
});
|
141
|
+
it('should embed an element with class "btn-success"', function() {
|
142
|
+
expect(button.hasClass('btn-success')).toBe(true);
|
143
|
+
});
|
144
|
+
it('should embed an element with class "glyphicon-ok"', function() {
|
145
|
+
expect(button.hasClass('glyphicon-ok')).toBe(true);
|
146
|
+
});
|
147
|
+
it('should embed a button with text " UNCHANGED"', function() {
|
148
|
+
expect(button.text()).toEqual(' UNCHANGED');
|
149
|
+
});
|
150
|
+
it('should embed a button with onclick == "navigate(route, id)"', function() {
|
151
|
+
expect(button.attr('ng-click')).toEqual("navigate(route, id)");
|
152
|
+
});
|
153
|
+
|
154
|
+
});
|
155
|
+
|
156
|
+
});
|
157
|
+
});
|
158
|
+
|
159
|
+
});
|