diff --git a/src/matrix/storage/idb/QueryTarget.ts b/src/matrix/storage/idb/QueryTarget.ts index 5bea1139..26821e0f 100644 --- a/src/matrix/storage/idb/QueryTarget.ts +++ b/src/matrix/storage/idb/QueryTarget.ts @@ -269,13 +269,18 @@ export class QueryTarget { } } -import {createMockDatabase, MockIDBImpl} from "../../../mocks/Storage"; +import {createMockDatabase, createMockIDBFactory, getMockIDBKeyRange} from "../../../mocks/Storage"; import {txnAsPromise} from "./utils"; import {QueryTargetWrapper, Store} from "./Store"; -export function tests() { +export async function tests() { - class MockTransaction extends MockIDBImpl { + class MockTransaction { + constructor(public readonly idbFactory: IDBFactory, readonly idbKeyRangeType: typeof IDBKeyRange) {} + + get IDBKeyRange(): typeof IDBKeyRange { + return this.idbKeyRangeType; + } get databaseName(): string { return "mockdb"; } addWriteError(error: StorageError, refItem: ILogItem | undefined, operationName: string, keys: IDBKey[] | undefined) {} } @@ -285,10 +290,12 @@ export function tests() { } async function createTestStore(): Promise> { - const mockImpl = new MockTransaction(); + const idbFactory = await createMockIDBFactory(); + const idbKeyRangeType = await getMockIDBKeyRange(); + const mockImpl = new MockTransaction(idbFactory, idbKeyRangeType); const db = await createMockDatabase("findExistingKeys", (db: IDBDatabase) => { db.createObjectStore("test", {keyPath: "key"}); - }, mockImpl); + }, idbFactory); const txn = db.transaction(["test"], "readwrite"); return new Store(txn.objectStore("test"), mockImpl); } diff --git a/src/mocks/Storage.ts b/src/mocks/Storage.ts index 389a5427..6f7d12a8 100644 --- a/src/mocks/Storage.ts +++ b/src/mocks/Storage.ts @@ -14,34 +14,35 @@ See the License for the specific language governing permissions and limitations under the License. */ -// @ts-ignore -import FDBFactory from "fake-indexeddb/lib/FDBFactory.js"; -// @ts-ignore -import FDBKeyRange from "fake-indexeddb/lib/FDBKeyRange.js"; import {StorageFactory} from "../matrix/storage/idb/StorageFactory"; import {IDOMStorage} from "../matrix/storage/idb/types"; import {Storage} from "../matrix/storage/idb/Storage"; import {Instance as nullLogger} from "../logging/NullLogger"; import {openDatabase, CreateObjectStore} from "../matrix/storage/idb/utils"; -export function createMockStorage(): Promise { - return new StorageFactory(null as any, new FDBFactory(), FDBKeyRange, new MockLocalStorage()).create("1", nullLogger.item); +export async function createMockStorage(): Promise { + const idbFactory = await createMockIDBFactory(); + const FDBKeyRange = await getMockIDBKeyRange(); + return new StorageFactory(null as any, idbFactory, FDBKeyRange, new MockLocalStorage()).create("1", nullLogger.item); } -export function createMockDatabase(name: string, createObjectStore: CreateObjectStore, impl: MockIDBImpl): Promise { - return openDatabase(name, createObjectStore, 1, impl.idbFactory); +// don't import fake-indexeddb until it's safe to assume we're actually in a unit test, +// as this is a devDependency +export async function createMockIDBFactory(): Promise { + // @ts-ignore + const FDBFactory = (await import("fake-indexeddb/lib/FDBFactory.js")).default; + return new FDBFactory(); } -export class MockIDBImpl { - idbFactory: FDBFactory; +// don't import fake-indexeddb until it's safe to assume we're actually in a unit test, +// as this is a devDependency +export async function getMockIDBKeyRange(): Promise { + // @ts-ignore + return (await import("fake-indexeddb/lib/FDBKeyRange.js")).default; +} - constructor() { - this.idbFactory = new FDBFactory(); - } - - get IDBKeyRange(): typeof IDBKeyRange { - return FDBKeyRange; - } +export function createMockDatabase(name: string, createObjectStore: CreateObjectStore, idbFactory: IDBFactory): Promise { + return openDatabase(name, createObjectStore, 1, idbFactory); } class MockLocalStorage implements IDOMStorage {