test(jira): add JiraLink model and jira_service tests [FASE-1.1]
Model and migration b020 were already present; adds regression coverage for persistence, schema validation, and link CRUD with Jira disabled.
This commit is contained in:
93
backend/tests/test_jira_link.py
Normal file
93
backend/tests/test_jira_link.py
Normal file
@@ -0,0 +1,93 @@
|
||||
"""Tests for Jira link model and jira_service link helpers (FASE-1.1).
|
||||
|
||||
Verifies persistence with SQLite test DB and link creation when Jira is disabled.
|
||||
API routes are covered indirectly via jira_service (same code path as the router).
|
||||
"""
|
||||
|
||||
import uuid
|
||||
|
||||
import pytest
|
||||
from pydantic import ValidationError
|
||||
|
||||
from app.models.jira_link import JiraLink, JiraLinkEntityType, JiraSyncDirection
|
||||
from app.schemas.jira_schema import JiraLinkCreate
|
||||
from app.services import jira_service
|
||||
|
||||
|
||||
def test_jira_link_persist_and_query(db, admin_user):
|
||||
entity_id = uuid.uuid4()
|
||||
link = JiraLink(
|
||||
entity_type=JiraLinkEntityType.test,
|
||||
entity_id=entity_id,
|
||||
jira_issue_key="PROJ-42",
|
||||
jira_issue_id="10001",
|
||||
sync_direction=JiraSyncDirection.bidirectional,
|
||||
created_by=admin_user.id,
|
||||
sync_metadata={"foo": "bar"},
|
||||
)
|
||||
db.add(link)
|
||||
db.commit()
|
||||
db.refresh(link)
|
||||
|
||||
loaded = db.query(JiraLink).filter(JiraLink.id == link.id).one()
|
||||
assert loaded.entity_type == JiraLinkEntityType.test
|
||||
assert loaded.entity_id == entity_id
|
||||
assert loaded.jira_issue_key == "PROJ-42"
|
||||
assert loaded.sync_metadata == {"foo": "bar"}
|
||||
assert loaded.created_by == admin_user.id
|
||||
|
||||
|
||||
def test_jira_link_create_schema_accepts_valid_issue_key():
|
||||
body = JiraLinkCreate(
|
||||
entity_type=JiraLinkEntityType.campaign,
|
||||
entity_id=uuid.uuid4(),
|
||||
jira_issue_key="ABC-1",
|
||||
)
|
||||
assert body.jira_issue_key == "ABC-1"
|
||||
assert body.sync_direction == JiraSyncDirection.bidirectional
|
||||
|
||||
|
||||
def test_jira_link_create_schema_rejects_invalid_issue_key():
|
||||
with pytest.raises(ValidationError):
|
||||
JiraLinkCreate(
|
||||
entity_type=JiraLinkEntityType.test,
|
||||
entity_id=uuid.uuid4(),
|
||||
jira_issue_key="proj-123",
|
||||
)
|
||||
|
||||
|
||||
def test_create_link_via_service_persists(db, admin_user):
|
||||
eid = uuid.uuid4()
|
||||
link = jira_service.create_link(
|
||||
db,
|
||||
entity_type=JiraLinkEntityType.test,
|
||||
entity_id=eid,
|
||||
jira_issue_key="TST-99",
|
||||
sync_direction=JiraSyncDirection.bidirectional,
|
||||
created_by=admin_user.id,
|
||||
)
|
||||
db.commit()
|
||||
db.refresh(link)
|
||||
assert link.jira_issue_key == "TST-99"
|
||||
assert link.entity_id == eid
|
||||
|
||||
|
||||
def test_list_links_filters_by_entity(db, admin_user):
|
||||
eid = uuid.uuid4()
|
||||
jira_service.create_link(
|
||||
db,
|
||||
entity_type=JiraLinkEntityType.technique,
|
||||
entity_id=eid,
|
||||
jira_issue_key="TECH-7",
|
||||
sync_direction=JiraSyncDirection.jira_to_aegis,
|
||||
created_by=admin_user.id,
|
||||
)
|
||||
db.commit()
|
||||
rows = jira_service.list_links(
|
||||
db,
|
||||
entity_type=JiraLinkEntityType.technique,
|
||||
entity_id=eid,
|
||||
)
|
||||
assert len(rows) == 1
|
||||
assert rows[0].jira_issue_key == "TECH-7"
|
||||
assert rows[0].sync_direction == JiraSyncDirection.jira_to_aegis
|
||||
Reference in New Issue
Block a user