import "reflect-metadata"; import CompletionType from "../../../src/shared/CompletionType"; import BookmarkRepository, { BookmarkItem, } from "../../../src/background/completion/BookmarkRepository"; import HistoryRepository, { HistoryItem, } from "../../../src/background/completion/HistoryRepository"; import OpenCompletionUseCase from "../../../src/background/completion/OpenCompletionUseCase"; import CachedSettingRepository from "../../../src/background/repositories/CachedSettingRepository"; import Settings, { DefaultSetting, } from "../../../src/shared/settings/Settings"; import { expect } from "chai"; import sinon from "sinon"; import Properties from "../../../src/shared/settings/Properties"; import Search from "../../../src/shared/settings/Search"; class MockBookmarkRepository implements BookmarkRepository { queryBookmarks(_query: string): Promise { throw new Error("not implemented"); } } class MockHistoryRepository implements HistoryRepository { queryHistories(_keywords: string): Promise { throw new Error("not implemented"); } } class MockSettingRepository implements CachedSettingRepository { get(): Promise { throw new Error("not implemented"); } setProperty(_name: string, _value: string | number | boolean): Promise { throw new Error("not implemented"); } update(_value: Settings): Promise { throw new Error("not implemented"); } } describe("OpenCompletionUseCase", () => { let bookmarkRepository: MockBookmarkRepository; let historyRepository: MockHistoryRepository; let settingRepository: MockSettingRepository; let sut: OpenCompletionUseCase; beforeEach(() => { bookmarkRepository = new MockBookmarkRepository(); historyRepository = new MockHistoryRepository(); settingRepository = new MockSettingRepository(); sut = new OpenCompletionUseCase( bookmarkRepository, historyRepository, settingRepository ); }); describe("#getCompletionTypes", () => { it("returns completion types from the property", async () => { sinon.stub(settingRepository, "get").returns( Promise.resolve( new Settings({ keymaps: DefaultSetting.keymaps, search: DefaultSetting.search, properties: new Properties({ complete: "shb" }), blacklist: DefaultSetting.blacklist, }) ) ); const items = await sut.getCompletionTypes(); expect(items).to.deep.equal([ CompletionType.SearchEngines, CompletionType.History, CompletionType.Bookmarks, ]); }); }); describe("#requestSearchEngines", () => { it("returns search engines matches by the query", async () => { sinon.stub(settingRepository, "get").returns( Promise.resolve( new Settings({ keymaps: DefaultSetting.keymaps, search: new Search("google", { google: "https://google.com/search?q={}", yahoo: "https://search.yahoo.com/search?q={}", bing: "https://bing.com/search?q={}", googleja: "https://google.co.jp/search?q={}", }), properties: DefaultSetting.properties, blacklist: DefaultSetting.blacklist, }) ) ); expect(await sut.requestSearchEngines("")).to.deep.equal([ "google", "yahoo", "bing", "googleja", ]); expect(await sut.requestSearchEngines("go")).to.deep.equal([ "google", "googleja", ]); expect(await sut.requestSearchEngines("x")).to.be.empty; }); }); describe("#requestBookmarks", () => { it("returns bookmarks from the repository", async () => { sinon .stub(bookmarkRepository, "queryBookmarks") .withArgs("site") .returns( Promise.resolve([ { title: "site1", url: "https://site1.example.com" }, { title: "site2", url: "https://site2.example.com/" }, ]) ) .withArgs("xyz") .returns(Promise.resolve([])); expect(await sut.requestBookmarks("site")).to.deep.equal([ { title: "site1", url: "https://site1.example.com" }, { title: "site2", url: "https://site2.example.com/" }, ]); expect(await sut.requestBookmarks("xyz")).to.be.empty; }); }); describe("#requestHistory", () => { it("returns histories from the repository", async () => { sinon .stub(historyRepository, "queryHistories") .withArgs("site") .returns( Promise.resolve([ { title: "site1", url: "https://site1.example.com" }, { title: "site2", url: "https://site2.example.com/" }, ]) ) .withArgs("xyz") .returns(Promise.resolve([])); expect(await sut.requestHistory("site")).to.deep.equal([ { title: "site1", url: "https://site1.example.com" }, { title: "site2", url: "https://site2.example.com/" }, ]); expect(await sut.requestHistory("xyz")).to.be.empty; }); }); });