summaryrefslogtreecommitdiff
path: root/tests/test_steam_service.py
blob: 4f61f3cbae2ad3443d2f97db932aae9902663fc6 (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 tempfile
import sys
import types
import unittest
from pathlib import Path
from unittest.mock import Mock


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.steam_service import SteamService, classify_shortcut_transport


class SteamTransportTests(unittest.TestCase):
    def test_only_a_direct_usr_bin_flatpak_target_is_special(self):
        self.assertEqual(
            classify_shortcut_transport("/usr/bin/flatpak", "run com.example.Game --fullscreen"),
            {"kind": "flatpak"},
        )
        self.assertEqual(
            classify_shortcut_transport("flatpak", "run com.example.Game --fullscreen", "/usr/bin/"),
            {"kind": "flatpak"},
        )
        for executable, options in (
            ("flatpak", "run com.example.Game"),
            ("/usr/bin/flatpak run com.example.Game", "--fullscreen"),
            ("~/.lsfg", "run com.example.Game"),
            ("/usr/bin/bash", "~/launch-game.sh --fullscreen"),
        ):
            with self.subTest(executable=executable, options=options):
                self.assertEqual(classify_shortcut_transport(executable, options), {"kind": "host"})

        self.assertEqual(
            classify_shortcut_transport("/usr/bin/flatpak", "--user run com.example.Game"),
            {"kind": "flatpak"},
        )
        self.assertEqual(
            classify_shortcut_transport('"~/.lsfg" "/usr/bin/flatpak"', "run com.example.Game"),
            {"kind": "flatpak"},
        )
        self.assertEqual(classify_shortcut_transport("~/.lsfg", "run com.example.Game"), {"kind": "host"})

    def test_split_flatpak_target_is_recognized_without_script_or_app_detection(self):
        game = SteamService._shortcut_game(
            {
                "appid": 123456,
                "AppName": "Split Flatpak shortcut",
                "Exe": "flatpak",
                "StartDir": "/usr/bin/",
                "LaunchOptions": "run io.example.Game",
            }
        )

        self.assertEqual(game["transport"], {"kind": "flatpak"})
        self.assertEqual(game["executable"], "flatpak")
        self.assertEqual(game["startDir"], "/usr/bin/")

    def test_direct_flatpak_shortcut_keeps_arguments_without_an_app_id(self):
        game = SteamService._shortcut_game(
            {
                "appid": 123456,
                "AppName": "Flatpak shortcut",
                "Exe": "/usr/bin/flatpak",
                "LaunchOptions": "run net.pcsx2.PCSX2 --fullscreen",
                "StartDir": "/home/deck/Games",
            }
        )

        self.assertEqual(game["transport"], {"kind": "flatpak"})
        self.assertEqual(game["executable"], "/usr/bin/flatpak")
        self.assertEqual(game["arguments"], "run net.pcsx2.PCSX2 --fullscreen")
        self.assertEqual(game["startDir"], "/home/deck/Games")

    def test_shell_targets_are_opaque_host_targets(self):
        game = SteamService._shortcut_game(
            {
                "appid": 654321,
                "AppName": "EmuDeck-style launcher",
                "Exe": "/usr/bin/bash",
                "LaunchOptions": "~/Emulators/launch-game.sh --game-id foo",
            }
        )

        self.assertEqual(game["transport"], {"kind": "host"})

    def test_normal_steam_manifest_always_uses_host_transport(self):
        with tempfile.TemporaryDirectory() as directory:
            home = Path(directory)
            steamapps = home / ".local/share/Steam/steamapps"
            steamapps.mkdir(parents=True)
            (steamapps / "appmanifest_123.acf").write_text(
                '"AppState" {\n\t"name" "Steam game"\n}\n',
                encoding="utf-8",
            )
            service = SteamService()
            service.user_home = home

            response = service.get_installed_games()

            self.assertTrue(response["success"])
            self.assertEqual(response["games"], [{
                "appid": "123",
                "name": "Steam game",
                "nonSteam": False,
                "transport": {"kind": "host"},
            }])


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