Skip to content

Commit

Permalink
Avoid running tests on l10n singleton
Browse files Browse the repository at this point in the history
We want tests to be independent, so we cannot have them modify a shared
state, such as the l10n singleton. Make sure each test instantiates its
own object instead.
  • Loading branch information
CendioOssman committed Apr 6, 2023
1 parent a4453c9 commit 681632b
Showing 1 changed file with 41 additions and 20 deletions.
61 changes: 41 additions & 20 deletions tests/test.localization.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,20 @@
const expect = chai.expect;
import { l10n } from '../app/localization.js';
import _, { Localizer, l10n } from '../app/localization.js';

describe('Localization', function () {
"use strict";

describe('Singleton', function () {
it('should export a singleton object', function () {
expect(l10n).to.be.instanceOf(Localizer);
});
it('should export a singleton translation function', function () {
// FIXME: Can we use some spy instead?
l10n.dictionary = { "Foobar": "gazonk" };
expect(_("Foobar")).to.equal("gazonk");
});
});

describe('language selection', function () {
let origNavigator;
beforeEach(function () {
Expand All @@ -20,52 +31,62 @@ describe('Localization', function () {
});

it('should use English by default', function () {
expect(l10n.language).to.equal('en');
let lclz = new Localizer();
expect(lclz.language).to.equal('en');
});
it('should use English if no user language matches', function () {
window.navigator.languages = ["nl", "de"];
l10n.setup(["es", "fr"]);
expect(l10n.language).to.equal('en');
let lclz = new Localizer();
lclz.setup(["es", "fr"]);
expect(lclz.language).to.equal('en');
});
it('should fall back to generic English for other English', function () {
window.navigator.languages = ["en-AU", "de"];
l10n.setup(["de", "fr", "en-GB"]);
expect(l10n.language).to.equal('en');
let lclz = new Localizer();
lclz.setup(["de", "fr", "en-GB"]);
expect(lclz.language).to.equal('en');
});
it('should prefer specific English over generic', function () {
window.navigator.languages = ["en-GB", "de"];
l10n.setup(["de", "en-AU", "en-GB"]);
expect(l10n.language).to.equal('en-GB');
let lclz = new Localizer();
lclz.setup(["de", "en-AU", "en-GB"]);
expect(lclz.language).to.equal('en-GB');
});
it('should use the most preferred user language', function () {
window.navigator.languages = ["nl", "de", "fr"];
l10n.setup(["es", "fr", "de"]);
expect(l10n.language).to.equal('de');
let lclz = new Localizer();
lclz.setup(["es", "fr", "de"]);
expect(lclz.language).to.equal('de');
});
it('should prefer sub-languages languages', function () {
window.navigator.languages = ["pt-BR"];
l10n.setup(["pt", "pt-BR"]);
expect(l10n.language).to.equal('pt-BR');
let lclz = new Localizer();
lclz.setup(["pt", "pt-BR"]);
expect(lclz.language).to.equal('pt-BR');
});
it('should fall back to language "parents"', function () {
window.navigator.languages = ["pt-BR"];
l10n.setup(["fr", "pt", "de"]);
expect(l10n.language).to.equal('pt');
let lclz = new Localizer();
lclz.setup(["fr", "pt", "de"]);
expect(lclz.language).to.equal('pt');
});
it('should not use specific language when user asks for a generic language', function () {
window.navigator.languages = ["pt", "de"];
l10n.setup(["fr", "pt-BR", "de"]);
expect(l10n.language).to.equal('de');
let lclz = new Localizer();
lclz.setup(["fr", "pt-BR", "de"]);
expect(lclz.language).to.equal('de');
});
it('should handle underscore as a separator', function () {
window.navigator.languages = ["pt-BR"];
l10n.setup(["pt_BR"]);
expect(l10n.language).to.equal('pt_BR');
let lclz = new Localizer();
lclz.setup(["pt_BR"]);
expect(lclz.language).to.equal('pt_BR');
});
it('should handle difference in case', function () {
window.navigator.languages = ["pt-br"];
l10n.setup(["pt-BR"]);
expect(l10n.language).to.equal('pt-BR');
let lclz = new Localizer();
lclz.setup(["pt-BR"]);
expect(lclz.language).to.equal('pt-BR');
});
});
});

0 comments on commit 681632b

Please sign in to comment.