Files
cc-ci/tests/gitea/test_install.py
autonomic-bot 2d865f06cb
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone Build is passing
fix(gtea): ruff format + check all gtea files and bridge.py
Clears cc-ci self-test lint failures:
- ruff format: 9 files reformatted (all gtea test files + test_discovery.py)
- ruff check --fix: bridge.py UP017 (datetime.UTC alias) + 6 gtea check errors
- manifest.py B007: rename unused loop variable path → _path (no auto-fix available)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-15 21:52:01 +00:00

73 lines
2.8 KiB
Python

"""gitea — INSTALL overlay (phase gtea).
Extends the generic serving assertion with gitea-specific checks:
- /api/healthz returns 200 (already covered by HEALTH_PATH, reinforced here)
- /api/v1/version returns 200 JSON (API router is up)
- Admin API is reachable and authenticated (ops.pre_install created the admin user)
- Playwright: the sign-in page renders in a real browser
"""
from __future__ import annotations
import os
import sys
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "..", "runner"))
from harness import browser as harness_browser # noqa: E402
from harness import generic, lifecycle # noqa: E402
sys.path.insert(0, os.path.dirname(__file__))
from ops import admin_creds # noqa: E402
def test_install_gitea(live_app, meta):
"""Gitea is serving, API is up, admin API is authenticated, UI loads in browser."""
# 1. Generic serving (services converged + HEALTH_PATH 200 + TLS valid)
generic.assert_serving(live_app, meta)
# 2. API version endpoint
status, body = lifecycle.http_fetch(live_app, "/api/v1/version")
assert status == 200, f"{live_app}/api/v1/version: HTTP {status} (expected 200)"
assert body, "/api/v1/version: empty response body"
# 3. Admin API reachable + authenticated — GET /api/v1/users/search as ci_admin
user, password = admin_creds(live_app)
import base64
import ssl
import urllib.request
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE
auth = base64.b64encode(f"{user}:{password}".encode()).decode()
req = urllib.request.Request(
f"https://{live_app}/api/v1/users/search?limit=1",
headers={"Authorization": f"Basic {auth}"},
)
import urllib.error
try:
with urllib.request.urlopen(req, timeout=15, context=ctx) as r:
assert r.status == 200, f"Admin API /users/search returned {r.status}"
except urllib.error.HTTPError as e:
raise AssertionError(f"Admin API /users/search failed: HTTP {e.code}") from e
# 4. Playwright: sign-in page renders
from playwright.sync_api import sync_playwright
url = f"https://{live_app}/user/login"
with sync_playwright() as p:
browser = p.chromium.launch(args=["--no-sandbox"])
try:
page = browser.new_context(ignore_https_errors=True).new_page()
harness_browser.goto_with_retry(
page, url, accept_statuses=(200, 302), goto_timeout_ms=30_000
)
page.wait_for_selector("input#user_name", timeout=20_000)
content = page.content()
assert (
"gitea" in content.lower() or "sign in" in content.lower()
), "Sign-in page did not render expected gitea content"
finally:
browser.close()