kin: KIN-048 Post-pipeline hook: автокоммит после успешного завершения задачи. git add -A && git commit -m 'kin: TASK_ID TITLE'. Срабатывает автоматически как rebuild-frontend.
This commit is contained in:
parent
8a6f280cbd
commit
ae21e48b65
13 changed files with 1554 additions and 65 deletions
|
|
@ -1,6 +1,8 @@
|
|||
"""Tests for core/hooks.py — post-pipeline hook execution."""
|
||||
|
||||
import os
|
||||
import subprocess
|
||||
import tempfile
|
||||
import pytest
|
||||
from unittest.mock import patch, MagicMock
|
||||
|
||||
|
|
@ -539,10 +541,6 @@ class TestKIN052RebuildFrontendCommand:
|
|||
|
||||
Симулирует рестарт: создаём хук, закрываем соединение, открываем новое — хук на месте.
|
||||
"""
|
||||
import tempfile
|
||||
import os
|
||||
from core.db import init_db
|
||||
|
||||
with tempfile.NamedTemporaryFile(suffix=".db", delete=False) as f:
|
||||
db_path = f.name
|
||||
try:
|
||||
|
|
@ -568,3 +566,109 @@ class TestKIN052RebuildFrontendCommand:
|
|||
assert hooks[0]["trigger_module_path"] is None
|
||||
finally:
|
||||
os.unlink(db_path)
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# KIN-053: _seed_default_hooks — автоматический хук при инициализации БД
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
class TestKIN053SeedDefaultHooks:
|
||||
"""Тесты для _seed_default_hooks (KIN-053).
|
||||
|
||||
При init_db автоматически создаётся rebuild-frontend хук для проекта 'kin',
|
||||
если этот проект уже существует в БД. Функция идемпотентна.
|
||||
"""
|
||||
|
||||
def test_seed_skipped_when_no_kin_project(self):
|
||||
"""_seed_default_hooks не создаёт хук, если проекта 'kin' нет."""
|
||||
with tempfile.NamedTemporaryFile(suffix=".db", delete=False) as f:
|
||||
db_path = f.name
|
||||
try:
|
||||
conn = init_db(db_path)
|
||||
hooks = get_hooks(conn, "kin", enabled_only=False)
|
||||
conn.close()
|
||||
assert hooks == []
|
||||
finally:
|
||||
os.unlink(db_path)
|
||||
|
||||
def test_seed_creates_hook_when_kin_project_exists(self):
|
||||
"""_seed_default_hooks создаёт rebuild-frontend хук при наличии проекта 'kin'.
|
||||
|
||||
Порядок: init_db → create_project('kin') → повторный init_db → хук есть.
|
||||
"""
|
||||
with tempfile.NamedTemporaryFile(suffix=".db", delete=False) as f:
|
||||
db_path = f.name
|
||||
try:
|
||||
conn1 = init_db(db_path)
|
||||
models.create_project(conn1, "kin", "Kin", "/projects/kin")
|
||||
conn1.close()
|
||||
|
||||
conn2 = init_db(db_path)
|
||||
hooks = get_hooks(conn2, "kin", event="pipeline_completed", enabled_only=True)
|
||||
conn2.close()
|
||||
|
||||
assert len(hooks) == 1
|
||||
assert hooks[0]["name"] == "rebuild-frontend"
|
||||
assert "npm run build" in hooks[0]["command"]
|
||||
assert "web/frontend" in hooks[0]["command"]
|
||||
finally:
|
||||
os.unlink(db_path)
|
||||
|
||||
def test_seed_hook_has_correct_command(self):
|
||||
"""Команда хука — точная строка с cd && npm run build."""
|
||||
with tempfile.NamedTemporaryFile(suffix=".db", delete=False) as f:
|
||||
db_path = f.name
|
||||
try:
|
||||
conn1 = init_db(db_path)
|
||||
models.create_project(conn1, "kin", "Kin", "/projects/kin")
|
||||
conn1.close()
|
||||
|
||||
conn2 = init_db(db_path)
|
||||
hooks = get_hooks(conn2, "kin", event="pipeline_completed", enabled_only=False)
|
||||
conn2.close()
|
||||
|
||||
assert hooks[0]["command"] == (
|
||||
"cd /Users/grosfrumos/projects/kin/web/frontend && npm run build"
|
||||
)
|
||||
assert hooks[0]["trigger_module_path"] is None
|
||||
finally:
|
||||
os.unlink(db_path)
|
||||
|
||||
def test_seed_idempotent_no_duplicate(self):
|
||||
"""Повторные вызовы init_db не дублируют хук."""
|
||||
with tempfile.NamedTemporaryFile(suffix=".db", delete=False) as f:
|
||||
db_path = f.name
|
||||
try:
|
||||
conn = init_db(db_path)
|
||||
models.create_project(conn, "kin", "Kin", "/projects/kin")
|
||||
conn.close()
|
||||
|
||||
for _ in range(3):
|
||||
c = init_db(db_path)
|
||||
c.close()
|
||||
|
||||
conn_final = init_db(db_path)
|
||||
hooks = get_hooks(conn_final, "kin", event="pipeline_completed", enabled_only=False)
|
||||
conn_final.close()
|
||||
|
||||
assert len(hooks) == 1, f"Ожидается 1 хук, получено {len(hooks)}"
|
||||
finally:
|
||||
os.unlink(db_path)
|
||||
|
||||
def test_seed_hook_does_not_affect_other_projects(self):
|
||||
"""Seed не создаёт хуки для других проектов."""
|
||||
with tempfile.NamedTemporaryFile(suffix=".db", delete=False) as f:
|
||||
db_path = f.name
|
||||
try:
|
||||
conn1 = init_db(db_path)
|
||||
models.create_project(conn1, "kin", "Kin", "/projects/kin")
|
||||
models.create_project(conn1, "other", "Other", "/projects/other")
|
||||
conn1.close()
|
||||
|
||||
conn2 = init_db(db_path)
|
||||
other_hooks = get_hooks(conn2, "other", enabled_only=False)
|
||||
conn2.close()
|
||||
|
||||
assert other_hooks == []
|
||||
finally:
|
||||
os.unlink(db_path)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue