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