From 83788cc8e0470c660b2783c2ec73c52269180775 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 12 Mar 2025 14:18:31 +0000 Subject: [PATCH] Add playwright tests for the opendesk module --- .../element-web/tests/fixture/app1.png | Bin 0 -> 1588 bytes .../element-web/tests/fixture/app2.png | Bin 0 -> 13818 bytes .../element-web/tests/fixture/logo.svg | 50 +++++ .../element-web/tests/fixture/navigation.json | 44 ++++ .../tests/fixture/silent-login.html | 14 ++ .../element-web/tests/fixture/widget.html | 52 +++++ .../element-web/tests/opendesk.spec.ts | 209 ++++++++++++++++++ ...Opendesk-should-render-top-bar-1-linux.yml | 5 + ...Opendesk-should-render-top-bar-2-linux.yml | 15 ++ .../snapshots/opendesk.spec.ts/menu-linux.png | Bin 0 -> 18149 bytes .../opendesk.spec.ts/nav-hover-linux.png | Bin 0 -> 2288 bytes .../snapshots/opendesk.spec.ts/nav-linux.png | Bin 0 -> 2288 bytes .../opendesk.spec.ts/nav-loading-linux.png | Bin 0 -> 2226 bytes 13 files changed, 389 insertions(+) create mode 100644 modules/opendesk/element-web/tests/fixture/app1.png create mode 100644 modules/opendesk/element-web/tests/fixture/app2.png create mode 100644 modules/opendesk/element-web/tests/fixture/logo.svg create mode 100644 modules/opendesk/element-web/tests/fixture/navigation.json create mode 100644 modules/opendesk/element-web/tests/fixture/silent-login.html create mode 100644 modules/opendesk/element-web/tests/fixture/widget.html create mode 100644 modules/opendesk/element-web/tests/opendesk.spec.ts create mode 100644 modules/opendesk/element-web/tests/snapshots/opendesk.spec.ts/Opendesk-should-render-top-bar-1-linux.yml create mode 100644 modules/opendesk/element-web/tests/snapshots/opendesk.spec.ts/Opendesk-should-render-top-bar-2-linux.yml create mode 100644 modules/opendesk/element-web/tests/snapshots/opendesk.spec.ts/menu-linux.png create mode 100644 modules/opendesk/element-web/tests/snapshots/opendesk.spec.ts/nav-hover-linux.png create mode 100644 modules/opendesk/element-web/tests/snapshots/opendesk.spec.ts/nav-linux.png create mode 100644 modules/opendesk/element-web/tests/snapshots/opendesk.spec.ts/nav-loading-linux.png diff --git a/modules/opendesk/element-web/tests/fixture/app1.png b/modules/opendesk/element-web/tests/fixture/app1.png new file mode 100644 index 0000000000000000000000000000000000000000..2c34416b885b9728da50b3d275652cec6e9d6004 GIT binary patch literal 1588 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 T^B6||yQ} + + + + + + + + + + + + \ No newline at end of file diff --git a/modules/opendesk/element-web/tests/fixture/navigation.json b/modules/opendesk/element-web/tests/fixture/navigation.json new file mode 100644 index 0000000000..79bac98d25 --- /dev/null +++ b/modules/opendesk/element-web/tests/fixture/navigation.json @@ -0,0 +1,44 @@ +{ + "categories": [ + { + "identifier": "category1", + "display_name": "Category 1", + "entries": [ + { + "identifier": "app1", + "display_name": "App 1", + "icon_url": "http://localhost:8080/app1.png", + "link": "https://example.com/app1", + "target": "_blank" + }, + { + "identifier": "app2", + "display_name": "App 2", + "icon_url": "http://localhost:8080/app2.png", + "link": "https://example.com/app2", + "target": "_blank" + } + ] + }, + { + "identifier": "category2", + "display_name": "Category 2", + "entries": [ + { + "identifier": "app3", + "display_name": "App 3", + "icon_url": "http://localhost:8080/app1.png", + "link": "https://example.com/app3", + "target": "_blank" + }, + { + "identifier": "app4", + "display_name": "App 4", + "icon_url": "http://localhost:8080/app2.png", + "link": "https://example.com/app4", + "target": "_blank" + } + ] + } + ] +} diff --git a/modules/opendesk/element-web/tests/fixture/silent-login.html b/modules/opendesk/element-web/tests/fixture/silent-login.html new file mode 100644 index 0000000000..ae80633f60 --- /dev/null +++ b/modules/opendesk/element-web/tests/fixture/silent-login.html @@ -0,0 +1,14 @@ + + + + + + Univention Silent Login + + + + diff --git a/modules/opendesk/element-web/tests/fixture/widget.html b/modules/opendesk/element-web/tests/fixture/widget.html new file mode 100644 index 0000000000..3e6a834a73 --- /dev/null +++ b/modules/opendesk/element-web/tests/fixture/widget.html @@ -0,0 +1,52 @@ + + + + Demo Widget + + + +

Hello unknown!

+ + diff --git a/modules/opendesk/element-web/tests/opendesk.spec.ts b/modules/opendesk/element-web/tests/opendesk.spec.ts new file mode 100644 index 0000000000..6598dad05a --- /dev/null +++ b/modules/opendesk/element-web/tests/opendesk.spec.ts @@ -0,0 +1,209 @@ +/* +Copyright 2025 New Vector Ltd. + +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. +*/ + +import { type SynapseContainer } from "@element-hq/element-web-playwright-common/lib/testcontainers"; + +import { test, expect } from "../../../../playwright/element-web-test.ts"; + +declare module "@element-hq/element-web-module-api" { + interface Config { + "net.nordeck.element_web.module.opendesk": { + config: { + banner: { + ics_navigation_json_url: string; + ics_silent_url: string; + portal_logo_svg_url: string; + portal_url: string; + }; + custom_css_variables: { + [key: `--cpd-${string}`]: string; + }; + }; + }; + "net.nordeck.element_web.module.widget_toggles": { + config: { + types: string[]; + }; + }; + "net.nordeck.element_web.module.widget_lifecycle": { + widget_permissions: { + [url: string]: { + preload_approved: boolean; + identity_approved: boolean; + capabilities_approved: string[]; + }; + }; + }; + } +} + +test.use({ + displayName: "Timmy", + synapseConfig: async ({ synapseConfig, _homeserver: homeserver }, use) => { + // Required for widget lifecycle test + (homeserver as SynapseContainer).withConfigField("listeners[0].resources[0].names", ["client", "openid"]); + await use(synapseConfig); + }, + page: async ({ context, page, moduleDir }, use) => { + for (const path of ["logo.svg", "app1.png", "app2.png"]) { + await context.route(`/${path}*`, async (route) => { + await route.fulfill({ path: `${moduleDir}/tests/fixture/${path}` }); + }); + } + await context.route("http://localhost:8080/ics/navigation.json*", async (route) => { + await route.fulfill({ + path: `${moduleDir}/tests/fixture/navigation.json`, + contentType: "application/json", + }); + }); + await context.route("http://localhost:8080/ics/silent", async (route) => { + await route.fulfill({ path: `${moduleDir}/tests/fixture/silent-login.html`, contentType: "text/html" }); + }); + await context.route("http://localhost:8080/widget.html*", async (route) => { + await route.fulfill({ path: `${moduleDir}/tests/fixture/widget.html`, contentType: "text/html" }); + }); + + await page.goto("/"); + await use(page); + }, + config: { + "net.nordeck.element_web.module.opendesk": { + config: { + banner: { + ics_navigation_json_url: "http://localhost:8080/ics/navigation.json", + ics_silent_url: "http://localhost:8080/ics/silent", + portal_logo_svg_url: "http://localhost:8080/logo.svg", + portal_url: "https://example.com/portal", + }, + + custom_css_variables: { + "--cpd-color-text-action-accent": "purple", + }, + }, + }, + "net.nordeck.element_web.module.widget_toggles": { + config: { + types: [], + }, + }, + "net.nordeck.element_web.module.widget_lifecycle": { + widget_permissions: { + "http://localhost:8080/widget.html": { + preload_approved: true, + identity_approved: true, + capabilities_approved: ["org.matrix.msc2762.receive.state_event:m.room.topic"], + }, + }, + }, + "net.nordeck.element_web.module.guest": { + config: { + guest_user_homeserver_url: "https://matrix.local/", + }, + }, + }, +}); + +test.describe("Opendesk", () => { + test("should render top-bar", { tag: ["@screenshot"] }, async ({ page }) => { + await expect(page.getByRole("heading", { name: "Welcome to Element!" })).toBeVisible(); + await expect(page.getByLabel("Show portal")).toHaveAttribute("href", "https://example.com/portal"); + + const nav = page.locator("nav"); + await expect(nav).toMatchScreenshot(`nav_loading.png`); + // The stub silent html doesn't seem to work in Playwright so send the postMessage manually + await page.evaluate(() => { + window.postMessage({ + loggedIn: true, + }); + }); + + const trigger = page.getByLabel("Show menu"); + await expect(trigger).toBeVisible(); + + // Assert the banner looks as we expect + await expect(nav).toMatchAriaSnapshot(); + await expect(nav).toMatchScreenshot(`nav.png`); + + // Check hover styles + await trigger.hover(); + await expect(nav).toMatchScreenshot(`nav_hover.png`); + + await test.step("open menu", async () => { + await trigger.click(); + const app1 = page.getByRole("link", { name: "App 1" }); + await expect(app1).toHaveAttribute("href", "https://example.com/app1"); + await app1.hover(); + + // Assert the sidebar looks as we expect + await expect(page.getByTestId("menu-list")).toMatchAriaSnapshot(); + await expect(page).toMatchScreenshot(`menu.png`, { + // We exclude this as we don't want to assert Element's styling, only our own + css: ` + .mx_AuthPage { + opacity: 0; + } + `, + }); + }); + + await test.step("close menu", async () => { + // Assert it closes by clicking the overlay + await page.getByTestId("menu-backdrop").click(); + await expect(page.getByTestId("menu-list")).not.toBeVisible(); + }); + }); + + test("should apply custom_css_variables", async ({ page, user }) => { + await expect(page.getByRole("button", { name: "Send a Direct Message" })).toHaveCSS( + "background-color", + "rgb(128, 0, 128)", + ); // -> purple + }); + + test("should show the widget without any permission requests", async ({ page, user, homeserver }) => { + const bot = await homeserver.registerUser("bot", "password", "Bot"); + const { room_id: roomId } = await homeserver.csApi.request<{ room_id: string }>( + "POST", + "/v3/createRoom", + bot.accessToken, + { + name: "Trusted Widget", + }, + ); + await homeserver.csApi.request<{ + event_id: string; + }>("PUT", `/v3/rooms/${encodeURIComponent(roomId)}/state/im.vector.modular.widgets/1`, bot.accessToken, { + id: "1", + creatorUserId: bot.userId, + type: "custom", + name: "Trusted Widget", + url: `http://localhost:8080/widget.html?hsUrl=${encodeURIComponent(homeserver.baseUrl)}`, + }); + await homeserver.csApi.request( + "PUT", + `/v3/rooms/${encodeURIComponent(roomId)}/state/io.element.widgets.layout/`, + bot.accessToken, + { + widgets: { + "1": { + container: "top", + }, + }, + }, + ); + await homeserver.csApi.request("POST", `/v3/rooms/${encodeURIComponent(roomId)}/invite`, bot.accessToken, { + user_id: user.userId, + }); + + await page.getByText("Trusted Widget").click(); + await page.getByText("Accept").click(); + + await expect( + page.frameLocator(`iframe[title="Trusted Widget"]`).getByRole("heading", { name: `Hello ${user.userId}!` }), + ).toBeVisible(); + }); +}); diff --git a/modules/opendesk/element-web/tests/snapshots/opendesk.spec.ts/Opendesk-should-render-top-bar-1-linux.yml b/modules/opendesk/element-web/tests/snapshots/opendesk.spec.ts/Opendesk-should-render-top-bar-1-linux.yml new file mode 100644 index 0000000000..f6b58ee014 --- /dev/null +++ b/modules/opendesk/element-web/tests/snapshots/opendesk.spec.ts/Opendesk-should-render-top-bar-1-linux.yml @@ -0,0 +1,5 @@ +- navigation: + - link "Show portal": + - img "Portal logo" + - button "Show menu": + - img diff --git a/modules/opendesk/element-web/tests/snapshots/opendesk.spec.ts/Opendesk-should-render-top-bar-2-linux.yml b/modules/opendesk/element-web/tests/snapshots/opendesk.spec.ts/Opendesk-should-render-top-bar-2-linux.yml new file mode 100644 index 0000000000..e979e85507 --- /dev/null +++ b/modules/opendesk/element-web/tests/snapshots/opendesk.spec.ts/Opendesk-should-render-top-bar-2-linux.yml @@ -0,0 +1,15 @@ +- list: + - listitem: + - text: Category 1 + - list: + - listitem: + - link "App 1" + - listitem: + - link "App 2" + - listitem: + - text: Category 2 + - list: + - listitem: + - link "App 3" + - listitem: + - link "App 4" diff --git a/modules/opendesk/element-web/tests/snapshots/opendesk.spec.ts/menu-linux.png b/modules/opendesk/element-web/tests/snapshots/opendesk.spec.ts/menu-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..c4a893dd31694c2cc6d774ea531f56e19b69e052 GIT binary patch literal 18149 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 literal 0 HcmV?d00001 diff --git a/modules/opendesk/element-web/tests/snapshots/opendesk.spec.ts/nav-linux.png b/modules/opendesk/element-web/tests/snapshots/opendesk.spec.ts/nav-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..c1adf808ab74f4723b83c3f4711bb49cb4c57cea GIT binary patch literal 2288 zcmb_eYgm%m7XHjp8BL`cwWm~K8gs0XtSL#&LpeESmRaOzqiH8C^Ac)gc&7}rGNBpM zN>j$lTZ-m2#Y8hNsio!(0hP=ILBKl*h@M@~{5a=%&cAc^kMG;-dG=m=?X}+bUHi71 ztCOzwCT$3Ube#_$Itf7Fx-vnF^xBb%*W+RNVFx&%6`+CQ}~D?w&5KG%7djZ*dE(qQqy|3gxK;|M!J*d!+x#|p>*@|nEZJmfvTi;#dWD9oi@zc z%ex;P1z}vh7}NJ&XiAK=ea5~fG@ z^))p$<(TS#6IE%c?f#n2o<4cg$O(4AdN27&01bH(;u4_WjmUZ8p1*_H{g#OJy z5(~7f{H4=eqEy6!HyuNd>{$~Oq`wH)>}|khJf=}p%8M8;u;EWXxO!MX06)02-f+r1JMvRL zH9mSg1-1|QAIq{`te1^u+Q(dl*`w3(a|Mz;qxoDantp(-`w2|3=AS7B50mv-;;U<1`JBMRl&?hKL^as z&G|$Na^EEB6Q!&GBx#pl>wcxELQCJ&yX;(xRLn85{Jj!4LVr0Ly`yf8w~r4apgY?> zM%wJk>!xD-TJL%?nM~qri&0s;sI0A(g1|(s0ti4i%*|8V*B*9qbabTAXmMU_HoK%= z%J$sp%UDkH@M&-Dhdac_$NTw>*G)6(qUL!FLhi}JIHhzXf_Vl>x}l}tm5JVI>K;KZ z^J^PqGLL83M)Vh);1j*v+4KkSwcQ}83!U++#Cw_T} zk#try+lDYRGi#$DC`>dOoqw`0Jw2U+s}qBC&Gr=2yk7c5cKq^I+X{jj6Lmi!J#B1k zSc(=S-*=szF8O_6YgukxU5sS7HWMA1ZS_wF+bk3cMHZWwm=t-G>LC{v7X0;tviF65 z0(l}xhUK4AkGFQluc~AL*-_i1k6iQd_*J_qtQ1^qG>V^vB!R3*rBdC^)+BgF zW~Ppg&UnjKC-Qzg@91!@Hx|2Lx?|hS26NYDvtgl7c;e}=XNamrqRm@YMZiv}l>i;^N}>fx}Vqsl--#U7fNC!{%@@ zX#ri2qq;PC4VAI-IfX(o%}}C9FXB~-p&I}8KbLBD16VyMJ-D_pj*4Qaq@0QfZf?H? zHqU9*YZ>)oO1OPtEU zzH()5{&DJxu&7izZRQA{n(t|+IwyN^pcpMWq+Hr|MY4XzgE~$qT-CaY@dnK0uvecbh7<30E+$>!KHhA&QjDCqP~}tKlNBd9B?W!X^9& zJ)*2;oNUKX2#b~q!eZ-s)UcL4%x^=^4td3><4pq+nJemus$y*(P>Zmx&vIXrBF1muv8` zqod>aKjc4TuTj0-O7Z77k&RiSqoxk~;uKea3f@|`)d4oo?_T|QL;sWDv{EXbisAi+ z*}Hcy&AWE@pu4;KJny{@vKWNlMmCuhH|t}TXJlL==Bj8&EoTWq{G9*8ajp{oNBQkpGvOFz~k{QE-urx{A?}L$d8~* zlm{xsR4L%cU2~5J0)aU&kYyiZO|rVgu3UP`((A^wM*-0X>V_mOC42$`2b9b%dv`s! zZRD}-Y0ry_iV6#FBhVp3_hXyotQC?H5kGt2Tz?SDvs)`G{z_prwQ ni{Y>`yTSZsG;j%7O|Gb$(0k5nocnPWn2@uh>!A{dvkCtK7QI_^ literal 0 HcmV?d00001 diff --git a/modules/opendesk/element-web/tests/snapshots/opendesk.spec.ts/nav-loading-linux.png b/modules/opendesk/element-web/tests/snapshots/opendesk.spec.ts/nav-loading-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..f79c7ff28bcf87167166f1b0d7c1c3b7d440737f GIT binary patch literal 2226 zcmb_deK^x=AOAU2I~dN@i(Z`8(g`_~bT09PBE399$tsOh5*cQ#OkTE>nn zaQ)5t5Cp-GA3N*|L90Lr9fW-czFiYu7%=JJeUG|96>PI92!cf%KYYk9HgATH4g2^J zu|`%+nkoK$wRN`d{k>hN{b~7zv+NwjvG{G6LvX)cmdZ8$?ti@ev-7E8mu23Q&h742 z2)J(^eqZ^XqPQ2G_xfDh4h=5bFGw|8^AOpEYX2Hh6fuZ-lol^p%8zF)@N%V&LUhLa zD=Xaui1j<-R)T0GtQkx@?m&j1)9wHB;=y^y*2=2n?{N)_MU>mko<^h5uQ~nw{gwF! zpp-cZ^l&7kpsK1$B9WZhG~Kj4sTLHMjf8x^5A5IH2I)dj2JE{%|FLKbc22UZ#*VP; zL)pnD6^)XHYnvDfXceXI>3ZzC83GZ%`{mOk{FU(6*WBbrD zAwcLL`zI$TU9k?Fsf)h8@wQ5-ybw24bk0@YY3{l#Yqe&+mM;lu+BuGo{negWA(b$} zrfzWy3lEQ5;1i6u9?1D;Q8)&3w(Oi8hFd1y){%}Nji))pNIun*w3?Qd7SG*p_EEh@ zZV9PyI6NdIM6Fgc&N7XVa|;U{n#PzJr$ptAQ>Xgyz0QQmKMT`cHT#qI;6A^zpe4wg zlXSsRL1l19f05?^Ge|pxVTRD40WMdYGBIFcm4<0#>R%0IPYJEh?^{Y zpJ^eKAOOhQ2>N>;_xxe#cjgS2&v$-ZM5hZ=tt;*+N>Pjpv17kRoPZAi^akUSuD+6W0#x*x8ySS7ev)eZC6*9`BBO{4V6kQ@hfF8 zM8&yLPPgP&4(!7W*F=&My8-%N%FVXkL7hCAQ4TJ`d;0Y04W~eV|4r!Ct5;9-(waiL zA6cC)e$JVa%jJWD;bDN>kjdN8(Tnp16D6nVlEKPgA)A`+q6`zqhzBbz@?*DC9(&Ub z474P3PO%r+rZu#Gco=>5tSLuItCx3K*GBO-3qO7QsOYipO*WAE}Uc1(``{O-OZenLF-it+O0+`Id0Q7F_1Nt*~m z+ImD`vC`@3)NJf<%?uZfg(Lssa`T;ThL5+WA(Po`HW10+txt70x(|)Q$l9`H%Q%Xs zN1U7NTZ9qbKm2LDBfUvE&Co_a#0%MhH4!`pleO6`cJ_mV57kLAMW?khYohpZOJB2t zGMa!5-Oj5!sIw@Dm!?fQB%cIV(~X9WRd#H(wy}XD17dg~fN|DmD-4nEZgx5dVuLXl zjQ9)+wVqs9SO{8n=IZL|lGM-K-Q9T&4Gqe&RXwDzkEJNUrICbLFW9Bl6nG_WN&Xer zxEJ7|4RkbYZY7w4y$`&&#b%TnowB@l9RX};wqN30bPZXcYyD2hL9UyVEsU?)1m32iVCi1Hd zdl{f34-XG7FE1b|$Am?hEULtBnn{?|jOkU;owVhkGN9D%rsciF*PsNMoT;j^1bC2- z7#X)Hv(KZ^hy+JgZ@P#q#iD5BHcm%sHLMMMt17?X{)s^(|VRaf3?)T&^W>~w*} zi5wGhtsu^t>fK9o)gB;zTXCgn2J`Y8;B|nUD`xd=yy2$EW$8;MiQo>>J}6p-H!Bp1 z%8h1b38P7CcJ0~)#5WQzeS;fsZ=27w@M)*NLM8(bX}=s67A6(E0Sea637wprxMlup zMJXvMs|+?In_M8N6;m8~N4rYeqy<8Ih6`QEo@6G`v9-1JrgJJ;6HhQzGi!IA=&Uhz z%?;wAM$z-9`c2&fFi+n&h)Du0rj z+neXO)-A^oe|5P}d|R0RB_J@6&*%T>c5k<3RCss;FsX4Xj)+@MPV_DD1BMeE9K2iy z?h*lqpk|V13(V&?B^r3Foe!nr#7?|yv_&8g0IL)Z+xa;*gn*{6BS}6<6n%aDBO3i6 zuwJxZYFx7s1V{e$U%imv9dscs#{!Ci5g)G#OM6Tk8XEdcou8X~pa=j7H1I&5+qu>F{x4k-A4SXjDTpPM|_3sOSYC8P^Cla>qUuU0Mz9ry4)T;X={ G&c6YO=sRox literal 0 HcmV?d00001