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