mirror of
https://github.com/vector-im/element-web.git
synced 2024-11-15 12:45:11 +08:00
Add ESLint Jest (#10261)
This commit is contained in:
parent
db7748b743
commit
5398db21ad
26
.eslintrc.js
26
.eslintrc.js
@ -165,10 +165,31 @@ module.exports = {
|
||||
},
|
||||
{
|
||||
files: ["test/**/*.{ts,tsx}", "cypress/**/*.ts"],
|
||||
extends: ["plugin:matrix-org/jest"],
|
||||
rules: {
|
||||
// We don't need super strict typing in test utilities
|
||||
"@typescript-eslint/explicit-function-return-type": "off",
|
||||
"@typescript-eslint/explicit-member-accessibility": "off",
|
||||
|
||||
// Jest/Cypress specific
|
||||
|
||||
// Disabled tests are a reality for now but as soon as all of the xits are
|
||||
// eliminated, we should enforce this.
|
||||
"jest/no-disabled-tests": "off",
|
||||
// TODO: There are many tests with invalid expects that should be fixed,
|
||||
// https://github.com/vector-im/element-web/issues/24709
|
||||
"jest/valid-expect": "off",
|
||||
// TODO: There are many cases to refactor away,
|
||||
// https://github.com/vector-im/element-web/issues/24710
|
||||
"jest/no-conditional-expect": "off",
|
||||
// Also treat "oldBackendOnly" as a test function.
|
||||
// Used in some crypto tests.
|
||||
"jest/no-standalone-expect": [
|
||||
"error",
|
||||
{
|
||||
additionalTestBlockFunctions: ["beforeAll", "beforeEach", "oldBackendOnly"],
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
{
|
||||
@ -176,6 +197,11 @@ module.exports = {
|
||||
parserOptions: {
|
||||
project: ["./cypress/tsconfig.json"],
|
||||
},
|
||||
rules: {
|
||||
// Cypress "promises" work differently - disable some related rules
|
||||
"jest/valid-expect-in-promise": "off",
|
||||
"jest/no-done-callback": "off",
|
||||
},
|
||||
},
|
||||
],
|
||||
settings: {
|
||||
|
@ -356,7 +356,7 @@ describe("Sliding Sync", () => {
|
||||
});
|
||||
|
||||
// Regression test for https://github.com/vector-im/element-web/issues/21462
|
||||
it("should not cancel replies when permalinks are clicked ", () => {
|
||||
it("should not cancel replies when permalinks are clicked", () => {
|
||||
cy.get<string>("@roomId").then((roomId) => {
|
||||
// we require a first message as you cannot click the permalink text with the avatar in the way
|
||||
return cy
|
||||
|
@ -24,7 +24,7 @@ import Timeoutable = Cypress.Timeoutable;
|
||||
import Withinable = Cypress.Withinable;
|
||||
import Shadow = Cypress.Shadow;
|
||||
|
||||
export enum Filter {
|
||||
enum Filter {
|
||||
People = "people",
|
||||
PublicRooms = "public_rooms",
|
||||
}
|
||||
@ -297,27 +297,28 @@ describe("Spotlight", () => {
|
||||
|
||||
// TODO: We currently can’t test finding rooms on other homeservers/other protocols
|
||||
// We obviously don’t have federation or bridges in cypress tests
|
||||
/*
|
||||
const room3Name = "Matrix HQ";
|
||||
const room3Id = "#matrix:matrix.org";
|
||||
|
||||
it("should find unknown public rooms on other homeservers", () => {
|
||||
cy.openSpotlightDialog().within(() => {
|
||||
cy.spotlightFilter(Filter.PublicRooms);
|
||||
cy.spotlightSearch().clear().type(room3Name);
|
||||
cy.get("[aria-haspopup=true][role=button]").click();
|
||||
}).then(() => {
|
||||
cy.contains(".mx_GenericDropdownMenu_Option--header", "matrix.org")
|
||||
.next("[role=menuitemradio]")
|
||||
.click();
|
||||
cy.wait(3_600_000);
|
||||
}).then(() => cy.spotlightDialog().within(() => {
|
||||
cy.spotlightResults().should("have.length", 1);
|
||||
cy.spotlightResults().eq(0).should("contain", room3Name);
|
||||
cy.spotlightResults().eq(0).should("contain", room3Id);
|
||||
}));
|
||||
it.skip("should find unknown public rooms on other homeservers", () => {
|
||||
cy.openSpotlightDialog()
|
||||
.within(() => {
|
||||
cy.spotlightFilter(Filter.PublicRooms);
|
||||
cy.spotlightSearch().clear().type(room3Name);
|
||||
cy.get("[aria-haspopup=true][role=button]").click();
|
||||
})
|
||||
.then(() => {
|
||||
cy.contains(".mx_GenericDropdownMenu_Option--header", "matrix.org")
|
||||
.next("[role=menuitemradio]")
|
||||
.click();
|
||||
cy.wait(3_600_000);
|
||||
})
|
||||
.then(() =>
|
||||
cy.spotlightDialog().within(() => {
|
||||
cy.spotlightResults().should("have.length", 1);
|
||||
cy.spotlightResults().eq(0).should("contain", room3Name);
|
||||
cy.spotlightResults().eq(0).should("contain", room3Id);
|
||||
}),
|
||||
);
|
||||
});
|
||||
*/
|
||||
|
||||
it("should find known people", () => {
|
||||
cy.openSpotlightDialog()
|
||||
.within(() => {
|
||||
|
@ -194,6 +194,7 @@
|
||||
"eslint-config-prettier": "^8.5.0",
|
||||
"eslint-plugin-deprecate": "^0.7.0",
|
||||
"eslint-plugin-import": "^2.25.4",
|
||||
"eslint-plugin-jest": "^27.2.1",
|
||||
"eslint-plugin-jsx-a11y": "^6.5.1",
|
||||
"eslint-plugin-matrix-org": "1.0.0",
|
||||
"eslint-plugin-react": "^7.28.0",
|
||||
|
@ -327,6 +327,6 @@ describe("uploadFile", () => {
|
||||
const prom = uploadFile(client, "!roomId:server", file);
|
||||
mocked(client.uploadContent).mock.calls[0][1]!.abortController!.abort();
|
||||
deferred.resolve({ content_uri: "mxc://foo/bar" });
|
||||
await expect(prom).rejects.toThrowError(UploadCanceledError);
|
||||
await expect(prom).rejects.toThrow(UploadCanceledError);
|
||||
});
|
||||
});
|
||||
|
@ -38,7 +38,7 @@ function createFailedDecryptionEvent() {
|
||||
}
|
||||
|
||||
describe("DecryptionFailureTracker", function () {
|
||||
it("tracks a failed decryption for a visible event", function (done) {
|
||||
it("tracks a failed decryption for a visible event", function () {
|
||||
const failedDecryptionEvent = createFailedDecryptionEvent();
|
||||
|
||||
let count = 0;
|
||||
@ -59,11 +59,9 @@ describe("DecryptionFailureTracker", function () {
|
||||
tracker.trackFailures();
|
||||
|
||||
expect(count).not.toBe(0, "should track a failure for an event that failed decryption");
|
||||
|
||||
done();
|
||||
});
|
||||
|
||||
it("tracks a failed decryption with expected raw error for a visible event", function (done) {
|
||||
it("tracks a failed decryption with expected raw error for a visible event", function () {
|
||||
const failedDecryptionEvent = createFailedDecryptionEvent();
|
||||
|
||||
let count = 0;
|
||||
@ -89,11 +87,9 @@ describe("DecryptionFailureTracker", function () {
|
||||
|
||||
expect(count).not.toBe(0, "should track a failure for an event that failed decryption");
|
||||
expect(reportedRawCode).toBe("INBOUND_SESSION_MISMATCH_ROOM_ID", "Should add the rawCode to the event context");
|
||||
|
||||
done();
|
||||
});
|
||||
|
||||
it("tracks a failed decryption for an event that becomes visible later", function (done) {
|
||||
it("tracks a failed decryption for an event that becomes visible later", function () {
|
||||
const failedDecryptionEvent = createFailedDecryptionEvent();
|
||||
|
||||
let count = 0;
|
||||
@ -114,11 +110,9 @@ describe("DecryptionFailureTracker", function () {
|
||||
tracker.trackFailures();
|
||||
|
||||
expect(count).not.toBe(0, "should track a failure for an event that failed decryption");
|
||||
|
||||
done();
|
||||
});
|
||||
|
||||
it("does not track a failed decryption for an event that never becomes visible", function (done) {
|
||||
it("does not track a failed decryption for an event that never becomes visible", function () {
|
||||
const failedDecryptionEvent = createFailedDecryptionEvent();
|
||||
|
||||
let count = 0;
|
||||
@ -137,11 +131,9 @@ describe("DecryptionFailureTracker", function () {
|
||||
tracker.trackFailures();
|
||||
|
||||
expect(count).toBe(0, "should not track a failure for an event that never became visible");
|
||||
|
||||
done();
|
||||
});
|
||||
|
||||
it("does not track a failed decryption where the event is subsequently successfully decrypted", (done) => {
|
||||
it("does not track a failed decryption where the event is subsequently successfully decrypted", () => {
|
||||
const decryptedEvent = createFailedDecryptionEvent();
|
||||
const tracker = new DecryptionFailureTracker(
|
||||
(total) => {
|
||||
@ -164,13 +156,12 @@ describe("DecryptionFailureTracker", function () {
|
||||
|
||||
// Immediately track the newest failures
|
||||
tracker.trackFailures();
|
||||
done();
|
||||
});
|
||||
|
||||
it(
|
||||
"does not track a failed decryption where the event is subsequently successfully decrypted " +
|
||||
"and later becomes visible",
|
||||
(done) => {
|
||||
() => {
|
||||
const decryptedEvent = createFailedDecryptionEvent();
|
||||
const tracker = new DecryptionFailureTracker(
|
||||
(total) => {
|
||||
@ -193,11 +184,10 @@ describe("DecryptionFailureTracker", function () {
|
||||
|
||||
// Immediately track the newest failures
|
||||
tracker.trackFailures();
|
||||
done();
|
||||
},
|
||||
);
|
||||
|
||||
it("only tracks a single failure per event, despite multiple failed decryptions for multiple events", (done) => {
|
||||
it("only tracks a single failure per event, despite multiple failed decryptions for multiple events", () => {
|
||||
const decryptedEvent = createFailedDecryptionEvent();
|
||||
const decryptedEvent2 = createFailedDecryptionEvent();
|
||||
|
||||
@ -231,11 +221,9 @@ describe("DecryptionFailureTracker", function () {
|
||||
tracker.trackFailures();
|
||||
|
||||
expect(count).toBe(2, count + " failures tracked, should only track a single failure per event");
|
||||
|
||||
done();
|
||||
});
|
||||
|
||||
it("should not track a failure for an event that was tracked previously", (done) => {
|
||||
it("should not track a failure for an event that was tracked previously", () => {
|
||||
const decryptedEvent = createFailedDecryptionEvent();
|
||||
|
||||
let count = 0;
|
||||
@ -261,11 +249,9 @@ describe("DecryptionFailureTracker", function () {
|
||||
tracker.trackFailures();
|
||||
|
||||
expect(count).toBe(1, "should only track a single failure per event");
|
||||
|
||||
done();
|
||||
});
|
||||
|
||||
xit("should not track a failure for an event that was tracked in a previous session", (done) => {
|
||||
it.skip("should not track a failure for an event that was tracked in a previous session", () => {
|
||||
// This test uses localStorage, clear it beforehand
|
||||
localStorage.clear();
|
||||
|
||||
@ -304,8 +290,6 @@ describe("DecryptionFailureTracker", function () {
|
||||
secondTracker.trackFailures();
|
||||
|
||||
expect(count).toBe(1, count + " failures tracked, should only track a single failure per event");
|
||||
|
||||
done();
|
||||
});
|
||||
|
||||
it("should count different error codes separately for multiple failures with different error codes", () => {
|
||||
|
@ -302,7 +302,7 @@ describe("Notifier", () => {
|
||||
);
|
||||
});
|
||||
|
||||
it("should display the expected notification for a broadcast chunk with sequence = 1", () => {
|
||||
it("should display the expected notification for a broadcast chunk with sequence = 2", () => {
|
||||
const audioEvent = mkAudioEvent({ sequence: 2 });
|
||||
Notifier.displayPopupNotification(audioEvent, testRoom);
|
||||
expect(MockPlatform.displayNotification).not.toHaveBeenCalled();
|
||||
|
@ -35,7 +35,7 @@ const getFakePosthog = (): PostHog =>
|
||||
register: jest.fn(),
|
||||
} as unknown as PostHog);
|
||||
|
||||
export interface ITestEvent extends IPosthogEvent {
|
||||
interface ITestEvent extends IPosthogEvent {
|
||||
eventName: "JestTestEvents";
|
||||
foo?: string;
|
||||
}
|
||||
|
@ -218,7 +218,7 @@ describe("RoomNotifs test", () => {
|
||||
expect(getUnreadNotificationCount(room, NotificationCountType.Highlight, THREAD_ID)).toBe(0);
|
||||
});
|
||||
|
||||
it("counts notifications type", () => {
|
||||
it("counts thread notifications type", () => {
|
||||
room.setThreadUnreadNotificationCount(THREAD_ID, NotificationCountType.Total, 2);
|
||||
room.setThreadUnreadNotificationCount(THREAD_ID, NotificationCountType.Highlight, 1);
|
||||
|
||||
|
@ -58,7 +58,7 @@ describe("ScalarAuthClient", function () {
|
||||
|
||||
await sac.connect();
|
||||
|
||||
expect(sac.exchangeForScalarToken).toBeCalledWith(tokenObject);
|
||||
expect(sac.exchangeForScalarToken).toHaveBeenCalledWith(tokenObject);
|
||||
expect(sac.hasCredentials).toBeTruthy();
|
||||
// @ts-ignore private property
|
||||
expect(sac.scalarToken).toEqual("wokentoken");
|
||||
|
@ -46,7 +46,7 @@ describe("SlidingSyncManager", () => {
|
||||
mocked(slidingSync.getRoomSubscriptions).mockReturnValue(subs);
|
||||
mocked(slidingSync.modifyRoomSubscriptions).mockResolvedValue("yep");
|
||||
await manager.setRoomVisible(roomId, true);
|
||||
expect(slidingSync.modifyRoomSubscriptions).toBeCalledWith(new Set<string>([roomId]));
|
||||
expect(slidingSync.modifyRoomSubscriptions).toHaveBeenCalledWith(new Set<string>([roomId]));
|
||||
});
|
||||
it("adds a custom subscription for a lazy-loadable room", async () => {
|
||||
const roomId = "!lazy:id";
|
||||
@ -72,9 +72,9 @@ describe("SlidingSyncManager", () => {
|
||||
mocked(slidingSync.getRoomSubscriptions).mockReturnValue(subs);
|
||||
mocked(slidingSync.modifyRoomSubscriptions).mockResolvedValue("yep");
|
||||
await manager.setRoomVisible(roomId, true);
|
||||
expect(slidingSync.modifyRoomSubscriptions).toBeCalledWith(new Set<string>([roomId]));
|
||||
expect(slidingSync.modifyRoomSubscriptions).toHaveBeenCalledWith(new Set<string>([roomId]));
|
||||
// we aren't prescriptive about what the sub name is.
|
||||
expect(slidingSync.useCustomSubscription).toBeCalledWith(roomId, expect.anything());
|
||||
expect(slidingSync.useCustomSubscription).toHaveBeenCalledWith(roomId, expect.anything());
|
||||
});
|
||||
});
|
||||
|
||||
@ -86,7 +86,7 @@ describe("SlidingSyncManager", () => {
|
||||
await manager.ensureListRegistered(listKey, {
|
||||
sort: ["by_recency"],
|
||||
});
|
||||
expect(slidingSync.setList).toBeCalledWith(
|
||||
expect(slidingSync.setList).toHaveBeenCalledWith(
|
||||
listKey,
|
||||
expect.objectContaining({
|
||||
sort: ["by_recency"],
|
||||
@ -103,7 +103,7 @@ describe("SlidingSyncManager", () => {
|
||||
await manager.ensureListRegistered(listKey, {
|
||||
sort: ["by_recency"],
|
||||
});
|
||||
expect(slidingSync.setList).toBeCalledWith(
|
||||
expect(slidingSync.setList).toHaveBeenCalledWith(
|
||||
listKey,
|
||||
expect.objectContaining({
|
||||
sort: ["by_recency"],
|
||||
@ -121,8 +121,8 @@ describe("SlidingSyncManager", () => {
|
||||
await manager.ensureListRegistered(listKey, {
|
||||
ranges: [[0, 52]],
|
||||
});
|
||||
expect(slidingSync.setList).not.toBeCalled();
|
||||
expect(slidingSync.setListRanges).toBeCalledWith(listKey, [[0, 52]]);
|
||||
expect(slidingSync.setList).not.toHaveBeenCalled();
|
||||
expect(slidingSync.setListRanges).toHaveBeenCalledWith(listKey, [[0, 52]]);
|
||||
});
|
||||
|
||||
it("no-ops for idential changes", async () => {
|
||||
@ -136,8 +136,8 @@ describe("SlidingSyncManager", () => {
|
||||
ranges: [[0, 42]],
|
||||
sort: ["by_recency"],
|
||||
});
|
||||
expect(slidingSync.setList).not.toBeCalled();
|
||||
expect(slidingSync.setListRanges).not.toBeCalled();
|
||||
expect(slidingSync.setList).not.toHaveBeenCalled();
|
||||
expect(slidingSync.setListRanges).not.toHaveBeenCalled();
|
||||
});
|
||||
});
|
||||
|
||||
@ -163,12 +163,12 @@ describe("SlidingSyncManager", () => {
|
||||
[50, 59],
|
||||
[60, 69],
|
||||
];
|
||||
expect(slidingSync.getListData).toBeCalledTimes(wantWindows.length);
|
||||
expect(slidingSync.setList).toBeCalledTimes(1);
|
||||
expect(slidingSync.setListRanges).toBeCalledTimes(wantWindows.length - 1);
|
||||
expect(slidingSync.getListData).toHaveBeenCalledTimes(wantWindows.length);
|
||||
expect(slidingSync.setList).toHaveBeenCalledTimes(1);
|
||||
expect(slidingSync.setListRanges).toHaveBeenCalledTimes(wantWindows.length - 1);
|
||||
wantWindows.forEach((range, i) => {
|
||||
if (i === 0) {
|
||||
expect(slidingSync.setList).toBeCalledWith(
|
||||
expect(slidingSync.setList).toHaveBeenCalledWith(
|
||||
SlidingSyncManager.ListSearch,
|
||||
expect.objectContaining({
|
||||
ranges: [[0, batchSize - 1], range],
|
||||
@ -176,7 +176,7 @@ describe("SlidingSyncManager", () => {
|
||||
);
|
||||
return;
|
||||
}
|
||||
expect(slidingSync.setListRanges).toBeCalledWith(SlidingSyncManager.ListSearch, [
|
||||
expect(slidingSync.setListRanges).toHaveBeenCalledWith(SlidingSyncManager.ListSearch, [
|
||||
[0, batchSize - 1],
|
||||
range,
|
||||
]);
|
||||
@ -193,9 +193,9 @@ describe("SlidingSyncManager", () => {
|
||||
};
|
||||
});
|
||||
await manager.startSpidering(batchSize, gapMs);
|
||||
expect(slidingSync.getListData).toBeCalledTimes(1);
|
||||
expect(slidingSync.setList).toBeCalledTimes(1);
|
||||
expect(slidingSync.setList).toBeCalledWith(
|
||||
expect(slidingSync.getListData).toHaveBeenCalledTimes(1);
|
||||
expect(slidingSync.setList).toHaveBeenCalledTimes(1);
|
||||
expect(slidingSync.setList).toHaveBeenCalledWith(
|
||||
SlidingSyncManager.ListSearch,
|
||||
expect.objectContaining({
|
||||
ranges: [
|
||||
@ -216,9 +216,9 @@ describe("SlidingSyncManager", () => {
|
||||
};
|
||||
});
|
||||
await manager.startSpidering(batchSize, gapMs);
|
||||
expect(slidingSync.getListData).toBeCalledTimes(1);
|
||||
expect(slidingSync.setList).toBeCalledTimes(1);
|
||||
expect(slidingSync.setList).toBeCalledWith(
|
||||
expect(slidingSync.getListData).toHaveBeenCalledTimes(1);
|
||||
expect(slidingSync.setList).toHaveBeenCalledTimes(1);
|
||||
expect(slidingSync.setList).toHaveBeenCalledWith(
|
||||
SlidingSyncManager.ListSearch,
|
||||
expect.objectContaining({
|
||||
ranges: [
|
||||
|
@ -68,7 +68,7 @@ describe("Terms", function () {
|
||||
const interactionCallback = jest.fn().mockResolvedValue([]);
|
||||
await startTermsFlow([IM_SERVICE_ONE], interactionCallback);
|
||||
|
||||
expect(interactionCallback).toBeCalledWith(
|
||||
expect(interactionCallback).toHaveBeenCalledWith(
|
||||
[
|
||||
{
|
||||
service: IM_SERVICE_ONE,
|
||||
@ -100,7 +100,7 @@ describe("Terms", function () {
|
||||
await startTermsFlow([IM_SERVICE_ONE], interactionCallback);
|
||||
|
||||
expect(interactionCallback).not.toHaveBeenCalled();
|
||||
expect(mockClient.agreeToTerms).toBeCalledWith(SERVICE_TYPES.IM, "https://imone.test", "a token token", [
|
||||
expect(mockClient.agreeToTerms).toHaveBeenCalledWith(SERVICE_TYPES.IM, "https://imone.test", "a token token", [
|
||||
"http://example.com/one",
|
||||
]);
|
||||
});
|
||||
@ -124,7 +124,7 @@ describe("Terms", function () {
|
||||
const interactionCallback = jest.fn().mockResolvedValue(["http://example.com/one", "http://example.com/two"]);
|
||||
await startTermsFlow([IM_SERVICE_ONE], interactionCallback);
|
||||
|
||||
expect(interactionCallback).toBeCalledWith(
|
||||
expect(interactionCallback).toHaveBeenCalledWith(
|
||||
[
|
||||
{
|
||||
service: IM_SERVICE_ONE,
|
||||
@ -135,7 +135,7 @@ describe("Terms", function () {
|
||||
],
|
||||
["http://example.com/one"],
|
||||
);
|
||||
expect(mockClient.agreeToTerms).toBeCalledWith(SERVICE_TYPES.IM, "https://imone.test", "a token token", [
|
||||
expect(mockClient.agreeToTerms).toHaveBeenCalledWith(SERVICE_TYPES.IM, "https://imone.test", "a token token", [
|
||||
"http://example.com/one",
|
||||
"http://example.com/two",
|
||||
]);
|
||||
@ -170,7 +170,7 @@ describe("Terms", function () {
|
||||
const interactionCallback = jest.fn().mockResolvedValue(["http://example.com/one", "http://example.com/two"]);
|
||||
await startTermsFlow([IM_SERVICE_ONE, IM_SERVICE_TWO], interactionCallback);
|
||||
|
||||
expect(interactionCallback).toBeCalledWith(
|
||||
expect(interactionCallback).toHaveBeenCalledWith(
|
||||
[
|
||||
{
|
||||
service: IM_SERVICE_TWO,
|
||||
@ -181,10 +181,10 @@ describe("Terms", function () {
|
||||
],
|
||||
["http://example.com/one"],
|
||||
);
|
||||
expect(mockClient.agreeToTerms).toBeCalledWith(SERVICE_TYPES.IM, "https://imone.test", "a token token", [
|
||||
expect(mockClient.agreeToTerms).toHaveBeenCalledWith(SERVICE_TYPES.IM, "https://imone.test", "a token token", [
|
||||
"http://example.com/one",
|
||||
]);
|
||||
expect(mockClient.agreeToTerms).toBeCalledWith(SERVICE_TYPES.IM, "https://imtwo.test", "a token token", [
|
||||
expect(mockClient.agreeToTerms).toHaveBeenCalledWith(SERVICE_TYPES.IM, "https://imtwo.test", "a token token", [
|
||||
"http://example.com/two",
|
||||
]);
|
||||
});
|
||||
|
@ -471,7 +471,7 @@ describe("TextForEvent", () => {
|
||||
expect(textForEvent(callEvent)).toEqual("Video call started in Test room.");
|
||||
});
|
||||
|
||||
it("returns correct message for call event when supported", () => {
|
||||
it("returns correct message for call event when not supported", () => {
|
||||
mocked(mockClient).supportsVoip.mockReturnValue(false);
|
||||
|
||||
expect(textForEvent(callEvent)).toEqual(
|
||||
|
@ -59,7 +59,7 @@ describe("KeyboardShortcutUtils", () => {
|
||||
});
|
||||
|
||||
describe("correctly filters shortcuts", () => {
|
||||
it("when on web and not on macOS ", async () => {
|
||||
it("when on web and not on macOS", async () => {
|
||||
mockKeyboardShortcuts({
|
||||
KEYBOARD_SHORTCUTS: {
|
||||
Keybind1: {},
|
||||
|
@ -46,7 +46,6 @@ const roomId = "!roomId:server_name";
|
||||
|
||||
describe("MessagePanel", function () {
|
||||
let clock: FakeTimers.InstalledClock;
|
||||
const realSetTimeout = window.setTimeout;
|
||||
const events = mkEvents();
|
||||
const userId = "@me:here";
|
||||
const client = getMockClientWithEventEmitter({
|
||||
@ -404,7 +403,7 @@ describe("MessagePanel", function () {
|
||||
expect(isReadMarkerVisible(rm)).toBeFalsy();
|
||||
});
|
||||
|
||||
it("shows a ghost read-marker when the read-marker moves", function (done) {
|
||||
it("shows a ghost read-marker when the read-marker moves", function () {
|
||||
// fake the clock so that we can test the velocity animation.
|
||||
clock = FakeTimers.install();
|
||||
|
||||
@ -446,19 +445,9 @@ describe("MessagePanel", function () {
|
||||
// the second should be the real thing
|
||||
expect(readMarkers[1].previousSibling).toEqual(tiles[6]);
|
||||
|
||||
// advance the clock, and then let the browser run an animation frame,
|
||||
// to let the animation start
|
||||
// advance the clock, and then let the browser run an animation frame to let the animation start
|
||||
clock.tick(1500);
|
||||
|
||||
realSetTimeout(() => {
|
||||
// then advance it again to let it complete
|
||||
clock.tick(1000);
|
||||
realSetTimeout(() => {
|
||||
// the ghost should now have finished
|
||||
expect(hr.style.opacity).toEqual("0");
|
||||
done();
|
||||
}, 100);
|
||||
}, 100);
|
||||
expect(hr.style.opacity).toEqual("0");
|
||||
});
|
||||
|
||||
it("should collapse creation events", function () {
|
||||
|
@ -147,7 +147,7 @@ describe("ThreadView", () => {
|
||||
);
|
||||
});
|
||||
|
||||
it("sends a message with the correct fallback", async () => {
|
||||
it("sends a thread message with the correct fallback", async () => {
|
||||
const { container } = await getComponent();
|
||||
|
||||
const { rootEvent: rootEvent2 } = mkThread({
|
||||
|
@ -84,7 +84,7 @@ describe("InteractiveAuthComponent", function () {
|
||||
await flushPromises();
|
||||
|
||||
expect(makeRequest).toHaveBeenCalledTimes(1);
|
||||
expect(makeRequest).toBeCalledWith(
|
||||
expect(makeRequest).toHaveBeenCalledWith(
|
||||
expect.objectContaining({
|
||||
session: "sess",
|
||||
type: "m.login.registration_token",
|
||||
@ -92,8 +92,8 @@ describe("InteractiveAuthComponent", function () {
|
||||
}),
|
||||
);
|
||||
|
||||
expect(onAuthFinished).toBeCalledTimes(1);
|
||||
expect(onAuthFinished).toBeCalledWith(
|
||||
expect(onAuthFinished).toHaveBeenCalledTimes(1);
|
||||
expect(onAuthFinished).toHaveBeenCalledWith(
|
||||
true,
|
||||
{ a: 1 },
|
||||
{ clientSecret: "t35tcl1Ent5ECr3T", emailSid: undefined },
|
||||
|
@ -79,7 +79,7 @@ describe("InteractiveAuthDialog", function () {
|
||||
await flushPromises();
|
||||
|
||||
expect(makeRequest).toHaveBeenCalledTimes(1);
|
||||
expect(makeRequest).toBeCalledWith(
|
||||
expect(makeRequest).toHaveBeenCalledWith(
|
||||
expect.objectContaining({
|
||||
session: "sess",
|
||||
type: "m.login.password",
|
||||
@ -91,7 +91,7 @@ describe("InteractiveAuthDialog", function () {
|
||||
}),
|
||||
);
|
||||
|
||||
expect(onFinished).toBeCalledTimes(1);
|
||||
expect(onFinished).toBeCalledWith(true, { a: 1 });
|
||||
expect(onFinished).toHaveBeenCalledTimes(1);
|
||||
expect(onFinished).toHaveBeenCalledWith(true, { a: 1 });
|
||||
});
|
||||
});
|
||||
|
@ -69,7 +69,7 @@ describe("<MessageEditHistory />", () => {
|
||||
expect(container).toMatchSnapshot();
|
||||
});
|
||||
|
||||
it("should support events with ", async () => {
|
||||
it("should support events with", async () => {
|
||||
mockEdits(
|
||||
{ msg: "My Great Massage", ts: undefined },
|
||||
{ msg: "My Great Massage?", ts: undefined },
|
||||
|
@ -112,7 +112,7 @@ exports[`<MessageEditHistory /> should match the snapshot 1`] = `
|
||||
</div>
|
||||
`;
|
||||
|
||||
exports[`<MessageEditHistory /> should support events with 1`] = `
|
||||
exports[`<MessageEditHistory /> should support events with 1`] = `
|
||||
<div>
|
||||
<div
|
||||
data-focus-guard="true"
|
||||
|
@ -431,30 +431,5 @@ describe("<PollHistoryDialog />", () => {
|
||||
`https://matrix.to/#/!room:domain.org/${pollEnd3.getId()!}`,
|
||||
);
|
||||
});
|
||||
|
||||
it("navigates back to poll list from detail view on header click", async () => {
|
||||
await setupRoomWithPollEvents([pollStart1, pollStart2, pollStart3], [], [pollEnd3], mockClient, room);
|
||||
|
||||
const { getByText, queryByText, getByTestId, container } = getComponent();
|
||||
await flushPromises();
|
||||
|
||||
fireEvent.click(getByText("Question?"));
|
||||
|
||||
// detail view
|
||||
expect(getByText("Question?")).toBeInTheDocument();
|
||||
|
||||
// header not shown
|
||||
expect(queryByText("Polls history")).not.toBeInTheDocument();
|
||||
|
||||
expect(getByText("Active polls")).toMatchSnapshot();
|
||||
fireEvent.click(getByText("Active polls"));
|
||||
|
||||
// main list header displayed again
|
||||
expect(getByText("Polls history")).toBeInTheDocument();
|
||||
// active filter still active
|
||||
expect(getByTestId("filter-tab-PollHistoryDialog_filter-ACTIVE").firstElementChild).toBeChecked();
|
||||
// list displayed
|
||||
expect(container.getElementsByClassName("mx_PollHistoryList_list").length).toBeTruthy();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -29,19 +29,6 @@ exports[`<PollHistoryDialog /> Poll detail navigates back to poll list from deta
|
||||
</div>
|
||||
`;
|
||||
|
||||
exports[`<PollHistoryDialog /> Poll detail navigates back to poll list from detail view on header click 2`] = `
|
||||
<div
|
||||
class="mx_AccessibleButton mx_PollDetailHeader mx_AccessibleButton_hasKind mx_AccessibleButton_kind_content_inline"
|
||||
role="button"
|
||||
tabindex="0"
|
||||
>
|
||||
<div
|
||||
class="mx_PollDetailHeader_icon"
|
||||
/>
|
||||
Active polls
|
||||
</div>
|
||||
`;
|
||||
|
||||
exports[`<PollHistoryDialog /> renders a list of active polls when there are polls in the room 1`] = `
|
||||
<div>
|
||||
<div
|
||||
|
@ -156,7 +156,7 @@ describe("EventListSummary", function () {
|
||||
expect(children[0]).toHaveTextContent("Expanded membership");
|
||||
});
|
||||
|
||||
it("renders expanded events if there are less than props.threshold", function () {
|
||||
it("renders expanded events if there are less than props.threshold for join and leave", function () {
|
||||
const events = generateEvents([
|
||||
{ userId: "@user_1:some.domain", prevMembership: "leave", membership: "join" },
|
||||
{ userId: "@user_1:some.domain", prevMembership: "join", membership: "leave" },
|
||||
|
@ -252,15 +252,6 @@ describe("<MBeaconBody />", () => {
|
||||
expect(modalSpy).toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it("does nothing on click when a beacon has no location", () => {
|
||||
makeRoomWithStateEvents([aliceBeaconInfo], { roomId, mockClient });
|
||||
const component = getComponent({ mxEvent: aliceBeaconInfo });
|
||||
|
||||
fireEvent.click(component.container.querySelector(".mx_MBeaconBody_map")!);
|
||||
|
||||
expect(modalSpy).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it("updates latest location", () => {
|
||||
const room = makeRoomWithStateEvents([aliceBeaconInfo], { roomId, mockClient });
|
||||
getComponent({ mxEvent: aliceBeaconInfo });
|
||||
|
@ -958,7 +958,7 @@ function endedVotesCount(renderResult: RenderResult, value: string): string {
|
||||
return votesCount(renderResult, value);
|
||||
}
|
||||
|
||||
export function newPollStart(answers?: PollAnswer[], question?: string, disclosed = true): PollStartEventContent {
|
||||
function newPollStart(answers?: PollAnswer[], question?: string, disclosed = true): PollStartEventContent {
|
||||
if (!answers) {
|
||||
answers = [
|
||||
{ id: "pizza", [M_TEXT.name]: "Pizza" },
|
||||
@ -1033,7 +1033,7 @@ function expectedResponseEventCall(answer: string) {
|
||||
return [roomId, eventType, content];
|
||||
}
|
||||
|
||||
export function newPollEndEvent(sender = "@me:example.com", ts = 0): MatrixEvent {
|
||||
function newPollEndEvent(sender = "@me:example.com", ts = 0): MatrixEvent {
|
||||
return makePollEndEvent("$mypoll", "#myroom:example.com", sender, ts);
|
||||
}
|
||||
|
||||
|
@ -195,7 +195,7 @@ describe("<MessageActionBar />", () => {
|
||||
// because beforeRedaction event is fired... before redaction
|
||||
// event is unchanged at point when this component updates
|
||||
// TODO file bug
|
||||
xit("updates component on before redaction event", () => {
|
||||
it.skip("updates component on before redaction event", () => {
|
||||
const event = new MatrixEvent({
|
||||
type: EventType.RoomMessage,
|
||||
sender: userId,
|
||||
|
@ -420,7 +420,7 @@ describe("<UserOptionsSection />", () => {
|
||||
expect(screen.getByRole("button", { name: /share link to user/i })).toBeInTheDocument();
|
||||
});
|
||||
|
||||
it("does not show ignore or direct message buttons when member userId matches client userId ", () => {
|
||||
it("does not show ignore or direct message buttons when member userId matches client userId", () => {
|
||||
mockClient.getUserId.mockReturnValueOnce(member.userId);
|
||||
renderComponent();
|
||||
|
||||
@ -428,7 +428,7 @@ describe("<UserOptionsSection />", () => {
|
||||
expect(screen.queryByRole("button", { name: /message/i })).not.toBeInTheDocument();
|
||||
});
|
||||
|
||||
it("shows ignore, direct message and mention buttons when member userId does not match client userId ", () => {
|
||||
it("shows ignore, direct message and mention buttons when member userId does not match client userId", () => {
|
||||
// call to client.getUserId returns undefined, which will not match member.userId
|
||||
renderComponent();
|
||||
|
||||
|
@ -137,13 +137,11 @@ describe("MemberList", () => {
|
||||
) as unknown as Component;
|
||||
});
|
||||
|
||||
afterEach((done) => {
|
||||
afterEach(() => {
|
||||
if (parentDiv) {
|
||||
ReactDOM.unmountComponentAtNode(parentDiv);
|
||||
parentDiv.remove();
|
||||
}
|
||||
|
||||
done();
|
||||
});
|
||||
|
||||
function expectOrderedByPresenceAndPowerLevel(memberTiles: MemberTile[], isPresenceEnabled: boolean) {
|
||||
|
@ -177,12 +177,12 @@ describe("EditWysiwygComposer", () => {
|
||||
screen.getByText("Cancel").click();
|
||||
|
||||
// Then
|
||||
expect(spyDispatcher).toBeCalledWith({
|
||||
expect(spyDispatcher).toHaveBeenCalledWith({
|
||||
action: Action.EditEvent,
|
||||
event: null,
|
||||
timelineRenderingType: defaultRoomContext.timelineRenderingType,
|
||||
});
|
||||
expect(spyDispatcher).toBeCalledWith({
|
||||
expect(spyDispatcher).toHaveBeenCalledWith({
|
||||
action: Action.FocusSendMessageComposer,
|
||||
context: defaultRoomContext.timelineRenderingType,
|
||||
});
|
||||
@ -215,10 +215,10 @@ describe("EditWysiwygComposer", () => {
|
||||
"msgtype": "m.text",
|
||||
};
|
||||
await waitFor(() =>
|
||||
expect(mockClient.sendMessage).toBeCalledWith(mockEvent.getRoomId(), null, expectedContent),
|
||||
expect(mockClient.sendMessage).toHaveBeenCalledWith(mockEvent.getRoomId(), null, expectedContent),
|
||||
);
|
||||
|
||||
expect(spyDispatcher).toBeCalledWith({ action: "message_sent" });
|
||||
expect(spyDispatcher).toHaveBeenCalledWith({ action: "message_sent" });
|
||||
});
|
||||
});
|
||||
|
||||
|
@ -84,7 +84,7 @@ describe("LinkModal", () => {
|
||||
// Then
|
||||
await waitFor(() => {
|
||||
expect(selectionSpy).toHaveBeenCalledWith(defaultValue);
|
||||
expect(onFinished).toBeCalledTimes(1);
|
||||
expect(onFinished).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
|
||||
// Then
|
||||
@ -127,7 +127,7 @@ describe("LinkModal", () => {
|
||||
// Then
|
||||
await waitFor(() => {
|
||||
expect(selectionSpy).toHaveBeenCalledWith(defaultValue);
|
||||
expect(onFinished).toBeCalledTimes(1);
|
||||
expect(onFinished).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
|
||||
// Then
|
||||
@ -142,7 +142,7 @@ describe("LinkModal", () => {
|
||||
|
||||
// Then
|
||||
expect(formattingFunctions.removeLinks).toHaveBeenCalledTimes(1);
|
||||
expect(onFinished).toBeCalledTimes(1);
|
||||
expect(onFinished).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
|
||||
it("Should display the link in editing", async () => {
|
||||
|
@ -74,7 +74,7 @@ describe("PlainTextComposer", () => {
|
||||
await userEvent.type(screen.getByRole("textbox"), content);
|
||||
|
||||
// Then
|
||||
expect(onChange).toBeCalledWith(content);
|
||||
expect(onChange).toHaveBeenCalledWith(content);
|
||||
});
|
||||
|
||||
it("Should call onSend when Enter is pressed when ctrlEnterToSend is false", async () => {
|
||||
@ -84,7 +84,7 @@ describe("PlainTextComposer", () => {
|
||||
await userEvent.type(screen.getByRole("textbox"), "{enter}");
|
||||
|
||||
// Then it sends a message
|
||||
expect(onSend).toBeCalledTimes(1);
|
||||
expect(onSend).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
|
||||
it("Should not call onSend when Enter is pressed when ctrlEnterToSend is true", async () => {
|
||||
@ -95,7 +95,7 @@ describe("PlainTextComposer", () => {
|
||||
await userEvent.type(screen.getByRole("textbox"), "{enter}");
|
||||
|
||||
// Then it does not send a message
|
||||
expect(onSend).toBeCalledTimes(0);
|
||||
expect(onSend).toHaveBeenCalledTimes(0);
|
||||
});
|
||||
|
||||
it("Should only call onSend when ctrl+enter is pressed when ctrlEnterToSend is true on windows", async () => {
|
||||
@ -109,15 +109,15 @@ describe("PlainTextComposer", () => {
|
||||
|
||||
// Then it does NOT send a message on enter
|
||||
await userEvent.type(textBox, "{enter}");
|
||||
expect(onSend).toBeCalledTimes(0);
|
||||
expect(onSend).toHaveBeenCalledTimes(0);
|
||||
|
||||
// Then it does NOT send a message on windows+enter
|
||||
await userEvent.type(textBox, "{meta>}{enter}{meta/}");
|
||||
expect(onSend).toBeCalledTimes(0);
|
||||
expect(onSend).toHaveBeenCalledTimes(0);
|
||||
|
||||
// Then it does send a message on ctrl+enter
|
||||
await userEvent.type(textBox, "{control>}{enter}{control/}");
|
||||
expect(onSend).toBeCalledTimes(1);
|
||||
expect(onSend).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
|
||||
it("Should only call onSend when cmd+enter is pressed when ctrlEnterToSend is true on mac", async () => {
|
||||
@ -132,15 +132,15 @@ describe("PlainTextComposer", () => {
|
||||
|
||||
// Then it does NOT send a message on enter
|
||||
await userEvent.type(textBox, "{enter}");
|
||||
expect(onSend).toBeCalledTimes(0);
|
||||
expect(onSend).toHaveBeenCalledTimes(0);
|
||||
|
||||
// Then it does NOT send a message on ctrl+enter
|
||||
await userEvent.type(textBox, "{control>}{enter}{control/}");
|
||||
expect(onSend).toBeCalledTimes(0);
|
||||
expect(onSend).toHaveBeenCalledTimes(0);
|
||||
|
||||
// Then it does send a message on cmd+enter
|
||||
await userEvent.type(textBox, "{meta>}{enter}{meta/}");
|
||||
expect(onSend).toBeCalledTimes(1);
|
||||
expect(onSend).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
|
||||
it("Should insert a newline character when shift enter is pressed when ctrlEnterToSend is false", async () => {
|
||||
@ -155,7 +155,7 @@ describe("PlainTextComposer", () => {
|
||||
await userEvent.type(textBox, inputWithShiftEnter);
|
||||
|
||||
// Then it does not send a message, but inserts a newline character
|
||||
expect(onSend).toBeCalledTimes(0);
|
||||
expect(onSend).toHaveBeenCalledTimes(0);
|
||||
expect(textBox.innerHTML).toBe(expectedInnerHtml);
|
||||
});
|
||||
|
||||
@ -172,7 +172,7 @@ describe("PlainTextComposer", () => {
|
||||
await userEvent.type(textBox, keyboardInput);
|
||||
|
||||
// Then it does not send a message, but inserts a newline character
|
||||
expect(onSend).toBeCalledTimes(0);
|
||||
expect(onSend).toHaveBeenCalledTimes(0);
|
||||
expect(textBox.innerHTML).toBe(expectedInnerHtml);
|
||||
});
|
||||
|
||||
@ -188,7 +188,7 @@ describe("PlainTextComposer", () => {
|
||||
await userEvent.type(textBox, "{enter}hello");
|
||||
|
||||
// Then it does not send a message, but inserts a newline character
|
||||
expect(onSend).toBeCalledTimes(0);
|
||||
expect(onSend).toHaveBeenCalledTimes(0);
|
||||
expect(textBox).not.toContainHTML(enterThenTypeHtml);
|
||||
});
|
||||
|
||||
@ -204,7 +204,7 @@ describe("PlainTextComposer", () => {
|
||||
await userEvent.type(textBox, "{enter}");
|
||||
|
||||
// Then it does not send a message, but inserts a newline character
|
||||
expect(onSend).toBeCalledTimes(0);
|
||||
expect(onSend).toHaveBeenCalledTimes(0);
|
||||
expect(textBox).not.toContainHTML(defaultEnterHtml);
|
||||
});
|
||||
|
||||
|
@ -88,10 +88,10 @@ describe("WysiwygComposer", () => {
|
||||
});
|
||||
|
||||
// Then
|
||||
await waitFor(() => expect(onChange).toBeCalledWith("foo bar"));
|
||||
await waitFor(() => expect(onChange).toHaveBeenCalledWith("foo bar"));
|
||||
});
|
||||
|
||||
it("Should call onSend when Enter is pressed ", async () => {
|
||||
it("Should call onSend when Enter is pressed", async () => {
|
||||
//When
|
||||
fireEvent(
|
||||
screen.getByRole("textbox"),
|
||||
@ -101,18 +101,18 @@ describe("WysiwygComposer", () => {
|
||||
);
|
||||
|
||||
// Then it sends a message
|
||||
await waitFor(() => expect(onSend).toBeCalledTimes(1));
|
||||
await waitFor(() => expect(onSend).toHaveBeenCalledTimes(1));
|
||||
});
|
||||
|
||||
it("Should not call onSend when Shift+Enter is pressed ", async () => {
|
||||
it("Should not call onSend when Shift+Enter is pressed", async () => {
|
||||
//When
|
||||
await userEvent.type(screen.getByRole("textbox"), "{shift>}{enter}");
|
||||
|
||||
// Then it sends a message
|
||||
await waitFor(() => expect(onSend).toBeCalledTimes(0));
|
||||
await waitFor(() => expect(onSend).toHaveBeenCalledTimes(0));
|
||||
});
|
||||
|
||||
it("Should not call onSend when ctrl+Enter is pressed ", async () => {
|
||||
it("Should not call onSend when ctrl+Enter is pressed", async () => {
|
||||
//When
|
||||
// Using userEvent.type or .keyboard wasn't working as expected in the case of ctrl+enter
|
||||
fireEvent(
|
||||
@ -124,23 +124,23 @@ describe("WysiwygComposer", () => {
|
||||
);
|
||||
|
||||
// Then it sends a message
|
||||
await waitFor(() => expect(onSend).toBeCalledTimes(0));
|
||||
await waitFor(() => expect(onSend).toHaveBeenCalledTimes(0));
|
||||
});
|
||||
|
||||
it("Should not call onSend when alt+Enter is pressed ", async () => {
|
||||
it("Should not call onSend when alt+Enter is pressed", async () => {
|
||||
//When
|
||||
await userEvent.type(screen.getByRole("textbox"), "{alt>}{enter}");
|
||||
|
||||
// Then it sends a message
|
||||
await waitFor(() => expect(onSend).toBeCalledTimes(0));
|
||||
await waitFor(() => expect(onSend).toHaveBeenCalledTimes(0));
|
||||
});
|
||||
|
||||
it("Should not call onSend when meta+Enter is pressed ", async () => {
|
||||
it("Should not call onSend when meta+Enter is pressed", async () => {
|
||||
//When
|
||||
await userEvent.type(screen.getByRole("textbox"), "{meta>}{enter}");
|
||||
|
||||
// Then it sends a message
|
||||
await waitFor(() => expect(onSend).toBeCalledTimes(0));
|
||||
await waitFor(() => expect(onSend).toHaveBeenCalledTimes(0));
|
||||
});
|
||||
});
|
||||
|
||||
@ -172,7 +172,7 @@ describe("WysiwygComposer", () => {
|
||||
);
|
||||
|
||||
// Then it does not send a message
|
||||
await waitFor(() => expect(onSend).toBeCalledTimes(0));
|
||||
await waitFor(() => expect(onSend).toHaveBeenCalledTimes(0));
|
||||
|
||||
fireEvent(
|
||||
textbox,
|
||||
@ -201,7 +201,7 @@ describe("WysiwygComposer", () => {
|
||||
);
|
||||
|
||||
// Then it sends a message
|
||||
await waitFor(() => expect(onSend).toBeCalledTimes(1));
|
||||
await waitFor(() => expect(onSend).toHaveBeenCalledTimes(1));
|
||||
});
|
||||
});
|
||||
|
||||
@ -269,7 +269,7 @@ describe("WysiwygComposer", () => {
|
||||
});
|
||||
|
||||
// Then
|
||||
expect(spyDispatcher).toBeCalledTimes(0);
|
||||
expect(spyDispatcher).toHaveBeenCalledTimes(0);
|
||||
});
|
||||
|
||||
it("Should moving when the composer is empty", async () => {
|
||||
@ -281,7 +281,7 @@ describe("WysiwygComposer", () => {
|
||||
});
|
||||
|
||||
// Then
|
||||
expect(spyDispatcher).toBeCalledWith({
|
||||
expect(spyDispatcher).toHaveBeenCalledWith({
|
||||
action: Action.EditEvent,
|
||||
event: mockEvent,
|
||||
timelineRenderingType: defaultRoomContext.timelineRenderingType,
|
||||
@ -316,7 +316,7 @@ describe("WysiwygComposer", () => {
|
||||
});
|
||||
|
||||
// Then
|
||||
expect(spyDispatcher).toBeCalledTimes(0);
|
||||
expect(spyDispatcher).toHaveBeenCalledTimes(0);
|
||||
});
|
||||
|
||||
it("Should not moving when the content has changed", async () => {
|
||||
@ -340,7 +340,7 @@ describe("WysiwygComposer", () => {
|
||||
});
|
||||
|
||||
// Then
|
||||
expect(spyDispatcher).toBeCalledTimes(0);
|
||||
expect(spyDispatcher).toHaveBeenCalledTimes(0);
|
||||
});
|
||||
|
||||
it("Should moving up", async () => {
|
||||
@ -366,7 +366,7 @@ describe("WysiwygComposer", () => {
|
||||
|
||||
// Then
|
||||
await waitFor(() =>
|
||||
expect(spyDispatcher).toBeCalledWith({
|
||||
expect(spyDispatcher).toHaveBeenCalledWith({
|
||||
action: Action.EditEvent,
|
||||
event: mockEvent,
|
||||
timelineRenderingType: defaultRoomContext.timelineRenderingType,
|
||||
@ -401,7 +401,7 @@ describe("WysiwygComposer", () => {
|
||||
});
|
||||
|
||||
// Then
|
||||
expect(spyDispatcher).toBeCalledWith({
|
||||
expect(spyDispatcher).toHaveBeenCalledWith({
|
||||
action: Action.EditEvent,
|
||||
event: mockEvent,
|
||||
timelineRenderingType: defaultRoomContext.timelineRenderingType,
|
||||
@ -427,7 +427,7 @@ describe("WysiwygComposer", () => {
|
||||
});
|
||||
|
||||
// Then
|
||||
expect(spyDispatcher).toBeCalledTimes(0);
|
||||
expect(spyDispatcher).toHaveBeenCalledTimes(0);
|
||||
});
|
||||
|
||||
it("Should not moving when the content has changed", async () => {
|
||||
@ -451,7 +451,7 @@ describe("WysiwygComposer", () => {
|
||||
});
|
||||
|
||||
// Then
|
||||
expect(spyDispatcher).toBeCalledTimes(0);
|
||||
expect(spyDispatcher).toHaveBeenCalledTimes(0);
|
||||
});
|
||||
|
||||
it("Should moving down", async () => {
|
||||
@ -479,7 +479,7 @@ describe("WysiwygComposer", () => {
|
||||
|
||||
// Then
|
||||
await waitFor(() =>
|
||||
expect(spyDispatcher).toBeCalledWith({
|
||||
expect(spyDispatcher).toHaveBeenCalledWith({
|
||||
action: Action.EditEvent,
|
||||
event: mockEvent,
|
||||
timelineRenderingType: defaultRoomContext.timelineRenderingType,
|
||||
@ -516,7 +516,7 @@ describe("WysiwygComposer", () => {
|
||||
});
|
||||
|
||||
// Then
|
||||
expect(spyDispatcher).toBeCalledWith({
|
||||
expect(spyDispatcher).toHaveBeenCalledWith({
|
||||
action: Action.EditEvent,
|
||||
event: mockEvent,
|
||||
timelineRenderingType: defaultRoomContext.timelineRenderingType,
|
||||
@ -549,7 +549,7 @@ describe("WysiwygComposer", () => {
|
||||
|
||||
// Then
|
||||
await waitFor(() =>
|
||||
expect(spyDispatcher).toBeCalledWith({
|
||||
expect(spyDispatcher).toHaveBeenCalledWith({
|
||||
action: Action.EditEvent,
|
||||
event: null,
|
||||
timelineRenderingType: defaultRoomContext.timelineRenderingType,
|
||||
|
@ -66,8 +66,8 @@ describe("message", () => {
|
||||
await sendMessage("", true, { roomContext: defaultRoomContext, mxClient: mockClient, permalinkCreator });
|
||||
|
||||
// Then
|
||||
expect(mockClient.sendMessage).toBeCalledTimes(0);
|
||||
expect(spyDispatcher).toBeCalledTimes(0);
|
||||
expect(mockClient.sendMessage).toHaveBeenCalledTimes(0);
|
||||
expect(spyDispatcher).toHaveBeenCalledTimes(0);
|
||||
});
|
||||
|
||||
it("Should not send message when there is no roomId", async () => {
|
||||
@ -82,8 +82,8 @@ describe("message", () => {
|
||||
});
|
||||
|
||||
// Then
|
||||
expect(mockClient.sendMessage).toBeCalledTimes(0);
|
||||
expect(spyDispatcher).toBeCalledTimes(0);
|
||||
expect(mockClient.sendMessage).toHaveBeenCalledTimes(0);
|
||||
expect(spyDispatcher).toHaveBeenCalledTimes(0);
|
||||
});
|
||||
|
||||
describe("calls client.sendMessage with", () => {
|
||||
@ -108,7 +108,7 @@ describe("message", () => {
|
||||
});
|
||||
|
||||
// Then
|
||||
expect(mockClient.sendMessage).toBeCalledWith(expect.anything(), null, expect.anything());
|
||||
expect(mockClient.sendMessage).toHaveBeenCalledWith(expect.anything(), null, expect.anything());
|
||||
});
|
||||
it("a null argument if SendMessageParams has relation but rel_type does not match THREAD_RELATION_TYPE.name", async () => {
|
||||
// When
|
||||
@ -123,7 +123,7 @@ describe("message", () => {
|
||||
});
|
||||
|
||||
// Then
|
||||
expect(mockClient.sendMessage).toBeCalledWith(expect.anything(), null, expect.anything());
|
||||
expect(mockClient.sendMessage).toHaveBeenCalledWith(expect.anything(), null, expect.anything());
|
||||
});
|
||||
|
||||
it("the event_id if SendMessageParams has relation and rel_type matches THREAD_RELATION_TYPE.name", async () => {
|
||||
@ -139,7 +139,7 @@ describe("message", () => {
|
||||
});
|
||||
|
||||
// Then
|
||||
expect(mockClient.sendMessage).toBeCalledWith(expect.anything(), "valid_id", expect.anything());
|
||||
expect(mockClient.sendMessage).toHaveBeenCalledWith(expect.anything(), "valid_id", expect.anything());
|
||||
});
|
||||
});
|
||||
|
||||
@ -158,8 +158,8 @@ describe("message", () => {
|
||||
formatted_body: "<i><b>hello</b> world</i>",
|
||||
msgtype: "m.text",
|
||||
};
|
||||
expect(mockClient.sendMessage).toBeCalledWith("myfakeroom", null, expectedContent);
|
||||
expect(spyDispatcher).toBeCalledWith({ action: "message_sent" });
|
||||
expect(mockClient.sendMessage).toHaveBeenCalledWith("myfakeroom", null, expectedContent);
|
||||
expect(spyDispatcher).toHaveBeenCalledWith({ action: "message_sent" });
|
||||
});
|
||||
|
||||
it("Should send reply to html message", async () => {
|
||||
@ -180,7 +180,7 @@ describe("message", () => {
|
||||
});
|
||||
|
||||
// Then
|
||||
expect(spyDispatcher).toBeCalledWith({
|
||||
expect(spyDispatcher).toHaveBeenCalledWith({
|
||||
action: "reply_to_event",
|
||||
event: null,
|
||||
context: defaultRoomContext.timelineRenderingType,
|
||||
@ -200,7 +200,7 @@ describe("message", () => {
|
||||
},
|
||||
},
|
||||
};
|
||||
expect(mockClient.sendMessage).toBeCalledWith("myfakeroom", null, expectedContent);
|
||||
expect(mockClient.sendMessage).toHaveBeenCalledWith("myfakeroom", null, expectedContent);
|
||||
});
|
||||
|
||||
it("Should scroll to bottom after sending a html message", async () => {
|
||||
@ -213,7 +213,7 @@ describe("message", () => {
|
||||
});
|
||||
|
||||
// Then
|
||||
expect(spyDispatcher).toBeCalledWith({
|
||||
expect(spyDispatcher).toHaveBeenCalledWith({
|
||||
action: "scroll_to_bottom",
|
||||
timelineRenderingType: defaultRoomContext.timelineRenderingType,
|
||||
});
|
||||
@ -224,7 +224,7 @@ describe("message", () => {
|
||||
await sendMessage("🎉", false, { roomContext: defaultRoomContext, mxClient: mockClient, permalinkCreator });
|
||||
|
||||
// Then
|
||||
expect(spyDispatcher).toBeCalledWith({ action: "effects.confetti" });
|
||||
expect(spyDispatcher).toHaveBeenCalledWith({ action: "effects.confetti" });
|
||||
});
|
||||
});
|
||||
|
||||
@ -256,10 +256,10 @@ describe("message", () => {
|
||||
await editMessage("", { roomContext: defaultRoomContext, mxClient: mockClient, editorStateTransfer });
|
||||
|
||||
// Then
|
||||
expect(mockClient.sendMessage).toBeCalledTimes(0);
|
||||
expect(mockClient.cancelPendingEvent).toBeCalledTimes(1);
|
||||
expect(mockCreateRedactEventDialog).toBeCalledTimes(1);
|
||||
expect(spyDispatcher).toBeCalledTimes(0);
|
||||
expect(mockClient.sendMessage).toHaveBeenCalledTimes(0);
|
||||
expect(mockClient.cancelPendingEvent).toHaveBeenCalledTimes(1);
|
||||
expect(mockCreateRedactEventDialog).toHaveBeenCalledTimes(1);
|
||||
expect(spyDispatcher).toHaveBeenCalledTimes(0);
|
||||
});
|
||||
|
||||
it("Should do nothing if the content is unmodified", async () => {
|
||||
@ -271,7 +271,7 @@ describe("message", () => {
|
||||
});
|
||||
|
||||
// Then
|
||||
expect(mockClient.sendMessage).toBeCalledTimes(0);
|
||||
expect(mockClient.sendMessage).toHaveBeenCalledTimes(0);
|
||||
});
|
||||
|
||||
it("Should send a message when the content is modified", async () => {
|
||||
@ -301,8 +301,8 @@ describe("message", () => {
|
||||
msgtype,
|
||||
format,
|
||||
};
|
||||
expect(mockClient.sendMessage).toBeCalledWith(mockEvent.getRoomId(), null, expectedContent);
|
||||
expect(spyDispatcher).toBeCalledWith({ action: "message_sent" });
|
||||
expect(mockClient.sendMessage).toHaveBeenCalledWith(mockEvent.getRoomId(), null, expectedContent);
|
||||
expect(spyDispatcher).toHaveBeenCalledWith({ action: "message_sent" });
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -47,7 +47,7 @@ describe("<DeviceDetailHeading />", () => {
|
||||
expect({ container }).toMatchSnapshot();
|
||||
});
|
||||
|
||||
it("renders device id as fallback when device has no display name ", () => {
|
||||
it("renders device id as fallback when device has no display name", () => {
|
||||
const { getByText } = render(
|
||||
getComponent({
|
||||
device: { ...device, display_name: undefined },
|
||||
|
@ -207,17 +207,6 @@ describe("<SessionManagerTab />", () => {
|
||||
expect(container.getElementsByClassName("mx_Spinner").length).toBeTruthy();
|
||||
});
|
||||
|
||||
it("removes spinner when device fetch fails", async () => {
|
||||
mockClient.getDevices.mockRejectedValue({ httpStatus: 404 });
|
||||
const { container } = render(getComponent());
|
||||
expect(mockClient.getDevices).toHaveBeenCalled();
|
||||
|
||||
await act(async () => {
|
||||
await flushPromises();
|
||||
});
|
||||
expect(container.getElementsByClassName("mx_Spinner").length).toBeFalsy();
|
||||
});
|
||||
|
||||
it("removes spinner when device fetch fails", async () => {
|
||||
// eat the expected error log
|
||||
jest.spyOn(logger, "error").mockImplementation(() => {});
|
||||
@ -760,7 +749,7 @@ describe("<SessionManagerTab />", () => {
|
||||
expect(mockClient.getDevices).toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it("deletes a device when interactive auth is not required", async () => {
|
||||
it("does not delete a device when interactive auth is not required", async () => {
|
||||
const { getByTestId } = render(getComponent());
|
||||
|
||||
await act(async () => {
|
||||
|
@ -215,7 +215,7 @@ describe("editor/deserialize", function () {
|
||||
expect(parts[4]).toStrictEqual({ type: "plain", text: "```" });
|
||||
});
|
||||
// failing likely because of https://github.com/vector-im/element-web/issues/10316
|
||||
xit("code block with no trailing text and no newlines", function () {
|
||||
it.skip("code block with no trailing text and no newlines", function () {
|
||||
const html = "<pre><code>0xDEADBEEF</code></pre>";
|
||||
const parts = normalize(parseEvent(htmlMessage(html), createPartCreator()));
|
||||
expect(parts.length).toBe(5);
|
||||
@ -412,7 +412,7 @@ describe("editor/deserialize", function () {
|
||||
text: "> <del>no formatting here</del>",
|
||||
});
|
||||
});
|
||||
it("it strips plaintext replies", () => {
|
||||
it("strips plaintext replies", () => {
|
||||
const body = "> Sender: foo\n\nMessage";
|
||||
const parts = normalize(parseEvent(textMessageReply(body), createPartCreator(), { shouldEscape: false }));
|
||||
expect(parts.length).toBe(1);
|
||||
|
@ -95,7 +95,7 @@ describe("RelationsHelper", () => {
|
||||
|
||||
expect(() => {
|
||||
new RelationsHelper(event, RelationType.Reference, EventType.RoomMessage, client);
|
||||
}).toThrowError("unable to create RelationsHelper: missing event ID");
|
||||
}).toThrow("unable to create RelationsHelper: missing event ID");
|
||||
});
|
||||
});
|
||||
|
||||
@ -105,7 +105,7 @@ describe("RelationsHelper", () => {
|
||||
|
||||
expect(() => {
|
||||
new RelationsHelper(event, RelationType.Reference, EventType.RoomMessage, client);
|
||||
}).toThrowError("unable to create RelationsHelper: missing room ID");
|
||||
}).toThrow("unable to create RelationsHelper: missing room ID");
|
||||
});
|
||||
});
|
||||
|
||||
|
@ -93,20 +93,17 @@ describe("languageHandler", function () {
|
||||
});
|
||||
|
||||
describe("when translations exist in language", () => {
|
||||
beforeEach(function (done) {
|
||||
beforeEach(function () {
|
||||
stubClient();
|
||||
|
||||
setLanguage("en").then(done);
|
||||
setLanguage("en");
|
||||
setMissingEntryGenerator((key) => key.split("|", 2)[1]);
|
||||
});
|
||||
|
||||
it("translates a string to german", function (done) {
|
||||
setLanguage("de")
|
||||
.then(function () {
|
||||
const translated = _t(basicString);
|
||||
expect(translated).toBe("Räume");
|
||||
})
|
||||
.then(done);
|
||||
it("translates a string to german", async () => {
|
||||
await setLanguage("de");
|
||||
const translated = _t(basicString);
|
||||
expect(translated).toBe("Räume");
|
||||
});
|
||||
|
||||
it.each(testCasesEn)("%s", (_d, translationString, variables, tags, result) => {
|
||||
|
@ -74,7 +74,8 @@ describe("AutoRageshakeStore", () => {
|
||||
});
|
||||
|
||||
it("should send a rageshake", () => {
|
||||
expect(mocked(client).sendToDevice.mock.calls).toMatchInlineSnapshot(`
|
||||
expect(mocked(client).sendToDevice.mock.calls).toMatchInlineSnapshot(
|
||||
`
|
||||
[
|
||||
[
|
||||
"im.vector.auto_rs_request",
|
||||
@ -82,7 +83,7 @@ describe("AutoRageshakeStore", () => {
|
||||
"@userId:matrix.org": {
|
||||
"undefined": {
|
||||
"device_id": undefined,
|
||||
"event_id": "${utdEvent.getId()}",
|
||||
"event_id": "utd_event_id",
|
||||
"recipient_rageshake": undefined,
|
||||
"room_id": "!room:example.com",
|
||||
"sender_key": undefined,
|
||||
@ -93,7 +94,8 @@ describe("AutoRageshakeStore", () => {
|
||||
},
|
||||
],
|
||||
]
|
||||
`);
|
||||
`.replace("utd_event_id", utdEvent.getId()!),
|
||||
);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -1179,34 +1179,34 @@ describe("SpaceStore", () => {
|
||||
const fn = jest.fn();
|
||||
store.traverseSpace("!b:server", fn);
|
||||
|
||||
expect(fn).toBeCalledTimes(3);
|
||||
expect(fn).toBeCalledWith("!a:server");
|
||||
expect(fn).toBeCalledWith("!b:server");
|
||||
expect(fn).toBeCalledWith("!c:server");
|
||||
expect(fn).toHaveBeenCalledTimes(3);
|
||||
expect(fn).toHaveBeenCalledWith("!a:server");
|
||||
expect(fn).toHaveBeenCalledWith("!b:server");
|
||||
expect(fn).toHaveBeenCalledWith("!c:server");
|
||||
});
|
||||
|
||||
it("including rooms", () => {
|
||||
const fn = jest.fn();
|
||||
store.traverseSpace("!b:server", fn, true);
|
||||
|
||||
expect(fn).toBeCalledTimes(8); // twice for shared-child
|
||||
expect(fn).toBeCalledWith("!a:server");
|
||||
expect(fn).toBeCalledWith("!a-child:server");
|
||||
expect(fn).toBeCalledWith("!b:server");
|
||||
expect(fn).toBeCalledWith("!b-child:server");
|
||||
expect(fn).toBeCalledWith("!c:server");
|
||||
expect(fn).toBeCalledWith("!c-child:server");
|
||||
expect(fn).toBeCalledWith("!shared-child:server");
|
||||
expect(fn).toHaveBeenCalledTimes(8); // twice for shared-child
|
||||
expect(fn).toHaveBeenCalledWith("!a:server");
|
||||
expect(fn).toHaveBeenCalledWith("!a-child:server");
|
||||
expect(fn).toHaveBeenCalledWith("!b:server");
|
||||
expect(fn).toHaveBeenCalledWith("!b-child:server");
|
||||
expect(fn).toHaveBeenCalledWith("!c:server");
|
||||
expect(fn).toHaveBeenCalledWith("!c-child:server");
|
||||
expect(fn).toHaveBeenCalledWith("!shared-child:server");
|
||||
});
|
||||
|
||||
it("excluding rooms", () => {
|
||||
const fn = jest.fn();
|
||||
store.traverseSpace("!b:server", fn, false);
|
||||
|
||||
expect(fn).toBeCalledTimes(3);
|
||||
expect(fn).toBeCalledWith("!a:server");
|
||||
expect(fn).toBeCalledWith("!b:server");
|
||||
expect(fn).toBeCalledWith("!c:server");
|
||||
expect(fn).toHaveBeenCalledTimes(3);
|
||||
expect(fn).toHaveBeenCalledWith("!a:server");
|
||||
expect(fn).toHaveBeenCalledWith("!b:server");
|
||||
expect(fn).toHaveBeenCalledWith("!c:server");
|
||||
});
|
||||
});
|
||||
|
||||
|
@ -163,13 +163,13 @@ describe("SlidingRoomListStore", () => {
|
||||
it("setTagSorting alters the 'sort' option in the list", async () => {
|
||||
const tagId: TagID = "foo";
|
||||
await store.setTagSorting(tagId, SortAlgorithm.Alphabetic);
|
||||
expect(context._SlidingSyncManager!.ensureListRegistered).toBeCalledWith(tagId, {
|
||||
expect(context._SlidingSyncManager!.ensureListRegistered).toHaveBeenCalledWith(tagId, {
|
||||
sort: SlidingSyncSortToFilter[SortAlgorithm.Alphabetic],
|
||||
});
|
||||
expect(store.getTagSorting(tagId)).toEqual(SortAlgorithm.Alphabetic);
|
||||
|
||||
await store.setTagSorting(tagId, SortAlgorithm.Recent);
|
||||
expect(context._SlidingSyncManager!.ensureListRegistered).toBeCalledWith(tagId, {
|
||||
expect(context._SlidingSyncManager!.ensureListRegistered).toHaveBeenCalledWith(tagId, {
|
||||
sort: SlidingSyncSortToFilter[SortAlgorithm.Recent],
|
||||
});
|
||||
expect(store.getTagSorting(tagId)).toEqual(SortAlgorithm.Recent);
|
||||
|
@ -151,7 +151,7 @@ describe("StopGapWidgetDriver", () => {
|
||||
state: OpenIDRequestState.Allowed,
|
||||
token: await client.getOpenIdToken(),
|
||||
};
|
||||
expect(listener).toBeCalledWith(openIdUpdate);
|
||||
expect(listener).toHaveBeenCalledWith(openIdUpdate);
|
||||
});
|
||||
|
||||
describe("sendToDevice", () => {
|
||||
@ -276,7 +276,7 @@ describe("StopGapWidgetDriver", () => {
|
||||
prevBatch: undefined,
|
||||
});
|
||||
|
||||
expect(client.relations).toBeCalledWith("!this-room-id", "$event", null, null, {});
|
||||
expect(client.relations).toHaveBeenCalledWith("!this-room-id", "$event", null, null, {});
|
||||
});
|
||||
|
||||
it("reads related events from a selected room", async () => {
|
||||
@ -292,7 +292,7 @@ describe("StopGapWidgetDriver", () => {
|
||||
prevBatch: undefined,
|
||||
});
|
||||
|
||||
expect(client.relations).toBeCalledWith("!room-id", "$event", null, null, {});
|
||||
expect(client.relations).toHaveBeenCalledWith("!room-id", "$event", null, null, {});
|
||||
});
|
||||
|
||||
it("reads related events with custom parameters", async () => {
|
||||
@ -318,7 +318,7 @@ describe("StopGapWidgetDriver", () => {
|
||||
prevBatch: undefined,
|
||||
});
|
||||
|
||||
expect(client.relations).toBeCalledWith("!room-id", "$event", "m.reference", "m.room.message", {
|
||||
expect(client.relations).toHaveBeenCalledWith("!room-id", "$event", "m.reference", "m.room.message", {
|
||||
limit: 25,
|
||||
from: "from-token",
|
||||
to: "to-token",
|
||||
|
@ -63,7 +63,7 @@ describe("theme", () => {
|
||||
|
||||
// Then
|
||||
expect(spyQuerySelectorAll).toHaveBeenCalledWith("[data-mx-theme]");
|
||||
expect(spyQuerySelectorAll).toBeCalledTimes(1);
|
||||
expect(spyQuerySelectorAll).toHaveBeenCalledTimes(1);
|
||||
expect(lightTheme.disabled).toBe(false);
|
||||
expect(darkTheme.disabled).toBe(true);
|
||||
});
|
||||
|
@ -35,7 +35,7 @@ describe("createReconnectedListener", () => {
|
||||
].forEach(([from, to]) => {
|
||||
it(`should invoke the callback on a transition from ${from} to ${to}`, () => {
|
||||
reconnectedListener(to, from);
|
||||
expect(onReconnect).toBeCalled();
|
||||
expect(onReconnect).toHaveBeenCalled();
|
||||
});
|
||||
});
|
||||
|
||||
@ -46,7 +46,7 @@ describe("createReconnectedListener", () => {
|
||||
].forEach(([from, to]) => {
|
||||
it(`should not invoke the callback on a transition from ${from} to ${to}`, () => {
|
||||
reconnectedListener(to, from);
|
||||
expect(onReconnect).not.toBeCalled();
|
||||
expect(onReconnect).not.toHaveBeenCalled();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -130,8 +130,8 @@ describe("parseUserAgent()", () => {
|
||||
const testPlatform = (platform: string, userAgents: string[], results: ExtendedDeviceInformation[]): void => {
|
||||
const testCases: TestCase[] = userAgents.map((userAgent, index) => [userAgent, results[index]]);
|
||||
|
||||
describe(platform, () => {
|
||||
it.each(testCases)("Parses user agent correctly - %s", (userAgent, expectedResult) => {
|
||||
describe(`on platform ${platform}`, () => {
|
||||
it.each(testCases)("should parse the user agent correctly - %s", (userAgent, expectedResult) => {
|
||||
expect(parseUserAgent(userAgent)).toEqual(expectedResult);
|
||||
});
|
||||
});
|
||||
|
@ -290,7 +290,7 @@ describe("export", function () {
|
||||
],
|
||||
];
|
||||
it.each(invalidExportOptions)("%s", (_d, options) => {
|
||||
expect(() => new PlainTextExporter(mockRoom, ExportType.Beginning, options, setProgressText)).toThrowError(
|
||||
expect(() => new PlainTextExporter(mockRoom, ExportType.Beginning, options, setProgressText)).toThrow(
|
||||
"Invalid export options",
|
||||
);
|
||||
});
|
||||
|
@ -329,31 +329,28 @@ describe("HTMLExport", () => {
|
||||
|
||||
// test link to the first page
|
||||
//@ts-ignore private access
|
||||
exporter.wrapHTML("", 0, 3).then((res) => {
|
||||
expect(res).not.toContain("Previous group of messages");
|
||||
expect(res).toContain(
|
||||
'<div style="text-align:center;margin:10px"><a href="./messages2.html" style="font-weight:bold">Next group of messages</a></div>',
|
||||
);
|
||||
});
|
||||
let result = await exporter.wrapHTML("", 0, 3);
|
||||
expect(result).not.toContain("Previous group of messages");
|
||||
expect(result).toContain(
|
||||
'<div style="text-align:center;margin:10px"><a href="./messages2.html" style="font-weight:bold">Next group of messages</a></div>',
|
||||
);
|
||||
|
||||
// test link for a middle page
|
||||
//@ts-ignore private access
|
||||
exporter.wrapHTML("", 1, 3).then((res) => {
|
||||
expect(res).toContain(
|
||||
'<div style="text-align:center"><a href="./messages.html" style="font-weight:bold">Previous group of messages</a></div>',
|
||||
);
|
||||
expect(res).toContain(
|
||||
'<div style="text-align:center;margin:10px"><a href="./messages3.html" style="font-weight:bold">Next group of messages</a></div>',
|
||||
);
|
||||
});
|
||||
result = await exporter.wrapHTML("", 1, 3);
|
||||
expect(result).toContain(
|
||||
'<div style="text-align:center"><a href="./messages.html" style="font-weight:bold">Previous group of messages</a></div>',
|
||||
);
|
||||
expect(result).toContain(
|
||||
'<div style="text-align:center;margin:10px"><a href="./messages3.html" style="font-weight:bold">Next group of messages</a></div>',
|
||||
);
|
||||
|
||||
// test link for last page
|
||||
//@ts-ignore private access
|
||||
exporter.wrapHTML("", 2, 3).then((res) => {
|
||||
expect(res).toContain(
|
||||
'<div style="text-align:center"><a href="./messages2.html" style="font-weight:bold">Previous group of messages</a></div>',
|
||||
);
|
||||
expect(res).not.toContain("Next group of messages");
|
||||
});
|
||||
result = await exporter.wrapHTML("", 2, 3);
|
||||
expect(result).toContain(
|
||||
'<div style="text-align:center"><a href="./messages2.html" style="font-weight:bold">Previous group of messages</a></div>',
|
||||
);
|
||||
expect(result).not.toContain("Next group of messages");
|
||||
});
|
||||
});
|
||||
|
@ -120,16 +120,14 @@ describe("local-room", () => {
|
||||
mocked(isRoomReady).mockReturnValue(false);
|
||||
});
|
||||
|
||||
it("should invoke the callbacks, set the room state to created and return the actual room id", (done) => {
|
||||
it("should invoke the callbacks, set the room state to created and return the actual room id", async () => {
|
||||
const prom = localRoomModule.waitForRoomReadyAndApplyAfterCreateCallbacks(client, localRoom);
|
||||
jest.advanceTimersByTime(5000);
|
||||
prom.then((roomId: string) => {
|
||||
expect(localRoom.state).toBe(LocalRoomState.CREATED);
|
||||
expect(localRoomCallbackRoomId).toBe(room1.roomId);
|
||||
expect(roomId).toBe(room1.roomId);
|
||||
expect(jest.getTimerCount()).toBe(0);
|
||||
done();
|
||||
});
|
||||
const roomId = await prom;
|
||||
expect(localRoom.state).toBe(LocalRoomState.CREATED);
|
||||
expect(localRoomCallbackRoomId).toBe(room1.roomId);
|
||||
expect(roomId).toBe(room1.roomId);
|
||||
expect(jest.getTimerCount()).toBe(0);
|
||||
});
|
||||
});
|
||||
|
||||
@ -138,17 +136,15 @@ describe("local-room", () => {
|
||||
mocked(isRoomReady).mockReturnValue(false);
|
||||
});
|
||||
|
||||
it("should invoke the callbacks, set the room state to created and return the actual room id", (done) => {
|
||||
it("should invoke the callbacks, set the room state to created and return the actual room id", async () => {
|
||||
const prom = localRoomModule.waitForRoomReadyAndApplyAfterCreateCallbacks(client, localRoom);
|
||||
mocked(isRoomReady).mockReturnValue(true);
|
||||
jest.advanceTimersByTime(500);
|
||||
prom.then((roomId: string) => {
|
||||
expect(localRoom.state).toBe(LocalRoomState.CREATED);
|
||||
expect(localRoomCallbackRoomId).toBe(room1.roomId);
|
||||
expect(roomId).toBe(room1.roomId);
|
||||
expect(jest.getTimerCount()).toBe(0);
|
||||
done();
|
||||
});
|
||||
const roomId = await prom;
|
||||
expect(localRoom.state).toBe(LocalRoomState.CREATED);
|
||||
expect(localRoomCallbackRoomId).toBe(room1.roomId);
|
||||
expect(roomId).toBe(room1.roomId);
|
||||
expect(jest.getTimerCount()).toBe(0);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -51,7 +51,7 @@ describe("isRoomReady", () => {
|
||||
mocked(client.getRoom).mockReturnValue(null);
|
||||
});
|
||||
|
||||
it("it should return false", () => {
|
||||
it("should return false", () => {
|
||||
expect(isRoomReady(client, localRoom)).toBe(false);
|
||||
});
|
||||
|
||||
@ -63,7 +63,7 @@ describe("isRoomReady", () => {
|
||||
});
|
||||
});
|
||||
|
||||
it("it should return false", () => {
|
||||
it("should return false", () => {
|
||||
expect(isRoomReady(client, localRoom)).toBe(false);
|
||||
});
|
||||
|
||||
@ -75,7 +75,7 @@ describe("isRoomReady", () => {
|
||||
]);
|
||||
});
|
||||
|
||||
it("it should return false", () => {
|
||||
it("should return false", () => {
|
||||
expect(isRoomReady(client, localRoom)).toBe(false);
|
||||
});
|
||||
|
||||
@ -92,7 +92,7 @@ describe("isRoomReady", () => {
|
||||
]);
|
||||
});
|
||||
|
||||
it("it should return true", () => {
|
||||
it("should return true", () => {
|
||||
expect(isRoomReady(client, localRoom)).toBe(true);
|
||||
});
|
||||
|
||||
@ -101,7 +101,7 @@ describe("isRoomReady", () => {
|
||||
localRoom.encrypted = true;
|
||||
});
|
||||
|
||||
it("it should return false", () => {
|
||||
it("should return false", () => {
|
||||
expect(isRoomReady(client, localRoom)).toBe(false);
|
||||
});
|
||||
|
||||
@ -118,7 +118,7 @@ describe("isRoomReady", () => {
|
||||
]);
|
||||
});
|
||||
|
||||
it("it should return true", () => {
|
||||
it("should return true", () => {
|
||||
expect(isRoomReady(client, localRoom)).toBe(true);
|
||||
});
|
||||
});
|
||||
|
@ -29,31 +29,32 @@ describe("waitForMember", () => {
|
||||
client = new EventEmitter();
|
||||
});
|
||||
|
||||
it("resolves with false if the timeout is reached", (done) => {
|
||||
waitForMember(<MatrixClient>client, "", "", { timeout: 0 }).then((r) => {
|
||||
expect(r).toBe(false);
|
||||
done();
|
||||
});
|
||||
afterEach(() => {
|
||||
jest.useRealTimers();
|
||||
});
|
||||
|
||||
it("resolves with false if the timeout is reached, even if other RoomState.newMember events fire", (done) => {
|
||||
it("resolves with false if the timeout is reached", async () => {
|
||||
const result = await waitForMember(<MatrixClient>client, "", "", { timeout: 0 });
|
||||
expect(result).toBe(false);
|
||||
});
|
||||
|
||||
it("resolves with false if the timeout is reached, even if other RoomState.newMember events fire", async () => {
|
||||
jest.useFakeTimers();
|
||||
const roomId = "!roomId:domain";
|
||||
const userId = "@clientId:domain";
|
||||
waitForMember(<MatrixClient>client, roomId, userId, { timeout }).then((r) => {
|
||||
expect(r).toBe(false);
|
||||
done();
|
||||
});
|
||||
const resultProm = waitForMember(<MatrixClient>client, roomId, userId, { timeout });
|
||||
jest.advanceTimersByTime(50);
|
||||
expect(await resultProm).toBe(false);
|
||||
client.emit("RoomState.newMember", undefined, undefined, { roomId, userId: "@anotherClient:domain" });
|
||||
jest.useRealTimers();
|
||||
});
|
||||
|
||||
it("resolves with true if RoomState.newMember fires", (done) => {
|
||||
it("resolves with true if RoomState.newMember fires", async () => {
|
||||
const roomId = "!roomId:domain";
|
||||
const userId = "@clientId:domain";
|
||||
waitForMember(<MatrixClient>client, roomId, userId, { timeout }).then((r) => {
|
||||
expect(r).toBe(true);
|
||||
expect((<MatrixClient>client).listeners(RoomStateEvent.NewMember).length).toBe(0);
|
||||
done();
|
||||
});
|
||||
expect((<MatrixClient>client).listeners(RoomStateEvent.NewMember).length).toBe(0);
|
||||
const resultProm = waitForMember(<MatrixClient>client, roomId, userId, { timeout });
|
||||
client.emit("RoomState.newMember", undefined, undefined, { roomId, userId });
|
||||
expect(await resultProm).toBe(true);
|
||||
});
|
||||
});
|
||||
|
@ -128,7 +128,7 @@ describe("notifications", () => {
|
||||
|
||||
it("sends a request even if everything has been read", () => {
|
||||
clearRoomNotification(room, client);
|
||||
expect(sendReadReceiptSpy).not.toBeCalled();
|
||||
expect(sendReadReceiptSpy).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it("marks the room as read even if the receipt failed", async () => {
|
||||
@ -163,7 +163,7 @@ describe("notifications", () => {
|
||||
|
||||
it("does not send any requests if everything has been read", () => {
|
||||
clearAllNotifications(client);
|
||||
expect(sendReadReceiptSpy).not.toBeCalled();
|
||||
expect(sendReadReceiptSpy).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it("sends unthreaded receipt requests", () => {
|
||||
@ -178,7 +178,7 @@ describe("notifications", () => {
|
||||
|
||||
clearAllNotifications(client);
|
||||
|
||||
expect(sendReadReceiptSpy).toBeCalledWith(message, ReceiptType.Read, true);
|
||||
expect(sendReadReceiptSpy).toHaveBeenCalledWith(message, ReceiptType.Read, true);
|
||||
});
|
||||
|
||||
it("sends private read receipts", () => {
|
||||
@ -195,7 +195,7 @@ describe("notifications", () => {
|
||||
|
||||
clearAllNotifications(client);
|
||||
|
||||
expect(sendReadReceiptSpy).toBeCalledWith(message, ReceiptType.ReadPrivate, true);
|
||||
expect(sendReadReceiptSpy).toHaveBeenCalledWith(message, ReceiptType.ReadPrivate, true);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -269,7 +269,7 @@ describe("VoiceBroadcastRecording", () => {
|
||||
it("should raise an error when creating a broadcast", () => {
|
||||
expect(() => {
|
||||
setUpVoiceBroadcastRecording();
|
||||
}).toThrowError("Cannot create broadcast for info event without Id.");
|
||||
}).toThrow("Cannot create broadcast for info event without Id.");
|
||||
});
|
||||
});
|
||||
|
||||
@ -285,7 +285,7 @@ describe("VoiceBroadcastRecording", () => {
|
||||
it("should raise an error when creating a broadcast", () => {
|
||||
expect(() => {
|
||||
setUpVoiceBroadcastRecording();
|
||||
}).toThrowError(`Cannot create broadcast for unknown room (info event ${infoEvent.getId()})`);
|
||||
}).toThrow(`Cannot create broadcast for unknown room (info event ${infoEvent.getId()})`);
|
||||
});
|
||||
});
|
||||
|
||||
|
@ -74,7 +74,7 @@ describe("VoiceBroadcastRecordingsStore", () => {
|
||||
infoEvent.event.event_id = undefined;
|
||||
expect(() => {
|
||||
recordings.setCurrent(recording);
|
||||
}).toThrowError("Got broadcast info event without Id");
|
||||
}).toThrow("Got broadcast info event without Id");
|
||||
});
|
||||
|
||||
describe("when setting a current Voice Broadcast recording", () => {
|
||||
|
@ -67,11 +67,7 @@ describe("setUpVoiceBroadcastPreRecording", () => {
|
||||
|
||||
beforeEach(() => {
|
||||
client = stubClient();
|
||||
|
||||
const clientUserId = client.getUserId();
|
||||
if (!clientUserId) fail("empty userId");
|
||||
userId = clientUserId;
|
||||
|
||||
userId = client.getSafeUserId();
|
||||
room = new Room(roomId, client, userId);
|
||||
infoEvent = mkVoiceBroadcastInfoStateEvent(
|
||||
roomId,
|
||||
|
55
yarn.lock
55
yarn.lock
@ -2528,6 +2528,14 @@
|
||||
"@typescript-eslint/types" "5.53.0"
|
||||
"@typescript-eslint/visitor-keys" "5.53.0"
|
||||
|
||||
"@typescript-eslint/scope-manager@5.54.0":
|
||||
version "5.54.0"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.54.0.tgz#74b28ac9a3fc8166f04e806c957adb8c1fd00536"
|
||||
integrity sha512-VTPYNZ7vaWtYna9M4oD42zENOBrb+ZYyCNdFs949GcN8Miwn37b8b7eMj+EZaq7VK9fx0Jd+JhmkhjFhvnovhg==
|
||||
dependencies:
|
||||
"@typescript-eslint/types" "5.54.0"
|
||||
"@typescript-eslint/visitor-keys" "5.54.0"
|
||||
|
||||
"@typescript-eslint/type-utils@5.53.0":
|
||||
version "5.53.0"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.53.0.tgz#41665449935ba9b4e6a1ba6e2a3f4b2c31d6cf97"
|
||||
@ -2543,6 +2551,11 @@
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.53.0.tgz#f79eca62b97e518ee124086a21a24f3be267026f"
|
||||
integrity sha512-5kcDL9ZUIP756K6+QOAfPkigJmCPHcLN7Zjdz76lQWWDdzfOhZDTj1irs6gPBKiXx5/6O3L0+AvupAut3z7D2A==
|
||||
|
||||
"@typescript-eslint/types@5.54.0":
|
||||
version "5.54.0"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.54.0.tgz#7d519df01f50739254d89378e0dcac504cab2740"
|
||||
integrity sha512-nExy+fDCBEgqblasfeE3aQ3NuafBUxZxgxXcYfzYRZFHdVvk5q60KhCSkG0noHgHRo/xQ/BOzURLZAafFpTkmQ==
|
||||
|
||||
"@typescript-eslint/typescript-estree@5.53.0":
|
||||
version "5.53.0"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.53.0.tgz#bc651dc28cf18ab248ecd18a4c886c744aebd690"
|
||||
@ -2556,6 +2569,19 @@
|
||||
semver "^7.3.7"
|
||||
tsutils "^3.21.0"
|
||||
|
||||
"@typescript-eslint/typescript-estree@5.54.0":
|
||||
version "5.54.0"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.54.0.tgz#f6f3440cabee8a43a0b25fa498213ebb61fdfe99"
|
||||
integrity sha512-X2rJG97Wj/VRo5YxJ8Qx26Zqf0RRKsVHd4sav8NElhbZzhpBI8jU54i6hfo9eheumj4oO4dcRN1B/zIVEqR/MQ==
|
||||
dependencies:
|
||||
"@typescript-eslint/types" "5.54.0"
|
||||
"@typescript-eslint/visitor-keys" "5.54.0"
|
||||
debug "^4.3.4"
|
||||
globby "^11.1.0"
|
||||
is-glob "^4.0.3"
|
||||
semver "^7.3.7"
|
||||
tsutils "^3.21.0"
|
||||
|
||||
"@typescript-eslint/utils@5.53.0":
|
||||
version "5.53.0"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.53.0.tgz#e55eaad9d6fffa120575ffaa530c7e802f13bce8"
|
||||
@ -2570,6 +2596,20 @@
|
||||
eslint-utils "^3.0.0"
|
||||
semver "^7.3.7"
|
||||
|
||||
"@typescript-eslint/utils@^5.10.0":
|
||||
version "5.54.0"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.54.0.tgz#3db758aae078be7b54b8ea8ea4537ff6cd3fbc21"
|
||||
integrity sha512-cuwm8D/Z/7AuyAeJ+T0r4WZmlnlxQ8wt7C7fLpFlKMR+dY6QO79Cq1WpJhvZbMA4ZeZGHiRWnht7ZJ8qkdAunw==
|
||||
dependencies:
|
||||
"@types/json-schema" "^7.0.9"
|
||||
"@types/semver" "^7.3.12"
|
||||
"@typescript-eslint/scope-manager" "5.54.0"
|
||||
"@typescript-eslint/types" "5.54.0"
|
||||
"@typescript-eslint/typescript-estree" "5.54.0"
|
||||
eslint-scope "^5.1.1"
|
||||
eslint-utils "^3.0.0"
|
||||
semver "^7.3.7"
|
||||
|
||||
"@typescript-eslint/visitor-keys@5.53.0":
|
||||
version "5.53.0"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.53.0.tgz#8a5126623937cdd909c30d8fa72f79fa56cc1a9f"
|
||||
@ -2578,6 +2618,14 @@
|
||||
"@typescript-eslint/types" "5.53.0"
|
||||
eslint-visitor-keys "^3.3.0"
|
||||
|
||||
"@typescript-eslint/visitor-keys@5.54.0":
|
||||
version "5.54.0"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.54.0.tgz#846878afbf0cd67c19cfa8d75947383d4490db8f"
|
||||
integrity sha512-xu4wT7aRCakGINTLGeyGqDn+78BwFlggwBjnHa1ar/KaGagnmwLYmlrXIrgAaQ3AE1Vd6nLfKASm7LrFHNbKGA==
|
||||
dependencies:
|
||||
"@typescript-eslint/types" "5.54.0"
|
||||
eslint-visitor-keys "^3.3.0"
|
||||
|
||||
"@wojtekmaj/enzyme-adapter-react-17@^0.8.0":
|
||||
version "0.8.0"
|
||||
resolved "https://registry.yarnpkg.com/@wojtekmaj/enzyme-adapter-react-17/-/enzyme-adapter-react-17-0.8.0.tgz#138f404f82f502d152242c049e87d9621dcda4bd"
|
||||
@ -4264,6 +4312,13 @@ eslint-plugin-import@^2.25.4:
|
||||
resolve "^1.22.0"
|
||||
tsconfig-paths "^3.14.1"
|
||||
|
||||
eslint-plugin-jest@^27.2.1:
|
||||
version "27.2.1"
|
||||
resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-27.2.1.tgz#b85b4adf41c682ea29f1f01c8b11ccc39b5c672c"
|
||||
integrity sha512-l067Uxx7ZT8cO9NJuf+eJHvt6bqJyz2Z29wykyEdz/OtmcELQl2MQGQLX8J94O1cSJWAwUSEvCjwjA7KEK3Hmg==
|
||||
dependencies:
|
||||
"@typescript-eslint/utils" "^5.10.0"
|
||||
|
||||
eslint-plugin-jsx-a11y@^6.5.1:
|
||||
version "6.6.1"
|
||||
resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.6.1.tgz#93736fc91b83fdc38cc8d115deedfc3091aef1ff"
|
||||
|
Loading…
Reference in New Issue
Block a user