Basic test environment setup (#23)
* karma, mocha, chai setup * basic setup works * line endings fixed * mock test removed * getAll works with mock store returning promise * eslint file tab indented to 2 spaces * all tests pass, code cleanup * tests added * misc changes * code cleanup * all tests cleared! * firefox addon added to travis.yml * capture.init moved back * eslint rules disabled * console stmt removed * travis trials * travis trials * travis trials * travis trials * travis trials * travis trials * travis trials * travis trials * travis trials
This commit is contained in:
Родитель
412ac62cd3
Коммит
9f8680c734
|
@ -1,12 +1,17 @@
|
||||||
{
|
{
|
||||||
"env": {
|
"env": {
|
||||||
"browser": true,
|
"browser": true,
|
||||||
"es6": true
|
"es6": true,
|
||||||
|
"mocha": true
|
||||||
},
|
},
|
||||||
"globals": {
|
"globals": {
|
||||||
"browser": true
|
"browser": true
|
||||||
},
|
},
|
||||||
"plugins": ["no-unsanitized"],
|
"plugins": [
|
||||||
|
"json",
|
||||||
|
"mocha",
|
||||||
|
"no-unsanitized"
|
||||||
|
],
|
||||||
"extends": ["eslint:recommended"],
|
"extends": ["eslint:recommended"],
|
||||||
"parserOptions": {
|
"parserOptions": {
|
||||||
"ecmaVersion": "2017"
|
"ecmaVersion": "2017"
|
||||||
|
|
|
@ -1 +1,2 @@
|
||||||
node_modules
|
node_modules
|
||||||
|
npm-debug.log
|
||||||
|
|
|
@ -1,6 +1,12 @@
|
||||||
|
addons:
|
||||||
|
firefox: latest
|
||||||
|
before_script:
|
||||||
|
- export DISPLAY=:99.0
|
||||||
|
- sh -e /etc/init.d/xvfb start
|
||||||
|
- sleep 3
|
||||||
language: node_js
|
language: node_js
|
||||||
node_js:
|
node_js:
|
||||||
- '6.1'
|
- '6.1'
|
||||||
notifications:
|
notifications:
|
||||||
slack:
|
slack:
|
||||||
secure: Y3VDGf3FSYXhgjvE9+RqIi+kMGpRuecp6r8rzFrhV11ktPzhb5aaFs0+qpBIL/Ptz99yTiM2kaRl/DTYqdcBzWD664tZR8g0OEsossvtu/U9ujlOPxz2QVsSbPI+JE21RwvQFq4wmK/2RUzyEjEp0SU9mxGngrBtkqMOHv7cSu5vy4NL8sTzcSTt4rZNAadzQHkhnrPu+dizLYD3a1MReRI2SuQ5qgVz0yuifKa26YXrjqmN+q1weycp8wQX1f0ITeZwCkhSERMOWRCjooGdbYsR6Oe0xQ+E7A1GxXCH5np43JHxKV+Te5YOnAzthiV1rdOnJdqx10+vHdU6NIZhZwER4wy0Tjsz/kiGwnvhWW641qS2NFPRC0aa8URDGBKzt2A9dOwiJYZ/f49dOe3q04cu3q8QH3cwkwHCNqO1f5T5iwldqU4pWRGyhwiiF6P5hVFWiyQ8b5ATG5rBIWFKq2uyD3xe5R4evw5Ay+3JwFG4Ddt2/C4KWv4OldbpT5pbT1WVOAkKKoXf4G/w0j3gDbWbxTqNJMP2L+jFmkYVEVrNd8Xcb/SR7I5398YicKEfJUiz8Y+p+nIvauJ6pdb/Ee6aBECOdhSDkcUwg8bPn7p4cS+wsoEIjz0SQGIe45wJ2Zy5nwMcgG8OPJy6EwuZ0s8eUW6Lbc44al3bOs/MS+k=
|
secure: Y3VDGf3FSYXhgjvE9+RqIi+kMGpRuecp6r8rzFrhV11ktPzhb5aaFs0+qpBIL/Ptz99yTiM2kaRl/DTYqdcBzWD664tZR8g0OEsossvtu/U9ujlOPxz2QVsSbPI+JE21RwvQFq4wmK/2RUzyEjEp0SU9mxGngrBtkqMOHv7cSu5vy4NL8sTzcSTt4rZNAadzQHkhnrPu+dizLYD3a1MReRI2SuQ5qgVz0yuifKa26YXrjqmN+q1weycp8wQX1f0ITeZwCkhSERMOWRCjooGdbYsR6Oe0xQ+E7A1GxXCH5np43JHxKV+Te5YOnAzthiV1rdOnJdqx10+vHdU6NIZhZwER4wy0Tjsz/kiGwnvhWW641qS2NFPRC0aa8URDGBKzt2A9dOwiJYZ/f49dOe3q04cu3q8QH3cwkwHCNqO1f5T5iwldqU4pWRGyhwiiF6P5hVFWiyQ8b5ATG5rBIWFKq2uyD3xe5R4evw5Ay+3JwFG4Ddt2/C4KWv4OldbpT5pbT1WVOAkKKoXf4G/w0j3gDbWbxTqNJMP2L+jFmkYVEVrNd8Xcb/SR7I5398YicKEfJUiz8Y+p+nIvauJ6pdb/Ee6aBECOdhSDkcUwg8bPn7p4cS+wsoEIjz0SQGIe45wJ2Zy5nwMcgG8OPJy6EwuZ0s8eUW6Lbc44al3bOs/MS+k=
|
||||||
|
|
|
@ -1,27 +1,29 @@
|
||||||
'use strict';
|
/* eslint no-undef: "off" */
|
||||||
|
'use strict';
|
||||||
// When the user clicks browserAction icon in toolbar, run Lightbeam
|
|
||||||
browser.browserAction.onClicked.addListener(runLightbeam);
|
// When the user clicks browserAction icon in toolbar, run Lightbeam
|
||||||
|
browser.browserAction.onClicked.addListener(runLightbeam);
|
||||||
capture.init();
|
|
||||||
|
capture.init();
|
||||||
async function runLightbeam() {
|
|
||||||
// Checks to see if Lightbeam is already open. Returns true if it is, false if not.
|
async function runLightbeam() {
|
||||||
async function isOpen() {
|
// Checks to see if Lightbeam is already open.
|
||||||
const tabs = await browser.tabs.query({});
|
// Returns true if it is, false if not.
|
||||||
const fullUrl = browser.extension.getURL('index.html');
|
async function isOpen() {
|
||||||
const lightbeamTabs = tabs.filter((tab) => {
|
const tabs = await browser.tabs.query({});
|
||||||
return (tab.url === fullUrl);
|
const fullUrl = browser.extension.getURL('index.html');
|
||||||
});
|
const lightbeamTabs = tabs.filter((tab) => {
|
||||||
return lightbeamTabs[0] || false;
|
return (tab.url === fullUrl);
|
||||||
}
|
});
|
||||||
|
return lightbeamTabs[0] || false;
|
||||||
const lightbeamTab = await isOpen();
|
}
|
||||||
if (!lightbeamTab) {
|
|
||||||
// only open a new Lightbeam instance if one isn't already open.
|
const lightbeamTab = await isOpen();
|
||||||
browser.tabs.create({url: 'index.html'});
|
if (!lightbeamTab) {
|
||||||
} else if (!lightbeamTab.active) {
|
// only open a new Lightbeam instance if one isn't already open.
|
||||||
// re-focus Lightbeam if it is already open but lost focus
|
browser.tabs.create({url: 'index.html'});
|
||||||
browser.tabs.update(lightbeamTab.id, {active: true});
|
} else if (!lightbeamTab.active) {
|
||||||
}
|
// re-focus Lightbeam if it is already open but lost focus
|
||||||
}
|
browser.tabs.update(lightbeamTab.id, {active: true});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
/* eslint no-console: "off" */
|
||||||
|
/* eslint no-unused-vars: "off" */
|
||||||
|
|
||||||
const capture = {
|
const capture = {
|
||||||
init() {
|
init() {
|
||||||
this.addListeners();
|
this.addListeners();
|
||||||
|
|
30
js/store.js
30
js/store.js
|
@ -40,7 +40,6 @@ const store = {
|
||||||
|
|
||||||
async set(websites) {
|
async set(websites) {
|
||||||
/**
|
/**
|
||||||
* @todo rewrite this method so that websites object is updated with additional hostnames
|
|
||||||
* @todo code to be updated in next PR
|
* @todo code to be updated in next PR
|
||||||
*/
|
*/
|
||||||
return await browser.storage.local.set({ websites });
|
return await browser.storage.local.set({ websites });
|
||||||
|
@ -51,31 +50,10 @@ const store = {
|
||||||
},
|
},
|
||||||
|
|
||||||
addListeners() {
|
addListeners() {
|
||||||
browser.storage.onChanged.addListener((changes, area) => {
|
/*
|
||||||
/*
|
* @todo update the code
|
||||||
* @todo update the code
|
*/
|
||||||
*/
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
store.getAll()
|
store.init();
|
||||||
.then(websites => {
|
|
||||||
console.log('get all websites:', websites);
|
|
||||||
});
|
|
||||||
|
|
||||||
store.getFirstParty('a4.com')
|
|
||||||
.then(firtParty => {
|
|
||||||
console.log('firtParty:', firtParty);
|
|
||||||
})
|
|
||||||
.catch(error => {
|
|
||||||
console.log('error from getFirstParty:', error.message);
|
|
||||||
});
|
|
||||||
|
|
||||||
store.getThirdParties('a4.com')
|
|
||||||
.then(thirdParties => {
|
|
||||||
console.log('thirdParties:', thirdParties);
|
|
||||||
})
|
|
||||||
.catch(error => {
|
|
||||||
console.log('error from getThirdParties:', error.message);
|
|
||||||
});
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
/* eslint no-undef: "off" */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @todo resolve 'module' is undefined and turn 'on' the eslint rule
|
||||||
|
*/
|
||||||
|
|
||||||
|
module.exports = function(config) {
|
||||||
|
config.set({
|
||||||
|
singleRun: true,
|
||||||
|
browsers: ['Firefox'],
|
||||||
|
frameworks: ['mocha', 'chai'],
|
||||||
|
files: [
|
||||||
|
'test/unit/*.test.js'
|
||||||
|
],
|
||||||
|
plugins: [
|
||||||
|
'karma-chai',
|
||||||
|
'karma-firefox-launcher',
|
||||||
|
'karma-mocha'
|
||||||
|
]
|
||||||
|
});
|
||||||
|
};
|
38
package.json
38
package.json
|
@ -4,20 +4,46 @@
|
||||||
"description": "Lightbeam web extension",
|
"description": "Lightbeam web extension",
|
||||||
"main": "background.js",
|
"main": "background.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "echo \"Error: no test specified\" && exit 1"
|
"lint": "npm-run-all lint:*",
|
||||||
|
"lint:eslint": "eslint --ext=.js,.json .",
|
||||||
|
"lint:webext": "web-ext -s js lint",
|
||||||
|
"test": "npm-run-all test:*",
|
||||||
|
"test:lint": "npm run lint:eslint",
|
||||||
|
"test:karma": "karma start --browsers Firefox --single-run"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "git+https://github.com/pauljt/lightbeam-we.git"
|
"url": "https://github.com/electrolyfish/lightbeam-we.git"
|
||||||
},
|
},
|
||||||
"author": "Mozilla",
|
"author": "Mozilla",
|
||||||
"license": "MPL-2.0",
|
"license": "MPL-2.0",
|
||||||
"bugs": {
|
"bugs": {
|
||||||
"url": "https://github.com/pauljt/lightbeam-we/issues"
|
"url": "https://github.com/electrolyfish/lightbeam-we/issues"
|
||||||
},
|
},
|
||||||
"homepage": "https://github.com/pauljt/lightbeam-we#readme",
|
"homepage": "https://github.com/electrolyfish/lightbeam-we#readme",
|
||||||
|
"dependencies": {},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"chai": "^3.5.0",
|
||||||
"eslint": "^3.19.0",
|
"eslint": "^3.19.0",
|
||||||
"eslint-plugin-no-unsanitized": "^2.0.0"
|
"eslint-plugin-json": "^1.2.0",
|
||||||
}
|
"eslint-plugin-mocha": "^4.9.0",
|
||||||
|
"eslint-plugin-no-unsanitized": "^2.0.0",
|
||||||
|
"karma": "^1.7.0",
|
||||||
|
"karma-chai": "^0.1.0",
|
||||||
|
"karma-firefox-launcher": "^1.0.1",
|
||||||
|
"karma-mocha": "^1.3.0",
|
||||||
|
"mocha": "^3.4.1",
|
||||||
|
"npm-run-all": "^4.0.2",
|
||||||
|
"sinon": "^2.3.1",
|
||||||
|
"sinon-chrome": "^2.2.1"
|
||||||
|
},
|
||||||
|
"directories": {
|
||||||
|
"test": "test"
|
||||||
|
},
|
||||||
|
"keywords": [
|
||||||
|
"webextension",
|
||||||
|
"mozilla",
|
||||||
|
"web",
|
||||||
|
"security"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,96 @@
|
||||||
|
/* eslint no-undef: "off" */
|
||||||
|
/* eslint no-console: "off" */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @todo resolve 'expect' is undefined and turn 'on' the above eslint rules
|
||||||
|
* @todo use eslint-plugin-chai to resolve 'expect'
|
||||||
|
*/
|
||||||
|
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
describe('store.js', () => {
|
||||||
|
describe('store get method', () => {
|
||||||
|
const mockStore = {
|
||||||
|
_websites: {
|
||||||
|
'a1.com': {
|
||||||
|
faviconUrl: '/link/to/url',
|
||||||
|
firstAccess: 1234,
|
||||||
|
lastAccess: 5678,
|
||||||
|
thirdPartyRequests: {
|
||||||
|
'a.com': {
|
||||||
|
requestTime: 9012,
|
||||||
|
cookies: []
|
||||||
|
},
|
||||||
|
'b.com': {},
|
||||||
|
'c.com': {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
'a2.com': {}
|
||||||
|
},
|
||||||
|
|
||||||
|
getAll() {
|
||||||
|
return Promise.resolve(this._websites);
|
||||||
|
},
|
||||||
|
|
||||||
|
getFirstParty(hostname) {
|
||||||
|
if (!hostname) {
|
||||||
|
throw new Error('getFirstParty requires a valid hostname argument');
|
||||||
|
}
|
||||||
|
|
||||||
|
return Promise.resolve(this._websites[hostname]);
|
||||||
|
},
|
||||||
|
|
||||||
|
getThirdParties(hostname) {
|
||||||
|
if (!hostname) {
|
||||||
|
throw new Error('getFirstParty requires a valid hostname argument');
|
||||||
|
}
|
||||||
|
|
||||||
|
const firstParty = this._websites[hostname];
|
||||||
|
if ('thirdPartyRequests' in firstParty) {
|
||||||
|
return Promise.resolve(firstParty.thirdPartyRequests);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Promise.resolve(null);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
it('should get all websites from store', async () => {
|
||||||
|
const websites = await mockStore.getAll();
|
||||||
|
expect(websites).to.deep.equal(mockStore._websites);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should get website object for a1.com', async () => {
|
||||||
|
const website = await mockStore.getFirstParty('a1.com');
|
||||||
|
expect(website).to.deep.equal(mockStore._websites['a1.com']);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('error thrown when hostname is not passed for getFirstParty()',
|
||||||
|
async () => {
|
||||||
|
try {
|
||||||
|
await mockStore.getFirstParty();
|
||||||
|
} catch (err) {
|
||||||
|
console.log('error from getFirstParty', err);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should get thirdPartyRequests for a1.com', async () => {
|
||||||
|
const thirdParties = await mockStore.getThirdParties('a1.com');
|
||||||
|
const mockThirdParties = mockStore._websites['a1.com'].thirdPartyRequests;
|
||||||
|
expect(thirdParties).to.deep.equal(mockThirdParties);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('error thrown when hostname is not passed for getThirdParties()',
|
||||||
|
async () => {
|
||||||
|
try {
|
||||||
|
await mockStore.getThirdParties();
|
||||||
|
} catch (err) {
|
||||||
|
console.log('error from getThirdParties', err);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return null for getThirdParties()', async () => {
|
||||||
|
const thirdPartyRequests = await mockStore.getThirdParties('a2.com');
|
||||||
|
expect(thirdPartyRequests).to.equal(null);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
Загрузка…
Ссылка в новой задаче