diff --git a/test/Terms-test.js b/test/Terms-test.js index 58ba688395..8e9b651299 100644 --- a/test/Terms-test.js +++ b/test/Terms-test.js @@ -53,7 +53,6 @@ describe('Terms', function() { }); const interactionCallback = jest.fn().mockResolvedValue([]); await startTermsFlow([IM_SERVICE_ONE], interactionCallback); - console.log("interaction callback calls", interactionCallback.mock.calls[0]); expect(interactionCallback).toBeCalledWith([ { @@ -80,7 +79,6 @@ describe('Terms', function() { const interactionCallback = jest.fn(); await startTermsFlow([IM_SERVICE_ONE], interactionCallback); - console.log("agreeToTerms call", MatrixClientPeg.get().agreeToTerms.mock.calls[0]); expect(interactionCallback).not.toHaveBeenCalled(); expect(MatrixClientPeg.get().agreeToTerms).toBeCalledWith( @@ -107,8 +105,6 @@ describe('Terms', function() { const interactionCallback = jest.fn().mockResolvedValue(["http://example.com/one", "http://example.com/two"]); await startTermsFlow([IM_SERVICE_ONE], interactionCallback); - console.log("interactionCallback call", interactionCallback.mock.calls[0]); - console.log("agreeToTerms call", MatrixClientPeg.get().agreeToTerms.mock.calls[0]); expect(interactionCallback).toBeCalledWith([ { @@ -154,10 +150,6 @@ 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); - console.log("getTerms call 0", MatrixClientPeg.get().getTerms.mock.calls[0]); - console.log("getTerms call 1", MatrixClientPeg.get().getTerms.mock.calls[1]); - console.log("interactionCallback call", interactionCallback.mock.calls[0]); - console.log("agreeToTerms call", MatrixClientPeg.get().agreeToTerms.mock.calls[0]); expect(interactionCallback).toBeCalledWith([ { diff --git a/test/components/structures/MessagePanel-test.js b/test/components/structures/MessagePanel-test.js index 0681f0ff6e..afa99f1da4 100644 --- a/test/components/structures/MessagePanel-test.js +++ b/test/components/structures/MessagePanel-test.js @@ -28,6 +28,7 @@ import SettingsStore from "../../../src/settings/SettingsStore"; import MatrixClientContext from "../../../src/contexts/MatrixClientContext"; import RoomContext from "../../../src/contexts/RoomContext"; import DMRoomMap from "../../../src/utils/DMRoomMap"; +import { upsertRoomStateEvents } from '../../utils/test-utils'; const TestUtils = require('react-dom/test-utils'); const expect = require('expect'); @@ -199,6 +200,7 @@ describe('MessagePanel', function() { mkEvent({ event: true, type: "m.room.create", + sender: '@test:example.org', room: roomId, user: alice, content: { @@ -435,6 +437,7 @@ describe('MessagePanel', function() { it('should collapse creation events', function() { const events = mkCreationEvents(); + upsertRoomStateEvents(room, events); const res = mount( , ); @@ -460,6 +463,7 @@ describe('MessagePanel', function() { it('should hide read-marker at the end of creation event summary', function() { const events = mkCreationEvents(); + upsertRoomStateEvents(room, events); const res = mount( { }); }); - console.log("Switch to room 2"); + // Switch to room 2 dis.dispatch({ action: Action.ViewRoom, room_id: "r2", diff --git a/test/components/structures/auth/Login-test.tsx b/test/components/structures/auth/Login-test.tsx index 2c267f45e0..741f4f5c56 100644 --- a/test/components/structures/auth/Login-test.tsx +++ b/test/components/structures/auth/Login-test.tsx @@ -41,6 +41,10 @@ describe('Login', function() { }; beforeEach(function() { + jest.spyOn(SdkConfig, "get").mockReturnValue({ + disable_custom_urls: true, + brand: 'test-brand', + }); mockClient.login.mockClear().mockResolvedValue({}); mockClient.loginFlows.mockClear().mockResolvedValue({ flows: [{ type: "m.login.password" }] }); createClient.mockReturnValue(mockClient); @@ -64,6 +68,10 @@ describe('Login', function() { } it('should show form with change server link', async () => { + jest.spyOn(SdkConfig, "get").mockReturnValue({ + disable_custom_urls: false, + brand: 'test', + }); const root = render(); await flushPromises(); @@ -79,10 +87,6 @@ describe('Login', function() { }); it('should show form without change server link when custom URLs disabled', async () => { - jest.spyOn(SdkConfig, "get").mockReturnValue({ - disable_custom_urls: true, - }); - const root = render(); await flushPromises(); @@ -97,10 +101,6 @@ describe('Login', function() { }); it("should show SSO button if that flow is available", async () => { - jest.spyOn(SdkConfig, "get").mockReturnValue({ - disable_custom_urls: true, - }); - mockClient.loginFlows.mockReturnValue({ flows: [{ type: "m.login.sso" }] }); const root = render(); @@ -111,10 +111,6 @@ describe('Login', function() { }); it("should show both SSO button and username+password if both are available", async () => { - jest.spyOn(SdkConfig, "get").mockReturnValue({ - disable_custom_urls: true, - }); - mockClient.loginFlows.mockReturnValue({ flows: [{ type: "m.login.password" }, { type: "m.login.sso" }] }); const root = render(); @@ -128,10 +124,6 @@ describe('Login', function() { }); it("should show multiple SSO buttons if multiple identity_providers are available", async () => { - jest.spyOn(SdkConfig, "get").mockReturnValue({ - disable_custom_urls: true, - }); - mockClient.loginFlows.mockReturnValue({ flows: [{ "type": "m.login.sso", diff --git a/test/components/structures/auth/Registration-test.js b/test/components/structures/auth/Registration-test.js index 2f2a00cca1..144ff3ab4d 100644 --- a/test/components/structures/auth/Registration-test.js +++ b/test/components/structures/auth/Registration-test.js @@ -20,7 +20,7 @@ import ReactTestUtils from 'react-dom/test-utils'; import { createClient } from 'matrix-js-sdk/src/matrix'; import sdk from '../../../skinned-sdk'; -import SdkConfig from '../../../../src/SdkConfig'; +import SdkConfig, { DEFAULTS } from '../../../../src/SdkConfig'; import { createTestClient, mkServerConfig } from "../../../test-utils"; jest.mock('matrix-js-sdk/src/matrix'); @@ -34,6 +34,10 @@ describe('Registration', function() { let parentDiv; beforeEach(function() { + jest.spyOn(SdkConfig, "get").mockReturnValue({ + ...DEFAULTS, + disable_custom_urls: true, + }); parentDiv = document.createElement('div'); document.body.appendChild(parentDiv); createClient.mockImplementation(() => createTestClient()); @@ -61,10 +65,6 @@ describe('Registration', function() { }); it('should show form when custom URLs disabled', async function() { - jest.spyOn(SdkConfig, "get").mockReturnValue({ - disable_custom_urls: true, - }); - const root = render(); // Set non-empty flows & matrixClient to get past the loading spinner @@ -84,10 +84,6 @@ describe('Registration', function() { }); it("should show SSO options if those are available", async () => { - jest.spyOn(SdkConfig, "get").mockReturnValue({ - disable_custom_urls: true, - }); - const root = render(); // Set non-empty flows & matrixClient to get past the loading spinner diff --git a/test/components/views/elements/AppTile-test.tsx b/test/components/views/elements/AppTile-test.tsx index aef240655f..3d3779568d 100644 --- a/test/components/views/elements/AppTile-test.tsx +++ b/test/components/views/elements/AppTile-test.tsx @@ -139,7 +139,7 @@ describe("AppTile", () => { const instance = renderer.root.findByType(AppTile).instance; const endWidgetActions = jest.spyOn(instance, "endWidgetActions"); - console.log("Switch to room 2"); + // Switch to room 2 dis.dispatch({ action: Action.ViewRoom, room_id: "r2", @@ -194,7 +194,7 @@ describe("AppTile", () => { const instance = renderer.root.findByType(AppTile).instance; const endWidgetActions = jest.spyOn(instance, "endWidgetActions"); - console.log("Move widget to center"); + // Move widget to center // Stop mocking settings so that the widget move can take effect mockSettings.mockRestore(); diff --git a/test/components/views/messages/TextualBody-test.js b/test/components/views/messages/TextualBody-test.js index 48ab8ed244..26d7726f08 100644 --- a/test/components/views/messages/TextualBody-test.js +++ b/test/components/views/messages/TextualBody-test.js @@ -352,6 +352,7 @@ describe("", () => { }, event: true, }); + jest.spyOn(ev, 'replacingEventDate').mockReturnValue(new Date(1993, 7, 3)); ev.makeReplaced(ev2); wrapper.setProps({ diff --git a/test/components/views/rooms/__snapshots__/RoomPreviewBar-test.tsx.snap b/test/components/views/rooms/__snapshots__/RoomPreviewBar-test.tsx.snap index 441c975f6d..23824baa15 100644 --- a/test/components/views/rooms/__snapshots__/RoomPreviewBar-test.tsx.snap +++ b/test/components/views/rooms/__snapshots__/RoomPreviewBar-test.tsx.snap @@ -106,7 +106,7 @@ exports[` with an invite with an invited email when client has This invite to RoomPreviewBar-test-room was sent to test@test.com

- Share this email in Settings to receive invites directly in . + Share this email in Settings to receive invites directly in Element.

`; @@ -119,7 +119,7 @@ exports[` with an invite with an invited email when client has This invite to RoomPreviewBar-test-room was sent to test@test.com

- Share this email in Settings to receive invites directly in . + Share this email in Settings to receive invites directly in Element.

`; @@ -132,7 +132,7 @@ exports[` with an invite with an invited email when client has This invite to RoomPreviewBar-test-room was sent to test@test.com

- Use an identity server in Settings to receive invites directly in . + Use an identity server in Settings to receive invites directly in Element.

`; @@ -145,7 +145,7 @@ exports[` with an invite with an invited email when invitedEma This invite to RoomPreviewBar-test-room was sent to test@test.com which is not associated with your account

- Link this email with your account in Settings to receive invites directly in . + Link this email with your account in Settings to receive invites directly in Element.

`; diff --git a/test/editor/model-test.js b/test/editor/model-test.js index 15c5af5806..3d0aa5cf64 100644 --- a/test/editor/model-test.js +++ b/test/editor/model-test.js @@ -101,7 +101,6 @@ describe('editor/model', function() { pc.plain("world"), ], pc, renderer); model.update("hello\nwarm\nworld", "insertText", { offset: 10, atNodeEnd: true }); - console.log(model.serializeParts()); expect(renderer.count).toBe(1); expect(renderer.caret.index).toBe(2); expect(renderer.caret.offset).toBe(4); diff --git a/test/editor/operations-test.js b/test/editor/operations-test.js index 17a4c8ba11..cbf62d0717 100644 --- a/test/editor/operations-test.js +++ b/test/editor/operations-test.js @@ -176,7 +176,6 @@ describe('editor/operations: formatting operations', () => { { "text": "__new paragraph__", "type": "plain" }, ]); range = model.startRange(model.positionForOffset(0, true), model.getPositionAtEnd()); // select-all - console.log("RANGE", range.parts); toggleInlineFormat(range, "__"); expect(model.serializeParts()).toEqual([ { "text": "hello world,", "type": "plain" }, diff --git a/test/setupTests.js b/test/setupTests.js index 3ed4e8c390..6297ddbd8f 100644 --- a/test/setupTests.js +++ b/test/setupTests.js @@ -3,10 +3,15 @@ import Adapter from "@wojtekmaj/enzyme-adapter-react-17"; import { configure } from "enzyme"; import * as languageHandler from "../src/languageHandler"; +import SdkConfig, { DEFAULTS } from '../src/SdkConfig'; languageHandler.setLanguage('en'); languageHandler.setMissingEntryGenerator(key => key.split("|", 2)[1]); +// uninitialised SdkConfig causes lots of warnings in console +// init with defaults +SdkConfig.put(DEFAULTS); + require('jest-fetch-mock').enableMocks(); // jest 27 removes setImmediate from jsdom diff --git a/test/utils/arrays-test.ts b/test/utils/arrays-test.ts index d38120daaf..7dabbb2981 100644 --- a/test/utils/arrays-test.ts +++ b/test/utils/arrays-test.ts @@ -30,8 +30,10 @@ import { GroupedArray, } from "../../src/utils/arrays"; -function expectSample(i: number, input: number[], expected: number[], smooth = false) { - console.log(`Resample case index: ${i}`); // for debugging test failures +type TestParams = { input: number[], output: number[] }; +type TestCase = [string, TestParams]; + +function expectSample(input: number[], expected: number[], smooth = false) { const result = (smooth ? arraySmoothingResample : arrayFastResample)(input, expected.length); expect(result).toBeDefined(); expect(result).toHaveLength(expected.length); @@ -40,60 +42,68 @@ function expectSample(i: number, input: number[], expected: number[], smooth = f describe('arrays', () => { describe('arrayFastResample', () => { - it('should downsample', () => { - [ - { input: [1, 2, 3, 4, 5], output: [1, 4] }, // Odd -> Even - { input: [1, 2, 3, 4, 5], output: [1, 3, 5] }, // Odd -> Odd - { input: [1, 2, 3, 4], output: [1, 2, 3] }, // Even -> Odd - { input: [1, 2, 3, 4], output: [1, 3] }, // Even -> Even - ].forEach((c, i) => expectSample(i, c.input, c.output)); - }); + const downsampleCases: TestCase[] = [ + ['Odd -> Even', { input: [1, 2, 3, 4, 5], output: [1, 4] }], + ['Odd -> Odd', { input: [1, 2, 3, 4, 5], output: [1, 3, 5] }], + ['Even -> Odd', { input: [1, 2, 3, 4], output: [1, 2, 3] }], + ['Even -> Even', { input: [1, 2, 3, 4], output: [1, 3] }], + ]; + it.each(downsampleCases)('downsamples correctly from %s', (_d, { input, output }) => + expectSample(input, output), + ); - it('should upsample', () => { - [ - { input: [1, 2, 3], output: [1, 1, 2, 2, 3, 3] }, // Odd -> Even - { input: [1, 2, 3], output: [1, 1, 2, 2, 3] }, // Odd -> Odd - { input: [1, 2], output: [1, 1, 1, 2, 2] }, // Even -> Odd - { input: [1, 2], output: [1, 1, 1, 2, 2, 2] }, // Even -> Even - ].forEach((c, i) => expectSample(i, c.input, c.output)); - }); + const upsampleCases: TestCase[] = [ + ['Odd -> Even', { input: [1, 2, 3], output: [1, 1, 2, 2, 3, 3] }], + ['Odd -> Odd', { input: [1, 2, 3], output: [1, 1, 2, 2, 3] }], + ['Even -> Odd', { input: [1, 2], output: [1, 1, 1, 2, 2] }], + ['Even -> Even', { input: [1, 2], output: [1, 1, 1, 2, 2, 2] }], + ]; + it.each(upsampleCases)('upsamples correctly from %s', (_d, { input, output }) => + expectSample(input, output), + ); - it('should maintain sample', () => { - [ - { input: [1, 2, 3], output: [1, 2, 3] }, // Odd - { input: [1, 2], output: [1, 2] }, // Even - ].forEach((c, i) => expectSample(i, c.input, c.output)); - }); + const maintainSampleCases: TestCase[] = [ + ['Odd', { input: [1, 2, 3], output: [1, 2, 3] }], // Odd + ['Even', { input: [1, 2], output: [1, 2] }], // Even + ]; + + it.each(maintainSampleCases)('maintains samples for %s', (_d, { input, output }) => + expectSample(input, output), + ); }); describe('arraySmoothingResample', () => { - it('should downsample', () => { - // Dev note: these aren't great samples, but they demonstrate the bare minimum. Ideally - // we'd be feeding a thousand values in and seeing what a curve of 250 values looks like, - // but that's not really feasible to manually verify accuracy. - [ - { input: [4, 4, 1, 4, 4, 1, 4, 4, 1], output: [3, 3, 3, 3] }, // Odd -> Even - { input: [4, 4, 1, 4, 4, 1, 4, 4, 1], output: [3, 3, 3] }, // Odd -> Odd - { input: [4, 4, 1, 4, 4, 1, 4, 4], output: [3, 3, 3] }, // Even -> Odd - { input: [4, 4, 1, 4, 4, 1, 4, 4], output: [3, 3] }, // Even -> Even - ].forEach((c, i) => expectSample(i, c.input, c.output, true)); - }); + // Dev note: these aren't great samples, but they demonstrate the bare minimum. Ideally + // we'd be feeding a thousand values in and seeing what a curve of 250 values looks like, + // but that's not really feasible to manually verify accuracy. + const downsampleCases: TestCase[] = [ + ['Odd -> Even', { input: [4, 4, 1, 4, 4, 1, 4, 4, 1], output: [3, 3, 3, 3] }], + ['Odd -> Odd', { input: [4, 4, 1, 4, 4, 1, 4, 4, 1], output: [3, 3, 3] }], + ['Even -> Odd', { input: [4, 4, 1, 4, 4, 1, 4, 4], output: [3, 3, 3] }], + ['Even -> Even', { input: [4, 4, 1, 4, 4, 1, 4, 4], output: [3, 3] }], + ]; - it('should upsample', () => { - [ - { input: [2, 0, 2], output: [2, 2, 0, 0, 2, 2] }, // Odd -> Even - { input: [2, 0, 2], output: [2, 2, 0, 0, 2] }, // Odd -> Odd - { input: [2, 0], output: [2, 2, 2, 0, 0] }, // Even -> Odd - { input: [2, 0], output: [2, 2, 2, 0, 0, 0] }, // Even -> Even - ].forEach((c, i) => expectSample(i, c.input, c.output, true)); - }); + it.each(downsampleCases)('downsamples correctly from %s', (_d, { input, output }) => + expectSample(input, output, true), + ); - it('should maintain sample', () => { - [ - { input: [2, 0, 2], output: [2, 0, 2] }, // Odd - { input: [2, 0], output: [2, 0] }, // Even - ].forEach((c, i) => expectSample(i, c.input, c.output, true)); - }); + const upsampleCases: TestCase[] = [ + ['Odd -> Even', { input: [2, 0, 2], output: [2, 2, 0, 0, 2, 2] }], + ['Odd -> Odd', { input: [2, 0, 2], output: [2, 2, 0, 0, 2] }], + ['Even -> Odd', { input: [2, 0], output: [2, 2, 2, 0, 0] }], + ['Even -> Even', { input: [2, 0], output: [2, 2, 2, 0, 0, 0] }], + ]; + it.each(upsampleCases)('upsamples correctly from %s', (_d, { input, output }) => + expectSample(input, output, true), + ); + + const maintainCases: TestCase[] = [ + ['Odd', { input: [2, 0, 2], output: [2, 0, 2] }], + ['Even', { input: [2, 0], output: [2, 0] }], + ]; + it.each(maintainCases)('maintains samples for %s', (_d, { input, output }) => + expectSample(input, output), + ); }); describe('arrayRescale', () => { diff --git a/test/utils/test-utils.ts b/test/utils/test-utils.ts index e4bc3740fd..dd98483796 100644 --- a/test/utils/test-utils.ts +++ b/test/utils/test-utils.ts @@ -19,6 +19,7 @@ import { MatrixEvent } from "matrix-js-sdk/src/models/event"; import { EventType } from "matrix-js-sdk/src/@types/event"; import { EventEmitter } from "events"; import { ReactWrapper } from "enzyme"; +import { Room } from "matrix-js-sdk"; import { AsyncStoreWithClient } from "../../src/stores/AsyncStoreWithClient"; import { mkEvent, mkStubRoom } from "../test-utils"; @@ -60,6 +61,24 @@ export const mkRoom = (client: MatrixClient, roomId: string, rooms?: ReturnType< return room; }; +/** + * Upserts given events into room.currentState + * @param room + * @param events + */ +export const upsertRoomStateEvents = (room: Room, events: MatrixEvent[]): void => { + const eventsMap = events.reduce((acc, event) => { + const eventType = event.getType(); + if (!acc.has(eventType)) { + acc.set(eventType, new Map()); + } + acc.get(eventType).set(event.getStateKey(), event); + return acc; + }, room.currentState.events || new Map>()); + + room.currentState.events = eventsMap; +}; + export const mkSpace = ( client: MatrixClient, spaceId: string,