feat(saju-lab): config + Pydantic 모델 + db.py CRUD (saju + compat) — 10 tests
This commit is contained in:
142
saju-lab/tests/test_db.py
Normal file
142
saju-lab/tests/test_db.py
Normal file
@@ -0,0 +1,142 @@
|
||||
import pytest
|
||||
from app import db as db_module
|
||||
|
||||
|
||||
@pytest.fixture(autouse=True)
|
||||
def fresh_db(monkeypatch, tmp_path):
|
||||
db_file = tmp_path / "test_saju.db"
|
||||
monkeypatch.setattr(db_module, "DB_PATH", str(db_file))
|
||||
db_module.init_db()
|
||||
yield
|
||||
try:
|
||||
if db_file.exists():
|
||||
db_file.unlink()
|
||||
except PermissionError:
|
||||
pass
|
||||
|
||||
|
||||
# --- saju_records 5 tests ---
|
||||
|
||||
def test_saju_save_and_get():
|
||||
rid = db_module.save_saju_record({
|
||||
"birth_year": 1990, "birth_month": 5, "birth_day": 15, "birth_hour": 14,
|
||||
"gender": "male", "calendar_type": "solar",
|
||||
"saju_data": {"day_stem": "辛"},
|
||||
"analysis_data": {"element_balance": {"金": 3.0}},
|
||||
"daeun_data": [{"age": 10}],
|
||||
"interpretation_json": {"items": []},
|
||||
"model": "claude-sonnet-4-6",
|
||||
"tokens_in": 100, "tokens_out": 200, "cost_usd": 0.005,
|
||||
})
|
||||
assert rid > 0
|
||||
row = db_module.get_saju_record(rid)
|
||||
assert row["birth_year"] == 1990
|
||||
assert row["saju_data"]["day_stem"] == "辛"
|
||||
|
||||
|
||||
def test_saju_list_with_favorite():
|
||||
for f in [0, 1, 0]:
|
||||
db_module.save_saju_record({
|
||||
"birth_year": 1990, "birth_month": 5, "birth_day": 15, "birth_hour": None,
|
||||
"gender": "male",
|
||||
"saju_data": {}, "analysis_data": {}, "daeun_data": [],
|
||||
"model": "x", "tokens_in": 0, "tokens_out": 0, "cost_usd": 0.0,
|
||||
})
|
||||
# set favorites
|
||||
rows = db_module.list_saju_records()["items"]
|
||||
db_module.update_saju_record(rows[0]["id"], favorite=True)
|
||||
res = db_module.list_saju_records(favorite=True)
|
||||
assert res["total"] == 1
|
||||
|
||||
|
||||
def test_saju_update_favorite_and_memo():
|
||||
rid = db_module.save_saju_record({
|
||||
"birth_year": 1990, "birth_month": 5, "birth_day": 15, "birth_hour": None,
|
||||
"gender": "male",
|
||||
"saju_data": {}, "analysis_data": {}, "daeun_data": [],
|
||||
"model": "x",
|
||||
})
|
||||
db_module.update_saju_record(rid, favorite=True, memo="좋은 사주")
|
||||
row = db_module.get_saju_record(rid)
|
||||
assert row["favorite"] == 1
|
||||
assert row["memo"] == "좋은 사주"
|
||||
|
||||
|
||||
def test_saju_delete():
|
||||
rid = db_module.save_saju_record({
|
||||
"birth_year": 1990, "birth_month": 5, "birth_day": 15, "birth_hour": None,
|
||||
"gender": "male",
|
||||
"saju_data": {}, "analysis_data": {}, "daeun_data": [],
|
||||
"model": "x",
|
||||
})
|
||||
db_module.delete_saju_record(rid)
|
||||
assert db_module.get_saju_record(rid) is None
|
||||
|
||||
|
||||
def test_saju_get_nonexistent():
|
||||
assert db_module.get_saju_record(9999) is None
|
||||
|
||||
|
||||
# --- compat_records 5 tests ---
|
||||
|
||||
def test_compat_save_and_get():
|
||||
rid = db_module.save_compat_record({
|
||||
"person_a": {"year": 1990},
|
||||
"person_b": {"year": 1992},
|
||||
"saju_a": {"day_stem": "辛"},
|
||||
"saju_b": {"day_stem": "丁"},
|
||||
"score": 85,
|
||||
"breakdown": {"day_master_element": {"score": 25}},
|
||||
"interpretation_json": {"summary": "좋음"},
|
||||
"model": "claude-sonnet-4-6",
|
||||
"tokens_in": 200, "tokens_out": 300, "cost_usd": 0.01,
|
||||
})
|
||||
assert rid > 0
|
||||
row = db_module.get_compat_record(rid)
|
||||
assert row["score"] == 85
|
||||
assert row["breakdown"]["day_master_element"]["score"] == 25
|
||||
|
||||
|
||||
def test_compat_list_with_favorite():
|
||||
for _ in range(3):
|
||||
db_module.save_compat_record({
|
||||
"person_a": {}, "person_b": {},
|
||||
"saju_a": {}, "saju_b": {},
|
||||
"score": 50,
|
||||
"breakdown": {},
|
||||
"model": "x", "tokens_in": 0, "tokens_out": 0, "cost_usd": 0.0,
|
||||
})
|
||||
rows = db_module.list_compat_records()["items"]
|
||||
db_module.update_compat_record(rows[0]["id"], favorite=True)
|
||||
res = db_module.list_compat_records(favorite=True)
|
||||
assert res["total"] == 1
|
||||
|
||||
|
||||
def test_compat_update_favorite_and_memo():
|
||||
rid = db_module.save_compat_record({
|
||||
"person_a": {}, "person_b": {},
|
||||
"saju_a": {}, "saju_b": {},
|
||||
"score": 70,
|
||||
"breakdown": {},
|
||||
"model": "x",
|
||||
})
|
||||
db_module.update_compat_record(rid, favorite=True, memo="궁합 좋음")
|
||||
row = db_module.get_compat_record(rid)
|
||||
assert row["favorite"] == 1
|
||||
assert row["memo"] == "궁합 좋음"
|
||||
|
||||
|
||||
def test_compat_delete():
|
||||
rid = db_module.save_compat_record({
|
||||
"person_a": {}, "person_b": {},
|
||||
"saju_a": {}, "saju_b": {},
|
||||
"score": 50,
|
||||
"breakdown": {},
|
||||
"model": "x",
|
||||
})
|
||||
db_module.delete_compat_record(rid)
|
||||
assert db_module.get_compat_record(rid) is None
|
||||
|
||||
|
||||
def test_compat_get_nonexistent():
|
||||
assert db_module.get_compat_record(9999) is None
|
||||
Reference in New Issue
Block a user