From 1565da87cf0cb13573de526cc0323a5d4dbb0c5e Mon Sep 17 00:00:00 2001
From: David Twigger <david.twigger@raisepartner.com>
Date: Tue, 10 Jan 2023 08:18:45 +0100
Subject: [PATCH] Implement cypress unit testing

---
 config/cypress.frontend.config.js | 10 +++++++
 package.json                      |  1 +
 test/cypress/unit/i18n.spec.js    | 44 +++++++++++++++++++++++++++++++
 3 files changed, 55 insertions(+)
 create mode 100644 config/cypress.frontend.config.js
 create mode 100644 test/cypress/unit/i18n.spec.js

diff --git a/config/cypress.frontend.config.js b/config/cypress.frontend.config.js
new file mode 100644
index 00000000..eecdcb8d
--- /dev/null
+++ b/config/cypress.frontend.config.js
@@ -0,0 +1,10 @@
+const { defineConfig } = require("cypress");
+
+module.exports = defineConfig({
+    e2e: {
+        supportFile: false,
+        specPattern: [
+            "test/cypress/unit/**/*.js"
+        ],
+    }
+});
diff --git a/package.json b/package.json
index ebe305f9..190ef247 100644
--- a/package.json
+++ b/package.json
@@ -60,6 +60,7 @@
         "start-pr-test": "node extra/checkout-pr.js && npm install && npm run dev",
         "cy:test": "node test/prepare-test-server.js && node server/server.js --port=3002 --data-dir=./data/test/ --e2e",
         "cy:run": "npx cypress run --browser chrome --headless --config-file ./config/cypress.config.js",
+        "cy:run:unit": "npx cypress run --browser chrome --headless --config-file ./config/cypress.frontend.config.js",
         "cypress-open": "concurrently -k -r \"node test/prepare-test-server.js && node server/server.js --port=3002 --data-dir=./data/test/\" \"cypress open --config-file ./config/cypress.config.js\"",
         "build-healthcheck-armv7": "cross-env GOOS=linux GOARCH=arm GOARM=7 go build -x -o ./extra/healthcheck-armv7 ./extra/healthcheck.go"
     },
diff --git a/test/cypress/unit/i18n.spec.js b/test/cypress/unit/i18n.spec.js
new file mode 100644
index 00000000..da63d95a
--- /dev/null
+++ b/test/cypress/unit/i18n.spec.js
@@ -0,0 +1,44 @@
+import { currentLocale } from "../../../src/i18n";
+
+describe("Test i18n.js", () => {
+
+    it("currentLocale()", () => {
+        const setLanguage = (language) => {
+            Object.defineProperty(window.navigator, 'language', { 
+                value: language, 
+                writable: true 
+            });
+        }
+        setLanguage('en-EN');
+
+        expect(currentLocale()).equal("en");
+
+        setLanguage('zh-HK');
+        expect(currentLocale()).equal("zh-HK");
+
+        // Note that in Safari on iOS prior to 10.2, the country code returned is lowercase: "en-us", "fr-fr" etc.
+        // https://developer.mozilla.org/en-US/docs/Web/API/Navigator/language
+        setLanguage('zh-hk');
+        expect(currentLocale()).equal("en");
+
+        setLanguage('en-US');
+        expect(currentLocale()).equal("en");
+
+        setLanguage('ja-ZZ');
+        expect(currentLocale()).equal("ja");
+
+        setLanguage('zz-ZZ');
+        expect(currentLocale()).equal("en");
+
+        setLanguage('zz-ZZ');
+        expect(currentLocale()).equal("en");
+
+        setLanguage('en');
+        localStorage.locale = "en";
+        expect(currentLocale()).equal("en");
+
+        localStorage.locale = "zh-HK";
+        expect(currentLocale()).equal("zh-HK");
+    });
+
+});
\ No newline at end of file