Files
stack/tests/api/test_woodpecker.py
kert 2c0a69a4d8 add HKDF credential derivation and auto-rotation
Single root key derives all 18 service credentials via HKDF-SHA256.
Bootstrap/service tiers rotate on key change vs every commit.
Provisioners update PostgreSQL roles and Gitea tokens automatically.
CI pipeline runs `api.auth provision` after each deploy.
2026-02-28 22:45:14 -05:00

119 lines
4.3 KiB
Python

"""Tests for WoodpeckerClient."""
from __future__ import annotations
from api.clients.woodpecker import WoodpeckerClient
class TestWoodpeckerAuth:
def test_bearer_header(self, capture_transport):
cap = capture_transport
c = WoodpeckerClient("wp-tok", _transport=cap.transport())
c.list_repos()
assert cap.requests[0].headers["authorization"] == "Bearer wp-tok"
class TestWoodpeckerRoutes:
def test_list_repos(self, capture_transport):
cap = capture_transport
c = WoodpeckerClient("t", _transport=cap.transport([]))
c.list_repos()
req = cap.requests[0]
assert req.method == "GET"
assert req.url.path == "/api/repos"
def test_get_pipeline(self, capture_transport):
cap = capture_transport
c = WoodpeckerClient("t", _transport=cap.transport({}))
c.get_pipeline(42, 7)
req = cap.requests[0]
assert req.method == "GET"
assert req.url.path == "/api/repos/42/pipelines/7"
def test_create_secret(self, capture_transport):
cap = capture_transport
c = WoodpeckerClient("t", _transport=cap.transport({}))
c.create_secret(1, {"name": "s", "value": "v"})
req = cap.requests[0]
assert req.method == "POST"
assert req.url.path == "/api/repos/1/secrets"
def test_version(self, capture_transport):
cap = capture_transport
c = WoodpeckerClient("t", _transport=cap.transport({"version": "2.0"}))
result = c.version()
assert result == {"version": "2.0"}
assert cap.requests[0].url.path == "/api/version"
def test_get_repo(self, capture_transport):
cap = capture_transport
c = WoodpeckerClient("t", _transport=cap.transport({}))
c.get_repo(42)
req = cap.requests[0]
assert req.method == "GET"
assert req.url.path == "/api/repos/42"
def test_list_pipelines(self, capture_transport):
cap = capture_transport
c = WoodpeckerClient("t", _transport=cap.transport([]))
c.list_pipelines(10)
req = cap.requests[0]
assert req.method == "GET"
assert req.url.path == "/api/repos/10/pipelines"
def test_get_logs(self, capture_transport):
cap = capture_transport
c = WoodpeckerClient("t", _transport=cap.transport([]))
c.get_logs(10, 5, 1)
req = cap.requests[0]
assert req.method == "GET"
assert req.url.path == "/api/repos/10/logs/5/1"
def test_list_secrets(self, capture_transport):
cap = capture_transport
c = WoodpeckerClient("t", _transport=cap.transport([]))
c.list_secrets(10)
req = cap.requests[0]
assert req.method == "GET"
assert req.url.path == "/api/repos/10/secrets"
def test_update_secret(self, capture_transport):
cap = capture_transport
c = WoodpeckerClient("t", _transport=cap.transport({}))
c.update_secret(10, "my_secret", {"value": "new"})
req = cap.requests[0]
assert req.method == "PATCH"
assert req.url.path == "/api/repos/10/secrets/my_secret"
def test_delete_secret(self, capture_transport):
cap = capture_transport
c = WoodpeckerClient("t", _transport=cap.transport(None, status=204))
c.delete_secret(10, "old_secret")
req = cap.requests[0]
assert req.method == "DELETE"
assert req.url.path == "/api/repos/10/secrets/old_secret"
def test_list_global_secrets(self, capture_transport):
cap = capture_transport
c = WoodpeckerClient("t", _transport=cap.transport([]))
c.list_global_secrets()
req = cap.requests[0]
assert req.method == "GET"
assert req.url.path == "/api/secrets"
def test_create_global_secret(self, capture_transport):
cap = capture_transport
c = WoodpeckerClient("t", _transport=cap.transport({}))
c.create_global_secret({"name": "s", "value": "v"})
req = cap.requests[0]
assert req.method == "POST"
assert req.url.path == "/api/secrets"
def test_update_global_secret(self, capture_transport):
cap = capture_transport
c = WoodpeckerClient("t", _transport=cap.transport({}))
c.update_global_secret("root_key", {"value": "new"})
req = cap.requests[0]
assert req.method == "PATCH"
assert req.url.path == "/api/secrets/root_key"