899cdb0e1d
* Skip unwritten tests Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Tidy jest fake timers Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Remove unnecessary sessionStorage mock Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Improve types Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Improve async assertions Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Improve error assertions Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Improve object assertions Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Remove assertion testing unclear mock This test failed when ran individually, same as after the clearAllMocks call Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Avoid awaiting non-thenables Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Pass nop function when stubbing out console, vitest won't accept it any other way Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Remove unnecessary mock which causes tests to fail after updating fetch-mock & fix typo Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Fix mistaken assertions not testing all values in array Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Fix hidden non-running tests in room.spec.ts Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Update fetch-mock-jest to @fetch-mock/jest Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Delint Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Make knip happier Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Make knip happier 2.0 Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Delint Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Switch from Jest to Vitest Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Iterate Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Delint Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Fix CI Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Remove unnecessary fake timers Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Update vite Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Revert irrelevant changes Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Fix coverage spec paths Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Fix slow test reporter Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Fix bad merge conflict resolution Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Fix babel config Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --------- Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
117 lines
4.1 KiB
TypeScript
117 lines
4.1 KiB
TypeScript
import { ConnectionError } from "../../src/http-api/errors";
|
|
import { ClientEvent, type MatrixClient, type Store } from "../../src/client";
|
|
import { ToDeviceMessageQueue } from "../../src/ToDeviceMessageQueue";
|
|
import { getMockClientWithEventEmitter } from "../test-utils/client";
|
|
import { StubStore } from "../../src/store/stub";
|
|
import { type IndexedToDeviceBatch } from "../../src/models/ToDeviceMessage";
|
|
import { SyncState } from "../../src/sync";
|
|
import { logger } from "../../src/logger.ts";
|
|
|
|
describe("onResumedSync", () => {
|
|
let batch: IndexedToDeviceBatch | null;
|
|
let shouldFailSendToDevice: boolean;
|
|
let onSendToDeviceFailure: () => void;
|
|
let onSendToDeviceSuccess: () => void;
|
|
let resumeSync: (newState: SyncState, oldState: SyncState) => void;
|
|
|
|
let store: Store;
|
|
let mockClient: MatrixClient;
|
|
let queue: ToDeviceMessageQueue;
|
|
|
|
beforeEach(() => {
|
|
batch = {
|
|
id: 0,
|
|
txnId: "123",
|
|
eventType: "m.dummy",
|
|
batch: [],
|
|
};
|
|
|
|
shouldFailSendToDevice = true;
|
|
onSendToDeviceFailure = () => {};
|
|
onSendToDeviceSuccess = () => {};
|
|
resumeSync = (newState, oldState) => {
|
|
shouldFailSendToDevice = false;
|
|
mockClient.emit(ClientEvent.Sync, newState, oldState);
|
|
};
|
|
|
|
store = new StubStore();
|
|
store.getOldestToDeviceBatch = vi.fn().mockImplementation(() => {
|
|
return batch;
|
|
});
|
|
store.removeToDeviceBatch = vi.fn().mockImplementation(() => {
|
|
batch = null;
|
|
});
|
|
|
|
mockClient = getMockClientWithEventEmitter({});
|
|
mockClient.store = store;
|
|
mockClient.sendToDevice = vi.fn().mockImplementation(async () => {
|
|
if (shouldFailSendToDevice) {
|
|
await Promise.reject(new ConnectionError("")).finally(() => {
|
|
setTimeout(onSendToDeviceFailure, 0);
|
|
});
|
|
} else {
|
|
await Promise.resolve({}).finally(() => {
|
|
setTimeout(onSendToDeviceSuccess, 0);
|
|
});
|
|
}
|
|
});
|
|
|
|
queue = new ToDeviceMessageQueue(mockClient, logger);
|
|
});
|
|
|
|
it("resends queue after connectivity restored", async () => {
|
|
const successResolvers = Promise.withResolvers<void>();
|
|
|
|
onSendToDeviceFailure = () => {
|
|
expect(store.getOldestToDeviceBatch).toHaveBeenCalledTimes(1);
|
|
expect(store.removeToDeviceBatch).not.toHaveBeenCalled();
|
|
|
|
resumeSync(SyncState.Syncing, SyncState.Catchup);
|
|
expect(store.getOldestToDeviceBatch).toHaveBeenCalledTimes(2);
|
|
};
|
|
|
|
onSendToDeviceSuccess = () => {
|
|
expect(store.getOldestToDeviceBatch).toHaveBeenCalledTimes(3);
|
|
expect(store.removeToDeviceBatch).toHaveBeenCalled();
|
|
successResolvers.resolve();
|
|
};
|
|
|
|
queue.start();
|
|
return successResolvers.promise;
|
|
});
|
|
|
|
it("does not resend queue if client sync still catching up", async () => {
|
|
const successResolvers = Promise.withResolvers<void>();
|
|
|
|
onSendToDeviceFailure = () => {
|
|
expect(store.getOldestToDeviceBatch).toHaveBeenCalledTimes(1);
|
|
expect(store.removeToDeviceBatch).not.toHaveBeenCalled();
|
|
|
|
resumeSync(SyncState.Catchup, SyncState.Catchup);
|
|
expect(store.getOldestToDeviceBatch).toHaveBeenCalledTimes(1);
|
|
successResolvers.resolve();
|
|
};
|
|
|
|
queue.start();
|
|
return successResolvers.promise;
|
|
});
|
|
|
|
it("does not resend queue if connectivity restored after queue stopped", async () => {
|
|
const successResolvers = Promise.withResolvers<void>();
|
|
|
|
onSendToDeviceFailure = () => {
|
|
expect(store.getOldestToDeviceBatch).toHaveBeenCalledTimes(1);
|
|
expect(store.removeToDeviceBatch).not.toHaveBeenCalled();
|
|
|
|
queue.stop();
|
|
|
|
resumeSync(SyncState.Syncing, SyncState.Catchup);
|
|
expect(store.getOldestToDeviceBatch).toHaveBeenCalledTimes(1);
|
|
successResolvers.resolve();
|
|
};
|
|
|
|
queue.start();
|
|
return successResolvers.promise;
|
|
});
|
|
});
|