diff --git a/.github/workflows/deploy-githubpages.yml b/.github/workflows/deploy-githubpages.yml index 9189aff..83b8b93 100644 --- a/.github/workflows/deploy-githubpages.yml +++ b/.github/workflows/deploy-githubpages.yml @@ -1,5 +1,5 @@ # Simple workflow for deploying static content to GitHub Pages -name: Deploy static content to Pages +name: Deploy GitHub Pages on: # Runs on pushes targeting the default branch diff --git a/.github/workflows/js-unittest.yml b/.github/workflows/js-unittest.yml new file mode 100644 index 0000000..327f27f --- /dev/null +++ b/.github/workflows/js-unittest.yml @@ -0,0 +1,25 @@ +name: Jest JS Unit Test + +on: + pull_request: + branches: + - main + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +jobs: + # Single deploy job since we're just deploying + test: + runs-on: ubuntu-latest + steps: + - name: Install apt updates + run: sudo apt -y update; sudo apt -y upgrade; + - name: Install prerequisites + run: sudo apt install -y nodejs npm; + - name: Checkout + uses: actions/checkout@v3 + - name: Install dependencies + run: sudo npm install + - name: Run tests + run: sudo npm test \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4f2c69d --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +**/.devcontainer/* +**/node_modules/* +**/package-lock.json \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..c845db1 --- /dev/null +++ b/package.json @@ -0,0 +1,10 @@ +{ + "name": "food-journal", + "version": "1.0.0", + "scripts": { + "test": "mocha --recursive **/*.test.js" + }, + "dependencies": { + "mocha": "10" + } +} diff --git a/testenv/testenv.js b/testenv/testenv.js new file mode 100644 index 0000000..e62cfc3 --- /dev/null +++ b/testenv/testenv.js @@ -0,0 +1,28 @@ +module.exports = {environment}; + +function environment () { + const localStorageMock = (function () { + let store = {}; + return { + getItem(key) { + return store[key]; + }, + setItem(key, value) { + store[key] = value; + }, + clear() { + store = {}; + }, + removeItem(key) { + delete store[key]; + }, + getAll() { + return store; + }, + }; + })(); + + let window = {}; + Object.defineProperty(window, "localStorage", { value: localStorageMock }); + return window; +} \ No newline at end of file diff --git a/testenv/testenv.test.js b/testenv/testenv.test.js new file mode 100644 index 0000000..d274fb8 --- /dev/null +++ b/testenv/testenv.test.js @@ -0,0 +1,80 @@ +const {environment} = require("./testenv.js"); +var assert = require('assert'); +var {saveToLocal, getFromLocal, removeFromLocal, clearLocal} = require('./testenv_helpers'); + +beforeEach(() => { + window = environment(); +}); + +describe("test localStorage mock", () => { + it("test save and fetch", () => { + saveToLocal("testkey1", "testvalue1"); + saveToLocal("testkey2", "testvalue2"); + saveToLocal("testkey3", "testvalue3"); + saveToLocal("testkey4", "testvalue4"); + + assert.equal(getFromLocal("testkey1"), "testvalue1"); + assert.equal(getFromLocal("testkey2"), "testvalue2"); + assert.equal(getFromLocal("testkey3"), "testvalue3"); + assert.equal(getFromLocal("testkey4"), "testvalue4"); + + saveToLocal("testkey6", "testvalue5"); + assert.equal(getFromLocal("testkey6"), "testvalue5"); + }); + + it("test window locality", () => { + assert.equal(getFromLocal("testkey1"), null); + assert.equal(getFromLocal("testkey2"), null); + assert.equal(getFromLocal("testkey3"), null); + assert.equal(getFromLocal("testkey4"), null); + }); + + it("test delete and fetch", () => { + saveToLocal("testkey1", "testvalue1"); + saveToLocal("testkey2", "testvalue2"); + saveToLocal("testkey3", "testvalue3"); + saveToLocal("testkey4", "testvalue4"); + + removeFromLocal("testkey3"); + + assert.equal(getFromLocal("testkey1"), "testvalue1"); + assert.equal(getFromLocal("testkey2"), "testvalue2"); + assert.equal(getFromLocal("testkey3"), null); + assert.equal(getFromLocal("testkey4"), "testvalue4"); + + removeFromLocal("testkey1"); + + assert.equal(getFromLocal("testkey1"), null); + assert.equal(getFromLocal("testkey2"), "testvalue2"); + assert.equal(getFromLocal("testkey3"), null); + assert.equal(getFromLocal("testkey4"), "testvalue4"); + + removeFromLocal("testkey4"); + + assert.equal(getFromLocal("testkey1"), null); + assert.equal(getFromLocal("testkey2"), "testvalue2"); + assert.equal(getFromLocal("testkey3"), null); + assert.equal(getFromLocal("testkey4"), null); + + removeFromLocal("testkey2"); + + assert.equal(getFromLocal("testkey1"), null); + assert.equal(getFromLocal("testkey2"), null); + assert.equal(getFromLocal("testkey3"), null); + assert.equal(getFromLocal("testkey4"), null); + }); + + it("test clear and fetch", () => { + saveToLocal("testkey1", "testvalue1"); + saveToLocal("testkey2", "testvalue2"); + saveToLocal("testkey3", "testvalue3"); + saveToLocal("testkey4", "testvalue4"); + + clearLocal(); + + assert.equal(getFromLocal("testkey1"), null); + assert.equal(getFromLocal("testkey2"), null); + assert.equal(getFromLocal("testkey3"), null); + assert.equal(getFromLocal("testkey4"), null); + }); +}); \ No newline at end of file diff --git a/testenv/testenv_helpers.js b/testenv/testenv_helpers.js new file mode 100644 index 0000000..469adc5 --- /dev/null +++ b/testenv/testenv_helpers.js @@ -0,0 +1,17 @@ +module.exports = {saveToLocal, getFromLocal, removeFromLocal, clearLocal}; + +function saveToLocal (k, v) { + window.localStorage.setItem(k, v); +} + +function getFromLocal (k) { + return window.localStorage.getItem(k); +} + +function removeFromLocal (k) { + window.localStorage.removeItem(k); +} + +function clearLocal () { + window.localStorage.clear(); +} \ No newline at end of file