Pour tout problème contactez-nous par mail : support@froggit.fr | La FAQ :grey_question: | Rejoignez-nous sur le Chat :speech_balloon:

Skip to content
Snippets Groups Projects
Commit f8ca62b2 authored by Pierre Jarriges's avatar Pierre Jarriges
Browse files

unit tests

parent 2cced6d2
Branches master
No related tags found
No related merge requests found
node_modules
...@@ -140,7 +140,13 @@ module.exports = { ...@@ -140,7 +140,13 @@ module.exports = {
locale = this.format_locale(locale); locale = this.format_locale(locale);
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
fetch(`${this.translations_url}${locale}.json`) fetch(`${this.translations_url}${locale}.json`)
.then(response => response.json()) .then(response => {
if (response.status === 200) {
return response.json();
} else {
throw Error("Translation file not found")
}
})
.then(response => { .then(response => {
this.translations = response; this.translations = response;
this.locale = locale; this.locale = locale;
......
Source diff could not be displayed: it is too large. Options to address this: view the blob.
{ {
"name": "ks-cheap-translator", "name": "ks-cheap-translator",
"version": "0.1.2", "version": "0.2.0",
"description": "A micro library to perform text translation", "description": "A micro library to perform text translation",
"main": "index.js", "main": "index.js",
"scripts": { "scripts": {
"test": "echo \"Error: no test specified\" && exit 1" "test": "jest --detectOpenHandles"
}, },
"author": "Kuadrado Software", "author": "Kuadrado Software",
"license": "LGPL-3.0", "license": "LGPL-3.0",
...@@ -17,5 +17,9 @@ ...@@ -17,5 +17,9 @@
"web", "web",
"frontend", "frontend",
"lightweight" "lightweight"
] ],
"devDependencies": {
"jest": "^27.3.1",
"jsdom": "^16.7.0"
}
} }
\ No newline at end of file
const { JSDOM } = require("jsdom");
const http = require("http");
const fr_json = {
"hello": "bonjour",
"You have X friends": "Tu as {%number%} amis"
};
const en_json = {
"You have X friends": "You have {%number%} friends"
}
const es_json = {
"hello": "hola",
"You have X friends": "Tienes {%number%} amigos"
};
module.exports = function () {
const base_html = `<!DOCTYPE html><html><body></body></html>`;
global.DOM = new JSDOM(base_html);
const { window } = DOM;
global.window = window;
const localStorageMock = (function () {
let store = {}
return {
getItem: function (key) {
return store[key] || null
},
setItem: function (key, value) {
store[key] = value.toString()
},
clear: function () {
store = {};
}
}
})()
Object.defineProperty(window, 'localStorage', {
value: localStorageMock,
});
global.localStorage = window.localStorage;
global.navigator = { language: "fr-FR" };
global.SERVER_PORT = 8989;
global.BASE_TEST_URL = "http://localhost" + ":" + SERVER_PORT;
global.fetch = function (url) {
return new Promise((resolve, reject) => {
const req = new window.XMLHttpRequest();
req.onload = function () {
req.json = async function () {
const res = req.status === 200
? JSON.parse(req.responseText)
: req.responseText;
return res;
};
resolve(req);
};
try {
req.open("GET", BASE_TEST_URL + url);
req.send();
} catch (error) {
reject(error)
}
});
}
const server = http.createServer((req, res) => {
const path = req.url.replace(BASE_TEST_URL, "");
res.setHeader("access-control-allow-origin", "*");
res.setHeader("Content-Type", "application/json");
switch (path) {
case "/fr.json":
res.end(JSON.stringify(fr_json));
break;
case "/en.json":
res.end(JSON.stringify(en_json));
break;
case "/es.json":
res.end(JSON.stringify(es_json));
break;
default:
res.statusCode = 404;
res.setHeader("Content-Type", "text/plain");
res.end("File not found");
}
});
const sockets = new Set();
server.on('connection', (socket) => {
sockets.add(socket);
server.once('close', () => {
sockets.delete(socket);
});
});
global.close_server = () => {
for (const socket of sockets) {
socket.destroy(); sockets.delete(socket);
}
server.close();
}
server.listen(SERVER_PORT)
}
\ No newline at end of file
const createTestingContext = require("./create-testing-context");
const translator = require("..");
createTestingContext();
test("test trad fr", () => {
navigator.language = "fr-FR";
return translator.init({
supported_languages: ["en", "fr", "es"],
translations_url: "/",
local_storage_key: "ls-test-trad",
})
.then(() => {
expect(translator.trad("hello")).toBe("bonjour");
});
});
test("test change trad", () => {
return translator.update_translations("es").then(() => {
expect(localStorage.getItem("ls-test-trad")).toBe("es");
expect(translator.trad("hello")).toBe("hola");
});
});
test("test trad params", () => {
expect(translator.trad("You have X friends", { number: 0 }))
.toBe("Tienes 0 amigos");
});
test("unsupported trad return key", () => {
return translator.update_translations("it").catch(() => {
expect(translator.trad("hello")).toBe("hola");
});
});
test("unexisting key return key", () => {
expect(translator.trad("whatever")).toBe("whatever");
});
test("use url locale fragment in priority", () => {
expect(translator.locale).toBe("es");
DOM.reconfigure({ url: "http://some-url.com/fr/some-path" });
navigator.language = "it-IT";
return translator.init({
supported_languages: ["en", "fr", "es"],
translations_url: "/",
})
.then(() => {
expect(translator.locale).toBe("fr");
});
});
test("ignore unsupported url locale fragment and get default", () => {
expect(translator.locale).toBe("fr");
DOM.reconfigure({ url: "http://some-url.com/de/some-path" });
navigator.language = "it-IT";
localStorage.clear();
return translator.init({
supported_languages: ["en", "fr", "es"],
translations_url: "/",
})
.then(() => {
expect(translator.locale).toBe("en");
});
});
test("use local storage if defined", () => {
expect(translator.locale).toBe("en");
DOM.reconfigure({ url: "http://some-url.com/some-path" });// No locale fragment
navigator.language = "it-IT"; // unsupported niavigator language
localStorage.setItem(translator.local_storage_key, "fr");
return translator.init({
supported_languages: ["en", "fr", "es"],
translations_url: "/",
})
.then(() => {
close_server()
expect(translator.locale).toBe("fr");
});
});
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment