import FindRepository from '../../../src/content/repositories/FindRepository'; import FindPresenter from '../../../src/content/presenters/FindPresenter'; import FindClient from '../../../src/content/client/FindClient'; import FindUseCase from '../../../src/content/usecases/FindUseCase'; import MockConsoleClient from '../mock/MockConsoleClient'; import { expect } from 'chai'; class MockFindRepository implements FindRepository { public keyword: string | null; constructor() { this.keyword = null; } getLastKeyword(): string | null { return this.keyword; } setLastKeyword(keyword: string): void { this.keyword = keyword; } } class MockFindPresenter implements FindPresenter { public document: string; public highlighted: boolean; constructor() { this.document = ''; this.highlighted = false; } find(keyword: string, _backward: boolean): boolean { let found = this.document.includes(keyword); this.highlighted = found; return found; } clearSelection(): void { this.highlighted = false; } } class MockFindClient implements FindClient { public keyword: string | null; constructor() { this.keyword = null; } getGlobalLastKeyword(): Promise { return Promise.resolve(this.keyword); } setGlobalLastKeyword(keyword: string): Promise { this.keyword = keyword; return Promise.resolve(); } } describe('FindUseCase', () => { let repository: MockFindRepository; let presenter: MockFindPresenter; let client: MockFindClient; let consoleClient: MockConsoleClient; let sut: FindUseCase; beforeEach(() => { repository = new MockFindRepository(); presenter = new MockFindPresenter(); client = new MockFindClient(); consoleClient = new MockConsoleClient(); sut = new FindUseCase({ repository, presenter, client, consoleClient }); }); describe('#startFind', () => { it('find next by ketword', async() => { presenter.document = 'monkey punch'; await sut.startFind('monkey'); expect(await presenter.highlighted).to.be.true; expect(await consoleClient.text).to.equal('Pattern found: monkey'); expect(await repository.getLastKeyword()).to.equal('monkey'); expect(await client.getGlobalLastKeyword()).to.equal('monkey'); }); it('find next by last keyword', async() => { presenter.document = 'gorilla kick'; repository.keyword = 'gorilla'; await sut.startFind(undefined); expect(await presenter.highlighted).to.be.true; expect(await consoleClient.text).to.equal('Pattern found: gorilla'); expect(await repository.getLastKeyword()).to.equal('gorilla'); expect(await client.getGlobalLastKeyword()).to.equal('gorilla'); }); it('find next by global last keyword', async() => { presenter.document = 'chimpanzee typing'; repository.keyword = null; client.keyword = 'chimpanzee'; await sut.startFind(undefined); expect(await presenter.highlighted).to.be.true; expect(await consoleClient.text).to.equal('Pattern found: chimpanzee'); expect(await repository.getLastKeyword()).to.equal('chimpanzee'); expect(await client.getGlobalLastKeyword()).to.equal('chimpanzee'); }); it('find not found error', async() => { presenter.document = 'zoo'; await sut.startFind('giraffe'); expect(await presenter.highlighted).to.be.false; expect(await consoleClient.text).to.equal('Pattern not found: giraffe'); expect(await repository.getLastKeyword()).to.equal('giraffe'); expect(await client.getGlobalLastKeyword()).to.equal('giraffe'); }); it('show errors when no last keywords', async() => { repository.keyword = null; client.keyword = null; await sut.startFind(undefined); expect(await consoleClient.text).to.equal('No previous search keywords'); expect(await consoleClient.isError).to.be.true; }); }); describe('#findNext', () => { it('finds by last keyword', async() => { presenter.document = 'monkey punch'; repository.keyword = 'monkey'; await sut.findNext(); expect(await presenter.highlighted).to.be.true; expect(await consoleClient.text).to.equal('Pattern found: monkey'); }); it('show errors when no last keywords', async() => { repository.keyword = null; client.keyword = null; await sut.findNext(); expect(await consoleClient.text).to.equal('No previous search keywords'); expect(await consoleClient.isError).to.be.true; }); }); describe('#findPrev', () => { }); });