Merge branch 'develop' into widget_state_no_update_invitation_room
This commit is contained in:
commit
f726314fa2
256 changed files with 21125 additions and 16532 deletions
276
cypress/e2e/integration-manager/read_events.spec.ts
Normal file
276
cypress/e2e/integration-manager/read_events.spec.ts
Normal file
|
@ -0,0 +1,276 @@
|
|||
/*
|
||||
Copyright 2022 The Matrix.org Foundation C.I.C.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
/// <reference types="cypress" />
|
||||
|
||||
import { SynapseInstance } from "../../plugins/synapsedocker";
|
||||
import { UserCredentials } from "../../support/login";
|
||||
|
||||
const ROOM_NAME = "Integration Manager Test";
|
||||
const USER_DISPLAY_NAME = "Alice";
|
||||
|
||||
const INTEGRATION_MANAGER_TOKEN = "DefinitelySecret_DoNotUseThisForReal";
|
||||
const INTEGRATION_MANAGER_HTML = `
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Fake Integration Manager</title>
|
||||
</head>
|
||||
<body>
|
||||
<input type="text" id="target-room-id"/>
|
||||
<input type="text" id="event-type"/>
|
||||
<input type="text" id="state-key"/>
|
||||
<button name="Send" id="send-action">Press to send action</button>
|
||||
<button name="Close" id="close">Press to close</button>
|
||||
<p id="message-response">No response</p>
|
||||
<script>
|
||||
document.getElementById("send-action").onclick = () => {
|
||||
window.parent.postMessage(
|
||||
{
|
||||
action: "read_events",
|
||||
room_id: document.getElementById("target-room-id").value,
|
||||
type: document.getElementById("event-type").value,
|
||||
state_key: JSON.parse(document.getElementById("state-key").value),
|
||||
},
|
||||
'*',
|
||||
);
|
||||
};
|
||||
document.getElementById("close").onclick = () => {
|
||||
window.parent.postMessage(
|
||||
{
|
||||
action: "close_scalar",
|
||||
},
|
||||
'*',
|
||||
);
|
||||
};
|
||||
// Listen for a postmessage response
|
||||
window.addEventListener("message", (event) => {
|
||||
document.getElementById("message-response").innerText = JSON.stringify(event.data);
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
`;
|
||||
|
||||
function openIntegrationManager() {
|
||||
cy.get(".mx_RightPanel_roomSummaryButton").click();
|
||||
cy.get(".mx_RoomSummaryCard_appsGroup").within(() => {
|
||||
cy.contains("Add widgets, bridges & bots").click();
|
||||
});
|
||||
}
|
||||
|
||||
function sendActionFromIntegrationManager(
|
||||
integrationManagerUrl: string,
|
||||
targetRoomId: string,
|
||||
eventType: string,
|
||||
stateKey: string | boolean,
|
||||
) {
|
||||
cy.accessIframe(`iframe[src*="${integrationManagerUrl}"]`).within(() => {
|
||||
cy.get("#target-room-id").should("exist").type(targetRoomId);
|
||||
cy.get("#event-type").should("exist").type(eventType);
|
||||
cy.get("#state-key").should("exist").type(JSON.stringify(stateKey));
|
||||
cy.get("#send-action").should("exist").click();
|
||||
});
|
||||
}
|
||||
|
||||
describe("Integration Manager: Read Events", () => {
|
||||
let testUser: UserCredentials;
|
||||
let synapse: SynapseInstance;
|
||||
let integrationManagerUrl: string;
|
||||
|
||||
beforeEach(() => {
|
||||
cy.serveHtmlFile(INTEGRATION_MANAGER_HTML).then((url) => {
|
||||
integrationManagerUrl = url;
|
||||
});
|
||||
cy.startSynapse("default").then((data) => {
|
||||
synapse = data;
|
||||
|
||||
cy.initTestUser(synapse, USER_DISPLAY_NAME, () => {
|
||||
cy.window().then((win) => {
|
||||
win.localStorage.setItem("mx_scalar_token", INTEGRATION_MANAGER_TOKEN);
|
||||
win.localStorage.setItem(`mx_scalar_token_at_${integrationManagerUrl}`, INTEGRATION_MANAGER_TOKEN);
|
||||
});
|
||||
}).then((user) => {
|
||||
testUser = user;
|
||||
});
|
||||
|
||||
cy.setAccountData("m.widgets", {
|
||||
"m.integration_manager": {
|
||||
content: {
|
||||
type: "m.integration_manager",
|
||||
name: "Integration Manager",
|
||||
url: integrationManagerUrl,
|
||||
data: {
|
||||
api_url: integrationManagerUrl,
|
||||
},
|
||||
},
|
||||
id: "integration-manager",
|
||||
},
|
||||
}).as("integrationManager");
|
||||
|
||||
// Succeed when checking the token is valid
|
||||
cy.intercept(`${integrationManagerUrl}/account?scalar_token=${INTEGRATION_MANAGER_TOKEN}*`, (req) => {
|
||||
req.continue((res) => {
|
||||
return res.send(200, {
|
||||
user_id: testUser.userId,
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
cy.createRoom({
|
||||
name: ROOM_NAME,
|
||||
}).as("roomId");
|
||||
});
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
cy.stopSynapse(synapse);
|
||||
cy.stopWebServers();
|
||||
});
|
||||
|
||||
it("should read a state event by state key", () => {
|
||||
cy.all([cy.get<string>("@roomId"), cy.get<{}>("@integrationManager")]).then(([roomId]) => {
|
||||
cy.viewRoomByName(ROOM_NAME);
|
||||
|
||||
const eventType = "io.element.integrations.installations";
|
||||
const eventContent = {
|
||||
foo: "bar",
|
||||
};
|
||||
const stateKey = "state-key-123";
|
||||
|
||||
// Send a state event
|
||||
cy.getClient()
|
||||
.then(async (client) => {
|
||||
return await client.sendStateEvent(roomId, eventType, eventContent, stateKey);
|
||||
})
|
||||
.then((event) => {
|
||||
openIntegrationManager();
|
||||
|
||||
// Read state events
|
||||
sendActionFromIntegrationManager(integrationManagerUrl, roomId, eventType, stateKey);
|
||||
|
||||
// Check the response
|
||||
cy.accessIframe(`iframe[src*="${integrationManagerUrl}"]`).within(() => {
|
||||
cy.get("#message-response")
|
||||
.should("include.text", event.event_id)
|
||||
.should("include.text", `"content":${JSON.stringify(eventContent)}`);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it("should read a state event with empty state key", () => {
|
||||
cy.all([cy.get<string>("@roomId"), cy.get<{}>("@integrationManager")]).then(([roomId]) => {
|
||||
cy.viewRoomByName(ROOM_NAME);
|
||||
|
||||
const eventType = "io.element.integrations.installations";
|
||||
const eventContent = {
|
||||
foo: "bar",
|
||||
};
|
||||
const stateKey = "";
|
||||
|
||||
// Send a state event
|
||||
cy.getClient()
|
||||
.then(async (client) => {
|
||||
return await client.sendStateEvent(roomId, eventType, eventContent, stateKey);
|
||||
})
|
||||
.then((event) => {
|
||||
openIntegrationManager();
|
||||
|
||||
// Read state events
|
||||
sendActionFromIntegrationManager(integrationManagerUrl, roomId, eventType, stateKey);
|
||||
|
||||
// Check the response
|
||||
cy.accessIframe(`iframe[src*="${integrationManagerUrl}"]`).within(() => {
|
||||
cy.get("#message-response")
|
||||
.should("include.text", event.event_id)
|
||||
.should("include.text", `"content":${JSON.stringify(eventContent)}`);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it("should read state events with any state key", () => {
|
||||
cy.all([cy.get<string>("@roomId"), cy.get<{}>("@integrationManager")]).then(([roomId]) => {
|
||||
cy.viewRoomByName(ROOM_NAME);
|
||||
|
||||
const eventType = "io.element.integrations.installations";
|
||||
|
||||
const stateKey1 = "state-key-123";
|
||||
const eventContent1 = {
|
||||
foo1: "bar1",
|
||||
};
|
||||
const stateKey2 = "state-key-456";
|
||||
const eventContent2 = {
|
||||
foo2: "bar2",
|
||||
};
|
||||
const stateKey3 = "state-key-789";
|
||||
const eventContent3 = {
|
||||
foo3: "bar3",
|
||||
};
|
||||
|
||||
// Send state events
|
||||
cy.getClient()
|
||||
.then(async (client) => {
|
||||
return Promise.all([
|
||||
client.sendStateEvent(roomId, eventType, eventContent1, stateKey1),
|
||||
client.sendStateEvent(roomId, eventType, eventContent2, stateKey2),
|
||||
client.sendStateEvent(roomId, eventType, eventContent3, stateKey3),
|
||||
]);
|
||||
})
|
||||
.then((events) => {
|
||||
openIntegrationManager();
|
||||
|
||||
// Read state events
|
||||
sendActionFromIntegrationManager(
|
||||
integrationManagerUrl,
|
||||
roomId,
|
||||
eventType,
|
||||
true, // Any state key
|
||||
);
|
||||
|
||||
// Check the response
|
||||
cy.accessIframe(`iframe[src*="${integrationManagerUrl}"]`).within(() => {
|
||||
cy.get("#message-response")
|
||||
.should("include.text", events[0].event_id)
|
||||
.should("include.text", `"content":${JSON.stringify(eventContent1)}`)
|
||||
.should("include.text", events[1].event_id)
|
||||
.should("include.text", `"content":${JSON.stringify(eventContent2)}`)
|
||||
.should("include.text", events[2].event_id)
|
||||
.should("include.text", `"content":${JSON.stringify(eventContent3)}`);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it("should fail to read an event type which is not allowed", () => {
|
||||
cy.all([cy.get<string>("@roomId"), cy.get<{}>("@integrationManager")]).then(([roomId]) => {
|
||||
cy.viewRoomByName(ROOM_NAME);
|
||||
|
||||
const eventType = "com.example.event";
|
||||
const stateKey = "";
|
||||
|
||||
openIntegrationManager();
|
||||
|
||||
// Read state events
|
||||
sendActionFromIntegrationManager(integrationManagerUrl, roomId, eventType, stateKey);
|
||||
|
||||
// Check the response
|
||||
cy.accessIframe(`iframe[src*="${integrationManagerUrl}"]`).within(() => {
|
||||
cy.get("#message-response").should("include.text", "Failed to read events");
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
261
cypress/e2e/integration-manager/send_event.spec.ts
Normal file
261
cypress/e2e/integration-manager/send_event.spec.ts
Normal file
|
@ -0,0 +1,261 @@
|
|||
/*
|
||||
Copyright 2022 The Matrix.org Foundation C.I.C.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
/// <reference types="cypress" />
|
||||
|
||||
import { SynapseInstance } from "../../plugins/synapsedocker";
|
||||
import { UserCredentials } from "../../support/login";
|
||||
|
||||
const ROOM_NAME = "Integration Manager Test";
|
||||
const USER_DISPLAY_NAME = "Alice";
|
||||
|
||||
const INTEGRATION_MANAGER_TOKEN = "DefinitelySecret_DoNotUseThisForReal";
|
||||
const INTEGRATION_MANAGER_HTML = `
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Fake Integration Manager</title>
|
||||
</head>
|
||||
<body>
|
||||
<input type="text" id="target-room-id"/>
|
||||
<input type="text" id="event-type"/>
|
||||
<input type="text" id="state-key"/>
|
||||
<input type="text" id="event-content"/>
|
||||
<button name="Send" id="send-action">Press to send action</button>
|
||||
<button name="Close" id="close">Press to close</button>
|
||||
<p id="message-response">No response</p>
|
||||
<script>
|
||||
document.getElementById("send-action").onclick = () => {
|
||||
window.parent.postMessage(
|
||||
{
|
||||
action: "send_event",
|
||||
room_id: document.getElementById("target-room-id").value,
|
||||
type: document.getElementById("event-type").value,
|
||||
state_key: document.getElementById("state-key").value,
|
||||
content: JSON.parse(document.getElementById("event-content").value),
|
||||
},
|
||||
'*',
|
||||
);
|
||||
};
|
||||
document.getElementById("close").onclick = () => {
|
||||
window.parent.postMessage(
|
||||
{
|
||||
action: "close_scalar",
|
||||
},
|
||||
'*',
|
||||
);
|
||||
};
|
||||
// Listen for a postmessage response
|
||||
window.addEventListener("message", (event) => {
|
||||
document.getElementById("message-response").innerText = JSON.stringify(event.data);
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
`;
|
||||
|
||||
function openIntegrationManager() {
|
||||
cy.get(".mx_RightPanel_roomSummaryButton").click();
|
||||
cy.get(".mx_RoomSummaryCard_appsGroup").within(() => {
|
||||
cy.contains("Add widgets, bridges & bots").click();
|
||||
});
|
||||
}
|
||||
|
||||
function sendActionFromIntegrationManager(
|
||||
integrationManagerUrl: string,
|
||||
targetRoomId: string,
|
||||
eventType: string,
|
||||
stateKey: string,
|
||||
content: Record<string, unknown>,
|
||||
) {
|
||||
cy.accessIframe(`iframe[src*="${integrationManagerUrl}"]`).within(() => {
|
||||
cy.get("#target-room-id").should("exist").type(targetRoomId);
|
||||
cy.get("#event-type").should("exist").type(eventType);
|
||||
if (stateKey) {
|
||||
cy.get("#state-key").should("exist").type(stateKey);
|
||||
}
|
||||
cy.get("#event-content").should("exist").type(JSON.stringify(content), { parseSpecialCharSequences: false });
|
||||
cy.get("#send-action").should("exist").click();
|
||||
});
|
||||
}
|
||||
|
||||
describe("Integration Manager: Send Event", () => {
|
||||
let testUser: UserCredentials;
|
||||
let synapse: SynapseInstance;
|
||||
let integrationManagerUrl: string;
|
||||
|
||||
beforeEach(() => {
|
||||
cy.serveHtmlFile(INTEGRATION_MANAGER_HTML).then((url) => {
|
||||
integrationManagerUrl = url;
|
||||
});
|
||||
cy.startSynapse("default").then((data) => {
|
||||
synapse = data;
|
||||
|
||||
cy.initTestUser(synapse, USER_DISPLAY_NAME, () => {
|
||||
cy.window().then((win) => {
|
||||
win.localStorage.setItem("mx_scalar_token", INTEGRATION_MANAGER_TOKEN);
|
||||
win.localStorage.setItem(`mx_scalar_token_at_${integrationManagerUrl}`, INTEGRATION_MANAGER_TOKEN);
|
||||
});
|
||||
}).then((user) => {
|
||||
testUser = user;
|
||||
});
|
||||
|
||||
cy.setAccountData("m.widgets", {
|
||||
"m.integration_manager": {
|
||||
content: {
|
||||
type: "m.integration_manager",
|
||||
name: "Integration Manager",
|
||||
url: integrationManagerUrl,
|
||||
data: {
|
||||
api_url: integrationManagerUrl,
|
||||
},
|
||||
},
|
||||
id: "integration-manager",
|
||||
},
|
||||
}).as("integrationManager");
|
||||
|
||||
// Succeed when checking the token is valid
|
||||
cy.intercept(`${integrationManagerUrl}/account?scalar_token=${INTEGRATION_MANAGER_TOKEN}*`, (req) => {
|
||||
req.continue((res) => {
|
||||
return res.send(200, {
|
||||
user_id: testUser.userId,
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
cy.createRoom({
|
||||
name: ROOM_NAME,
|
||||
}).as("roomId");
|
||||
});
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
cy.stopSynapse(synapse);
|
||||
cy.stopWebServers();
|
||||
});
|
||||
|
||||
it("should send a state event", () => {
|
||||
cy.all([cy.get<string>("@roomId"), cy.get<{}>("@integrationManager")]).then(([roomId]) => {
|
||||
cy.viewRoomByName(ROOM_NAME);
|
||||
|
||||
openIntegrationManager();
|
||||
|
||||
const eventType = "io.element.integrations.installations";
|
||||
const eventContent = {
|
||||
foo: "bar",
|
||||
};
|
||||
const stateKey = "state-key-123";
|
||||
|
||||
// Send the event
|
||||
sendActionFromIntegrationManager(integrationManagerUrl, roomId, eventType, stateKey, eventContent);
|
||||
|
||||
// Check the response
|
||||
cy.accessIframe(`iframe[src*="${integrationManagerUrl}"]`).within(() => {
|
||||
cy.get("#message-response").should("include.text", "event_id");
|
||||
});
|
||||
|
||||
// Check the event
|
||||
cy.getClient()
|
||||
.then(async (client) => {
|
||||
return await client.getStateEvent(roomId, eventType, stateKey);
|
||||
})
|
||||
.then((event) => {
|
||||
expect(event).to.deep.equal(eventContent);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it("should send a state event with empty content", () => {
|
||||
cy.all([cy.get<string>("@roomId"), cy.get<{}>("@integrationManager")]).then(([roomId]) => {
|
||||
cy.viewRoomByName(ROOM_NAME);
|
||||
|
||||
openIntegrationManager();
|
||||
|
||||
const eventType = "io.element.integrations.installations";
|
||||
const eventContent = {};
|
||||
const stateKey = "state-key-123";
|
||||
|
||||
// Send the event
|
||||
sendActionFromIntegrationManager(integrationManagerUrl, roomId, eventType, stateKey, eventContent);
|
||||
|
||||
// Check the response
|
||||
cy.accessIframe(`iframe[src*="${integrationManagerUrl}"]`).within(() => {
|
||||
cy.get("#message-response").should("include.text", "event_id");
|
||||
});
|
||||
|
||||
// Check the event
|
||||
cy.getClient()
|
||||
.then(async (client) => {
|
||||
return await client.getStateEvent(roomId, eventType, stateKey);
|
||||
})
|
||||
.then((event) => {
|
||||
expect(event).to.be.empty;
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it("should send a state event with empty state key", () => {
|
||||
cy.all([cy.get<string>("@roomId"), cy.get<{}>("@integrationManager")]).then(([roomId]) => {
|
||||
cy.viewRoomByName(ROOM_NAME);
|
||||
|
||||
openIntegrationManager();
|
||||
|
||||
const eventType = "io.element.integrations.installations";
|
||||
const eventContent = {
|
||||
foo: "bar",
|
||||
};
|
||||
const stateKey = "";
|
||||
|
||||
// Send the event
|
||||
sendActionFromIntegrationManager(integrationManagerUrl, roomId, eventType, stateKey, eventContent);
|
||||
|
||||
// Check the response
|
||||
cy.accessIframe(`iframe[src*="${integrationManagerUrl}"]`).within(() => {
|
||||
cy.get("#message-response").should("include.text", "event_id");
|
||||
});
|
||||
|
||||
// Check the event
|
||||
cy.getClient()
|
||||
.then(async (client) => {
|
||||
return await client.getStateEvent(roomId, eventType, stateKey);
|
||||
})
|
||||
.then((event) => {
|
||||
expect(event).to.deep.equal(eventContent);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it("should fail to send an event type which is not allowed", () => {
|
||||
cy.all([cy.get<string>("@roomId"), cy.get<{}>("@integrationManager")]).then(([roomId]) => {
|
||||
cy.viewRoomByName(ROOM_NAME);
|
||||
|
||||
openIntegrationManager();
|
||||
|
||||
const eventType = "com.example.event";
|
||||
const eventContent = {
|
||||
foo: "bar",
|
||||
};
|
||||
const stateKey = "";
|
||||
|
||||
// Send the event
|
||||
sendActionFromIntegrationManager(integrationManagerUrl, roomId, eventType, stateKey, eventContent);
|
||||
|
||||
// Check the response
|
||||
cy.accessIframe(`iframe[src*="${integrationManagerUrl}"]`).within(() => {
|
||||
cy.get("#message-response").should("include.text", "Failed to send event");
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
|
@ -77,6 +77,7 @@ describe("Polls", () => {
|
|||
};
|
||||
|
||||
beforeEach(() => {
|
||||
cy.enableLabsFeature("feature_threadstable");
|
||||
cy.window().then((win) => {
|
||||
win.localStorage.setItem("mx_lhs_size", "0"); // Collapse left panel for these tests
|
||||
});
|
||||
|
@ -114,7 +115,10 @@ describe("Polls", () => {
|
|||
|
||||
const pollParams = {
|
||||
title: "Does the polls feature work?",
|
||||
options: ["Yes", "No", "Maybe"],
|
||||
// Since we're going to take a screenshot anyways, we include some
|
||||
// non-ASCII characters here to stress test the app's font config
|
||||
// while we're at it.
|
||||
options: ["Yes", "Noo⃐o⃑o⃩o⃪o⃫o⃬o⃭o⃮o⃯", "のらねこ Maybe?"],
|
||||
};
|
||||
createPoll(pollParams);
|
||||
|
||||
|
|
|
@ -18,6 +18,7 @@ limitations under the License.
|
|||
|
||||
import _ from "lodash";
|
||||
import { MatrixClient } from "matrix-js-sdk/src/matrix";
|
||||
import { Interception } from "cypress/types/net-stubbing";
|
||||
|
||||
import { SynapseInstance } from "../../plugins/synapsedocker";
|
||||
import { SettingLevel } from "../../../src/settings/SettingLevel";
|
||||
|
@ -407,4 +408,55 @@ describe("Sliding Sync", () => {
|
|||
// ensure the reply-to does not disappear
|
||||
cy.get(".mx_ReplyPreview").should("exist");
|
||||
});
|
||||
|
||||
it("should send unsubscribe_rooms for every room switch", () => {
|
||||
let roomAId: string;
|
||||
let roomPId: string;
|
||||
// create rooms and check room names are correct
|
||||
cy.createRoom({ name: "Apple" })
|
||||
.as("roomA")
|
||||
.then((roomId) => (roomAId = roomId))
|
||||
.then(() => cy.contains(".mx_RoomSublist", "Apple"));
|
||||
|
||||
cy.createRoom({ name: "Pineapple" })
|
||||
.as("roomP")
|
||||
.then((roomId) => (roomPId = roomId))
|
||||
.then(() => cy.contains(".mx_RoomSublist", "Pineapple"));
|
||||
cy.createRoom({ name: "Orange" })
|
||||
.as("roomO")
|
||||
.then(() => cy.contains(".mx_RoomSublist", "Orange"));
|
||||
|
||||
// Intercept all calls to /sync
|
||||
cy.intercept({ method: "POST", url: "**/sync*" }).as("syncRequest");
|
||||
|
||||
const assertUnsubExists = (interception: Interception, subRoomId: string, unsubRoomId: string) => {
|
||||
const body = interception.request.body;
|
||||
// There may be a request without a txn_id, ignore it, as there won't be any subscription changes
|
||||
if (body.txn_id === undefined) {
|
||||
return;
|
||||
}
|
||||
expect(body.unsubscribe_rooms).eql([unsubRoomId]);
|
||||
expect(body.room_subscriptions).to.not.have.property(unsubRoomId);
|
||||
expect(body.room_subscriptions).to.have.property(subRoomId);
|
||||
};
|
||||
|
||||
// Select the Test Room
|
||||
cy.contains(".mx_RoomTile", "Apple").click();
|
||||
|
||||
// and wait for cypress to get the result as alias
|
||||
cy.wait("@syncRequest").then((interception) => {
|
||||
// This is the first switch, so no unsubscriptions yet.
|
||||
assert.isObject(interception.request.body.room_subscriptions, "room_subscriptions is object");
|
||||
});
|
||||
|
||||
// Switch to another room
|
||||
cy.contains(".mx_RoomTile", "Pineapple").click();
|
||||
cy.wait("@syncRequest").then((interception) => assertUnsubExists(interception, roomPId, roomAId));
|
||||
|
||||
// And switch to even another room
|
||||
cy.contains(".mx_RoomTile", "Apple").click();
|
||||
cy.wait("@syncRequest").then((interception) => assertUnsubExists(interception, roomPId, roomAId));
|
||||
|
||||
// TODO: Add tests for encrypted rooms
|
||||
});
|
||||
});
|
||||
|
|
|
@ -77,8 +77,10 @@ describe("Spaces", () => {
|
|||
cy.stopSynapse(synapse);
|
||||
});
|
||||
|
||||
it("should allow user to create public space", () => {
|
||||
openSpaceCreateMenu().within(() => {
|
||||
it.only("should allow user to create public space", () => {
|
||||
openSpaceCreateMenu();
|
||||
cy.get("#mx_ContextualMenu_Container").percySnapshotElement("Space create menu");
|
||||
cy.get(".mx_SpaceCreateMenu_wrapper .mx_ContextualMenu").within(() => {
|
||||
cy.get(".mx_SpaceCreateMenuType_public").click();
|
||||
cy.get('.mx_SpaceBasicSettings_avatarContainer input[type="file"]').selectFile(
|
||||
"cypress/fixtures/riot.png",
|
||||
|
|
|
@ -19,10 +19,17 @@ limitations under the License.
|
|||
import { SynapseInstance } from "../../plugins/synapsedocker";
|
||||
import { MatrixClient } from "../../global";
|
||||
|
||||
function markWindowBeforeReload(): void {
|
||||
// mark our window object to "know" when it gets reloaded
|
||||
cy.window().then((w) => (w.beforeReload = true));
|
||||
}
|
||||
|
||||
describe("Threads", () => {
|
||||
let synapse: SynapseInstance;
|
||||
|
||||
beforeEach(() => {
|
||||
// Default threads to ON for this spec
|
||||
cy.enableLabsFeature("feature_threadstable");
|
||||
cy.window().then((win) => {
|
||||
win.localStorage.setItem("mx_lhs_size", "0"); // Collapse left panel for these tests
|
||||
});
|
||||
|
@ -37,6 +44,35 @@ describe("Threads", () => {
|
|||
cy.stopSynapse(synapse);
|
||||
});
|
||||
|
||||
it("should reload when enabling threads beta", () => {
|
||||
markWindowBeforeReload();
|
||||
|
||||
// Turn off
|
||||
cy.openUserSettings("Labs").within(() => {
|
||||
// initially the new property is there
|
||||
cy.window().should("have.prop", "beforeReload", true);
|
||||
|
||||
cy.leaveBeta("Threaded messages");
|
||||
cy.wait(1000);
|
||||
// after reload the property should be gone
|
||||
cy.window().should("not.have.prop", "beforeReload");
|
||||
});
|
||||
|
||||
cy.get(".mx_MatrixChat", { timeout: 15000 }); // wait for the app
|
||||
markWindowBeforeReload();
|
||||
|
||||
// Turn on
|
||||
cy.openUserSettings("Labs").within(() => {
|
||||
// initially the new property is there
|
||||
cy.window().should("have.prop", "beforeReload", true);
|
||||
|
||||
cy.joinBeta("Threaded messages");
|
||||
cy.wait(1000);
|
||||
// after reload the property should be gone
|
||||
cy.window().should("not.have.prop", "beforeReload");
|
||||
});
|
||||
});
|
||||
|
||||
it("should be usable for a conversation", () => {
|
||||
let bot: MatrixClient;
|
||||
cy.getBot(synapse, {
|
||||
|
|
|
@ -145,7 +145,7 @@ describe("Widget PIP", () => {
|
|||
win.mxActiveWidgetStore.setWidgetPersistence(DEMO_WIDGET_ID, roomId, true);
|
||||
|
||||
// checks that pip window is opened
|
||||
cy.get(".mx_LegacyCallView_pip").should("exist");
|
||||
cy.get(".mx_WidgetPip").should("exist");
|
||||
|
||||
// checks that widget is opened in pip
|
||||
cy.accessIframe(`iframe[title="${DEMO_WIDGET_NAME}"]`).within({}, () => {
|
||||
|
@ -164,7 +164,7 @@ describe("Widget PIP", () => {
|
|||
}
|
||||
|
||||
// checks that pip window is closed
|
||||
cy.get(".mx_LegacyCallView_pip").should("not.exist");
|
||||
cy.get(".mx_WidgetPip").should("not.exist");
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
|
@ -71,8 +71,8 @@ Cypress.Commands.add("goOnline", (): void => {
|
|||
Cypress.Commands.add("stubDefaultServer", (): void => {
|
||||
cy.log("Stubbing vector.im and matrix.org network calls");
|
||||
// We intercept vector.im & matrix.org calls so that tests don't fail when it has issues
|
||||
cy.intercept("GET", "https://vector.im/_matrix/identity/api/v1", {
|
||||
fixture: "vector-im-identity-v1.json",
|
||||
cy.intercept("GET", "https://vector.im/_matrix/identity/v2", {
|
||||
fixture: "vector-im-identity-v2.json",
|
||||
});
|
||||
cy.intercept("GET", "https://matrix.org/.well-known/matrix/client", {
|
||||
fixture: "matrix-org-client-well-known.json",
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue