Align widget_build_url_ignore_dm with call behaviour switch between 1:1 and Widget (#12760)

* Align `widget_build_url_ignore_dm` with call behaviour switch between 1:1 and Widget

Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>

* Add tests

Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>

* Improve coverage

Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>

---------

Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
This commit is contained in:
Michael Telatynski 2024-07-15 10:08:34 +01:00 committed by GitHub
parent 44454618d8
commit 3221f7cade
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 103 additions and 46 deletions

View file

@ -14,38 +14,91 @@ See the License for the specific language governing permissions and
limitations under the License.
*/
import { isManagedHybridWidgetEnabled } from "../../src/widgets/ManagedHybrid";
import DMRoomMap from "../../src/utils/DMRoomMap";
import { Room } from "matrix-js-sdk/src/matrix";
import { logger } from "matrix-js-sdk/src/logger";
import fetchMock from "fetch-mock-jest";
import { addManagedHybridWidget, isManagedHybridWidgetEnabled } from "../../src/widgets/ManagedHybrid";
import { stubClient } from "../test-utils";
import SdkConfig from "../../src/SdkConfig";
import WidgetUtils from "../../src/utils/WidgetUtils";
import { WidgetLayoutStore } from "../../src/stores/widgets/WidgetLayoutStore";
jest.mock("../../src/utils/room/getJoinedNonFunctionalMembers", () => ({
getJoinedNonFunctionalMembers: jest.fn().mockReturnValue([1, 2]),
}));
describe("isManagedHybridWidgetEnabled", () => {
let dmRoomMap: DMRoomMap;
let room: Room;
beforeEach(() => {
stubClient();
dmRoomMap = {
getUserIdForRoomId: jest.fn().mockReturnValue("@user:server"),
} as unknown as DMRoomMap;
DMRoomMap.setShared(dmRoomMap);
const client = stubClient();
room = new Room("!room:server", client, client.getSafeUserId());
});
it("should return false if widget_build_url is unset", () => {
expect(isManagedHybridWidgetEnabled("!room:server")).toBeFalsy();
expect(isManagedHybridWidgetEnabled(room)).toBeFalsy();
});
it("should return true for DMs when widget_build_url_ignore_dm is unset", () => {
it("should return true for 1-1 rooms when widget_build_url_ignore_dm is unset", () => {
SdkConfig.put({
widget_build_url: "https://url",
});
expect(isManagedHybridWidgetEnabled("!room:server")).toBeTruthy();
expect(isManagedHybridWidgetEnabled(room)).toBeTruthy();
});
it("should return false for DMs when widget_build_url_ignore_dm is true", () => {
it("should return false for 1-1 rooms when widget_build_url_ignore_dm is true", () => {
SdkConfig.put({
widget_build_url: "https://url",
widget_build_url_ignore_dm: true,
});
expect(isManagedHybridWidgetEnabled("!room:server")).toBeFalsy();
expect(isManagedHybridWidgetEnabled(room)).toBeFalsy();
});
});
describe("addManagedHybridWidget", () => {
let room: Room;
beforeEach(() => {
const client = stubClient();
room = new Room("!room:server", client, client.getSafeUserId());
});
it("should noop if user lacks permission", async () => {
const logSpy = jest.spyOn(logger, "error").mockImplementation();
jest.spyOn(WidgetUtils, "canUserModifyWidgets").mockReturnValue(false);
fetchMock.mockClear();
await addManagedHybridWidget(room);
expect(logSpy).toHaveBeenCalledWith("User not allowed to modify widgets in !room:server");
expect(fetchMock).toHaveBeenCalledTimes(0);
});
it("should noop if no widget_build_url", async () => {
jest.spyOn(WidgetUtils, "canUserModifyWidgets").mockReturnValue(true);
fetchMock.mockClear();
await addManagedHybridWidget(room);
expect(fetchMock).toHaveBeenCalledTimes(0);
});
it("should add the widget successfully", async () => {
fetchMock.get("https://widget-build-url/?roomId=!room:server", {
widget_id: "WIDGET_ID",
widget: { key: "value" },
});
jest.spyOn(WidgetUtils, "canUserModifyWidgets").mockReturnValue(true);
jest.spyOn(WidgetLayoutStore.instance, "canCopyLayoutToRoom").mockReturnValue(true);
const setRoomWidgetContentSpy = jest.spyOn(WidgetUtils, "setRoomWidgetContent").mockResolvedValue();
SdkConfig.put({
widget_build_url: "https://widget-build-url",
});
await addManagedHybridWidget(room);
expect(fetchMock).toHaveBeenCalledWith("https://widget-build-url?roomId=!room:server");
expect(setRoomWidgetContentSpy).toHaveBeenCalledWith(room.client, room.roomId, "WIDGET_ID", {
"key": "value",
"io.element.managed_hybrid": true,
});
});
});