65 lines
2.9 KiB
Python
65 lines
2.9 KiB
Python
from pathlib import Path
|
|
import unittest
|
|
|
|
|
|
WORKFLOW = Path(__file__).resolve().parents[1] / ".gitea/workflows/deploy.yml"
|
|
DOCKERFILE = Path(__file__).resolve().parents[1] / "Dockerfile"
|
|
API_CLIENT = Path(__file__).resolve().parents[1] / "web/src/lib/api/client.ts"
|
|
|
|
|
|
class DeployWorkflowContractTest(unittest.TestCase):
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
cls.workflow = WORKFLOW.read_text(encoding="utf-8")
|
|
cls.dockerfile = DOCKERFILE.read_text(encoding="utf-8")
|
|
cls.api_client = API_CLIENT.read_text(encoding="utf-8")
|
|
|
|
def test_targets_pro_branch_and_single_runner(self):
|
|
self.assertIn("push:", self.workflow)
|
|
self.assertIn("- pro", self.workflow)
|
|
self.assertIn("workflow_dispatch:", self.workflow)
|
|
self.assertIn("runs-on: deploy-host", self.workflow)
|
|
self.assertIn("concurrency:", self.workflow)
|
|
|
|
def test_builds_and_pushes_pro_image(self):
|
|
self.assertIn("git.olns.shop/pro/im_webapp", self.workflow)
|
|
self.assertIn("docker push", self.workflow)
|
|
self.assertIn(":pro", self.workflow)
|
|
|
|
def test_deploys_compose_service_with_pinned_host_key(self):
|
|
self.assertIn("DEPLOY_SSH_KEY", self.workflow)
|
|
self.assertIn("DEPLOY_KNOWN_HOSTS", self.workflow)
|
|
self.assertIn("StrictHostKeyChecking=yes", self.workflow)
|
|
self.assertIn("docker compose pull im-webapp", self.workflow)
|
|
self.assertIn("docker compose up -d --no-deps --wait im-webapp", self.workflow)
|
|
|
|
def test_removes_old_kubernetes_and_registry_targets(self):
|
|
self.assertNotIn("kubectl", self.workflow)
|
|
self.assertNotIn("KUBECONFIG", self.workflow)
|
|
self.assertNotIn("git.118im.com", self.workflow)
|
|
|
|
def test_uses_same_origin_im_endpoints(self):
|
|
self.assertNotIn("TINODE_API_BASE=", self.workflow)
|
|
self.assertNotIn("TINODE_FILE_BASE=", self.workflow)
|
|
self.assertNotIn("im-api.yuexuan.shop", self.workflow)
|
|
self.assertIn("ARG TINODE_FILE_BASE=", self.dockerfile)
|
|
self.assertNotIn("api.118im.com", self.dockerfile)
|
|
|
|
def test_build_exposes_configured_api_base_to_vite(self):
|
|
self.assertIn("ARG TINODE_API_BASE=", self.dockerfile)
|
|
self.assertIn("ENV VITE_TINODE_API_BASE=$TINODE_API_BASE", self.dockerfile)
|
|
|
|
def test_strips_accidentally_quoted_api_key_before_build(self):
|
|
self.assertIn('TINODE_API_KEY="${TINODE_API_KEY#\\\'}"', self.workflow)
|
|
self.assertIn('TINODE_API_KEY="${TINODE_API_KEY%\\\'}"', self.workflow)
|
|
|
|
def test_api_client_keeps_same_origin_defaults(self):
|
|
self.assertIn("import.meta.env.VITE_TINODE_API_BASE?.trim()", self.api_client)
|
|
self.assertIn("CONFIGURED_API_BASE || endpoints?.api || DEFAULT_API_BASE", self.api_client)
|
|
self.assertIn("const DEFAULT_API_BASE = '/v1/im'", self.api_client)
|
|
self.assertIn("const DEFAULT_FILE_BASE = '/v0/file'", self.api_client)
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|
|
|