From 82aad419a74a3061247d4e82656fa711e63f213c Mon Sep 17 00:00:00 2001 From: Shin'ya Ueoka Date: Sat, 12 May 2018 23:21:16 +0900 Subject: [PATCH 01/11] Add navigate test --- QA.md | 2 - e2e/ambassador/src/background/index.js | 4 +- e2e/ambassador/src/background/tabs.js | 2 +- e2e/ambassador/src/client/tabs.js | 11 ++++- e2e/ambassador/src/shared/messages.js | 2 + e2e/contents/navigate.test.js | 63 ++++++++++++++++++++++++++ 6 files changed, 78 insertions(+), 6 deletions(-) create mode 100644 e2e/contents/navigate.test.js diff --git a/QA.md b/QA.md index 1670e05..6ac0d48 100644 --- a/QA.md +++ b/QA.md @@ -31,8 +31,6 @@ The behaviors of the console are tested in [Console section](#consoles). - [ ] H, L: go back and forward in history - [ ] [[, ]]: Open next/prev link in `` tags. - [ ] [[, ]]: find prev and next links and open it -- [ ] gu: go to parent directory -- [ ] gU: go to root directory #### Misc diff --git a/e2e/ambassador/src/background/index.js b/e2e/ambassador/src/background/index.js index db2deb3..c40b4d8 100644 --- a/e2e/ambassador/src/background/index.js +++ b/e2e/ambassador/src/background/index.js @@ -1,6 +1,6 @@ import { WINDOWS_CREATE, WINDOWS_REMOVE, WINDOWS_GET, - TABS_CREATE, TABS_SELECT_AT, TABS_GET_ZOOM, TABS_SET_ZOOM, + TABS_CREATE, TABS_SELECT_AT, TABS_GET, TABS_GET_ZOOM, TABS_SET_ZOOM, EVENT_KEYPRESS, EVENT_KEYDOWN, EVENT_KEYUP, SCROLL_GET, SCROLL_SET, } from '../shared/messages'; @@ -25,6 +25,8 @@ receiveContentMessage((message) => { windowId: message.windowId, index: message.index, }); + case TABS_GET: + return browser.tabs.get(message.tabId); case TABS_GET_ZOOM: return browser.tabs.getZoom(message.tabId); case TABS_SET_ZOOM: diff --git a/e2e/ambassador/src/background/tabs.js b/e2e/ambassador/src/background/tabs.js index d049500..37156c4 100644 --- a/e2e/ambassador/src/background/tabs.js +++ b/e2e/ambassador/src/background/tabs.js @@ -5,7 +5,7 @@ const create = (props = {}) => { if (tab.url !== 'about:blank' && tabId === createdTab.id && changeInfo.status === 'complete') { browser.tabs.onUpdated.removeListener(callback); - resolve(tab); + setTimeout(() => resolve(tab), 50) // wait for 50 milliseconds to ensure plugin loaded; } }; browser.tabs.onUpdated.addListener(callback); diff --git a/e2e/ambassador/src/client/tabs.js b/e2e/ambassador/src/client/tabs.js index c7b1340..14d524d 100644 --- a/e2e/ambassador/src/client/tabs.js +++ b/e2e/ambassador/src/client/tabs.js @@ -1,5 +1,5 @@ import { - TABS_CREATE, TABS_SELECT_AT, TABS_GET_ZOOM, TABS_SET_ZOOM, + TABS_CREATE, TABS_SELECT_AT, TABS_GET, TABS_GET_ZOOM, TABS_SET_ZOOM, } from '../shared/messages'; import * as ipc from './ipc'; @@ -19,6 +19,13 @@ const selectAt = (windowId, index) => { }); }; +const get = (tabId) => { + return ipc.send({ + type: TABS_GET, + tabId, + }); +}; + const getZoom = (tabId) => { return ipc.send({ tabId, @@ -34,4 +41,4 @@ const setZoom = (tabId, factor) => { }); }; -export { create, selectAt, getZoom, setZoom }; +export { create, selectAt, get, getZoom, setZoom }; diff --git a/e2e/ambassador/src/shared/messages.js b/e2e/ambassador/src/shared/messages.js index 1fc47d2..34ec5d3 100644 --- a/e2e/ambassador/src/shared/messages.js +++ b/e2e/ambassador/src/shared/messages.js @@ -5,6 +5,7 @@ const WINDOWS_REMOVE = 'windows.remove'; const WINDOWS_GET = 'windows.get'; const TABS_CREATE = 'tabs.create'; const TABS_SELECT_AT = 'tabs.selectAt'; +const TABS_GET = 'tabs.get'; const TABS_GET_ZOOM = 'tabs.get.zoom'; const TABS_SET_ZOOM = 'tabs.set.zoom'; const EVENT_KEYPRESS = 'event.keypress'; @@ -21,6 +22,7 @@ export { WINDOWS_REMOVE, WINDOWS_GET, + TABS_GET, TABS_CREATE, TABS_SELECT_AT, TABS_GET_ZOOM, diff --git a/e2e/contents/navigate.test.js b/e2e/contents/navigate.test.js new file mode 100644 index 0000000..518c3e3 --- /dev/null +++ b/e2e/contents/navigate.test.js @@ -0,0 +1,63 @@ +import * as windows from "../ambassador/src/client/windows"; +import * as tabs from "../ambassador/src/client/tabs"; +import * as keys from "../ambassador/src/client/keys"; +import * as scrolls from "../ambassador/src/client/scrolls"; + +const SERVER_URL = "http://localhost:11111"; + +describe("navigate test", () => { + let targetWindow; + + before(() => { + return windows.create().then((win) => { + targetWindow = win; + return tabs.create(targetWindow.id, SERVER_URL); + }); + }); + + after(() => { + return windows.remove(targetWindow.id); + }); + + it('goes to parent', () => { + let targetTab; + return tabs.create(targetWindow.id, SERVER_URL + '/a/b/c').then((tab) => { + targetTab = tab; + return keys.press(targetTab.id, 'g'); + }).then(() => { + return keys.press(targetTab.id, 'u'); + }).then(() => { + return tabs.get(targetTab.id); + }).then((tab) => { + expect(tab.url).to.be.equal(SERVER_URL + '/a/b/'); + }); + }); + + it('removes hash', () => { + let targetTab; + return tabs.create(targetWindow.id, SERVER_URL + '/a/b/c#navigate').then((tab) => { + targetTab = tab; + return keys.press(targetTab.id, 'g'); + }).then(() => { + return keys.press(targetTab.id, 'u'); + }).then(() => { + return tabs.get(targetTab.id); + }).then((tab) => { + expect(tab.url).to.be.equal(SERVER_URL + '/a/b/c#'); + }); + }); + + it('goes to root', () => { + let targetTab; + return tabs.create(targetWindow.id, SERVER_URL + '/a/b/c').then((tab) => { + targetTab = tab; + return keys.press(targetTab.id, 'g'); + }).then(() => { + return keys.press(targetTab.id, 'U', { shiftKey: true }); + }).then(() => { + return tabs.get(targetTab.id); + }).then((tab) => { + expect(tab.url).to.be.equal(SERVER_URL + '/'); + }); + }); +}); From 5617f6f7650e0eb5711bea5b060e98f0d2e94f46 Mon Sep 17 00:00:00 2001 From: Shin'ya Ueoka Date: Sun, 13 May 2018 00:12:11 +0900 Subject: [PATCH 02/11] Add e2e test cases for deleting tabs --- QA.md | 1 - e2e/ambassador/src/background/index.js | 5 +++- e2e/ambassador/src/background/tabs.js | 4 +++- e2e/ambassador/src/client/tabs.js | 13 +++++++++-- e2e/ambassador/src/shared/messages.js | 2 ++ e2e/contents/tab.test.js | 32 ++++++++++++++++++++++++++ 6 files changed, 52 insertions(+), 5 deletions(-) diff --git a/QA.md b/QA.md index 6ac0d48..0b1422b 100644 --- a/QA.md +++ b/QA.md @@ -21,7 +21,6 @@ The behaviors of the console are tested in [Console section](#consoles). #### Tabs -- [ ] !d: delete current tab and pinned tab - [ ] u: reopen close tab - [ ] r: reload current tab - [ ] R: reload current tab without cache diff --git a/e2e/ambassador/src/background/index.js b/e2e/ambassador/src/background/index.js index c40b4d8..046b8c1 100644 --- a/e2e/ambassador/src/background/index.js +++ b/e2e/ambassador/src/background/index.js @@ -1,6 +1,7 @@ import { WINDOWS_CREATE, WINDOWS_REMOVE, WINDOWS_GET, - TABS_CREATE, TABS_SELECT_AT, TABS_GET, TABS_GET_ZOOM, TABS_SET_ZOOM, + TABS_CREATE, TABS_SELECT_AT, TABS_GET, TABS_UPDATE, + TABS_GET_ZOOM, TABS_SET_ZOOM, EVENT_KEYPRESS, EVENT_KEYDOWN, EVENT_KEYUP, SCROLL_GET, SCROLL_SET, } from '../shared/messages'; @@ -27,6 +28,8 @@ receiveContentMessage((message) => { }); case TABS_GET: return browser.tabs.get(message.tabId); + case TABS_UPDATE: + return browser.tabs.update(message.tabId, message.properties); case TABS_GET_ZOOM: return browser.tabs.getZoom(message.tabId); case TABS_SET_ZOOM: diff --git a/e2e/ambassador/src/background/tabs.js b/e2e/ambassador/src/background/tabs.js index 37156c4..5594134 100644 --- a/e2e/ambassador/src/background/tabs.js +++ b/e2e/ambassador/src/background/tabs.js @@ -5,7 +5,9 @@ const create = (props = {}) => { if (tab.url !== 'about:blank' && tabId === createdTab.id && changeInfo.status === 'complete') { browser.tabs.onUpdated.removeListener(callback); - setTimeout(() => resolve(tab), 50) // wait for 50 milliseconds to ensure plugin loaded; + + // wait for 50 milliseconds to ensure plugin loaded; + setTimeout(() => resolve(tab), 50); } }; browser.tabs.onUpdated.addListener(callback); diff --git a/e2e/ambassador/src/client/tabs.js b/e2e/ambassador/src/client/tabs.js index 14d524d..290428c 100644 --- a/e2e/ambassador/src/client/tabs.js +++ b/e2e/ambassador/src/client/tabs.js @@ -1,5 +1,6 @@ import { - TABS_CREATE, TABS_SELECT_AT, TABS_GET, TABS_GET_ZOOM, TABS_SET_ZOOM, + TABS_CREATE, TABS_SELECT_AT, TABS_GET, TABS_UPDATE, + TABS_GET_ZOOM, TABS_SET_ZOOM, } from '../shared/messages'; import * as ipc from './ipc'; @@ -26,6 +27,14 @@ const get = (tabId) => { }); }; +const update = (tabId, properties) => { + return ipc.send({ + type: TABS_UPDATE, + tabId, + properties, + }); +}; + const getZoom = (tabId) => { return ipc.send({ tabId, @@ -41,4 +50,4 @@ const setZoom = (tabId, factor) => { }); }; -export { create, selectAt, get, getZoom, setZoom }; +export { create, selectAt, get, update, getZoom, setZoom }; diff --git a/e2e/ambassador/src/shared/messages.js b/e2e/ambassador/src/shared/messages.js index 34ec5d3..d148ca0 100644 --- a/e2e/ambassador/src/shared/messages.js +++ b/e2e/ambassador/src/shared/messages.js @@ -6,6 +6,7 @@ const WINDOWS_GET = 'windows.get'; const TABS_CREATE = 'tabs.create'; const TABS_SELECT_AT = 'tabs.selectAt'; const TABS_GET = 'tabs.get'; +const TABS_UPDATE = 'tabs.update'; const TABS_GET_ZOOM = 'tabs.get.zoom'; const TABS_SET_ZOOM = 'tabs.set.zoom'; const EVENT_KEYPRESS = 'event.keypress'; @@ -23,6 +24,7 @@ export { WINDOWS_GET, TABS_GET, + TABS_UPDATE, TABS_CREATE, TABS_SELECT_AT, TABS_GET_ZOOM, diff --git a/e2e/contents/tab.test.js b/e2e/contents/tab.test.js index 880deb8..f0b7449 100644 --- a/e2e/contents/tab.test.js +++ b/e2e/contents/tab.test.js @@ -212,4 +212,36 @@ describe("tab test", () => { expect(win.tabs).to.have.lengthOf(1); }); }); + + it('does not delete pinned tab by d', () => { + return Promise.resolve().then(() => { + return tabs.create(targetWindow.id, SERVER_URL + '#1'); + }).then((tab) => { + return tabs.update(tab.id, { pinned: true }); + }).then((tab) => { + return keys.press(tab.id, 'd'); + }).then(() => { + return windows.get(targetWindow.id); + }).then((win) => { + expect(win.tabs).to.have.lengthOf(2); + }); + }); + + it('deletes pinned tab by !d', () => { + let target; + return Promise.resolve().then(() => { + return tabs.create(targetWindow.id, SERVER_URL + '#1'); + }).then((tab) => { + return tabs.update(tab.id, { pinned: true }); + }).then((tab) => { + target = tab; + return keys.press(target.id, '!'); + }).then(() => { + return keys.press(target.id, 'd'); + }).then(() => { + return windows.get(targetWindow.id); + }).then((win) => { + expect(win.tabs).to.have.lengthOf(1); + }); + }); }); From e17399c4df35d5cd55300e9555240818eae5cf2c Mon Sep 17 00:00:00 2001 From: Shin'ya Ueoka Date: Sun, 13 May 2018 01:06:01 +0900 Subject: [PATCH 03/11] Add e2e test case for history navigations --- QA.md | 1 - e2e/contents/navigate.test.js | 26 ++++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/QA.md b/QA.md index 0b1422b..38c3196 100644 --- a/QA.md +++ b/QA.md @@ -27,7 +27,6 @@ The behaviors of the console are tested in [Console section](#consoles). #### Navigation -- [ ] H, L: go back and forward in history - [ ] [[, ]]: Open next/prev link in `` tags. - [ ] [[, ]]: find prev and next links and open it diff --git a/e2e/contents/navigate.test.js b/e2e/contents/navigate.test.js index 518c3e3..3b34785 100644 --- a/e2e/contents/navigate.test.js +++ b/e2e/contents/navigate.test.js @@ -60,4 +60,30 @@ describe("navigate test", () => { expect(tab.url).to.be.equal(SERVER_URL + '/'); }); }); + + it('goes back and forward in history', () => { + let targetTab; + return tabs.create(targetWindow.id, SERVER_URL + '/#navigate').then((tab) => { + targetTab = tab; + return keys.press(targetTab.id, 'g'); + }).then(() => { + return keys.press(targetTab.id, 'u'); + }).then(() => { + return keys.press(targetTab.id, 'H', { shiftKey: true }); + }).then(() => { + return new Promise(resolve => { setTimeout(() => resolve(), 2000) }); + }).then(() => { + return tabs.get(targetTab.id); + }).then((tab) => { + expect(tab.url, 'go back in history').to.be.equal(SERVER_URL + '/#navigate'); + }).then(() => { + return new Promise(resolve => { setTimeout(() => resolve(), 2000) }); + }).then(() => { + return keys.press(targetTab.id, 'L', { shiftKey: true }); + }).then(() => { + return tabs.get(targetTab.id); + }).then((tab) => { + expect(tab.url, 'go next in history').to.be.equal(SERVER_URL + '/#'); + }); + }); }); From d844440a30a2ae6ddce0ff59af6c7572041f9bb4 Mon Sep 17 00:00:00 2001 From: Shin'ya Ueoka Date: Sun, 13 May 2018 12:17:09 +0900 Subject: [PATCH 04/11] Fix debug web-server on e2e testing --- e2e/contents/navigate.test.js | 23 +++++++------- e2e/contents/scroll.test.js | 5 ++- e2e/contents/tab.test.js | 59 +++++++++++++++++------------------ e2e/contents/zoom.test.js | 7 ++--- e2e/web-server/index.js | 28 +++++++++++------ e2e/web-server/url.js | 5 +++ 6 files changed, 69 insertions(+), 58 deletions(-) create mode 100644 e2e/web-server/url.js diff --git a/e2e/contents/navigate.test.js b/e2e/contents/navigate.test.js index 3b34785..590a4b3 100644 --- a/e2e/contents/navigate.test.js +++ b/e2e/contents/navigate.test.js @@ -2,8 +2,7 @@ import * as windows from "../ambassador/src/client/windows"; import * as tabs from "../ambassador/src/client/tabs"; import * as keys from "../ambassador/src/client/keys"; import * as scrolls from "../ambassador/src/client/scrolls"; - -const SERVER_URL = "http://localhost:11111"; +import { CLIENT_URL } from '../web-server/url'; describe("navigate test", () => { let targetWindow; @@ -11,7 +10,7 @@ describe("navigate test", () => { before(() => { return windows.create().then((win) => { targetWindow = win; - return tabs.create(targetWindow.id, SERVER_URL); + return tabs.create(targetWindow.id, CLIENT_URL); }); }); @@ -21,7 +20,7 @@ describe("navigate test", () => { it('goes to parent', () => { let targetTab; - return tabs.create(targetWindow.id, SERVER_URL + '/a/b/c').then((tab) => { + return tabs.create(targetWindow.id, CLIENT_URL + '/a/b/c').then((tab) => { targetTab = tab; return keys.press(targetTab.id, 'g'); }).then(() => { @@ -29,13 +28,13 @@ describe("navigate test", () => { }).then(() => { return tabs.get(targetTab.id); }).then((tab) => { - expect(tab.url).to.be.equal(SERVER_URL + '/a/b/'); + expect(tab.url).to.be.equal(CLIENT_URL + '/a/b/'); }); }); it('removes hash', () => { let targetTab; - return tabs.create(targetWindow.id, SERVER_URL + '/a/b/c#navigate').then((tab) => { + return tabs.create(targetWindow.id, CLIENT_URL + '/a/b/c#navigate').then((tab) => { targetTab = tab; return keys.press(targetTab.id, 'g'); }).then(() => { @@ -43,13 +42,13 @@ describe("navigate test", () => { }).then(() => { return tabs.get(targetTab.id); }).then((tab) => { - expect(tab.url).to.be.equal(SERVER_URL + '/a/b/c#'); + expect(tab.url).to.be.equal(CLIENT_URL + '/a/b/c#'); }); }); it('goes to root', () => { let targetTab; - return tabs.create(targetWindow.id, SERVER_URL + '/a/b/c').then((tab) => { + return tabs.create(targetWindow.id, CLIENT_URL + '/a/b/c').then((tab) => { targetTab = tab; return keys.press(targetTab.id, 'g'); }).then(() => { @@ -57,13 +56,13 @@ describe("navigate test", () => { }).then(() => { return tabs.get(targetTab.id); }).then((tab) => { - expect(tab.url).to.be.equal(SERVER_URL + '/'); + expect(tab.url).to.be.equal(CLIENT_URL + '/'); }); }); it('goes back and forward in history', () => { let targetTab; - return tabs.create(targetWindow.id, SERVER_URL + '/#navigate').then((tab) => { + return tabs.create(targetWindow.id, CLIENT_URL + '/#navigate').then((tab) => { targetTab = tab; return keys.press(targetTab.id, 'g'); }).then(() => { @@ -75,7 +74,7 @@ describe("navigate test", () => { }).then(() => { return tabs.get(targetTab.id); }).then((tab) => { - expect(tab.url, 'go back in history').to.be.equal(SERVER_URL + '/#navigate'); + expect(tab.url, 'go back in history').to.be.equal(CLIENT_URL + '/#navigate'); }).then(() => { return new Promise(resolve => { setTimeout(() => resolve(), 2000) }); }).then(() => { @@ -83,7 +82,7 @@ describe("navigate test", () => { }).then(() => { return tabs.get(targetTab.id); }).then((tab) => { - expect(tab.url, 'go next in history').to.be.equal(SERVER_URL + '/#'); + expect(tab.url, 'go next in history').to.be.equal(CLIENT_URL + '/#'); }); }); }); diff --git a/e2e/contents/scroll.test.js b/e2e/contents/scroll.test.js index 0a896b3..9410343 100644 --- a/e2e/contents/scroll.test.js +++ b/e2e/contents/scroll.test.js @@ -2,8 +2,7 @@ import * as windows from "../ambassador/src/client/windows"; import * as tabs from "../ambassador/src/client/tabs"; import * as keys from "../ambassador/src/client/keys"; import * as scrolls from "../ambassador/src/client/scrolls"; - -const SERVER_URL = "localhost:11111"; +import { CLIENT_URL } from '../web-server/url'; describe("scroll test", () => { let targetWindow; @@ -12,7 +11,7 @@ describe("scroll test", () => { before(() => { return windows.create().then((win) => { targetWindow = win; - return tabs.create(targetWindow.id, SERVER_URL); + return tabs.create(targetWindow.id, CLIENT_URL + '/scroll'); }).then((tab) => { targetTab = tab; }); diff --git a/e2e/contents/tab.test.js b/e2e/contents/tab.test.js index f0b7449..550d79a 100644 --- a/e2e/contents/tab.test.js +++ b/e2e/contents/tab.test.js @@ -1,14 +1,13 @@ import * as windows from "../ambassador/src/client/windows"; import * as tabs from "../ambassador/src/client/tabs"; import * as keys from "../ambassador/src/client/keys"; - -const SERVER_URL = "localhost:11111/"; +import { CLIENT_URL } from '../web-server/url'; describe("tab test", () => { let targetWindow; beforeEach(() => { - return windows.create(SERVER_URL).then((win) => { + return windows.create(CLIENT_URL).then((win) => { targetWindow = win; }); }); @@ -20,7 +19,7 @@ describe("tab test", () => { it('deletes tab by d', () => { let before; let targetTab; - return tabs.create(targetWindow.id, SERVER_URL).then((tab) => { + return tabs.create(targetWindow.id, CLIENT_URL).then((tab) => { targetTab = tab; return windows.get(targetWindow.id); }).then((win) => { @@ -36,7 +35,7 @@ describe("tab test", () => { it('duplicates tab by zd', () => { let before; let targetTab; - return tabs.create(targetWindow.id, SERVER_URL).then((tab) => { + return tabs.create(targetWindow.id, CLIENT_URL).then((tab) => { targetTab = tab; return windows.get(targetWindow.id) }).then((win) => {; @@ -54,7 +53,7 @@ describe("tab test", () => { it('makes pinned by zp', () => { let before; let targetTab; - return tabs.create(targetWindow.id, SERVER_URL).then((tab) => { + return tabs.create(targetWindow.id, CLIENT_URL).then((tab) => { targetTab = tab; return windows.get(targetWindow.id) }).then((win) => {; @@ -71,11 +70,11 @@ describe("tab test", () => { it('selects previous tab by K', () => { return Promise.resolve().then(() => { - return tabs.create(targetWindow.id, SERVER_URL + '#1') + return tabs.create(targetWindow.id, CLIENT_URL + '#1') }).then(() => { - return tabs.create(targetWindow.id, SERVER_URL + '#2') + return tabs.create(targetWindow.id, CLIENT_URL + '#2') }).then(() => { - return tabs.create(targetWindow.id, SERVER_URL + '#3'); + return tabs.create(targetWindow.id, CLIENT_URL + '#3'); }).then(() => { return tabs.selectAt(targetWindow.id, 2); }).then((tab) => { @@ -89,11 +88,11 @@ describe("tab test", () => { it('selects previous tab by K rotatory', () => { return Promise.resolve().then(() => { - return tabs.create(targetWindow.id, SERVER_URL + '#1') + return tabs.create(targetWindow.id, CLIENT_URL + '#1') }).then(() => { - return tabs.create(targetWindow.id, SERVER_URL + '#2') + return tabs.create(targetWindow.id, CLIENT_URL + '#2') }).then(() => { - return tabs.create(targetWindow.id, SERVER_URL + '#3'); + return tabs.create(targetWindow.id, CLIENT_URL + '#3'); }).then(() => { return tabs.selectAt(targetWindow.id, 0); }).then((tab) => { @@ -107,11 +106,11 @@ describe("tab test", () => { it('selects next tab by J', () => { return Promise.resolve().then(() => { - return tabs.create(targetWindow.id, SERVER_URL + '#1') + return tabs.create(targetWindow.id, CLIENT_URL + '#1') }).then(() => { - return tabs.create(targetWindow.id, SERVER_URL + '#2') + return tabs.create(targetWindow.id, CLIENT_URL + '#2') }).then(() => { - return tabs.create(targetWindow.id, SERVER_URL + '#3'); + return tabs.create(targetWindow.id, CLIENT_URL + '#3'); }).then(() => { return tabs.selectAt(targetWindow.id, 2); }).then((tab) => { @@ -125,11 +124,11 @@ describe("tab test", () => { it('selects previous tab by J rotatory', () => { return Promise.resolve().then(() => { - return tabs.create(targetWindow.id, SERVER_URL + '#1') + return tabs.create(targetWindow.id, CLIENT_URL + '#1') }).then(() => { - return tabs.create(targetWindow.id, SERVER_URL + '#2') + return tabs.create(targetWindow.id, CLIENT_URL + '#2') }).then(() => { - return tabs.create(targetWindow.id, SERVER_URL + '#3'); + return tabs.create(targetWindow.id, CLIENT_URL + '#3'); }).then(() => { return tabs.selectAt(targetWindow.id, 3); }).then((tab) => { @@ -143,11 +142,11 @@ describe("tab test", () => { it('selects first tab by g0', () => { return Promise.resolve().then(() => { - return tabs.create(targetWindow.id, SERVER_URL + '#1') + return tabs.create(targetWindow.id, CLIENT_URL + '#1') }).then(() => { - return tabs.create(targetWindow.id, SERVER_URL + '#2') + return tabs.create(targetWindow.id, CLIENT_URL + '#2') }).then(() => { - return tabs.create(targetWindow.id, SERVER_URL + '#3'); + return tabs.create(targetWindow.id, CLIENT_URL + '#3'); }).then(() => { return tabs.selectAt(targetWindow.id, 2); }).then((tab) => { @@ -163,11 +162,11 @@ describe("tab test", () => { it('selects last tab by g$', () => { return Promise.resolve().then(() => { - return tabs.create(targetWindow.id, SERVER_URL + '#1') + return tabs.create(targetWindow.id, CLIENT_URL + '#1') }).then(() => { - return tabs.create(targetWindow.id, SERVER_URL + '#2') + return tabs.create(targetWindow.id, CLIENT_URL + '#2') }).then(() => { - return tabs.create(targetWindow.id, SERVER_URL + '#3'); + return tabs.create(targetWindow.id, CLIENT_URL + '#3'); }).then(() => { return tabs.selectAt(targetWindow.id, 2); }).then((tab) => { @@ -183,11 +182,11 @@ describe("tab test", () => { it('selects last selected tab by ', () => { return Promise.resolve().then(() => { - return tabs.create(targetWindow.id, SERVER_URL + '#1') + return tabs.create(targetWindow.id, CLIENT_URL + '#1') }).then(() => { - return tabs.create(targetWindow.id, SERVER_URL + '#2') + return tabs.create(targetWindow.id, CLIENT_URL + '#2') }).then(() => { - return tabs.create(targetWindow.id, SERVER_URL + '#3'); + return tabs.create(targetWindow.id, CLIENT_URL + '#3'); }).then(() => { return tabs.selectAt(targetWindow.id, 1); }).then(() => { @@ -203,7 +202,7 @@ describe("tab test", () => { it('deletes tab by d', () => { return Promise.resolve().then(() => { - return tabs.create(targetWindow.id, SERVER_URL + '#1'); + return tabs.create(targetWindow.id, CLIENT_URL + '#1'); }).then((tab) => { return keys.press(tab.id, 'd'); }).then(() => { @@ -215,7 +214,7 @@ describe("tab test", () => { it('does not delete pinned tab by d', () => { return Promise.resolve().then(() => { - return tabs.create(targetWindow.id, SERVER_URL + '#1'); + return tabs.create(targetWindow.id, CLIENT_URL + '#1'); }).then((tab) => { return tabs.update(tab.id, { pinned: true }); }).then((tab) => { @@ -230,7 +229,7 @@ describe("tab test", () => { it('deletes pinned tab by !d', () => { let target; return Promise.resolve().then(() => { - return tabs.create(targetWindow.id, SERVER_URL + '#1'); + return tabs.create(targetWindow.id, CLIENT_URL + '#1'); }).then((tab) => { return tabs.update(tab.id, { pinned: true }); }).then((tab) => { diff --git a/e2e/contents/zoom.test.js b/e2e/contents/zoom.test.js index 10b7cca..c7efc93 100644 --- a/e2e/contents/zoom.test.js +++ b/e2e/contents/zoom.test.js @@ -1,15 +1,14 @@ import * as windows from "../ambassador/src/client/windows"; import * as tabs from "../ambassador/src/client/tabs"; import * as keys from "../ambassador/src/client/keys"; - -const SERVER_URL = "localhost:11111/"; +import { CLIENT_URL } from '../web-server/url'; describe("zoom test", () => { let targetWindow; let targetTab; before(() => { - return windows.create(SERVER_URL).then((win) => { + return windows.create(CLIENT_URL).then((win) => { targetWindow = win; }); }); @@ -19,7 +18,7 @@ describe("zoom test", () => { }); beforeEach(() => { - return tabs.create(targetWindow.id, SERVER_URL).then((tab) => { + return tabs.create(targetWindow.id, CLIENT_URL).then((tab) => { targetTab = tab; }); }); diff --git a/e2e/web-server/index.js b/e2e/web-server/index.js index 81e11c1..8710bf9 100644 --- a/e2e/web-server/index.js +++ b/e2e/web-server/index.js @@ -1,14 +1,24 @@ +var serverUrl = require('./url'); var http = require('http'); +var url = require('url'); -const content = -'' + -'' + - '' + - '' + -'' ; +const handleScroll = (req, res) => { + res.writeHead(200, {'Content-Type': 'text/html'}); + res.end(''); +}; +const handle404 = (req, res) => { + res.writeHead(404, {'Content-Type': 'text/plain'}); + res.end('not found') +}; http.createServer(function (req, res) { - res.writeHead(200, {'Content-Type': 'text/html'}); - res.end(content); -}).listen(11111, '127.0.0.1'); + let u = url.parse(req.url); + if (req.method === 'GET' && u.pathname === '/scroll') { + handleScroll(req, res); + } else { + handle404(req, res); + } + + console.log(`"${req.method} ${req.url}"`, res.statusCode) +}).listen(serverUrl.PORT, serverUrl.HOST); diff --git a/e2e/web-server/url.js b/e2e/web-server/url.js new file mode 100644 index 0000000..37f3d84 --- /dev/null +++ b/e2e/web-server/url.js @@ -0,0 +1,5 @@ +module.exports = { + PORT: 11111, + HOST: '127.0.0.1', + CLIENT_URL: 'http://127.0.0.1:11111', +} From 28da164e5c630a7d9d0dafe61277814b7b777804 Mon Sep 17 00:00:00 2001 From: Shin'ya Ueoka Date: Sun, 13 May 2018 14:41:03 +0900 Subject: [PATCH 05/11] Add e2e test cases for [[/]] --- QA.md | 5 --- e2e/contents/navigate.test.js | 68 +++++++++++++++++++++++++++++++++-- e2e/web-server/index.js | 55 +++++++++++++++++++++++++++- 3 files changed, 120 insertions(+), 8 deletions(-) diff --git a/QA.md b/QA.md index 38c3196..ef1ecb4 100644 --- a/QA.md +++ b/QA.md @@ -25,11 +25,6 @@ The behaviors of the console are tested in [Console section](#consoles). - [ ] r: reload current tab - [ ] R: reload current tab without cache -#### Navigation - -- [ ] [[, ]]: Open next/prev link in `` tags. -- [ ] [[, ]]: find prev and next links and open it - #### Misc - [ ] y: yank current URL and show a message diff --git a/e2e/contents/navigate.test.js b/e2e/contents/navigate.test.js index 590a4b3..b9d283d 100644 --- a/e2e/contents/navigate.test.js +++ b/e2e/contents/navigate.test.js @@ -70,13 +70,13 @@ describe("navigate test", () => { }).then(() => { return keys.press(targetTab.id, 'H', { shiftKey: true }); }).then(() => { - return new Promise(resolve => { setTimeout(() => resolve(), 2000) }); + return new Promise(resolve => { setTimeout(() => resolve(), 10) }); }).then(() => { return tabs.get(targetTab.id); }).then((tab) => { expect(tab.url, 'go back in history').to.be.equal(CLIENT_URL + '/#navigate'); }).then(() => { - return new Promise(resolve => { setTimeout(() => resolve(), 2000) }); + return new Promise(resolve => { setTimeout(() => resolve(), 10) }); }).then(() => { return keys.press(targetTab.id, 'L', { shiftKey: true }); }).then(() => { @@ -85,4 +85,68 @@ describe("navigate test", () => { expect(tab.url, 'go next in history').to.be.equal(CLIENT_URL + '/#'); }); }); + + it('goes previous page by ', () => { + let targetTab; + return tabs.create(targetWindow.id, CLIENT_URL + '/a-pagenation?page=10').then((tab) => { + targetTab = tab; + return keys.press(targetTab.id, '['); + }).then(() => { + return keys.press(targetTab.id, '['); + }).then(() => { + return new Promise(resolve => { setTimeout(() => resolve(), 10) }); + }).then(() => { + return tabs.get(targetTab.id); + }).then((tab) => { + expect(tab.url).to.be.equal(CLIENT_URL + '/a-pagenation?page=9'); + }); + }) + + it('goes next page by ', () => { + let targetTab; + return tabs.create(targetWindow.id, CLIENT_URL + '/a-pagenation?page=10').then((tab) => { + targetTab = tab; + return keys.press(targetTab.id, ']'); + }).then(() => { + return keys.press(targetTab.id, ']'); + }).then(() => { + return new Promise(resolve => { setTimeout(() => resolve(), 10) }); + }).then(() => { + return tabs.get(targetTab.id); + }).then((tab) => { + expect(tab.url).to.be.equal(CLIENT_URL + '/a-pagenation?page=11'); + }); + }) + + it('goes previous page by ', () => { + let targetTab; + return tabs.create(targetWindow.id, CLIENT_URL + '/link-pagenation?page=10').then((tab) => { + targetTab = tab; + return keys.press(targetTab.id, '['); + }).then(() => { + return keys.press(targetTab.id, '['); + }).then(() => { + return new Promise(resolve => { setTimeout(() => resolve(), 10) }); + }).then(() => { + return tabs.get(targetTab.id); + }).then((tab) => { + expect(tab.url).to.be.equal(CLIENT_URL + '/link-pagenation?page=9'); + }); + }) + + it('goes next page by ', () => { + let targetTab; + return tabs.create(targetWindow.id, CLIENT_URL + '/link-pagenation?page=10').then((tab) => { + targetTab = tab; + return keys.press(targetTab.id, ']'); + }).then(() => { + return keys.press(targetTab.id, ']'); + }).then(() => { + return new Promise(resolve => { setTimeout(() => resolve(), 10) }); + }).then(() => { + return tabs.get(targetTab.id); + }).then((tab) => { + expect(tab.url).to.be.equal(CLIENT_URL + '/link-pagenation?page=11'); + }); + }) }); diff --git a/e2e/web-server/index.js b/e2e/web-server/index.js index 8710bf9..cbeee15 100644 --- a/e2e/web-server/index.js +++ b/e2e/web-server/index.js @@ -1,3 +1,5 @@ +'use strict'; + var serverUrl = require('./url'); var http = require('http'); var url = require('url'); @@ -7,15 +9,66 @@ const handleScroll = (req, res) => { res.end(''); }; +const handleAPagenation = (req, res) => { + let u = url.parse(req.url); + let params = new url.URLSearchParams(u.search); + let page = params.get('page') === null ? null : Number(params.get('page')); + if (page === null || isNaN(page)) { + return handle404(req, res); + } + + let body = ''; + let nextLink = u.pathname + '?page=' + (page + 1); + let prevLink = u.pathname + '?page=' + (page - 1); + + if (page > 1) { + body += 'prev | '; + } + body += 'next'; + + res.writeHead(200, {'Content-Type': 'text/html'}); + res.end('' + body + ''); +}; + +const handleLinkPagenation = (req, res) => { + let u = url.parse(req.url); + let params = new url.URLSearchParams(u.search); + let page = params.get('page') === null ? null : Number(params.get('page')); + if (page === null || isNaN(page)) { + return handle404(req, res); + } + + let head = ''; + let nextLink = u.pathname + '?page=' + (page + 1); + let prevLink = u.pathname + '?page=' + (page - 1); + + if (page > 1) { + head += ''; + } + head += ''; + + res.writeHead(200, {'Content-Type': 'text/html'}); + res.end('' + head + ''); +}; + + const handle404 = (req, res) => { res.writeHead(404, {'Content-Type': 'text/plain'}); res.end('not found') }; http.createServer(function (req, res) { + if (req.method !== 'GET') { + handle404(req, res); + } + let u = url.parse(req.url); - if (req.method === 'GET' && u.pathname === '/scroll') { + if (u.pathname === '/scroll') { handleScroll(req, res); + } else if (u.pathname === '/a-pagenation') { + handleAPagenation(req, res); + } else if (u.pathname === '/link-pagenation') { + handleLinkPagenation(req, res); } else { handle404(req, res); } From 1017cefae4beb38bfcbd90f49300cbf3e86e34ea Mon Sep 17 00:00:00 2001 From: Shin'ya Ueoka Date: Sun, 13 May 2018 15:35:25 +0900 Subject: [PATCH 06/11] Add sleep --- e2e/contents/navigate.test.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/e2e/contents/navigate.test.js b/e2e/contents/navigate.test.js index b9d283d..2058314 100644 --- a/e2e/contents/navigate.test.js +++ b/e2e/contents/navigate.test.js @@ -53,6 +53,8 @@ describe("navigate test", () => { return keys.press(targetTab.id, 'g'); }).then(() => { return keys.press(targetTab.id, 'U', { shiftKey: true }); + }).then(() => { + return new Promise(resolve => { setTimeout(() => resolve(), 10) }); }).then(() => { return tabs.get(targetTab.id); }).then((tab) => { From a6c0eb06e9bdb8df32ae1ef8c7bae0adf076ba1f Mon Sep 17 00:00:00 2001 From: Shin'ya Ueoka Date: Sun, 13 May 2018 15:38:26 +0900 Subject: [PATCH 07/11] Add e2e test cases for u --- QA.md | 1 - e2e/contents/tab.test.js | 17 +++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/QA.md b/QA.md index ef1ecb4..46b4c01 100644 --- a/QA.md +++ b/QA.md @@ -21,7 +21,6 @@ The behaviors of the console are tested in [Console section](#consoles). #### Tabs -- [ ] u: reopen close tab - [ ] r: reload current tab - [ ] R: reload current tab without cache diff --git a/e2e/contents/tab.test.js b/e2e/contents/tab.test.js index 550d79a..72479b9 100644 --- a/e2e/contents/tab.test.js +++ b/e2e/contents/tab.test.js @@ -212,6 +212,23 @@ describe("tab test", () => { }); }); + it('reopen tab by u', () => { + return Promise.resolve().then(() => { + return tabs.create(targetWindow.id, CLIENT_URL + '#1'); + }).then((tab) => { + return keys.press(tab.id, 'd'); + }).then(() => { + return windows.get(targetWindow.id); + }).then((win) => { + expect(win.tabs).to.have.lengthOf(1); + return keys.press(win.tabs[0].id, 'u'); + }).then(() => { + return windows.get(targetWindow.id); + }).then((win) => { + expect(win.tabs).to.have.lengthOf(2); + }); + }); + it('does not delete pinned tab by d', () => { return Promise.resolve().then(() => { return tabs.create(targetWindow.id, CLIENT_URL + '#1'); From 2801b953de8fc1059d655a689303e21de609a6c8 Mon Sep 17 00:00:00 2001 From: Shin'ya Ueoka Date: Sun, 13 May 2018 18:41:35 +0900 Subject: [PATCH 08/11] Add e2e test cases for following --- QA.md | 4 -- e2e/contents/follow.test.js | 121 ++++++++++++++++++++++++++++++++++++ e2e/web-server/index.js | 11 ++++ 3 files changed, 132 insertions(+), 4 deletions(-) create mode 100644 e2e/contents/follow.test.js diff --git a/QA.md b/QA.md index 46b4c01..e6adef4 100644 --- a/QA.md +++ b/QA.md @@ -34,10 +34,6 @@ The behaviors of the console are tested in [Console section](#consoles). ### Following links -- [ ] f: start following links -- [ ] F: start following links and open in new tab -- [ ] open link with target='_blank' in new tab by f -- [ ] open link with target='_blank' in new tab by F - [ ] Show hints on following on a page containing ``/`