diff --git a/.eslintrc.yaml b/.eslintrc.yaml index a421fb654ef0..a6423a41d2f5 100644 --- a/.eslintrc.yaml +++ b/.eslintrc.yaml @@ -1,8 +1,7 @@ extends: - openlayers env: - jquery: true - jasmine: true + jquery: true parserOptions: ecmaVersion: 2017 rules: diff --git a/contribs/gmf/src/controllers/AbstractAppController.js b/contribs/gmf/src/controllers/AbstractAppController.js index 2e48b66107a5..8a58014ad263 100644 --- a/contribs/gmf/src/controllers/AbstractAppController.js +++ b/contribs/gmf/src/controllers/AbstractAppController.js @@ -30,6 +30,7 @@ import olStyleFill from 'ol/style/Fill.js'; import olStyleStroke from 'ol/style/Stroke.js'; import olStyleStyle from 'ol/style/Style.js'; import {ThemeEventType} from 'gmf/theme/Manager.js'; +import {getBrowserLanguage} from 'ngeo/utils.js'; /** @@ -413,11 +414,6 @@ export function AbstractAppController(config, map, $scope, $injector) { } ); - /** - * @type {import('ngeo/misc/getBrowserLanguage.js').miscGetBrowserLanguage} - */ - this.getBrowserLanguage = $injector.get('ngeoGetBrowserLanguage'); - /** * @type {import("ngeo/statemanager/Service.js").StatemanagerService} */ @@ -708,8 +704,7 @@ AbstractAppController.prototype.initLanguage = function() { }); }); - const browserLanguage = /** @type {string|undefined} */ - (this.getBrowserLanguage(Object.keys(this.langUrls))); + const browserLanguage = getBrowserLanguage(Object.keys(this.langUrls)); const urlLanguage = /** @type {string|undefined} */ (this.stateManager.getInitialStringValue('lang')); diff --git a/contribs/gmf/test/.eslintrc.yaml b/contribs/gmf/test/.eslintrc.yaml new file mode 100644 index 000000000000..73255ae23afc --- /dev/null +++ b/contribs/gmf/test/.eslintrc.yaml @@ -0,0 +1,2 @@ +env: + jasmine: true diff --git a/karma-conf.js b/karma-conf.js index 6db074139a2a..552e704d1bd5 100644 --- a/karma-conf.js +++ b/karma-conf.js @@ -18,7 +18,7 @@ module.exports = function(config) { // frameworks to use // available frameworks: https://npmjs.org/browse/keyword/karma-adapter - frameworks: ['jasmine'], + frameworks: ['jasmine', 'sinon'], // list of files / patterns to load in the browser files: [ diff --git a/package.json b/package.json index 882661a825e4..704cbdc590e9 100644 --- a/package.json +++ b/package.json @@ -98,6 +98,7 @@ "karma": "^4.1.0", "karma-chrome-launcher": "^2.2.0", "karma-jasmine": "^2.0.1", + "karma-sinon": "^1.0.5", "karma-sourcemap-loader": "^0.3.7", "karma-webpack": "^4.0.2", "loader-utils": "^1.2.3", @@ -115,6 +116,7 @@ "proj4": "^2.5.0", "raven-js": "^3.27.1", "simple-html-tokenizer": "^0.1.1", + "sinon": "^7.3.2", "svg-inline-loader": "^0.8.0", "svgo": "^1.2.2", "svgo-loader": "^2.2.0", diff --git a/src/misc/extraModule.js b/src/misc/extraModule.js index 7644fe443c56..e2c1957b436f 100644 --- a/src/misc/extraModule.js +++ b/src/misc/extraModule.js @@ -11,7 +11,6 @@ import ngeoMiscFeatureHelper from 'ngeo/misc/FeatureHelper.js'; import ngeoMiscFile from 'ngeo/misc/File.js'; import ngeoMiscFilereaderComponent from 'ngeo/misc/filereaderComponent.js'; import ngeoMiscFilters from 'ngeo/misc/filters.js'; -import ngeoMiscGetBrowserLanguage from 'ngeo/misc/getBrowserLanguage.js'; import ngeoMiscSortableComponent from 'ngeo/misc/sortableComponent.js'; import ngeoMiscTime from 'ngeo/misc/Time.js'; import ngeoMiscToolActivateMgr from 'ngeo/misc/ToolActivateMgr.js'; @@ -31,7 +30,6 @@ export default angular.module('ngeoMiscExtraModule', [ ngeoMiscFile.name, ngeoMiscFilereaderComponent.name, ngeoMiscFilters.name, - ngeoMiscGetBrowserLanguage.name, ngeoMiscSortableComponent.name, ngeoMiscTime.name, ngeoMiscToolActivateMgr.name, diff --git a/src/misc/getBrowserLanguage.js b/src/misc/getBrowserLanguage.js deleted file mode 100644 index 1c104be4468f..000000000000 --- a/src/misc/getBrowserLanguage.js +++ /dev/null @@ -1,53 +0,0 @@ -import angular from 'angular'; - - -/** - * @type {angular.IModule} - * @hidden - */ -const module = angular.module('ngeoGetBrowserLanguage', []); - - -/** - * Provides a function that returns the most appropriate 2-letter - * language code depending on the list of available languages and the browser - * languages settings. - * @typedef {function(string[]):string} miscGetBrowserLanguage - */ - - -/** - * Provides a function that returns the most appropriate 2-letter - * language code depending on the list of available languages and the browser - * languages settings. - * - * @param {angular.IWindowService} $window Angular $window service. - * @return {miscGetBrowserLanguage} The "GetBrowserLanguage" function. - * - * @ngdoc service - * @ngname ngeoGetBrowserLanguage - * @ngInject - * @private - * @hidden - */ -function factory($window) { - return ( - /** - * @param {string[]} availableLanguages Available languages. - * @return {string} The "best" language code. - */ - function(availableLanguages) { - const nav = $window.navigator; - let browserLanguages = nav.languages || [nav.language]; - browserLanguages = browserLanguages.map(item => item.substring(0, 2)); - // remove duplicated language codes - browserLanguages = browserLanguages.filter((item, index, arr) => arr.indexOf(item) == index); - const supportedLanguages = browserLanguages.filter(item => availableLanguages.indexOf(item) != -1); - return supportedLanguages[0]; - }); -} - -module.factory('ngeoGetBrowserLanguage', factory); - - -export default module; diff --git a/src/utils.js b/src/utils.js index b7ed2a2c39a4..af9978fb75dc 100644 --- a/src/utils.js +++ b/src/utils.js @@ -7,6 +7,21 @@ import olGeomPoint from 'ol/geom/Point.js'; import olGeomPolygon from 'ol/geom/Polygon.js'; import {getTopLeft, getTopRight, getBottomLeft, getBottomRight} from 'ol/extent.js'; + +/** + * @param {string[]} availableLanguages Available languages. + * @return {string} The "best" language code. + */ +export function getBrowserLanguage(availableLanguages) { + let browserLanguages = window.navigator.languages || [window.navigator.language]; + browserLanguages = browserLanguages.map(item => item.substring(0, 2)); + // remove duplicated language codes + browserLanguages = browserLanguages.filter((item, index, arr) => arr.indexOf(item) == index); + const supportedLanguages = browserLanguages.filter(item => availableLanguages.indexOf(item) != -1); + return supportedLanguages[0]; +} + + /** * Utility method that converts a simple geometry to its multi equivalent. If * the geometry itself is already multi, it is returned as-is. diff --git a/test/.eslintrc.yaml b/test/.eslintrc.yaml new file mode 100644 index 000000000000..0b39c32e9c04 --- /dev/null +++ b/test/.eslintrc.yaml @@ -0,0 +1,4 @@ +env: + jasmine: true +globals: + sinon: true diff --git a/test/spec/all.js b/test/spec/all.js index 322b5377692c..ac72194fb572 100644 --- a/test/spec/all.js +++ b/test/spec/all.js @@ -2,11 +2,11 @@ import 'jquery'; import 'angular'; import 'angular-mocks'; import 'angular-gettext'; +import './ngeo/getbrowserlanguage.spec.js'; import './beforeeach.js'; import './search/createlocationsearchbloodhound.spec.js'; import './services/wmstime.spec.js'; import './services/layerHelper.spec.js'; -import './services/getbrowserlanguage.spec.js'; import './services/backgroundlayermgr.spec.js'; import './services/decoratelayer.spec.js'; import './services/wfspermalink.spec.js'; diff --git a/test/spec/ngeo/getbrowserlanguage.spec.js b/test/spec/ngeo/getbrowserlanguage.spec.js new file mode 100644 index 000000000000..e464064a2f49 --- /dev/null +++ b/test/spec/ngeo/getbrowserlanguage.spec.js @@ -0,0 +1,18 @@ +import {getBrowserLanguage} from 'ngeo/utils.js'; + +describe('ngeo.misc.getBrowserLanguage', () => { + + it('gets language from navigator.languages', () => { + const stub = sinon.stub(window.navigator, 'languages').value(['en-US', 'zh-CN', 'ja-JP', 'fr-FR']); + const langCode = getBrowserLanguage(['de', 'fr', 'it']); + expect(langCode).toBe('fr'); + stub.restore(); + }); + + it('gets language from navigator.language', () => { + const stub = sinon.stub(window.navigator, 'language').value('fr-FR'); + const langCode = getBrowserLanguage(['de', 'fr', 'it']); + expect(langCode).toBe('fr'); + stub.restore(); + }); +}); diff --git a/test/spec/services/getbrowserlanguage.spec.js b/test/spec/services/getbrowserlanguage.spec.js deleted file mode 100644 index 5dcb2a84bbe9..000000000000 --- a/test/spec/services/getbrowserlanguage.spec.js +++ /dev/null @@ -1,33 +0,0 @@ -import angular from 'angular'; -describe('ngeo.misc.getBrowserLanguage', () => { - /** @type {Object} */ - let win; - /** @type {import('ngeo/misc/getBrowserLanguage.js').miscGetBrowserLanguage} */ - let ngeoGetBrowserLanguage; - - beforeEach(() => { - win = {navigator: {}}; - angular.mock.module( - /** - * @param {angular.IModule} $provide - */ - ($provide) => { - $provide.value('$window', win); - }); - angular.mock.inject((_ngeoGetBrowserLanguage_) => { - ngeoGetBrowserLanguage = _ngeoGetBrowserLanguage_; - }); - }); - - it('gets language from navigator.languages', () => { - win.navigator.languages = ['en-US', 'zh-CN', 'ja-JP', 'fr-FR']; - const langCode = ngeoGetBrowserLanguage(['de', 'fr', 'it']); - expect(langCode).toBe('fr'); - }); - - it('gets language from navigator.language', () => { - win.navigator.language = 'fr-FR'; - const langCode = ngeoGetBrowserLanguage(['de', 'fr', 'it']); - expect(langCode).toBe('fr'); - }); -});