Changeset View
Changeset View
Standalone View
Standalone View
src/tests/quick-tests/tst_UserPage.qml
/* | /* | ||||
* This file is part of kazv. | * This file is part of kazv. | ||||
* SPDX-FileCopyrightText: 2023 tusooa <tusooa@kazv.moe> | * SPDX-FileCopyrightText: 2023 tusooa <tusooa@kazv.moe> | ||||
* SPDX-License-Identifier: AGPL-3.0-or-later | * SPDX-License-Identifier: AGPL-3.0-or-later | ||||
*/ | */ | ||||
import QtQuick 2.15 | import QtQuick 2.15 | ||||
import QtQuick.Layouts 1.15 | import QtQuick.Layouts 1.15 | ||||
import QtTest 1.0 | import QtTest 1.0 | ||||
import '../../contents/ui' as Kazv | import '../../contents/ui' as Kazv | ||||
import './test-helpers' as TestHelpers | import './test-helpers' as TestHelpers | ||||
import 'test-helpers.js' as Helpers | import 'test-helpers.js' as JsHelpers | ||||
import moe.kazv.mxc.kazv 0.0 as MK | import moe.kazv.mxc.kazv 0.0 as MK | ||||
Item { | Item { | ||||
id: upper | id: upper | ||||
width: 800 | width: 800 | ||||
height: 600 | height: 600 | ||||
property var l10n: Helpers.fluentMock | property var l10n: JsHelpers.fluentMock | ||||
property var matrixSdk: TestHelpers.MatrixSdkMock { | property var matrixSdk: TestHelpers.MatrixSdkMock { | ||||
property var userId: '@foo:example.com' | property var userId: '@foo:example.com' | ||||
} | } | ||||
property var mockHelper: TestHelpers.MockHelper {} | property var mockHelper: TestHelpers.MockHelper {} | ||||
property var sdkVars: QtObject { | property var sdkVars: QtObject { | ||||
property var userGivenNicknameMap: QtObject { | property var userGivenNicknameMap: QtObject { | ||||
id: gnMap | id: gnMap | ||||
property var map: ({}) | property var map: ({}) | ||||
property var setAndUpload: mockHelper.promise() | property var setAndUpload: mockHelper.promise() | ||||
} | } | ||||
} | } | ||||
property var showPassiveNotification: mockHelper.noop() | property var showPassiveNotification: mockHelper.noop() | ||||
property var powerLevelMapping: ({ | property var powerLevelMapping: ({ | ||||
'@mew:example.com': 100, | '@mew:example.com': 100, | ||||
}) | }) | ||||
property var room: ({ | property var room: QtObject { | ||||
userPowerLevel(userId) { | signal onPowerLevelsChanged() | ||||
function userPowerLevel(userId) { | |||||
return powerLevelMapping[userId]; | return powerLevelMapping[userId]; | ||||
}, | } | ||||
setUserPowerLevel: mockHelper.promise(), | property var setUserPowerLevel: mockHelper.promise() | ||||
ensureStateEvent: mockHelper.promise(), | property var ensureStateEvent: mockHelper.promise() | ||||
kickUser: mockHelper.promise(), | property var kickUser: mockHelper.promise() | ||||
banUser: mockHelper.promise(), | property var banUser: mockHelper.promise() | ||||
unbanUser: mockHelper.promise(), | property var unbanUser: mockHelper.promise() | ||||
}) | } | ||||
ColumnLayout { | property var userPage: null | ||||
property var userPageComp: Component { | |||||
Kazv.UserPage { | Kazv.UserPage { | ||||
id: userPage | |||||
userId: '@mew:example.com' | userId: '@mew:example.com' | ||||
user: ({ userId: '@mew:example.com', name: 'mew' }) | user: ({ userId: '@mew:example.com', name: 'mew' }) | ||||
room: upper.room | room: upper.room | ||||
} | } | ||||
} | |||||
Kazv.UserPage { | ColumnLayout { | ||||
id: userPageSelf | id: layout | ||||
userId: '@foo:example.com' | |||||
} | } | ||||
} | |||||
TestCase { | TestCase { | ||||
id: userPageTest | id: userPageTest | ||||
name: 'UserPageTest' | name: 'UserPageTest' | ||||
when: windowShown | when: windowShown | ||||
function initTestCase() { | function init() { | ||||
mockHelper.clearAll(); | |||||
userPage = userPageComp.createObject(layout); | |||||
layout.children = [userPage]; | |||||
if (MK.KazvUtil.kfQtMajorVersion === 6) { | if (MK.KazvUtil.kfQtMajorVersion === 6) { | ||||
userPage.contentItem.clip = false; | userPage.contentItem.clip = false; | ||||
userPageSelf.contentItem.clip = false; | |||||
} | } | ||||
} | } | ||||
function cleanupTestCase() { | function cleanup() { | ||||
mockHelper.clearAll(); | layout.children = []; | ||||
userPage.submittingPowerLevel = false; | userPage.destroy(); | ||||
userPage.editingPowerLevel = false; | userPage = null; | ||||
userPage.powerLevelsLoaded = false; | |||||
userPage.banningUser = false; | |||||
userPage.unbanningUser = false; | |||||
userPage.user = ({}); | |||||
gnMap.map = {}; | gnMap.map = {}; | ||||
} | } | ||||
function test_powerLevel() { | function test_powerLevel() { | ||||
verify(findChild(userPage, 'powerLevelLabel').visible); | verify(findChild(userPage, 'powerLevelLabel').visible); | ||||
verify(findChild(userPage, 'powerLevelLabel').text.includes('100')); | verify(findChild(userPage, 'powerLevelLabel').text.includes('100')); | ||||
verify(!findChild(userPage, 'newPowerLevelInput').visible); | verify(!findChild(userPage, 'newPowerLevelInput').visible); | ||||
const editButton = findChild(userPage, 'editPowerLevelButton'); | const editButton = findChild(userPage, 'editPowerLevelButton'); | ||||
verify(editButton.visible); | verify(editButton.visible); | ||||
verify(!editButton.enabled); | verify(!editButton.enabled); | ||||
tryVerify(() => userPage.room.ensureStateEvent.calledTimes() === 2); | |||||
tryVerify(() => userPage.room.ensureStateEvent.args[1][0] === 'm.room.power_levels', 1000); | |||||
tryVerify(() => userPage.room.ensureStateEvent.retVals[1], 1000); | tryVerify(() => userPage.room.ensureStateEvent.retVals[1], 1000); | ||||
userPage.room.ensureStateEvent.retVals[1].resolve(true, {}); | userPage.room.ensureStateEvent.retVals[1].resolve(true, {}); | ||||
tryVerify(() => userPage.powerLevelsLoaded); | |||||
tryVerify(() => editButton.enabled); | tryVerify(() => editButton.enabled); | ||||
tryVerify(() => editButton.visible); | |||||
mouseClick(editButton); | mouseClick(editButton); | ||||
const textField = findChild(userPage, 'newPowerLevelInput'); | const textField = findChild(userPage, 'newPowerLevelInput'); | ||||
tryVerify(() => textField.visible, 1000); | tryVerify(() => textField.visible); | ||||
textField.text = '50'; | textField.text = '50'; | ||||
const saveButton = findChild(userPage, 'savePowerLevelButton'); | const saveButton = findChild(userPage, 'savePowerLevelButton'); | ||||
verify(saveButton.visible); | |||||
mouseClick(saveButton); | mouseClick(saveButton); | ||||
tryVerify(() => room.setUserPowerLevel.calledTimes(), 1000); | |||||
tryVerify(() => room.setUserPowerLevel.lastRetVal(), 1000); | tryVerify(() => room.setUserPowerLevel.lastRetVal(), 1000); | ||||
// Text field is not closed until the request succeeded | // Text field is not closed until the request succeeded | ||||
verify(textField.visible); | verify(textField.visible); | ||||
verify(textField.readOnly); | verify(textField.readOnly); | ||||
verify(room.setUserPowerLevel.lastArgs()[0] === '@mew:example.com'); | verify(room.setUserPowerLevel.lastArgs()[0] === '@mew:example.com'); | ||||
verify(room.setUserPowerLevel.lastArgs()[1] === 50); | verify(room.setUserPowerLevel.lastArgs()[1] === 50); | ||||
// the buttons are disabled until the request responded | // the buttons are disabled until the request responded | ||||
verify(!saveButton.enabled); | verify(!saveButton.enabled); | ||||
Show All 32 Lines | function test_powerLevelEditFailure() { | ||||
// show error message | // show error message | ||||
verify(upper.showPassiveNotification.calledTimes()); | verify(upper.showPassiveNotification.calledTimes()); | ||||
// the buttons are enabled when the request responded | // the buttons are enabled when the request responded | ||||
verify(saveButton.enabled); | verify(saveButton.enabled); | ||||
verify(findChild(userPage, 'discardPowerLevelButton').enabled); | verify(findChild(userPage, 'discardPowerLevelButton').enabled); | ||||
} | } | ||||
/** | function test_banUser() { | ||||
* 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" | // Ban user is only available if membership ! = "ban" | ||||
userPage.user = ({ membership: "join" }); | userPage.user = ({ membership: "join", userId: '@mew:example.com' }); | ||||
const banButton = findChild(userPage, 'banUserButton'); | const banButton = findChild(userPage, 'banUserButton'); | ||||
verify(banButton.visible); | verify(banButton.visible); | ||||
verify(banButton.enabled); | verify(banButton.enabled); | ||||
const reasonDialog = findChild(userPage, 'banUserReasonDialog'); | const reasonDialog = findChild(userPage, 'banUserReasonDialog'); | ||||
verify(!reasonDialog.opened); | verify(!reasonDialog.opened); | ||||
const textField = findChild(userPage, 'banUserReasonInput'); | const textField = findChild(userPage, 'banUserReasonInput'); | ||||
mouseClick(banButton); | mouseClick(banButton); | ||||
Show All 9 Lines | function test_banUser() { | ||||
verify(room.banUser.lastArgs()[0] === '@mew:example.com'); | verify(room.banUser.lastArgs()[0] === '@mew:example.com'); | ||||
verify(room.banUser.lastArgs()[1] === 'some reason'); | verify(room.banUser.lastArgs()[1] === 'some reason'); | ||||
room.banUser.lastRetVal().resolve(true, {}); | room.banUser.lastRetVal().resolve(true, {}); | ||||
tryVerify(() => textField.text === '', 1000); | tryVerify(() => textField.text === '', 1000); | ||||
tryVerify(() => banButton.enabled, 1000); | tryVerify(() => banButton.enabled, 1000); | ||||
} | } | ||||
function test_zzbanUserFailure() { | function test_banUserFailure() { | ||||
// Ban user is only available if membership ! = "ban" | // Ban user is only available if membership ! = "ban" | ||||
userPage.user = ({ membership: "join" }); | userPage.user = ({ membership: "join" }); | ||||
const banButton = findChild(userPage, 'banUserButton'); | const banButton = findChild(userPage, 'banUserButton'); | ||||
verify(banButton.visible); | verify(banButton.visible); | ||||
verify(banButton.enabled); | verify(banButton.enabled); | ||||
const reasonDialog = findChild(userPage, 'banUserReasonDialog'); | const reasonDialog = findChild(userPage, 'banUserReasonDialog'); | ||||
verify(!reasonDialog.opened); | verify(!reasonDialog.opened); | ||||
const textField = findChild(userPage, 'banUserReasonInput'); | const textField = findChild(userPage, 'banUserReasonInput'); | ||||
▲ Show 20 Lines • Show All 45 Lines • ▼ Show 20 Lines | function test_unbanUserFailure() { | ||||
tryVerify(() => !unbanButton.enabled, 1000); | tryVerify(() => !unbanButton.enabled, 1000); | ||||
verify(room.unbanUser.lastArgs()[0] == '@mew:example.com'); | verify(room.unbanUser.lastArgs()[0] == '@mew:example.com'); | ||||
verify(room.unbanUser.lastRetVal()); | verify(room.unbanUser.lastRetVal()); | ||||
room.unbanUser.lastRetVal().resolve(false, {}); | room.unbanUser.lastRetVal().resolve(false, {}); | ||||
tryVerify(() => upper.showPassiveNotification.calledTimes(), 1000); | tryVerify(() => upper.showPassiveNotification.calledTimes(), 1000); | ||||
tryVerify(() => unbanButton.enabled, 1000); | tryVerify(() => unbanButton.enabled, 1000); | ||||
} | } | ||||
} | |||||
function test_kickUser() { | function test_kickUser() { | ||||
const kickButton = findChild(userPage, 'kickUserButton'); | const kickButton = findChild(userPage, 'kickUserButton'); | ||||
verify(kickButton.visible); | verify(kickButton.visible); | ||||
verify(kickButton.enabled); | verify(kickButton.enabled); | ||||
const reasonDialog = findChild(userPage, 'kickUserReasonDialog'); | const reasonDialog = findChild(userPage, 'kickUserReasonDialog'); | ||||
verify(!reasonDialog.opened); | verify(!reasonDialog.opened); | ||||
const textField = findChild(userPage, 'kickUserReasonInput'); | const textField = findChild(userPage, 'kickUserReasonInput'); | ||||
mouseClick(kickButton); | mouseClick(kickButton); | ||||
verify(!reasonDialog.opened); | verify(!reasonDialog.opened); | ||||
verify(textField.visible); | |||||
verify(!textField.readOnly); | verify(!textField.readOnly); | ||||
textField.text = 'some reason'; | textField.text = 'some reason'; | ||||
reasonDialog.accept(); | reasonDialog.accept(); | ||||
tryVerify(() => !reasonDialog.opened, 1000); | tryVerify(() => !reasonDialog.opened, 1000); | ||||
tryVerify(() => !kickButton.enabled, 1000); | tryVerify(() => !kickButton.enabled, 1000); | ||||
tryVerify(() => room.kickUser.lastRetVal(), 1000); | tryVerify(() => room.kickUser.lastRetVal(), 1000); | ||||
verify(room.kickUser.lastArgs()[0] === '@mew:example.com'); | verify(room.kickUser.lastArgs()[0] === '@mew:example.com'); | ||||
verify(room.kickUser.lastArgs()[1] === 'some reason'); | verify(room.kickUser.lastArgs()[1] === 'some reason'); | ||||
room.kickUser.lastRetVal().resolve(true, {}); | room.kickUser.lastRetVal().resolve(true, {}); | ||||
tryVerify(() => textField.text === '', 1000); | tryVerify(() => textField.text === '', 1000); | ||||
// still available only because this is a mock call, no real action | // still available only because this is a mock call, no real action | ||||
// is performed on the user | // is performed on the user | ||||
tryVerify(() => kickButton.enabled, 1000); | tryVerify(() => kickButton.enabled, 1000); | ||||
} | } | ||||
function test_overridedName() { | function test_overridedName() { | ||||
const input = findChild(userPage, 'nameOverrideInput'); | const input = findChild(userPage, 'nameOverrideInput'); | ||||
compare(input.text, ''); | compare(input.text, ''); | ||||
gnMap.map = { '@mew:example.com': 'something' }; | gnMap.map = { '@mew:example.com': 'something' }; | ||||
compare(input.text, 'something'); | tryCompare(input, 'text', 'something'); | ||||
} | |||||
verify(!findChild(userPageSelf, 'nameOverrideInput').visible); | function test_noOverridedNameForSelf() { | ||||
userPage.userId = '@foo:example.com'; | |||||
verify(!findChild(userPage, 'nameOverrideInput').visible); | |||||
} | } | ||||
function test_updateOverridedName() { | function test_updateOverridedName() { | ||||
const input = findChild(userPage, 'nameOverrideInput'); | const input = findChild(userPage, 'nameOverrideInput'); | ||||
compare(input.text, ''); | compare(input.text, ''); | ||||
verify(input.enabled); | verify(input.enabled); | ||||
input.text = 'something'; | input.text = 'something'; | ||||
const saveButton = findChild(userPage, 'saveNameOverrideButton'); | const saveButton = findChild(userPage, 'saveNameOverrideButton'); | ||||
verify(saveButton.enabled); | verify(saveButton.enabled); | ||||
mouseClick(saveButton); | mouseClick(saveButton); | ||||
tryVerify(() => !input.enabled); | tryVerify(() => !input.enabled); | ||||
verify(!saveButton.enabled); | verify(!saveButton.enabled); | ||||
compare(gnMap.setAndUpload.calledTimes(), 1); | compare(gnMap.setAndUpload.calledTimes(), 1); | ||||
verify(TestHelpers.deepEqual(gnMap.setAndUpload.lastRetVal(), ['@mew:example.com', 'something'])); | verify(JsHelpers.deepEqual(gnMap.setAndUpload.lastArgs(), ['@mew:example.com', 'something'])); | ||||
gnMap.setAndUpload.lastRetVal().resolve(true, {}); | gnMap.setAndUpload.lastRetVal().resolve(true, {}); | ||||
tryVerify(() => input.enabled); | tryVerify(() => input.enabled); | ||||
verify(saveButton.enabled); | verify(saveButton.enabled); | ||||
} | } | ||||
function test_updateOverridedNameFailed() { | function test_updateOverridedNameFailed() { | ||||
const input = findChild(userPage, 'nameOverrideInput'); | const input = findChild(userPage, 'nameOverrideInput'); | ||||
compare(input.text, ''); | compare(input.text, ''); | ||||
verify(input.enabled); | verify(input.enabled); | ||||
input.text = 'something'; | input.text = 'something'; | ||||
const saveButton = findChild(userPage, 'saveNameOverrideButton'); | const saveButton = findChild(userPage, 'saveNameOverrideButton'); | ||||
verify(saveButton.enabled); | verify(saveButton.enabled); | ||||
mouseClick(saveButton); | mouseClick(saveButton); | ||||
tryVerify(() => !input.enabled); | tryVerify(() => !input.enabled); | ||||
verify(!saveButton.enabled); | verify(!saveButton.enabled); | ||||
compare(gnMap.setAndUpload.calledTimes(), 1); | compare(gnMap.setAndUpload.calledTimes(), 1); | ||||
verify(TestHelpers.deepEqual(gnMap.setAndUpload.lastArgs(), ['@mew:example.com', 'something'])); | verify(JsHelpers.deepEqual(gnMap.setAndUpload.lastArgs(), ['@mew:example.com', 'something'])); | ||||
gnMap.setAndUpload.lastRetVal().resolve(false, {}); | gnMap.setAndUpload.lastRetVal().resolve(false, {}); | ||||
tryVerify(() => input.enabled); | tryVerify(() => input.enabled); | ||||
verify(saveButton.enabled); | verify(saveButton.enabled); | ||||
} | } | ||||
function test_removeOverridedName() { | function test_removeOverridedName() { | ||||
gnMap.map = { '@mew:example.com': 'something' }; | gnMap.map = { '@mew:example.com': 'something' }; | ||||
const input = findChild(userPage, 'nameOverrideInput'); | const input = findChild(userPage, 'nameOverrideInput'); | ||||
compare(input.text, 'something'); | compare(input.text, 'something'); | ||||
input.text = ''; | input.text = ''; | ||||
const saveButton = findChild(userPage, 'saveNameOverrideButton'); | const saveButton = findChild(userPage, 'saveNameOverrideButton'); | ||||
verify(saveButton.enabled); | verify(saveButton.enabled); | ||||
mouseClick(saveButton); | mouseClick(saveButton); | ||||
tryVerify(() => !input.enabled); | tryVerify(() => !input.enabled); | ||||
verify(!saveButton.enabled); | verify(!saveButton.enabled); | ||||
compare(gnMap.setAndUpload.calledTimes(), 1); | compare(gnMap.setAndUpload.calledTimes(), 1); | ||||
verify(TestHelpers.deepEqual(gnMap.setAndUpload.lastArgs(), ['@mew:example.com', null])); | verify(JsHelpers.deepEqual(gnMap.setAndUpload.lastArgs(), ['@mew:example.com', null])); | ||||
gnMap.setAndUpload.lastRetVal().resolve(true, {}); | gnMap.setAndUpload.lastRetVal().resolve(true, {}); | ||||
tryVerify(() => input.enabled); | tryVerify(() => input.enabled); | ||||
verify(saveButton.enabled); | verify(saveButton.enabled); | ||||
} | |||||
} | } | ||||
} | } |