Files
matrix-js-sdk/spec/unit/ToDeviceMessageQueue.spec.ts
T

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

117 lines
4.1 KiB
TypeScript
Raw Normal View History

2022-12-12 16:13:21 +00:00
import { ConnectionError } from "../../src/http-api/errors";
import { ClientEvent, type MatrixClient, type Store } from "../../src/client";
2022-12-12 16:13:21 +00:00
import { ToDeviceMessageQueue } from "../../src/ToDeviceMessageQueue";
import { getMockClientWithEventEmitter } from "../test-utils/client";
import { StubStore } from "../../src/store/stub";
import { type IndexedToDeviceBatch } from "../../src/models/ToDeviceMessage";
2022-12-12 16:13:21 +00:00
import { SyncState } from "../../src/sync";
import { logger } from "../../src/logger.ts";
2022-12-12 16:13:21 +00:00
describe("onResumedSync", () => {
let batch: IndexedToDeviceBatch | null;
let shouldFailSendToDevice: boolean;
2022-12-12 16:13:21 +00:00
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();
2026-01-15 11:15:37 +00:00
store.getOldestToDeviceBatch = vi.fn().mockImplementation(() => {
2022-12-12 16:13:21 +00:00
return batch;
});
2026-01-15 11:15:37 +00:00
store.removeToDeviceBatch = vi.fn().mockImplementation(() => {
2022-12-12 16:13:21 +00:00
batch = null;
});
mockClient = getMockClientWithEventEmitter({});
mockClient.store = store;
2026-01-15 11:15:37 +00:00
mockClient.sendToDevice = vi.fn().mockImplementation(async () => {
2022-12-12 16:13:21 +00:00
if (shouldFailSendToDevice) {
await Promise.reject(new ConnectionError("")).finally(() => {
setTimeout(onSendToDeviceFailure, 0);
});
} else {
await Promise.resolve({}).finally(() => {
setTimeout(onSendToDeviceSuccess, 0);
});
}
});
queue = new ToDeviceMessageQueue(mockClient, logger);
2022-12-12 16:13:21 +00:00
});
2023-02-10 05:05:40 -06:00
it("resends queue after connectivity restored", async () => {
const successResolvers = Promise.withResolvers<void>();
2023-02-10 05:05:40 -06:00
2022-12-12 16:13:21 +00:00
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();
2022-12-12 16:13:21 +00:00
};
queue.start();
return successResolvers.promise;
2022-12-12 16:13:21 +00:00
});
2023-02-10 05:05:40 -06:00
it("does not resend queue if client sync still catching up", async () => {
const successResolvers = Promise.withResolvers<void>();
2023-02-10 05:05:40 -06:00
2022-12-12 16:13:21 +00:00
onSendToDeviceFailure = () => {
expect(store.getOldestToDeviceBatch).toHaveBeenCalledTimes(1);
expect(store.removeToDeviceBatch).not.toHaveBeenCalled();
resumeSync(SyncState.Catchup, SyncState.Catchup);
expect(store.getOldestToDeviceBatch).toHaveBeenCalledTimes(1);
successResolvers.resolve();
2022-12-12 16:13:21 +00:00
};
queue.start();
return successResolvers.promise;
2022-12-12 16:13:21 +00:00
});
2023-02-10 05:05:40 -06:00
it("does not resend queue if connectivity restored after queue stopped", async () => {
const successResolvers = Promise.withResolvers<void>();
2023-02-10 05:05:40 -06:00
2022-12-12 16:13:21 +00:00
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();
2022-12-12 16:13:21 +00:00
};
queue.start();
return successResolvers.promise;
2022-12-12 16:13:21 +00:00
});
});