diff --git a/__mocks__/webextension-polyfill-ts/index.ts b/__mocks__/webextension-polyfill-ts/index.ts new file mode 100644 index 0000000..f9fb0e2 --- /dev/null +++ b/__mocks__/webextension-polyfill-ts/index.ts @@ -0,0 +1,19 @@ +class BrowserMock { + runtime = { + getBackgroundPage() { + return 'https://background-page.html'; + }, + getManifest() { + return { + version: 'test-version', + }; + }, + openOptionsPage() { + return 'https://options-page.html'; + }, + }; +} + +export const browser = new BrowserMock(); + +export default { browser }; diff --git a/jest.config.ts b/jest.config.ts index 2741622..b2959fa 100644 --- a/jest.config.ts +++ b/jest.config.ts @@ -32,7 +32,7 @@ export default { // Indicates which provider should be used to instrument code for coverage coverageProvider: 'v8', - + preset: 'ts-jest', // A list of reporter names that Jest uses when writing coverage reports // coverageReporters: [ // "json", diff --git a/package-lock.json b/package-lock.json index e4f7c48..af69205 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9295,6 +9295,15 @@ "electron-to-chromium": "^1.2.7" } }, + "bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "requires": { + "fast-json-stable-stringify": "2.x" + } + }, "bser": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", @@ -20556,6 +20565,18 @@ "traceur-runner": "^1.0.2" } }, + "mockzilla": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mockzilla/-/mockzilla-0.9.0.tgz", + "integrity": "sha512-JkVFqrdep3JtaqKh1QC5pV3KzjXtoJp5T32IsuPeZ3kMUcixm/4np3ytNd5OV/QjWn/VsSrd4Ti3dFgVLl9+2A==", + "dev": true + }, + "mockzilla-webextension": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mockzilla-webextension/-/mockzilla-webextension-0.9.0.tgz", + "integrity": "sha512-G4VVxJ0fbdN9eBy6n8CxmyyWc5VC7k7zTUYeghshkUDdsAdr6Tos4T2349Qangl4wu6oRZ9AO6ShozBoXXwY4A==", + "dev": true + }, "modify-filename": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/modify-filename/-/modify-filename-1.1.0.tgz", @@ -25619,6 +25640,199 @@ "glob": "^7.1.2" } }, + "ts-jest": { + "version": "26.4.4", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-26.4.4.tgz", + "integrity": "sha512-3lFWKbLxJm34QxyVNNCgXX1u4o/RV0myvA2y2Bxm46iGIjKlaY0own9gIckbjZJPn+WaJEnfPPJ20HHGpoq4yg==", + "dev": true, + "requires": { + "@types/jest": "26.x", + "bs-logger": "0.x", + "buffer-from": "1.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^26.1.0", + "json5": "2.x", + "lodash.memoize": "4.x", + "make-error": "1.x", + "mkdirp": "1.x", + "semver": "7.x", + "yargs-parser": "20.x" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "requires": { + "ci-info": "^2.0.0" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "jest-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + } + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true + } + } + }, "ts-loader": { "version": "8.0.14", "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-8.0.14.tgz", @@ -26717,7 +26931,6 @@ "version": "0.22.0", "resolved": "https://registry.npmjs.org/webextension-polyfill-ts/-/webextension-polyfill-ts-0.22.0.tgz", "integrity": "sha512-3P33ClMwZ/qiAT7UH1ROrkRC1KM78umlnPpRhdC/292UyoTTW9NcjJEqDsv83HbibcTB6qCtpVeuB2q2/oniHQ==", - "dev": true, "requires": { "webextension-polyfill": "^0.7.0" }, @@ -26725,8 +26938,7 @@ "webextension-polyfill": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/webextension-polyfill/-/webextension-polyfill-0.7.0.tgz", - "integrity": "sha512-su48BkMLxqzTTvPSE1eWxKToPS2Tv5DLGxKexLEVpwFd6Po6N8hhSLIvG6acPAg7qERoEaDL+Y5HQJeJeml5Aw==", - "dev": true + "integrity": "sha512-su48BkMLxqzTTvPSE1eWxKToPS2Tv5DLGxKexLEVpwFd6Po6N8hhSLIvG6acPAg7qERoEaDL+Y5HQJeJeml5Aw==" } } }, diff --git a/package.json b/package.json index 69338bc..620ef4a 100644 --- a/package.json +++ b/package.json @@ -77,6 +77,8 @@ "mocha": "^5.0.0", "mocha-sinon": "^2.0.0", "mocha-traceur": "^2.1.0", + "mockzilla": "^0.9.0", + "mockzilla-webextension": "^0.9.0", "phantomjs": "^2.1.7", "popper.js": "^1.14.6", "prettier": "^2.2.1", @@ -88,6 +90,7 @@ "sinon-chai": "^2.8.0", "sinon-chrome": "^2.2.4", "traceur": "^0.0.111", + "ts-jest": "^26.4.4", "ts-loader": "^8.0.14", "ts-node": "^9.1.1", "typescript": "^4.1.3", diff --git a/src/config.test.ts b/src/config.test.ts new file mode 100644 index 0000000..8c5c62b --- /dev/null +++ b/src/config.test.ts @@ -0,0 +1,51 @@ +import config from './config'; + +describe('wakatime config', () => { + it('snapshot of config', () => { + expect(config).toMatchInlineSnapshot(` + Object { + "alert": Object { + "failure": Object { + "text": "There was an error while saving the options!", + "type": "danger", + }, + "success": Object { + "text": "Options have been saved!", + "type": "success", + }, + }, + "colors": Object { + "allGood": "", + "lightTheme": "white", + "notLogging": "gray", + "notSignedIn": "red", + }, + "currentUserApiUrl": "https://wakatime.com/api/v1/users/current", + "detectionIntervalInSeconds": 60, + "heartbeatApiUrl": "https://wakatime.com/api/v1/users/current/heartbeats", + "loggingEnabled": true, + "loggingStyle": "blacklist", + "loggingType": "domain", + "logoutUserUrl": "https://wakatime.com/logout", + "name": "WakaTime", + "states": Array [ + "allGood", + "notLogging", + "notSignedIn", + "blacklisted", + "whitelisted", + ], + "summariesApiUrl": "https://wakatime.com/api/v1/users/current/summaries", + "theme": "light", + "tooltips": Object { + "allGood": "", + "blacklisted": "This URL is blacklisted", + "notLogging": "Not logging", + "notSignedIn": "Not signed In", + "whitelisted": "This URL is not on your whitelist", + }, + "version": "test-version", + } + `); + }); +}); diff --git a/src/config.ts b/src/config.ts index f2bd803..a7743c2 100644 --- a/src/config.ts +++ b/src/config.ts @@ -113,11 +113,13 @@ const config: Config = { notSignedIn: 'red', }, - currentUserApiUrl: 'https://wakatime.com/api/v1/users/current', + currentUserApiUrl: + process.env.CURRENT_USER_API_URL ?? 'https://wakatime.com/api/v1/users/current', detectionIntervalInSeconds: 60, - heartbeatApiUrl: 'https://wakatime.com/api/v1/users/current/heartbeats', + heartbeatApiUrl: + process.env.HEART_BEAT_API_URL ?? 'https://wakatime.com/api/v1/users/current/heartbeats', loggingEnabled: true, @@ -125,13 +127,14 @@ const config: Config = { loggingType: 'domain', - logoutUserUrl: 'https://wakatime.com/logout', + logoutUserUrl: process.env.LOGOUT_USER_URL ?? 'https://wakatime.com/logout', name: 'WakaTime', states: ['allGood', 'notLogging', 'notSignedIn', 'blacklisted', 'whitelisted'], - summariesApiUrl: 'https://wakatime.com/api/v1/users/current/summaries', + summariesApiUrl: + process.env.SUMMARIES_API_URL ?? 'https://wakatime.com/api/v1/users/current/summaries', theme: 'light', diff --git a/src/jest.config.ts b/src/jest.config.ts new file mode 100644 index 0000000..04adb2d --- /dev/null +++ b/src/jest.config.ts @@ -0,0 +1,6 @@ +import jestConfig from '../jest.config'; + +export default { + ...jestConfig, + testEnvironment: 'node', +}; diff --git a/tsconfig.json b/tsconfig.json index cd769ec..6b1da8d 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -15,5 +15,5 @@ "baseUrl": "./", "paths": {} }, - "exclude": ["**/lib/", "**/*.test.ts"] + "exclude": [] } diff --git a/xclap.ts b/xclap.ts index adc8629..88853ed 100644 --- a/xclap.ts +++ b/xclap.ts @@ -39,6 +39,7 @@ load({ prettier: [exec('prettier --write .')], test: ['build', 'lint', 'test-jest', 'test-js'], 'test-jest': [exec('jest --clearCache'), exec('jest --verbose --coverage')], + 'test-jest-update': exec('jest -u'), 'test-js': 'phantomjs tests/run.js', webpack: [exec('webpack --mode production')], 'webpack:dev': [exec('webpack --mode development')],