1
0
mirror of https://github.com/matrix-org/matrix-js-sdk.git synced 2025-07-30 04:23:07 +03:00

Add tests

This commit is contained in:
Eric Eastwood
2022-11-30 18:45:05 -06:00
parent 3a1897629a
commit d3f08fec03
2 changed files with 174 additions and 12 deletions

View File

@ -19,6 +19,12 @@ import { mocked } from "jest-mock";
import { logger } from "../../src/logger";
import { MatrixClient, ClientEvent } from "../../src/client";
import { Filter } from "../../src/filter";
import {
Method,
ClientPrefix,
IRequestOpts,
} from "../../src/http-api";
import { QueryDict } from "../../src/utils";
import { DEFAULT_TREE_POWER_LEVELS_TEMPLATE } from "../../src/models/MSC3089TreeSpace";
import {
EventType,
@ -52,6 +58,27 @@ jest.mock("../../src/webrtc/call", () => ({
supportsMatrixCall: jest.fn(() => false),
}));
enum AnsiColorCode {
Red = 31,
Green = 32,
Yellow = 33,
}
// Color text in the terminal
function decorateStringWithAnsiColor(inputString: string, decorationColor: AnsiColorCode) {
return `\x1b[${decorationColor}m${inputString}\x1b[0m`;
}
function convertQueryDictToStringRecord(queryDict?: QueryDict): Record<string, string> {
if (!queryDict) {
return {};
}
return Object.entries(queryDict).reduce((resultant, [key, value]) => {
resultant[key] = String(value);
return resultant;
}, {});
}
describe("MatrixClient", function() {
const userId = "@alice:bar";
const identityServerUrl = "https://identity.server";
@ -92,10 +119,11 @@ describe("MatrixClient", function() {
let httpLookups: {
method: string;
path: string;
prefix?: string;
data?: object;
error?: object;
expectBody?: object;
expectQueryParams?: object;
expectQueryParams?: QueryDict;
thenCall?: Function;
}[] = [];
let acceptKeepalives: boolean;
@ -104,7 +132,14 @@ describe("MatrixClient", function() {
method: string;
path: string;
} | null = null;
function httpReq(method, path, qp, data, prefix) {
function httpReq(
method: Method,
path: string,
queryParams?: QueryDict,
body?: Body,
requestOpts: IRequestOpts = {}
) {
const { prefix } = requestOpts;
if (path === KEEP_ALIVE_PATH && acceptKeepalives) {
return Promise.resolve({
unstable_features: {
@ -135,17 +170,20 @@ describe("MatrixClient", function() {
};
return pendingLookup.promise;
}
if (next.path === path && next.method === method) {
// Either we don't care about the prefix if it wasn't defined in the expected
// lookup or it should match.
const doesMatchPrefix = !next.prefix || next.prefix === prefix;
if (doesMatchPrefix && next.path === path && next.method === method) {
logger.log(
"MatrixClient[UT] Matched. Returning " +
(next.error ? "BAD" : "GOOD") + " response",
);
if (next.expectBody) {
expect(data).toEqual(next.expectBody);
expect(body).toEqual(next.expectBody);
}
if (next.expectQueryParams) {
Object.keys(next.expectQueryParams).forEach(function(k) {
expect(qp[k]).toEqual(next.expectQueryParams![k]);
expect(queryParams?.[k]).toEqual(next.expectQueryParams![k]);
});
}
@ -165,12 +203,15 @@ describe("MatrixClient", function() {
}
return Promise.resolve(next.data);
}
// Jest doesn't let us have custom expectation errors, so if you're seeing this then
// you forgot to handle at least 1 pending request. Check your tests to ensure your
// number of expectations lines up with your number of requests made, and that those
// requests match your expectations.
expect(true).toBe(false);
return new Promise(() => {});
// If you're seeing this then you forgot to handle at least 1 pending request.
const receivedRequest = decorateStringWithAnsiColor(`${method} ${prefix}${path}${new URLSearchParams(convertQueryDictToStringRecord(queryParams)).toString()}`, AnsiColorCode.Red);
const expectedRequest = decorateStringWithAnsiColor(`${next.method} ${next.prefix ?? ''}${next.path}${new URLSearchParams(convertQueryDictToStringRecord(next.expectQueryParams)).toString()}`, AnsiColorCode.Green);
throw new Error(
`A pending request was not handled: ${receivedRequest} ` +
`(next request expected was ${expectedRequest})\n` +
`Check your tests to ensure your number of expectations lines up with your number of requests ` +
`made, and that those requests match your expectations.`,
);
}
function makeClient() {
@ -231,6 +272,118 @@ describe("MatrixClient", function() {
client.stopClient();
});
describe('timestampToEvent', () => {
const roomId = '!room:server.org';
const eventId = "$eventId:example.org";
const unstableMsc3030Prefix = "/_matrix/client/unstable/org.matrix.msc3030";
it('should call stable endpoint', async () => {
httpLookups = [{
method: "GET",
path: `/rooms/${encodeURIComponent(roomId)}/timestamp_to_event`,
data: { event_id: eventId },
expectQueryParams: {
ts: '0',
dir: 'f'
},
}];
await client.timestampToEvent(roomId, 0, 'f');
expect(client.http.authedRequest.mock.calls.length).toStrictEqual(1);
const [method, path, queryParams,, { prefix }] = client.http.authedRequest.mock.calls[0];
expect(method).toStrictEqual('GET');
expect(prefix).toStrictEqual(ClientPrefix.V1);
expect(path).toStrictEqual(
`/rooms/${encodeURIComponent(roomId)}/timestamp_to_event`
);
expect(queryParams).toStrictEqual({
ts: '0',
dir: 'f'
});
});
it('should fallback to unstable endpoint when no support for stable endpoint', async () => {
httpLookups = [{
method: "GET",
path: `/rooms/${encodeURIComponent(roomId)}/timestamp_to_event`,
prefix: ClientPrefix.V1,
error: {
httpStatus: 404,
errcode: "M_UNRECOGNIZED"
},
expectQueryParams: {
ts: '0',
dir: 'f'
},
}, {
method: "GET",
path: `/rooms/${encodeURIComponent(roomId)}/timestamp_to_event`,
prefix: unstableMsc3030Prefix,
data: { event_id: eventId },
expectQueryParams: {
ts: '0',
dir: 'f'
},
}];
await client.timestampToEvent(roomId, 0, 'f');
expect(client.http.authedRequest.mock.calls.length).toStrictEqual(2);
const [stableMethod, stablePath, stableQueryParams,, { prefix: stablePrefix }] = client.http.authedRequest.mock.calls[0];
expect(stableMethod).toStrictEqual('GET');
expect(stablePrefix).toStrictEqual(ClientPrefix.V1);
expect(stablePath).toStrictEqual(
`/rooms/${encodeURIComponent(roomId)}/timestamp_to_event`
);
expect(stableQueryParams).toStrictEqual({
ts: '0',
dir: 'f'
});
const [unstableMethod, unstablePath, unstableQueryParams,, { prefix: unstablePrefix }] = client.http.authedRequest.mock.calls[1];
expect(unstableMethod).toStrictEqual('GET');
expect(unstablePrefix).toStrictEqual(unstableMsc3030Prefix);
expect(unstablePath).toStrictEqual(
`/rooms/${encodeURIComponent(roomId)}/timestamp_to_event`
);
expect(unstableQueryParams).toStrictEqual({
ts: '0',
dir: 'f'
});
});
it('should not fallback to unstable endpoint when stable endpoint returns an error', async () => {
httpLookups = [{
method: "GET",
path: `/rooms/${encodeURIComponent(roomId)}/timestamp_to_event`,
prefix: ClientPrefix.V1,
error: {
httpStatus: 500,
errcode: "Fake response error"
},
expectQueryParams: {
ts: '0',
dir: 'f'
},
}];
await expect(client.timestampToEvent(roomId, 0, 'f')).rejects.toBeDefined();
expect(client.http.authedRequest.mock.calls.length).toStrictEqual(1);
const [method, path, queryParams,, { prefix }] = client.http.authedRequest.mock.calls[0];
expect(method).toStrictEqual('GET');
expect(prefix).toStrictEqual(ClientPrefix.V1);
expect(path).toStrictEqual(
`/rooms/${encodeURIComponent(roomId)}/timestamp_to_event`
);
expect(queryParams).toStrictEqual({
ts: '0',
dir: 'f'
});
});
});
describe("sendEvent", () => {
const roomId = "!room:example.org";
const body = "This is the body";