diff --git a/appiumtests/createroomtest.py b/appiumtests/createroomtest.py new file mode 100755 index 000000000..443776cb7 --- /dev/null +++ b/appiumtests/createroomtest.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python3 + +# SPDX-License-Identifier: MIT +# SPDX-FileCopyrightText: 2024 Tobias Fella + +import os +import subprocess +import sys +import unittest +import time + +from appium import webdriver +from appium.options.common.base import AppiumOptions +from appium.webdriver.common.appiumby import AppiumBy + + +class CreateRoomTest(unittest.TestCase): + + mockServerProcess: subprocess.Popen + + @classmethod + def setUpClass(cls): + cls.mockServerProcess = subprocess.Popen([sys.executable, os.path.join(os.path.dirname(__file__), "login-server.py")]) + options = AppiumOptions() + options.set_capability("app", "neochat --ignore-ssl-errors --test") + cls.driver = webdriver.Remote(command_executor='http://127.0.0.1:4723', options=options) + + def setUp(self): + pass + + def tearDown(self): + if not self._outcome.result.wasSuccessful(): + self.driver.get_screenshot_as_file("failed_test_shot_{}.png".format(self.id())) + + @classmethod + def tearDownClass(self): + self.mockServerProcess.terminate() + self.driver.quit() + + def test_create_room(self): + self.driver.find_element(by=AppiumBy.NAME, value="@user:localhost:1234").click() + self.driver.find_element(by=AppiumBy.NAME, value="Show Menu").click() + self.driver.find_element(by=AppiumBy.NAME, value="Create a Room").click() + self.driver.find_element(by=AppiumBy.NAME, value="Name:").send_keys("Super awesome room name")# + time.sleep(0.1) # without this, the second half of the text is sent to the topic field?! + self.driver.find_element(by=AppiumBy.NAME, value="Topic:").send_keys("There are not enough raccoons here") + time.sleep(0.1) + self.driver.find_element(by=AppiumBy.NAME, value="Create Room").click() + time.sleep(0.1) + self.driver.find_element(by=AppiumBy.NAME, value="Super awesome room name").click() + self.driver.find_element(by=AppiumBy.NAME, value="Show Room Information").click() + self.driver.find_element(by=AppiumBy.NAME, value="There are not enough raccoons here") + + +if __name__ == '__main__': + unittest.main() diff --git a/appiumtests/data/sync_response_new_room.json b/appiumtests/data/sync_response_new_room.json new file mode 100644 index 000000000..385433744 --- /dev/null +++ b/appiumtests/data/sync_response_new_room.json @@ -0,0 +1,78 @@ +{ + "next_batch": "batch1234", + "rooms": { + "join": { + "!newroom123321:localhost:1234": { + "state": { + "events": [ + { + "type": "m.room.member", + "state_key": "@user:localhost:1234", + "sender": "@user:localhost:1234", + "origin_server_ts": 1432735824653, + "event_id": "$event_id_1234_0:localhost:1234", + "room_id": "!newroom123321:localhost:1234", + "content": { + "avatar_url": "", + "displayname": "A Display Name", + "membership": "join", + "reason": "Nothing" + }, + "unsigned": { + "age": 1234 + } + }, + { + "type": "m.room.name", + "state_key": "", + "sender": "@user:localhost:1234", + "origin_server_ts": 1432735824653, + "event_id": "$event_id_1234_1:localhost:1234", + "room_id": "!newroom123321:localhost:1234", + "content": { + "name": "Super awesome room name" + }, + "unsigned": { + "age": 1234 + } + }, + { + "type": "m.room.topic", + "state_key": "", + "sender": "@user:localhost:1234", + "origin_server_ts": 1432735824653, + "event_id": "$event_id_1234_2:localhost:1234", + "room_id": "!newroom123321:localhost:1234", + "content": { + "topic": "There are not enough raccoons here" + }, + "unsigned": { + "age": 1234 + } + } + ] + }, + "timeline": { + "events": [ + { + "type": "m.room.message", + "sender": "@user:localhost:1234", + "origin_server_ts": 1432735824653, + "event_id": "$event_id_1234_1:localhost:1234", + "room_id": "!newroom123321:localhost:1234", + "content": { + "body": "This is a message", + "format": "org.matrix.custom.html", + "formatted_body": "User:", + "msgtype": "m.text" + }, + "unsigned": { + "age": 1234 + } + } + ] + } + } + } + } +} diff --git a/appiumtests/login-server.py b/appiumtests/login-server.py index b0ecfd485..4856ff8db 100644 --- a/appiumtests/login-server.py +++ b/appiumtests/login-server.py @@ -6,6 +6,8 @@ from flask import Flask, request, abort import os app = Flask(__name__) +next_sync_payload = "" + @app.route("/_matrix/client/v3/login", methods=["GET"]) def login_get(): @@ -42,8 +44,13 @@ def load_json(name): @app.route("/_matrix/client/r0/sync") def sync(): - - result = load_json("sync_response_no_rooms") if ("login" in request.headers.get("Authorization")) else load_json("sync_response_rooms") + global next_sync_payload + result = dict() + if len(next_sync_payload) > 0: + result = load_json(next_sync_payload) + next_sync_payload = "" + else: + result = load_json("sync_response_no_rooms") if ("login" in request.headers.get("Authorization")) else load_json("sync_response_rooms") return result @app.route("/.well-known/matrix/client") @@ -65,6 +72,18 @@ def upload_keys(): reply = dict() return reply +@app.route("/_matrix/client/v3/createRoom", methods=["POST"]) +def create_room(): + global next_sync_payload + data = request.get_json() + if data["name"] != "Super awesome room name" or data["topic"] != "There are not enough raccoons here": + return dict(), 400 + response = dict() + response["room_id"] = "!newroom123321:localhost:1234" + next_sync_payload = "sync_response_new_room" + return response + + if __name__ == "__main__": app.run(ssl_context='adhoc', port=1234) diff --git a/src/qml/CreateRoomDialog.qml b/src/qml/CreateRoomDialog.qml index f417688e3..670ed3c79 100644 --- a/src/qml/CreateRoomDialog.qml +++ b/src/qml/CreateRoomDialog.qml @@ -88,7 +88,7 @@ FormCard.FormCardPage { } FormCard.FormButtonDelegate { id: ok - text: i18nc("@action:button", "Ok") + text: root.isSpace ? i18nc("@action:button", "Create Space") : i18nc("@action:button", "Create Room") enabled: roomNameField.text.length > 0 onClicked: { if (root.isSpace) { diff --git a/src/qml/ExploreComponent.qml b/src/qml/ExploreComponent.qml index 646d6926a..d8311c0eb 100644 --- a/src/qml/ExploreComponent.qml +++ b/src/qml/ExploreComponent.qml @@ -112,6 +112,7 @@ RowLayout { QQC2.ToolButton { id: menuButton Accessible.role: Accessible.ButtonMenu + Accessible.onPressAction: menuButton.action.trigger() display: QQC2.AbstractButton.IconOnly checkable: true action: Kirigami.Action { @@ -144,18 +145,23 @@ RowLayout { dim: false QQC2.MenuItem { + Accessible.onPressAction: action.triggered() action: exploreAction } QQC2.MenuItem { + Accessible.onPressAction: action.triggered() action: chatAction } QQC2.MenuItem { + Accessible.onPressAction: action.triggered() action: roomAction } QQC2.MenuItem { + Accessible.onPressAction: action.triggered() action: spaceAction } QQC2.MenuItem { + Accessible.onPressAction: action.triggered() action: scanAction } }