Files
kernalix7--winpodx/tests/test_debloat_picker.py
T
wehub-resource-sync 3e779be6f3
CI / lint (push) Failing after 13m4s
CI / test (3.11, ubuntu-latest) (push) Failing after 2m4s
CI / test (3.13, ubuntu-latest) (push) Successful in 13m30s
CI / test (3.14, ubuntu-latest) (push) Successful in 17m21s
CI / test (3.12, ubuntu-latest) (push) Successful in 17m55s
CI / discover-apps-ps (push) Successful in 1m56s
CI / test (3.9, ubuntu-latest) (push) Successful in 13m17s
CI / test (3.10, ubuntu-latest) (push) Successful in 26m21s
CI / audit (push) Successful in 13m38s
Deploy site / deploy (push) Has been cancelled
CI / test (3.14, ubuntu-24.04-arm) (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:32:37 +08:00

120 lines
3.9 KiB
Python

# SPDX-License-Identifier: MIT
"""Smoke tests for the Qt debloat picker dialog (#247 phase 3).
Runs headless via ``QApplication([])`` -- no display server required.
"""
from __future__ import annotations
import os
import pytest
# Force the offscreen Qt platform plugin so tests run on CI / headless
# dev boxes without an X server. Must be set before QApplication ctor.
os.environ.setdefault("QT_QPA_PLATFORM", "offscreen")
PySide6 = pytest.importorskip("PySide6")
from winpodx.core.debloat import load_catalog # noqa: E402
from winpodx.gui.debloat_picker import DebloatPickerDialog # noqa: E402
def _ensure_qapp():
from PySide6.QtWidgets import QApplication
app = QApplication.instance()
if app is None:
app = QApplication([])
return app
@pytest.fixture(scope="module")
def qapp():
return _ensure_qapp()
@pytest.fixture
def catalog():
return load_catalog()
class TestDialogInitialState:
def test_opens_with_roomy_starting_size(self, qapp, catalog):
# #550: the picker must open large enough to show preset + items,
# not at a cramped default.
dlg = DebloatPickerDialog(catalog)
try:
assert dlg.width() >= 700
assert dlg.height() >= 640
finally:
dlg.deleteLater()
def test_opens_with_normal_preset_seeded(self, qapp, catalog):
dlg = DebloatPickerDialog(catalog)
try:
normal_members = set(catalog.items_for_preset("normal"))
assert set(dlg.selected_items()) == normal_members
# Radio: normal must be checked.
assert dlg._preset_buttons["normal"].isChecked()
assert not dlg._custom_button.isChecked()
finally:
dlg.deleteLater()
def test_initial_preset_can_be_overridden(self, qapp, catalog):
dlg = DebloatPickerDialog(catalog, initial_preset="speed")
try:
speed_members = set(catalog.items_for_preset("speed"))
assert set(dlg.selected_items()) == speed_members
assert dlg._preset_buttons["speed"].isChecked()
finally:
dlg.deleteLater()
def test_invalid_initial_preset_falls_back_to_normal(self, qapp, catalog):
dlg = DebloatPickerDialog(catalog, initial_preset="bogus")
try:
normal_members = set(catalog.items_for_preset("normal"))
assert set(dlg.selected_items()) == normal_members
finally:
dlg.deleteLater()
class TestPresetToggling:
def test_clicking_preset_reseeds_checkboxes(self, qapp, catalog):
dlg = DebloatPickerDialog(catalog)
try:
dlg._preset_buttons["performance"].setChecked(True)
assert set(dlg.selected_items()) == set(catalog.items_for_preset("performance"))
finally:
dlg.deleteLater()
def test_toggling_a_checkbox_flips_to_custom(self, qapp, catalog):
dlg = DebloatPickerDialog(catalog)
try:
assert dlg._preset_buttons["normal"].isChecked()
# Flip OneDrive (not in normal preset).
dlg._item_boxes["onedrive"].setChecked(True)
assert dlg._custom_button.isChecked()
assert not dlg._preset_buttons["normal"].isChecked()
finally:
dlg.deleteLater()
class TestSelectedItems:
def test_returns_catalog_order(self, qapp, catalog):
dlg = DebloatPickerDialog(catalog, initial_preset="speed")
try:
ordered = dlg.selected_items()
expected_order = [name for name in catalog.items if name in ordered]
assert ordered == expected_order
finally:
dlg.deleteLater()
def test_empty_selection_when_all_unchecked(self, qapp, catalog):
dlg = DebloatPickerDialog(catalog)
try:
for box in dlg._item_boxes.values():
box.setChecked(False)
assert dlg.selected_items() == []
finally:
dlg.deleteLater()