Files
cowork-local/tests/ui/test_project_gate_subtabs.py
T
duylh19andgitea-admin b71a622227
CI / test (push) Canceled after 0s
Delta team/fix comment ui v2 (#11)
## Summary

What changed and why?

## Change Type

- [ ] Cowork feature
- [ ] Bug fix
- [ ] Core AI contribution
- [ ] Test / hardening
- [ ] Performance
- [ ] Documentation

## Related Work

Cowork Task:

Core Repo: http://34.143.229.138/gitea-admin/fsg-ai-core-assets

Core AI Issue:

Core Task:

Related PR:

## Scope

What is intentionally included?

What is intentionally NOT included?

## Validation

- [ ] Unit tests
- [ ] Integration tests
- [ ] Manual verification
- [ ] Regression check

Commands / evidence:

## Security Impact

Permission / credential / network / customer data impact:

## Compatibility

- [ ] No breaking change
- [ ] Breaking change documented

## Reviewer Notes

Anything Cowork reviewers should pay attention to.

Reviewed-on: #11
Co-authored-by: Duy Le Huu <duylh19@fpt.com>
2026-09-14 13:15:40 +00:00

142 lines
5.3 KiB
Python

"""Cổng project: Cowork và GraphRAG chỉ hiện khi đã chọn một project cụ thể.
Cổng có hai mặt và trước đây chỉ mặt thứ nhất làm đúng:
* **Sub-tab trong màn Workspace** — ``_update_tab_visibility`` vốn đã ẩn/hiện
đúng. Chỗ hỏng nằm ở ``refresh()``: nó mặc định ``row_to_select = 0`` nên lúc
mở app (chưa ai bấm gì) danh sách tự chọn hộ project đầu tiên, mở cổng cho một
project người dùng chưa hề chọn.
* **Hàng trên menu trái** — ``NavRailMixin._rebuild_nav`` từng dựng hàng ở dạng
mờ kèm tooltip thay vì bỏ đi ("shown instead of hidden"), nên người dùng vẫn
thấy Cowork/GraphRAG trên menu dù cổng đang đóng.
Các bài dưới đây chốt cả hai mặt, ở cả ba trạng thái: chưa chọn → ẩn, chọn rồi →
hiện, bỏ chọn → ẩn lại.
"""
from __future__ import annotations
import pytest
pytest.importorskip("PySide6", reason="cần PySide6 để dựng cửa sổ thật")
@pytest.fixture
def win(qapp, tmp_path):
"""MainWindow thật — cần cả cửa sổ vì phải kiểm cả menu trái.
Đọc project từ ``~/.cowork_local`` như bản cài thật (``core/projects.py``
gắn ``PROJECTS_DIR`` vào đó) nên các bài này KHÔNG tạo/xoá project nào.
Bài nào cần cổng MỞ thì gọi thẳng ``_update_tab_visibility(True)`` thay vì
tạo project trên đĩa của người chạy test.
"""
from cowork_local.presentation.shell.bootstrap import build_config, build_context
from cowork_local.presentation.shell.main_window import MainWindow
config_path = tmp_path / "config.json"
build_config(config_path)
window = MainWindow(build_context(config_path))
yield window
window.close()
def _cong(ws):
"""Hai sub-tab nằm sau cổng project, bỏ qua bản dựng không có chúng."""
return [(ten, idx) for ten, idx in
(("Cowork", ws._cowork_tab_idx), ("GraphRAG", ws._graphrag_tab_idx))
if idx >= 0]
def _hang_menu(win):
"""Nhãn của mọi hàng đang có trên cột menu trái."""
return [win.nav.topLevelItem(i).text(0) for i in range(win.nav.topLevelItemCount())]
# ---- mặt 1: không tự chọn hộ project ------------------------------------
def test_mo_app_len_chua_chon_thi_khong_tu_chon_ho(win):
"""Đây là nguyên nhân gốc: ``refresh()`` từng mặc định chọn dòng 0."""
ws = win.workspace
assert ws._current_id == ""
assert ws.project_list.currentRow() == -1
def test_chua_chon_project_thi_hai_sub_tab_deu_an(win):
ws = win.workspace
for ten, idx in _cong(ws):
assert ws.tabs.isTabVisible(idx) is False, f"{ten} hiện khi chưa chọn project"
assert ws.subtab_available(idx) is False, f"{ten} vẫn mở cổng"
def test_chua_chon_project_thi_dung_o_tab_project(win):
"""Ẩn hai tab kia mà lại đứng ở một tab đã ẩn thì màn hình trống trơn."""
ws = win.workspace
assert ws.current_subtab() == ws._project_tab_idx
def test_refresh_giu_nguyen_project_dang_chon(win):
"""Sửa cổng không được làm mất lựa chọn hiện có: ``keep`` vẫn phải thắng."""
ws = win.workspace
if ws.project_list.count() == 0:
pytest.skip("máy chạy test chưa có project nào để chọn")
ws.project_list.setCurrentRow(0)
dang_chon = ws._current_id
ws.refresh()
assert ws._current_id == dang_chon
assert ws.project_list.currentRow() >= 0
# ---- mặt 2: menu trái bỏ hẳn hàng, không hiện dạng mờ -------------------
def test_chua_chon_project_thi_menu_trai_khong_co_hai_hang(win):
"""Đây là thứ người dùng nhìn thấy — trước đây hai hàng vẫn nằm đó, chỉ mờ."""
nhan = _hang_menu(win)
assert "Cowork" not in nhan, f"Cowork vẫn trên menu: {nhan}"
assert "GraphRAG" not in nhan, f"GraphRAG vẫn trên menu: {nhan}"
def test_mo_cong_thi_hai_hang_quay_lai_menu_trai(win):
"""Bỏ hàng phải đảo ngược được, nếu không thì chọn project xong vẫn kẹt."""
ws = win.workspace
ws._current_id = "gia-lap"
ws._update_tab_visibility(True)
nhan = _hang_menu(win)
assert "Cowork" in nhan, f"Cowork không quay lại: {nhan}"
assert "GraphRAG" in nhan, f"GraphRAG không quay lại: {nhan}"
def test_mo_cong_thi_hai_sub_tab_cung_hien_lai(win):
ws = win.workspace
ws._current_id = "gia-lap"
ws._update_tab_visibility(True)
for ten, idx in _cong(ws):
assert ws.tabs.isTabVisible(idx) is True, f"{ten} vẫn ẩn khi cổng đã mở"
def test_dong_cong_lai_thi_hai_hang_bien_mat(win):
"""Cổng phải đóng lại được, không chỉ mở một chiều."""
ws = win.workspace
ws._current_id = "gia-lap"
ws._update_tab_visibility(True)
ws._current_id = ""
ws._update_tab_visibility(False)
nhan = _hang_menu(win)
assert "Cowork" not in nhan and "GraphRAG" not in nhan, nhan
def test_cac_hang_khac_khong_bi_anh_huong(win):
"""Chỉ hai hàng sau cổng bị bỏ — phần còn lại của menu giữ nguyên."""
nhan = _hang_menu(win)
for bat_buoc in ("Project", "Co4E"):
assert bat_buoc in nhan, f"{bat_buoc} biến mất khỏi menu: {nhan}"