kin: auto-commit after pipeline

This commit is contained in:
Gros Frumos 2026-03-18 17:43:54 +02:00
parent 1487e84eb6
commit 8623323161
2 changed files with 391 additions and 0 deletions

View file

@ -0,0 +1,108 @@
"""Regression tests for KIN-126 — фильтр по дате выполнения задач.
Проверяет backend-поведение:
1. Колонка completed_at добавляется в таблицу tasks при инициализации БД
2. Новая задача имеет completed_at=None по умолчанию
3. update_task(status='done') устанавливает completed_at как ISO-строку
4. update_task(status='done') completed_at является валидной ISO-строкой
5. update_task(status='in_progress') не устанавливает completed_at
6. update_task(status='cancelled') не устанавливает completed_at
7. Обновление полей без смены статуса на done не трогает completed_at
8. update_task(status='blocked') не устанавливает completed_at
"""
import pytest
from datetime import datetime
from core.db import init_db
from core import models
@pytest.fixture
def conn():
"""Fresh in-memory DB for each test."""
c = init_db(db_path=":memory:")
yield c
c.close()
# ---------------------------------------------------------------------------
# Schema
# ---------------------------------------------------------------------------
def test_schema_tasks_has_completed_at_column(conn):
"""KIN-126: таблица tasks содержит колонку completed_at после инициализации БД."""
cols = {r[1] for r in conn.execute("PRAGMA table_info(tasks)").fetchall()}
assert "completed_at" in cols, "KIN-126: колонка completed_at должна быть в таблице tasks"
# ---------------------------------------------------------------------------
# Default value
# ---------------------------------------------------------------------------
def test_new_task_completed_at_is_null(conn):
"""KIN-126: новая задача имеет completed_at=None по умолчанию."""
models.create_project(conn, "p1", "P1", "/p1")
t = models.create_task(conn, "P1-001", "p1", "Task")
assert t["completed_at"] is None
# ---------------------------------------------------------------------------
# Setting completed_at on status='done'
# ---------------------------------------------------------------------------
def test_update_task_to_done_sets_completed_at(conn):
"""KIN-126: update_task(status='done') устанавливает completed_at."""
models.create_project(conn, "p1", "P1", "/p1")
models.create_task(conn, "P1-001", "p1", "Task")
updated = models.update_task(conn, "P1-001", status="done")
assert updated["completed_at"] is not None
def test_update_task_to_done_completed_at_is_valid_iso(conn):
"""KIN-126: completed_at при status='done' — валидная ISO-строка datetime."""
models.create_project(conn, "p1", "P1", "/p1")
models.create_task(conn, "P1-001", "p1", "Task")
updated = models.update_task(conn, "P1-001", status="done")
# Must parse without exception
parsed = datetime.fromisoformat(updated["completed_at"])
assert parsed is not None
# ---------------------------------------------------------------------------
# Non-done statuses do NOT set completed_at
# ---------------------------------------------------------------------------
def test_update_task_to_in_progress_does_not_set_completed_at(conn):
"""KIN-126: update_task(status='in_progress') не устанавливает completed_at."""
models.create_project(conn, "p1", "P1", "/p1")
models.create_task(conn, "P1-001", "p1", "Task")
updated = models.update_task(conn, "P1-001", status="in_progress")
assert updated["completed_at"] is None
def test_update_task_to_cancelled_does_not_set_completed_at(conn):
"""KIN-126: update_task(status='cancelled') не устанавливает completed_at."""
models.create_project(conn, "p1", "P1", "/p1")
models.create_task(conn, "P1-001", "p1", "Task")
updated = models.update_task(conn, "P1-001", status="cancelled")
assert updated["completed_at"] is None
def test_update_task_to_blocked_does_not_set_completed_at(conn):
"""KIN-126: update_task(status='blocked') не устанавливает completed_at."""
models.create_project(conn, "p1", "P1", "/p1")
models.create_task(conn, "P1-001", "p1", "Task")
updated = models.update_task(conn, "P1-001", status="blocked")
assert updated["completed_at"] is None
# ---------------------------------------------------------------------------
# Non-status updates do NOT touch completed_at
# ---------------------------------------------------------------------------
def test_update_task_priority_only_does_not_set_completed_at(conn):
"""KIN-126: update_task с изменением только priority не трогает completed_at."""
models.create_project(conn, "p1", "P1", "/p1")
models.create_task(conn, "P1-001", "p1", "Task")
updated = models.update_task(conn, "P1-001", priority=1)
assert updated["completed_at"] is None