test: 81 unit tests for tickets (data, storage, transcript, ui)
All checks were successful
ci / ci (push) Successful in 1m3s
All checks were successful
ci / ci (push) Successful in 1m3s
- 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)
This commit is contained in:
parent
628e02aea9
commit
e771073909
5 changed files with 812 additions and 1 deletions
130
tests/test_storage.py
Normal file
130
tests/test_storage.py
Normal file
|
|
@ -0,0 +1,130 @@
|
|||
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
|
||||
Loading…
Add table
Add a link
Reference in a new issue