feat: 优化设置布局并支持管理端地址切换 (#130)
This commit is contained in:
@@ -1110,6 +1110,31 @@ class PDDTaskPageEventTest(unittest.TestCase):
|
||||
window.close()
|
||||
window.deleteLater()
|
||||
|
||||
def test_admin_base_url_change_reaches_persistent_claim_worker(self):
|
||||
settings = self._saved_settings()
|
||||
page = PDDTaskPage()
|
||||
events = PDDTaskPageEvent(
|
||||
page,
|
||||
self.repository,
|
||||
settings_repository=settings,
|
||||
)
|
||||
worker = events._ensure_claim_executor()
|
||||
|
||||
events.update_admin_base_url("http://192.168.0.9:8080/")
|
||||
self.assertTrue(
|
||||
wait_until(
|
||||
self.app,
|
||||
lambda: getattr(worker._gateway, "_base_url", "")
|
||||
== "http://192.168.0.9:8080",
|
||||
)
|
||||
)
|
||||
self.assertEqual(
|
||||
getattr(events._claim_gateway, "_base_url", ""),
|
||||
"http://192.168.0.9:8080",
|
||||
)
|
||||
events.shutdown()
|
||||
page.deleteLater()
|
||||
|
||||
def test_admin_task_mapping_uses_explicit_real_field_names(self):
|
||||
local_task = admin_task_to_new_claimed_task(
|
||||
collect_admin_task("COL-8020a8729f111c15")
|
||||
|
||||
@@ -19,6 +19,7 @@ from src.android_device_service import (
|
||||
AndroidWifiConversionResult,
|
||||
)
|
||||
from src.mock_admin_gateway import MockAdminGateway
|
||||
from src.http_admin_gateway import DEFAULT_ADMIN_BASE_URL
|
||||
from src.selected_android_device_service import SELECTED_ANDROID_SERIAL_KEY
|
||||
from src.settings_repository import SettingsRepository
|
||||
from src.settings_ui import AndroidDeviceRow, SettingsPage
|
||||
@@ -212,10 +213,129 @@ class SettingsPageEventTest(unittest.TestCase):
|
||||
|
||||
self.assertEqual(page.deviceIdInput.text(), "CLIENT-EXISTING")
|
||||
self.assertEqual(page.deviceNameInput.text(), "办公室电脑")
|
||||
self.assertEqual(page.adminBaseUrlInput.text(), DEFAULT_ADMIN_BASE_URL)
|
||||
self.assertEqual(page.currentDeviceStatusLabel.text(), "本地设备信息已加载")
|
||||
page.eventBinder.shutdown()
|
||||
page.deleteLater()
|
||||
|
||||
def test_compact_form_layout_keeps_related_fields_on_same_row(self):
|
||||
page = SettingsPage(
|
||||
settings_repository=self.repository,
|
||||
admin_gateway=MockAdminGateway(),
|
||||
)
|
||||
|
||||
self.assertEqual(
|
||||
page.currentDeviceFormLayout.getItemPosition(
|
||||
page.currentDeviceFormLayout.indexOf(page.deviceIdInput)
|
||||
),
|
||||
(0, 1, 1, 1),
|
||||
)
|
||||
self.assertEqual(
|
||||
page.currentDeviceFormLayout.getItemPosition(
|
||||
page.currentDeviceFormLayout.indexOf(page.deviceNameInput)
|
||||
),
|
||||
(0, 3, 1, 1),
|
||||
)
|
||||
self.assertEqual(
|
||||
page.currentDeviceFormLayout.getItemPosition(
|
||||
page.currentDeviceFormLayout.indexOf(page.adminBaseUrlInput)
|
||||
),
|
||||
(1, 1, 1, 3),
|
||||
)
|
||||
self.assertEqual(
|
||||
page.updateFormLayout.getItemPosition(
|
||||
page.updateFormLayout.indexOf(page.updateUsernameInput)
|
||||
),
|
||||
(2, 1, 1, 1),
|
||||
)
|
||||
self.assertEqual(
|
||||
page.updateFormLayout.getItemPosition(
|
||||
page.updateFormLayout.indexOf(page.updatePasswordInput)
|
||||
),
|
||||
(2, 3, 1, 1),
|
||||
)
|
||||
self.assertEqual(page.updateFormLayout.columnStretch(1), 45)
|
||||
self.assertEqual(page.updateFormLayout.columnStretch(3), 55)
|
||||
self.assertIs(page.deviceIdLabel.buddy(), page.deviceIdInput)
|
||||
self.assertIs(page.adminBaseUrlLabel.buddy(), page.adminBaseUrlInput)
|
||||
self.assertIs(page.usernameLabel.buddy(), page.updateUsernameInput)
|
||||
self.assertIs(page.passwordLabel.buddy(), page.updatePasswordInput)
|
||||
page.eventBinder.shutdown()
|
||||
page.deleteLater()
|
||||
|
||||
def test_save_persists_normalized_admin_base_url_and_emits_change(self):
|
||||
gateway = MockAdminGateway()
|
||||
page = SettingsPage(
|
||||
settings_repository=self.repository,
|
||||
admin_gateway=gateway,
|
||||
)
|
||||
changed_urls = []
|
||||
page.eventBinder.adminBaseUrlChanged.connect(changed_urls.append)
|
||||
page.deviceNameInput.setText("仓库电脑")
|
||||
page.adminBaseUrlInput.setText(" http://192.168.0.8:8080/ ")
|
||||
|
||||
page.currentDeviceSaveButton.click()
|
||||
self._wait_until(lambda: page.eventBinder._thread is None)
|
||||
|
||||
expected = "http://192.168.0.8:8080"
|
||||
self.assertEqual(self.repository.get("admin.base_url"), expected)
|
||||
self.assertEqual(page.adminBaseUrlInput.text(), expected)
|
||||
self.assertEqual(changed_urls, [expected])
|
||||
self.assertEqual(gateway.registration_count, 1)
|
||||
page.eventBinder.shutdown()
|
||||
page.deleteLater()
|
||||
|
||||
def test_invalid_admin_base_url_does_not_save_any_current_device_field(self):
|
||||
self.repository.set_many(
|
||||
{
|
||||
"admin.client_id": "CLIENT-EXISTING",
|
||||
"admin.client_name": "原设备名",
|
||||
"admin.base_url": "http://127.0.0.1:8080",
|
||||
}
|
||||
)
|
||||
gateway = MockAdminGateway()
|
||||
page = SettingsPage(
|
||||
settings_repository=self.repository,
|
||||
admin_gateway=gateway,
|
||||
)
|
||||
page.show()
|
||||
self.app.processEvents()
|
||||
page.deviceNameInput.setText("不应保存的新名称")
|
||||
page.adminBaseUrlInput.setText("不是地址")
|
||||
|
||||
page.currentDeviceSaveButton.click()
|
||||
self.app.processEvents()
|
||||
|
||||
self.assertEqual(self.repository.get("admin.client_name"), "原设备名")
|
||||
self.assertEqual(
|
||||
self.repository.get("admin.base_url"),
|
||||
"http://127.0.0.1:8080",
|
||||
)
|
||||
self.assertEqual(gateway.registration_count, 0)
|
||||
self.assertIn("Admin 服务地址必须", page.currentDeviceStatusLabel.text())
|
||||
self.assertIs(self.app.focusWidget(), page.adminBaseUrlInput)
|
||||
page.eventBinder.shutdown()
|
||||
page.deleteLater()
|
||||
|
||||
def test_admin_base_url_with_credentials_is_not_saved(self):
|
||||
gateway = MockAdminGateway()
|
||||
page = SettingsPage(
|
||||
settings_repository=self.repository,
|
||||
admin_gateway=gateway,
|
||||
)
|
||||
page.adminBaseUrlInput.setText(
|
||||
"http://operator@127.0.0.1:8080"
|
||||
)
|
||||
|
||||
page.currentDeviceSaveButton.click()
|
||||
self.app.processEvents()
|
||||
|
||||
self.assertIsNone(self.repository.get("admin.base_url"))
|
||||
self.assertEqual(gateway.registration_count, 0)
|
||||
self.assertIn("不能包含账号、密码", page.currentDeviceStatusLabel.text())
|
||||
page.eventBinder.shutdown()
|
||||
page.deleteLater()
|
||||
|
||||
def test_settings_page_has_no_manual_live_purchase_authorization(self):
|
||||
page = SettingsPage(
|
||||
settings_repository=self.repository,
|
||||
|
||||
Reference in New Issue
Block a user