Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F85827083
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Authored By
Unknown
Size
11 KB
Referenced Files
None
Subscribers
None
View Options
diff --git a/src/tests/quick-tests/tst_UserPage.qml b/src/tests/quick-tests/tst_UserPage.qml
index d034f3e..a376077 100644
--- a/src/tests/quick-tests/tst_UserPage.qml
+++ b/src/tests/quick-tests/tst_UserPage.qml
@@ -1,266 +1,314 @@
/*
* This file is part of kazv.
* SPDX-FileCopyrightText: 2023 tusooa <tusooa@kazv.moe>
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import QtQuick 2.15
import QtQuick.Layouts 1.15
import QtTest 1.0
import '../../contents/ui' as Kazv
import './test-helpers' as TestHelpers
import 'test-helpers.js' as Helpers
Item {
id: upper
width: 800
height: 600
property var l10n: Helpers.fluentMock
property var matrixSdk: TestHelpers.MatrixSdkMock {}
property var lastNotification: undefined
function showPassiveNotification(msg) {
upper.lastNotification = msg;
}
property var promiseComp: Component {
TestHelpers.MatrixPromiseMock {
}
}
property var powerLevelMapping: ({
'@mew:example.com': 100,
})
property var room: ({
userPowerLevel(userId) {
return powerLevelMapping[userId];
},
setUserPowerLevel(userId, powerLevel) {
upper.room._setUserPowerLevelUserId = userId;
upper.room._setUserPowerLevelPowerLevel = powerLevel;
upper.room._setUserPowerLevelPromise = promiseComp.createObject(upper.room);
return upper.room._setUserPowerLevelPromise;
},
ensureStateEvent(type, stateKey) {
const promise = promiseComp.createObject(upper.room);
console.log('ensureStateEvent', type, stateKey, promise);
upper.room._ensureStateEventPromises.push(promise);
console.log(upper.room._ensureStateEventPromises);
return promise;
},
kickUser(userId, reason) {
upper.room._kickUserUserId = userId;
upper.room._kickUserReason = reason;
upper.room._kickUserPromise = promiseComp.createObject(upper.room);
return upper.room._kickUserPromise;
},
banUser(userId, reason) {
upper.room._banUserUserId = userId;
upper.room._banUserReason = reason;
upper.room._banUserPromise = promiseComp.createObject(upper.room);
return upper.room._banUserPromise;
},
+ unbanUser(userId) {
+ upper.room._unbanUserUserId = userId;
+ upper.room._unbanUserPromise = promiseComp.createObject(upper.room);
+ return upper.room._unbanUserPromise;
+ },
_setUserPowerLevelUserId: undefined,
_setUserPowerLevelPowerLevel: undefined,
_setUserPowerLevelPromise: undefined,
_ensureStateEventPromises: [],
_kickUserUserId: undefined,
_kickUserReason: undefined,
_kickUserPromise: undefined,
_banUserUserId: undefined,
_banUserReason: undefined,
_banUserPromise: undefined,
+ _unbanUserUserId: undefined,
+ _unbanUserPromise: undefined,
})
ColumnLayout {
Kazv.UserPage {
id: userPage
userId: '@mew:example.com'
user: ({})
room: upper.room
}
}
TestCase {
id: userPageTest
name: 'UserPageTest'
when: windowShown
function cleanupTestCase() {
upper.room._setUserPowerLevelUserId = undefined;
upper.room._setUserPowerLevelPowerLevel = undefined;
upper.room._setUserPowerLevelPromise = undefined;
upper.room._ensureStateEventPromises = [];
upper.room._kickUserUserId = undefined;
upper.room._kickUserReason = undefined;
upper.room._kickUserPromise = undefined;
upper.room._banUserUserId = undefined;
upper.room._banUserReason = undefined;
upper.room._banUserPromise = undefined;
+ upper.room._unbanUserUserId = undefined;
+ upper.room._unbanUserPromise = undefined;
userPage.submittingPowerLevel = false;
userPage.editingPowerLevel = false;
userPage.powerLevelsLoaded = false;
userPage.banningUser = false;
+ userPage.unbanningUser = false;
upper.lastNotification = undefined;
+ userPage.user = ({});
}
function test_powerLevel() {
verify(findChild(userPage, 'powerLevelLabel').visible);
verify(findChild(userPage, 'powerLevelLabel').text.includes('100'));
verify(!findChild(userPage, 'newPowerLevelInput').visible);
const editButton = findChild(userPage, 'editPowerLevelButton');
verify(editButton.visible);
verify(!editButton.enabled);
tryVerify(() => userPage.room._ensureStateEventPromises[1], 1000);
userPage.room._ensureStateEventPromises[1].resolve(true, {});
tryVerify(() => editButton.enabled);
mouseClick(editButton);
const textField = findChild(userPage, 'newPowerLevelInput');
tryVerify(() => textField.visible, 1000);
textField.text = '50';
const saveButton = findChild(userPage, 'savePowerLevelButton');
mouseClick(saveButton);
tryVerify(() => room._setUserPowerLevelPromise, 1000);
// Text field is not closed until the request succeeded
verify(textField.visible);
verify(textField.readOnly);
verify(room._setUserPowerLevelUserId === '@mew:example.com');
verify(room._setUserPowerLevelPowerLevel === 50);
// the buttons are disabled until the request responded
verify(!saveButton.enabled);
verify(!findChild(userPage, 'discardPowerLevelButton').enabled);
room._setUserPowerLevelPromise.resolve(true, {});
tryVerify(() => !textField.visible, 1000);
// Text field is editable when we try to edit the power level again
mouseClick(editButton);
tryVerify(() => textField.visible, 1000);
verify(!textField.readOnly);
}
function test_powerLevelEditFailure() {
tryVerify(() => userPage.room._ensureStateEventPromises[1], 1000);
userPage.room._ensureStateEventPromises[1].resolve(true, {});
const editButton = findChild(userPage, 'editPowerLevelButton');
tryVerify(() => editButton.enabled);
mouseClick(editButton);
const textField = findChild(userPage, 'newPowerLevelInput');
tryVerify(() => textField.visible, 1000);
textField.text = '50';
const saveButton = findChild(userPage, 'savePowerLevelButton');
mouseClick(saveButton);
tryVerify(() => room._setUserPowerLevelPromise, 1000);
// Text field is not closed until the request succeeded
room._setUserPowerLevelPromise.resolve(false, {});
// text field is no longer readonly if failed
tryVerify(() => !textField.readOnly, 1000);
// show error message
verify(upper.lastNotification);
// the buttons are enabled when the request responded
verify(saveButton.enabled);
verify(findChild(userPage, 'discardPowerLevelButton').enabled);
}
/**
* The zz prefix is to allow this test to run after tst_powerlevel,
* which would otherwise fail for unknown reasons.
*/
function test_zzbanUser() {
+ // Ban user is only available if membership ! = "ban"
+ userPage.user = ({ membership: "join" });
const banButton = findChild(userPage, 'banUserButton');
verify(banButton.visible);
verify(banButton.enabled);
const reasonDialog = findChild(userPage, 'banUserReasonDialog')
verify(!reasonDialog.opened)
const textField = findChild(userPage, 'banUserReasonInput');
mouseClick(banButton);
verify(!reasonDialog.opened);
verify(textField.visible);
verify(!textField.readOnly);
textField.text = 'some reason';
reasonDialog.accept();
tryVerify(() => !reasonDialog.opened, 1000);
tryVerify(() => !banButton.enabled, 1000);
tryVerify(() => room._banUserPromise, 1000);
verify(room._banUserUserId === '@mew:example.com');
verify(room._banUserReason === 'some reason');
room._banUserPromise.resolve(true, {});
tryVerify(() => textField.text === '', 1000);
tryVerify(() => banButton.enabled, 1000);
}
- function tst_zzbanUserFailure() {
+ function test_zzbanUserFailure() {
+ // Ban user is only available if membership ! = "ban"
+ userPage.user = ({ membership: "join" });
const banButton = findChild(userPage, 'banUserButton');
verify(banButton.visible);
verify(banButton.enabled);
const reasonDialog = findChild(userPage, 'banUserReasonDialog')
verify(!reasonDialog.opened)
const textField = findChild(userPage, 'banUserReasonInput');
mouseClick(banButton);
verify(!reasonDialog.opened);
verify(textField.visible);
verify(!textField.readOnly);
textField.text = 'some reason';
reasonDialog.accept();
tryVerify(() => !reasonDialog.opened, 1000);
tryVerify(() => !banButton.enabled, 1000);
tryVerify(() => room._banUserPromise, 1000);
verify(room._banUserUserId === '@mew:example.com');
verify(room._banUserReason === 'some reason');
room._banUserPromise.resolve(false, {});
- verify(upper.lastNotification);
+ tryVerify(() => upper.lastNotification, 1000);
// text field is not cleared when failed
tryVerify(() => textField.text === 'some reason', 1000);
tryVerify(() => banButton.enabled, 1000);
}
+
+ function test_unbanUser() {
+ // Unban user is only available if membership == "ban"
+ userPage.user = ({ membership: "ban" });
+ const unbanButton = findChild(userPage, 'unbanUserButton');
+ verify(unbanButton.visible);
+
+ verify(unbanButton.enabled);
+ mouseClick(unbanButton);
+ tryVerify(() => !unbanButton.enabled, 1000);
+ verify(room._unbanUserUserId == '@mew:example.com');
+ verify(room._unbanUserPromise);
+
+ room._unbanUserPromise.resolve(true, {});
+ tryVerify(() => unbanButton.enabled, 1000);
+ }
+
+ function test_unbanUserFailure() {
+ // Unban user is only available if membership == "ban"
+ userPage.user = ({ membership: "ban" });
+ const unbanButton = findChild(userPage, 'unbanUserButton');
+ verify(unbanButton.visible);
+
+ verify(unbanButton.enabled);
+ mouseClick(unbanButton);
+ tryVerify(() => !unbanButton.enabled, 1000);
+ verify(room._unbanUserUserId == '@mew:example.com');
+ verify(room._unbanUserPromise);
+
+ room._unbanUserPromise.resolve(false, {});
+ tryVerify(() => upper.lastNotification, 1000);
+ tryVerify(() => unbanButton.enabled, 1000);
+ }
}
function test_kickUser() {
const kickButton = findChild(userPage, 'kickUserButton');
verify(kickButton.visible);
verify(kickButton.enabled);
const reasonDialog = findChild(userPage, 'kickUserReasonDialog');
verify(!reasonDialog.opened);
const textField = findChild(userPage, 'kickUserReasonInput');
mouseClick(kickButton);
verify(!reasonDialog.opened);
verify(textField.visible);
verify(!textField.readOnly);
textField.text = 'some reason';
reasonDialog.accept();
tryVerify(() => !reasonDialog.opened, 1000);
tryVerify(() => !kickButton.enabled, 1000);
tryVerify(() => room._kickUserPromise, 1000);
verify(room._kickUserUserId === '@mew:example.com');
verify(room._kickUserReason === 'some reason');
room._kickUserPromise.resolve(true, {});
tryVerify(() => textField.text === '', 1000);
// still available only because this is a mock call, no real action
// is performed on the user
tryVerify(() => kickButton.enabled, 1000);
}
}
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Fri, Oct 30, 2:24 PM (18 h, 41 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1800205
Default Alt Text
(11 KB)
Attached To
Mode
rK kazv
Attached
Detach File
Event Timeline