feat: 优化设置布局并支持管理端地址切换 (#130)

This commit is contained in:
chengma
2026-08-11 09:24:04 +08:00
parent 4ede126f58
commit cd2889d76c
9 changed files with 347 additions and 47 deletions
+25
View File
@@ -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")
+120
View File
@@ -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,