VisionApp/tests/test_storage.py
Mathis e771073909
All checks were successful
ci / ci (push) Successful in 1m3s
test: 81 unit tests for tickets (data, storage, transcript, ui)
- tests/test_data.py: models serialization, enums, roundtrip
- tests/test_storage.py: CRUD JSON, cache, persistence
- tests/test_transcript.py: HTML generation, escaping, attachments
- tests/test_ui.py: button callbacks with mocked interactions
- Fixed: transcript.py attachments access (dataclass not dict)
2026-10-02 19:34:11 +02:00

130 lines
4.2 KiB
Python

from __future__ import annotations
import json
import pytest
from tickets import storage
from tickets.data import GuildTicketConfig, TicketCategory, TicketData
@pytest.fixture(autouse=True)
def clean_storage(tmp_path):
"""Isolate storage in a temp dir and reset caches."""
storage.TICKETS_DIR = tmp_path / "tickets"
storage._CONFIG_FILE = storage.TICKETS_DIR / "config.json"
storage._config_cache.clear()
storage._tickets_cache.clear()
yield
storage._config_cache.clear()
storage._tickets_cache.clear()
class TestGetConfig:
def test_returns_default_when_missing(self):
config = storage.get_config(guild_id=123)
assert config.guild_id == 123
assert config.enabled is False
assert config.categories == []
def test_returns_same_object(self):
c1 = storage.get_config(guild_id=1)
c2 = storage.get_config(guild_id=1)
assert c1 is c2
def test_different_guilds_different_configs(self):
c1 = storage.get_config(guild_id=1)
c2 = storage.get_config(guild_id=2)
assert c1.guild_id != c2.guild_id
class TestSaveConfig:
def test_save_creates_file(self, tmp_path):
config = storage.get_config(guild_id=1)
config.enabled = True
storage.save_config(config)
assert storage._CONFIG_FILE.exists()
def test_save_persists(self, tmp_path):
config = storage.get_config(guild_id=1)
config.enabled = True
config.categories.append(TicketCategory(id="a", name="A"))
storage.save_config(config)
storage._config_cache.clear()
loaded = storage.get_config(guild_id=1)
assert loaded.enabled is True
assert len(loaded.categories) == 1
assert loaded.categories[0].id == "a"
def test_save_multiple_guilds(self):
c1 = storage.get_config(guild_id=1)
c1.enabled = True
storage.save_config(c1)
c2 = storage.get_config(guild_id=2)
c2.enabled = False
storage.save_config(c2)
storage._config_cache.clear()
assert storage.get_config(guild_id=1).enabled is True
assert storage.get_config(guild_id=2).enabled is False
class TestSaveAndGetTicket:
def test_get_missing_returns_none(self):
assert storage.get_ticket(999) is None
def test_save_and_get(self):
ticket = TicketData(channel_id=100, guild_id=1, user_id=2, category_id="cat")
storage.save_ticket(ticket)
loaded = storage.get_ticket(100)
assert loaded is not None
assert loaded.channel_id == 100
assert loaded.category_id == "cat"
def test_save_persists_to_disk(self):
ticket = TicketData(channel_id=200, guild_id=1, user_id=2, category_id="c")
storage.save_ticket(ticket)
storage._tickets_cache.clear()
loaded = storage.get_ticket(200)
assert loaded is not None
assert loaded.user_id == 2
def test_save_overwrites(self):
t1 = TicketData(channel_id=300, guild_id=1, user_id=2, category_id="old")
storage.save_ticket(t1)
t2 = TicketData(channel_id=300, guild_id=1, user_id=2, category_id="new")
storage.save_ticket(t2)
loaded = storage.get_ticket(300)
assert loaded.category_id == "new"
def test_multiple_tickets(self):
t1 = TicketData(channel_id=400, guild_id=1, user_id=2, category_id="a")
t2 = TicketData(channel_id=401, guild_id=1, user_id=3, category_id="b")
storage.save_ticket(t1)
storage.save_ticket(t2)
assert storage.get_ticket(400).category_id == "a"
assert storage.get_ticket(401).category_id == "b"
class TestDeleteTicket:
def test_delete_removes_file(self):
ticket = TicketData(channel_id=500, guild_id=1, user_id=2, category_id="c")
storage.save_ticket(ticket)
assert storage.get_ticket(500) is not None
storage.delete_ticket(500)
assert storage.get_ticket(500) is None
def test_delete_nonexistent(self):
storage.delete_ticket(9999)
def test_delete_clears_cache(self):
ticket = TicketData(channel_id=600, guild_id=1, user_id=2, category_id="c")
storage.save_ticket(ticket)
storage.delete_ticket(600)
assert 600 not in storage._tickets_cache