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.
119 lines
4.3 KiB
Python
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"
|