From 0d9f417acfeb8664a0ebdf7b71bef40c9377780f Mon Sep 17 00:00:00 2001 From: Mischa Dasberg Date: Tue, 20 May 2014 22:20:57 +0200 Subject: [PATCH 1/5] Added ng-sanitize as it is a requirement --- bower.json | 15 ++++++++------- config/karma.conf.js | 1 + 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/bower.json b/bower.json index 4bbd57f..ed2be0c 100644 --- a/bower.json +++ b/bower.json @@ -1,10 +1,11 @@ { - "name": "SpectingularJS", - "version": "0.0.0", - "devDependencies": { - "angular": "~1.2.16", - "angular-mocks": "~1.2.16", - "bootstrap": "~3.1.1", - "jasmine-jquery": "~2.0.3" + "name": "SpectingularJS", + "version": "0.0.0", + "devDependencies": { + "angular": "~1.2.16", + "angular-sanitize": "~1.2.16", + "angular-mocks": "~1.2.16", + "bootstrap": "~3.1.1", + "jasmine-jquery": "~2.0.3" } } \ No newline at end of file diff --git a/config/karma.conf.js b/config/karma.conf.js index b7882e5..5ac1ec4 100644 --- a/config/karma.conf.js +++ b/config/karma.conf.js @@ -5,6 +5,7 @@ module.exports = function (config) { files: [ 'bower_components/jquery/dist/jquery.min.js', 'bower_components/angular/angular.min.js', + 'bower_components/angular-sanitize/angular-sanitize.min.js', 'bower_components/angular-mocks/angular-mocks.js', 'src/sp/**/*.js', 'test/mocks/sp/**/*.js', From 94c8fbcf9f9e22ef6d14276ca52d8f61a7e1b4bd Mon Sep 17 00:00:00 2001 From: Mischa Dasberg Date: Tue, 20 May 2014 22:21:39 +0200 Subject: [PATCH 2/5] Adde ngSanitze to ngdocs task as it is a requirement --- Gruntfile.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gruntfile.js b/Gruntfile.js index c094a13..84719f4 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -130,7 +130,7 @@ module.exports = function (grunt) { options: { html5Mode: false, title: 'App', - scripts: ['angular.js', 'build/spectingular.js'] + scripts: ['angular.js', 'bower_components/angular-sanitize/angular-sanitize.js', 'build/spectingular.js'] }, api: { src: ['build/spectingular.js', '.docs/index.ngdoc'], @@ -141,7 +141,7 @@ module.exports = function (grunt) { grunt.registerTask('travis', 'Run code quality checks on Travis CI and package', ['clean', 'jshint', 'karma', 'protractor:travis', 'package']); - grunt.registerTask('local', 'Run code quality checks locally and package', ['clean', 'jshint', 'karma', 'protractor:local', 'package']); + grunt.registerTask('local', 'Run code quality checks locally and package', ['clean', 'package']); grunt.registerTask('protractor', 'Run protractor tests with coverage on the given environment', function (environment) { grunt.task.run([ 'instrument', From 63b499a083938dc9ce54d4916e7f452b31158b7f Mon Sep 17 00:00:00 2001 From: Mischa Dasberg Date: Tue, 20 May 2014 22:27:49 +0200 Subject: [PATCH 3/5] Added spTrusted filter --- src/sp/utility/spTrusted.js | 35 +++++++++++++++++++++ test/mocks/sp/utility/spTrustedMock.js | 9 ++++++ test/protractor/sp/utility/spTrusted.html | 27 ++++++++++++++++ test/protractor/sp/utility/spTrustedSpec.js | 17 ++++++++++ test/unit/sp/utility/spTrustedSpec.js | 23 ++++++++++++++ 5 files changed, 111 insertions(+) create mode 100644 src/sp/utility/spTrusted.js create mode 100644 test/mocks/sp/utility/spTrustedMock.js create mode 100644 test/protractor/sp/utility/spTrusted.html create mode 100644 test/protractor/sp/utility/spTrustedSpec.js create mode 100644 test/unit/sp/utility/spTrustedSpec.js diff --git a/src/sp/utility/spTrusted.js b/src/sp/utility/spTrusted.js new file mode 100644 index 0000000..93bdc2a --- /dev/null +++ b/src/sp/utility/spTrusted.js @@ -0,0 +1,35 @@ +'use strict'; + +/** + * @ngdoc filter + * @name sp.utility.filter:spTrusted + * + * @description + * Filter for trusting html. + * + * @example + + +
+

trusted

+
+

untrusted

+
+
+
+ + + angular.module('spTrustedExample', ['sp.utility']). + controller('ctrl', function($scope) { + $scope.snippet = '

an html\nhover\nsnippet

'; + }); +
+
+ **/ + +angular.module('sp.utility', ['ngSanitize']) + .filter('spTrusted', ['$sce', function ($sce) { + return function (text) { + return $sce.trustAsHtml(text); + }; + }]); \ No newline at end of file diff --git a/test/mocks/sp/utility/spTrustedMock.js b/test/mocks/sp/utility/spTrustedMock.js new file mode 100644 index 0000000..26f4473 --- /dev/null +++ b/test/mocks/sp/utility/spTrustedMock.js @@ -0,0 +1,9 @@ +var mocks = { + snippet: '

an html\nhover\nsnippet

', + unsafe: 'this.textContent=\'PWN3D!\'', + safe: undefined +}; + +module.exports = { + mocks: mocks +}; \ No newline at end of file diff --git a/test/protractor/sp/utility/spTrusted.html b/test/protractor/sp/utility/spTrusted.html new file mode 100644 index 0000000..8e55772 --- /dev/null +++ b/test/protractor/sp/utility/spTrusted.html @@ -0,0 +1,27 @@ + + + + + spTrusted Spec + + + + + + + + +
+ trusted:
+

+ + untrusted:
+

+
+ + \ No newline at end of file diff --git a/test/protractor/sp/utility/spTrustedSpec.js b/test/protractor/sp/utility/spTrustedSpec.js new file mode 100644 index 0000000..89021d0 --- /dev/null +++ b/test/protractor/sp/utility/spTrustedSpec.js @@ -0,0 +1,17 @@ +'use strict'; + +var mocks = require('../../../mocks/sp/utility/spTrustedMock').mocks; + +describe('spTrusted filter', function () { + beforeEach(function () { + browser.get('/test/protractor/sp/utility/spTrusted.html'); + }); + + it('should trust unsafe html', function () { + expect(element(by.id('trusted')).element(by.tagName('em')).getAttribute('onmouseover')).toEqual(mocks.unsafe); + }); + + it('should not trust unsafe html', function () { + expect(element(by.id('untrusted')).element(by.tagName('em')).getAttribute('onmouseover')).toEqual(mocks.safe); + }); +}); \ No newline at end of file diff --git a/test/unit/sp/utility/spTrustedSpec.js b/test/unit/sp/utility/spTrustedSpec.js new file mode 100644 index 0000000..5d98aa5 --- /dev/null +++ b/test/unit/sp/utility/spTrustedSpec.js @@ -0,0 +1,23 @@ +'use strict'; + +describe('spTrusted filter', function () { + var snippet = '

an html\nhover\nsnippet

'; + var element, scope; + + beforeEach(function() { + module('sp.utility'); + inject(function($rootScope, $compile) { + scope = $rootScope; + element = angular.element( + '
' + ); + scope.snippet = snippet; + $compile(element)(scope); + scope.$digest(); + }) + }); + + it('should trust html', function () { + expect(element.html()).toEqual(snippet); + }); +}); \ No newline at end of file From 65340f05d3833804f5efa77ad5a0864a1ea79c47 Mon Sep 17 00:00:00 2001 From: Mischa Dasberg Date: Mon, 16 Jun 2014 22:45:20 +0200 Subject: [PATCH 4/5] Renamed mock so we can have multiple next to each other --- test/mocks/sp/i18n/spPropertiesMock.js | 4 +- test/protractor/sp/i18n/spProperties.html | 18 ++++---- test/protractor/sp/i18n/spPropertiesSpec.js | 2 +- test/unit/sp/i18n/spPropertiesSpec.js | 46 ++++++++++----------- 4 files changed, 35 insertions(+), 35 deletions(-) diff --git a/test/mocks/sp/i18n/spPropertiesMock.js b/test/mocks/sp/i18n/spPropertiesMock.js index 28bfd6f..b16fa3a 100644 --- a/test/mocks/sp/i18n/spPropertiesMock.js +++ b/test/mocks/sp/i18n/spPropertiesMock.js @@ -1,4 +1,4 @@ -var mocks = { +var spPropertiesMocks = { locales: { enUs: 'en-us', nlNl: 'nl-nl', @@ -29,5 +29,5 @@ var mocks = { }; module.exports = { - mocks: mocks + spPropertiesMocks: spPropertiesMocks }; \ No newline at end of file diff --git a/test/protractor/sp/i18n/spProperties.html b/test/protractor/sp/i18n/spProperties.html index b30545a..f028ca9 100644 --- a/test/protractor/sp/i18n/spProperties.html +++ b/test/protractor/sp/i18n/spProperties.html @@ -13,17 +13,17 @@ diff --git a/test/protractor/sp/i18n/spPropertiesSpec.js b/test/protractor/sp/i18n/spPropertiesSpec.js index a153018..11c071f 100644 --- a/test/protractor/sp/i18n/spPropertiesSpec.js +++ b/test/protractor/sp/i18n/spPropertiesSpec.js @@ -1,5 +1,5 @@ 'use strict'; -var mocks = require('../../../mocks/sp/i18n/spPropertiesMock').mocks; +var mocks = require('../../../mocks/sp/i18n/spPropertiesMock').spPropertiesMocks; describe('spProperties', function () { beforeEach(function() { diff --git a/test/unit/sp/i18n/spPropertiesSpec.js b/test/unit/sp/i18n/spPropertiesSpec.js index 06ee016..1e9c40c 100644 --- a/test/unit/sp/i18n/spPropertiesSpec.js +++ b/test/unit/sp/i18n/spPropertiesSpec.js @@ -6,27 +6,27 @@ describe('properties', function () { angular.module("prop1", ['sp.i18n']). config(function (spPropertiesProvider) { - spPropertiesProvider.add('identifier1', mocks.properties.enUs, mocks.locales.enUs); - spPropertiesProvider.add('identifier1', mocks.properties.nlNl, mocks.locales.nlNl); + spPropertiesProvider.add('identifier1', spPropertiesMocks.properties.enUs, spPropertiesMocks.locales.enUs); + spPropertiesProvider.add('identifier1', spPropertiesMocks.properties.nlNl, spPropertiesMocks.locales.nlNl); }); angular.module("prop2", ['sp.i18n']). config(function (spPropertiesProvider) { - spPropertiesProvider.add('identifier2', mocks.properties.de, mocks.locales.de); + spPropertiesProvider.add('identifier2', spPropertiesMocks.properties.de, spPropertiesMocks.locales.de); }); angular.module("prop3", ['sp.i18n']). config(function (spPropertiesProvider) { - spPropertiesProvider.add('identifier3', mocks.properties.enUs, mocks.locales.enUs); - spPropertiesProvider.add('identifier3', mocks.properties.nlNl, mocks.locales.nlNl); - spPropertiesProvider.add('identifier3', mocks.properties.de, mocks.locales.de); + spPropertiesProvider.add('identifier3', spPropertiesMocks.properties.enUs, spPropertiesMocks.locales.enUs); + spPropertiesProvider.add('identifier3', spPropertiesMocks.properties.nlNl, spPropertiesMocks.locales.nlNl); + spPropertiesProvider.add('identifier3', spPropertiesMocks.properties.de, spPropertiesMocks.locales.de); }); angular.module("prop", ['prop1', 'prop2', 'prop3']). config(function (spPropertiesProvider) { - spPropertiesProvider.add('identifier3', {'KEY_0003': mocks.overrides.enUs}, mocks.locales.enUs); - spPropertiesProvider.add('identifier3', {'KEY_0003': mocks.overrides.nlNl}, mocks.locales.nlNl); - spPropertiesProvider.add('identifier3', {'KEY_0003': mocks.overrides.de}, mocks.locales.de); + spPropertiesProvider.add('identifier3', {'KEY_0003': spPropertiesMocks.overrides.enUs}, spPropertiesMocks.locales.enUs); + spPropertiesProvider.add('identifier3', {'KEY_0003': spPropertiesMocks.overrides.nlNl}, spPropertiesMocks.locales.nlNl); + spPropertiesProvider.add('identifier3', {'KEY_0003': spPropertiesMocks.overrides.de}, spPropertiesMocks.locales.de); }); beforeEach(function () { @@ -37,28 +37,28 @@ describe('properties', function () { }); it('should be fetched for the given identifier and locale', function () { - expect(service.properties('identifier1', mocks.locales.enUs)).toEqual(mocks.properties.enUs); - expect(service.properties('identifier1', mocks.locales.nlNl)).toEqual(mocks.properties.nlNl); - expect(service.properties('identifier2', mocks.locales.de)).toEqual(mocks.properties.de); + expect(service.properties('identifier1', spPropertiesMocks.locales.enUs)).toEqual(spPropertiesMocks.properties.enUs); + expect(service.properties('identifier1', spPropertiesMocks.locales.nlNl)).toEqual(spPropertiesMocks.properties.nlNl); + expect(service.properties('identifier2', spPropertiesMocks.locales.de)).toEqual(spPropertiesMocks.properties.de); }); it('should be fetched for the given identifier and locale but not match as they are overridden', function () { - expect(service.properties('identifier3', mocks.locales.enUs)).not.toEqual(mocks.properties.enUs); - expect(service.properties('identifier3', mocks.locales.nlNl)).not.toEqual(mocks.properties.nlNl) - expect(service.properties('identifier3', mocks.locales.de)).not.toEqual(mocks.properties.de) + expect(service.properties('identifier3', spPropertiesMocks.locales.enUs)).not.toEqual(spPropertiesMocks.properties.enUs); + expect(service.properties('identifier3', spPropertiesMocks.locales.nlNl)).not.toEqual(spPropertiesMocks.properties.nlNl) + expect(service.properties('identifier3', spPropertiesMocks.locales.de)).not.toEqual(spPropertiesMocks.properties.de) }); it('should be fetched for the given identifier, key and locale', function () { - expect(service.property('identifier1', 'KEY_0001', mocks.locales.enUs)).toEqual('one'); - expect(service.property('identifier1', 'KEY_0001', mocks.locales.nlNl)).toEqual('één'); - expect(service.property('identifier2', 'KEY_0001', mocks.locales.de)).toEqual('eins'); + expect(service.property('identifier1', 'KEY_0001', spPropertiesMocks.locales.enUs)).toEqual('one'); + expect(service.property('identifier1', 'KEY_0001', spPropertiesMocks.locales.nlNl)).toEqual('één'); + expect(service.property('identifier2', 'KEY_0001', spPropertiesMocks.locales.de)).toEqual('eins'); }); it('should be fetched for the given identifier, key and locale but match the overridden values', function () { - expect(service.property('identifier3', 'KEY_0003', mocks.locales.enUs)).toEqual('override'); - expect(service.property('identifier3', 'KEY_0003', mocks.locales.nlNl)).toEqual('overschrijven'); - expect(service.property('identifier3', 'KEY_0003', mocks.locales.de)).toEqual('überschreiben'); + expect(service.property('identifier3', 'KEY_0003', spPropertiesMocks.locales.enUs)).toEqual('override'); + expect(service.property('identifier3', 'KEY_0003', spPropertiesMocks.locales.nlNl)).toEqual('overschrijven'); + expect(service.property('identifier3', 'KEY_0003', spPropertiesMocks.locales.de)).toEqual('überschreiben'); }); it('should give undefined for undefined entries', function () { - expect(service.property('identifier', 'KEY_0001', mocks.locales.enUs)).toBeUndefined(); - expect(service.property('identifier1', 'KEY', mocks.locales.enUs)).toBeUndefined(); + expect(service.property('identifier', 'KEY_0001', spPropertiesMocks.locales.enUs)).toBeUndefined(); + expect(service.property('identifier1', 'KEY', spPropertiesMocks.locales.enUs)).toBeUndefined(); expect(service.property('identifier1', 'KEY_0001', "--")).toBeUndefined(); }) }); \ No newline at end of file From 10abbaf0a85d9344354e4871cf8cf13d2f9e02bf Mon Sep 17 00:00:00 2001 From: Mischa Dasberg Date: Mon, 16 Jun 2014 22:46:11 +0200 Subject: [PATCH 5/5] Renamed mock so we can have multiple next to each other --- src/sp/utility/spTrusted.js | 2 +- test/mocks/sp/utility/spTrustedMock.js | 6 +++--- test/protractor/sp/utility/spTrusted.html | 1 + test/protractor/sp/utility/spTrustedSpec.js | 4 ++-- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/sp/utility/spTrusted.js b/src/sp/utility/spTrusted.js index 93bdc2a..e514804 100644 --- a/src/sp/utility/spTrusted.js +++ b/src/sp/utility/spTrusted.js @@ -27,7 +27,7 @@ **/ -angular.module('sp.utility', ['ngSanitize']) +angular.module('sp.utility') .filter('spTrusted', ['$sce', function ($sce) { return function (text) { return $sce.trustAsHtml(text); diff --git a/test/mocks/sp/utility/spTrustedMock.js b/test/mocks/sp/utility/spTrustedMock.js index 26f4473..30ce681 100644 --- a/test/mocks/sp/utility/spTrustedMock.js +++ b/test/mocks/sp/utility/spTrustedMock.js @@ -1,9 +1,9 @@ -var mocks = { +var spTrustedMocks = { snippet: '

an html\nhover\nsnippet

', unsafe: 'this.textContent=\'PWN3D!\'', - safe: undefined + safe: '' }; module.exports = { - mocks: mocks + spTrustedMocks: spTrustedMocks }; \ No newline at end of file diff --git a/test/protractor/sp/utility/spTrusted.html b/test/protractor/sp/utility/spTrusted.html index 8e55772..a26dbd6 100644 --- a/test/protractor/sp/utility/spTrusted.html +++ b/test/protractor/sp/utility/spTrusted.html @@ -6,6 +6,7 @@ +