diff --git a/app/shared/filters.js b/app/shared/filters.js
index 2efe3b784..e6becfdb8 100644
--- a/app/shared/filters.js
+++ b/app/shared/filters.js
@@ -1,4 +1,4 @@
-angular.module('dockerui.filters', [])
+angular.module('<%= pkg.name %>.filters', [])
.filter('truncate', function() {
'use strict';
return function(text, length, end) {
@@ -7,14 +7,14 @@ angular.module('dockerui.filters', [])
}
if (end === undefined){
- end = "...";
+ end = '...';
}
if (text.length <= length || text.length - end.length <= length) {
return text;
}
else {
- return String(text).substring(0, length-end.length) + end;
+ return String(text).substring(0, length - end.length) + end;
}
};
})
diff --git a/app/shared/services.js b/app/shared/services.js
index 5a06bc5db..d825f94fd 100644
--- a/app/shared/services.js
+++ b/app/shared/services.js
@@ -1,4 +1,4 @@
-angular.module('dockerui.services', ['ngResource'])
+angular.module('<%= pkg.name %>.services', ['ngResource'])
.factory('Container', function($resource, Settings) {
'use strict';
// Resource for interacting with the docker containers
diff --git a/index.html b/index.html
index fb79d52d4..89e49bfc9 100644
--- a/index.html
+++ b/index.html
@@ -1,5 +1,5 @@
-
+
DockerUI
diff --git a/test/unit/shared/filters.spec.js b/test/unit/shared/filters.spec.js
new file mode 100644
index 000000000..d83f37911
--- /dev/null
+++ b/test/unit/shared/filters.spec.js
@@ -0,0 +1,156 @@
+describe('filters', function () {
+ beforeEach(module('<%= pkg.name %>.filters'));
+
+ describe('truncate', function () {
+ it('should truncate the string to 10 characters ending in "..." by default', inject(function(truncateFilter) {
+ expect(truncateFilter('this is 20 chars long')).toBe('this is...');
+ }));
+
+ it('should truncate the string to 7 characters ending in "..."', inject(function(truncateFilter) {
+ expect(truncateFilter('this is 20 chars long', 7)).toBe('this...');
+ }));
+
+ it('should truncate the string to 10 characters ending in "???"', inject(function(truncateFilter) {
+ expect(truncateFilter('this is 20 chars long', 10, '???')).toBe('this is???');
+ }));
+ });
+
+ describe('statusbadge', function () {
+ it('should be "important" when input is "Ghost"', inject(function(statusbadgeFilter) {
+ expect(statusbadgeFilter('Ghost')).toBe('important');
+ }));
+
+ it('should be "success" when input is "Exit 0"', inject(function(statusbadgeFilter) {
+ expect(statusbadgeFilter('Exit 0')).toBe('success');
+ }));
+
+ it('should be "warning" when exit code is non-zero', inject(function(statusbadgeFilter) {
+ expect(statusbadgeFilter('Exit 1')).toBe('warning');
+ }));
+ });
+
+ describe('getstatetext', function () {
+
+ it('should return an empty string when state is undefined', inject(function(getstatetextFilter) {
+ expect(getstatetextFilter(undefined)).toBe('');
+ }));
+
+ it('should detect a Ghost state', inject(function(getstatetextFilter) {
+ var state = {
+ Ghost: true,
+ Running: true,
+ Paused: false
+ };
+ expect(getstatetextFilter(state)).toBe('Ghost');
+ }));
+
+ it('should detect a Paused state', inject(function(getstatetextFilter) {
+ var state = {
+ Ghost: false,
+ Running: true,
+ Paused: true
+ };
+ expect(getstatetextFilter(state)).toBe('Running (Paused)');
+ }));
+
+ it('should detect a Running state', inject(function(getstatetextFilter) {
+ var state = {
+ Ghost: false,
+ Running: true,
+ Paused: false
+ };
+ expect(getstatetextFilter(state)).toBe('Running');
+ }));
+
+ it('should detect a Stopped state', inject(function(getstatetextFilter) {
+ var state = {
+ Ghost: false,
+ Running: false,
+ Paused: false
+ };
+ expect(getstatetextFilter(state)).toBe('Stopped');
+ }));
+ });
+
+ describe('getstatelabel', function () {
+ it('should return an empty string when state is undefined', inject(function(getstatelabelFilter) {
+ expect(getstatelabelFilter(undefined)).toBe('');
+ }));
+
+ it('should return label-important when a ghost state is detected', inject(function(getstatelabelFilter) {
+ var state = {
+ Ghost: true,
+ Running: true,
+ Paused: false
+ };
+ expect(getstatelabelFilter(state)).toBe('label-important');
+ }));
+
+ it('should return label-success when a running state is detected', inject(function(getstatelabelFilter) {
+ var state = {
+ Ghost: false,
+ Running: true,
+ Paused: false
+ };
+ expect(getstatelabelFilter(state)).toBe('label-success');
+ }));
+ });
+
+ describe('humansize', function () {
+ it('should return n/a when size is zero', inject(function(humansizeFilter) {
+ expect(humansizeFilter(0)).toBe('n/a');
+ }));
+
+ it('should handle Bytes values', inject(function(humansizeFilter) {
+ expect(humansizeFilter(512)).toBe('512 Bytes');
+ }));
+
+ it('should handle KB values', inject(function(humansizeFilter) {
+ expect(humansizeFilter(5120)).toBe('5 KB');
+ }));
+
+ it('should handle MB values', inject(function(humansizeFilter) {
+ expect(humansizeFilter(5 * Math.pow(10, 6))).toBe('5 MB');
+ }));
+
+ it('should handle GB values', inject(function(humansizeFilter) {
+ expect(humansizeFilter(5 * Math.pow(10, 9))).toBe('5 GB');
+ }));
+
+ it('should handle TB values', inject(function(humansizeFilter) {
+ expect(humansizeFilter(5 * Math.pow(10, 12))).toBe('5 TB');
+ }));
+ });
+
+ describe('containername', function () {
+ it('should strip the leading slash from container name', inject(function(containernameFilter) {
+ var container = {
+ Names: ['/elegant_ardinghelli']
+ };
+
+ expect(containernameFilter(container)).toBe('elegant_ardinghelli');
+ }));
+ });
+
+ describe('repotag', function () {
+ it('should not display empty repo tag', inject(function(repotagFilter) {
+ var image = {
+ RepoTags: [':']
+ };
+ expect(repotagFilter(image)).toBe('');
+ }));
+
+ it('should display a normal repo tag', inject(function(repotagFilter) {
+ var image = {
+ RepoTags: ['ubuntu:latest']
+ };
+ expect(repotagFilter(image)).toBe('ubuntu:latest');
+ }));
+ });
+
+ describe('getdate', function () {
+ it('should convert the Docker date to a human readable form', inject(function(getdateFilter) {
+ expect(getdateFilter(1420424998)).toBe('Sun Jan 04 2015');
+ }));
+ });
+});
\ No newline at end of file