summaryrefslogtreecommitdiff
path: root/tests/test_configuration_profiles.py
blob: 898a9e7e2eaffd10d0e1e2957daf5abb160517f1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
import sys
import tempfile
import types
import unittest
from pathlib import Path
from unittest.mock import Mock, patch


sys.modules.setdefault(
    "decky",
    types.SimpleNamespace(DECKY_USER_HOME="/home/deck", logger=Mock()),
)
sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "py_modules"))

from lsfg_vk.config_schema import ConfigurationManager
from lsfg_vk.configuration import ConfigurationService


class ConfigurationProfileTests(unittest.TestCase):
    def setUp(self):
        self.tempdir = tempfile.TemporaryDirectory()
        self.home = Path(self.tempdir.name) / "home" / "deck"
        self.home.mkdir(parents=True)
        self.runtime = Mock()
        self.service = ConfigurationService(runtime_service=self.runtime)
        self.service.user_home = self.home
        self.service.config_dir = self.home / ".config/lsfg-vk"
        self.service.config_file_path = self.service.config_dir / "conf.toml"

    def tearDown(self):
        self.tempdir.cleanup()

    def test_selector_only_profile_survives_round_trip(self):
        content = """version = 2

[global]
allow_fp16 = true

[[profile]]
name = "flatpak:org.example.Game"
pacing_mode = "vsync"
multiplier = 3
flow_scale = 0.8
performance_mode = false
override_present_mode = true
preserve_swapchain_image_count = false
"""
        parsed = ConfigurationManager.parse_toml_content_multi_profile(content)
        self.assertIn("flatpak:org.example.Game", parsed["profiles"])
        self.assertEqual(parsed["profiles"]["flatpak:org.example.Game"]["active_in"], [])
        rendered = ConfigurationManager.generate_toml_content_multi_profile(parsed)
        reparsed = ConfigurationManager.parse_toml_content_multi_profile(rendered)
        self.assertEqual(reparsed["profiles"]["flatpak:org.example.Game"]["multiplier"], 3)

    def test_game_reset_all_preserves_flatpak_profiles(self):
        self.service.update_game_config("123", "Steam Game", {"multiplier": 2})
        self.service.update_flatpak_config("org.example.Game", {"multiplier": 3})

        result = self.service.reset_all_game_configs()
        data = self.service._get_profile_data()

        self.assertTrue(result["success"])
        self.assertNotIn("Steam Game", data["profiles"])
        self.assertIn("flatpak:org.example.Game", data["profiles"])
        self.assertEqual(data["profiles"]["flatpak:org.example.Game"]["multiplier"], 3)

    def test_scoped_game_reset_is_one_write_and_preserves_other_profiles(self):
        self.service.update_game_config("123", "Steam Game", {"multiplier": 2})
        self.service.update_game_config("456", "Non-Steam Game", {"multiplier": 3})
        self.service.update_flatpak_config("org.example.Game", {"multiplier": 4})

        with patch.object(self.service, "_save_profile_data", wraps=self.service._save_profile_data) as save:
            result = self.service.reset_game_configs(["123"])

        data = self.service._get_profile_data()
        self.assertTrue(result["success"])
        self.assertEqual(save.call_count, 1)
        self.assertNotIn("Steam Game", data["profiles"])
        self.assertIn("Non-Steam Game", data["profiles"])
        self.assertIn("flatpak:org.example.Game", data["profiles"])

    def test_flatpak_reset_all_preserves_steam_profiles(self):
        self.service.update_game_config("123", "Steam Game", {"multiplier": 2})
        self.service.update_flatpak_config("org.example.Game", {"multiplier": 3})

        result = self.service.reset_all_flatpak_configs()
        data = self.service._get_profile_data()

        self.assertTrue(result["success"])
        self.assertIn("Steam Game", data["profiles"])
        self.assertNotIn("flatpak:org.example.Game", data["profiles"])

    def test_global_config_update_does_not_change_profile_values(self):
        self.service.update_game_config("123", "Steam Game", {"multiplier": 2})

        result = self.service.update_global_config({"no_fp16": True})
        data = self.service._get_profile_data()

        self.assertTrue(result["success"])
        self.assertTrue(result["global_config"]["no_fp16"])
        self.assertTrue(data["global_config"]["no_fp16"])
        self.assertEqual(data["profiles"]["Steam Game"]["multiplier"], 2)

    def test_profile_update_cannot_overwrite_global_fp16_setting(self):
        self.service.update_global_config({"no_fp16": True})

        self.service.update_game_config("123", "Steam Game", {"multiplier": 3, "no_fp16": False})

        data = self.service._get_profile_data()
        self.assertTrue(data["global_config"]["no_fp16"])


if __name__ == "__main__":
    unittest.main()