import "reflect-metadata"; import TabPresenter from '../../../src/background/presenters/TabPresenter'; import NavigateUseCase from '../../../src/background/usecases/NavigateUseCase'; import NavigateClient from '../../../src/background/clients/NavigateClient'; import * as sinon from 'sinon'; class MockTabPresenter implements TabPresenter { create(_url: string, _opts?: object): Promise { throw new Error("not implemented"); } duplicate(_id: number): Promise { throw new Error("not implemented"); } getAll(): Promise { throw new Error("not implemented"); } getByKeyword(_keyword: string, _excludePinned: boolean): Promise { throw new Error("not implemented"); } getCurrent(): Promise { throw new Error("not implemented"); } getLastSelectedId(): Promise { throw new Error("not implemented"); } getZoom(_tabId: number): Promise { throw new Error("not implemented"); } onSelected(_listener: (arg: { tabId: number; windowId: number }) => void): void { throw new Error("not implemented"); } open(_url: string, _tabId?: number): Promise { throw new Error("not implemented"); } reload(_tabId: number, _cache: boolean): Promise { throw new Error("not implemented"); } remove(_ids: number[]): Promise { throw new Error("not implemented"); } reopen(): Promise { throw new Error("not implemented"); } select(_tabId: number): Promise { throw new Error("not implemented"); } setPinned(_tabId: number, _pinned: boolean): Promise { throw new Error("not implemented"); } setZoom(_tabId: number, _factor: number): Promise { throw new Error("not implemented"); } } describe('NavigateUseCase', () => { let sut: NavigateUseCase; let tabPresenter: TabPresenter; let navigateClient: NavigateClient; beforeEach(() => { tabPresenter = new MockTabPresenter(); navigateClient = new NavigateClient(); sut = new NavigateUseCase(tabPresenter, navigateClient); }); const newTab = (url: string): browser.tabs.Tab => { return { index: 0, title: 'dummy title', url: url, active: true, hidden: false, highlighted: false, incognito: false, isArticle: false, isInReaderMode: false, lastAccessed: 1585446733000, pinned: false, selected: false, windowId: 0 }; }; describe('#openParent()', async () => { it('opens parent directory of file', async() => { sinon.stub(tabPresenter, 'getCurrent') .returns(Promise.resolve(newTab('https://google.com/fruits/yellow/banana'))); const mock = sinon.mock(tabPresenter) .expects('open').withArgs('https://google.com/fruits/yellow/'); await sut.openParent(); mock.verify(); }); it('opens parent directory of directory', async() => { sinon.stub(tabPresenter, 'getCurrent') .returns(Promise.resolve(newTab('https://google.com/fruits/yellow/'))); const mock = sinon.mock(tabPresenter) .expects('open').withArgs('https://google.com/fruits/'); await sut.openParent(); mock.verify(); }); it('removes hash', async() => { sinon.stub(tabPresenter, 'getCurrent') .returns(Promise.resolve(newTab('https://google.com/#top'))); const mock = sinon.mock(tabPresenter) .expects('open').withArgs('https://google.com/'); await sut.openParent(); mock.verify(); }); it('removes search query', async() => { sinon.stub(tabPresenter, 'getCurrent') .returns(Promise.resolve(newTab('https://google.com/search?q=apple'))); const mock = sinon.mock(tabPresenter) .expects('open').withArgs('https://google.com/search'); await sut.openParent(); mock.verify(); }); }); describe('#openRoot()', () => { it('opens root direectory', async() => { sinon.stub(tabPresenter, 'getCurrent') .returns(Promise.resolve(newTab('https://google.com/seach?q=apple'))); const mock = sinon.mock(tabPresenter) .expects('open').withArgs('https://google.com'); await sut.openRoot(); mock.verify(); }); }); });