Files
pulp-console/tests/test_sync.py
Hyemin Lee bfd84fe94a fix+style: deploy modal/banner, back button, table stability
버그픽스
- 배포 확정 활성화: tojson 따옴표가 oninput 속성을 깨뜨리던 것 → data-confirm 비교로 수정
- ghost 버튼 호버 시 글자 하얘짐 → 호버 색 명시(새로고침/페이저/테마토글 공통)

UX/디자인
- 배포 모달: 취소·배포확정 한 줄, 저장소명만 mono, 순 변화 +초록/−빨강, 표 chrome 제거
- 배포 성공: 별도 다이얼로그 제거 → 모달 닫힘 + 배지 이동 + 완료 배너(여백·크기 정돈)
- 대시보드 백링크: ghost 버튼 + 화살표, 제목과 간격 확보
- 표 액션 셀 고정 박스(172x36) → 동기화/완료/진행 전환 시 행·열 안 흔들림
  (완료 'v3', 진행 'n/m·NN%', 실패는 축약+title 로 사유)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 16:53:01 +09:00

116 lines
3.5 KiB
Python

import httpx
from fastapi.testclient import TestClient
from app import task_store
from app.main import app, get_pulp_client
client = TestClient(app)
class _FakePulp:
def __init__(self, repo=None, task=None, sync_raises=False):
self._repo = (
{"remote": "/pulp/api/v3/remotes/rpm/rpm/r1/"} if repo is None else repo
)
self._task = task
self._sync_raises = sync_raises
self.synced = None
def get_repo(self, uuid):
return self._repo
def sync_repo(self, uuid, remote_href):
if self._sync_raises:
raise httpx.ConnectError("connection refused")
self.synced = (uuid, remote_href)
return f"/pulp/api/v3/tasks/t-{uuid}/"
def get_task(self, task_href):
return self._task
def _use(fake):
app.dependency_overrides[get_pulp_client] = lambda: fake
def teardown_function():
app.dependency_overrides.clear()
task_store._active.clear()
def test_start_sync_begins_polling_and_records_task():
fake = _FakePulp()
_use(fake)
resp = client.post("/repos/abc/sync")
assert resp.status_code == 200
assert 'hx-get="/repos/abc/progress"' in resp.text
assert 'hx-trigger="every 3s"' in resp.text
assert task_store.get_task("abc") == "/pulp/api/v3/tasks/t-abc/"
assert fake.synced == ("abc", "/pulp/api/v3/remotes/rpm/rpm/r1/")
def test_start_sync_without_remote_is_rejected():
_use(_FakePulp(repo={})) # remote 미설정
resp = client.post("/repos/abc/sync")
assert resp.status_code == 400
assert "remote" in resp.text
assert task_store.get_task("abc") is None
def test_start_sync_handles_pulp_error():
_use(_FakePulp(sync_raises=True))
resp = client.post("/repos/abc/sync")
assert resp.status_code == 502
assert "동기화 시작 실패" in resp.text
assert task_store.get_task("abc") is None
def test_progress_running_renders_bar_and_keeps_polling():
task_store.set_task("abc", "/pulp/api/v3/tasks/t1/")
_use(
_FakePulp(
task={"state": "running", "progress_reports": [{"done": 4, "total": 8}]}
)
)
resp = client.get("/repos/abc/progress")
assert resp.status_code == 200
assert "50%" in resp.text
assert 'hx-trigger="every 3s"' in resp.text
assert task_store.get_task("abc") is not None # 아직 추적 중
def test_progress_completed_stops_polling_and_clears():
task_store.set_task("abc", "/pulp/api/v3/tasks/t1/")
_use(
_FakePulp(
task={
"state": "completed",
"created_resources": [
"/pulp/api/v3/repositories/rpm/rpm/abc/versions/7/"
],
}
)
)
resp = client.get("/repos/abc/progress")
assert "완료" in resp.text
assert "v7" in resp.text
assert "hx-trigger" not in resp.text # 폴링 중단
assert task_store.get_task("abc") is None # 정리됨
def test_progress_failed_shows_error_and_clears():
task_store.set_task("abc", "/pulp/api/v3/tasks/t1/")
_use(_FakePulp(task={"state": "failed", "error": {"description": "GPG 검증 실패"}}))
resp = client.get("/repos/abc/progress")
assert "동기화 실패" in resp.text
assert "GPG 검증 실패" in resp.text
assert "hx-trigger" not in resp.text
assert task_store.get_task("abc") is None
def test_progress_idle_when_no_active_task():
_use(_FakePulp())
resp = client.get("/repos/zzz/progress")
assert resp.status_code == 200
assert "hx-trigger" not in resp.text # 폴링하지 않음