aboutsummaryrefslogtreecommitdiff
path: root/test/er_xdg_pipe_menu_scanner_tests.erl
blob: 3f934966403aa4dd0abf871add0888b1f696cab9 (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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
-module(er_xdg_pipe_menu_scanner_tests).

-include_lib("eunit/include/eunit.hrl").

data_dirs_defaults_test() ->
    with_env(
        [{"XDG_DATA_HOME", false}, {"XDG_DATA_DIRS", false}, {"HOME", "/home/testuser"}],
        fun() ->
            ?assertEqual(
                [
                    "/home/testuser/.local/share/applications",
                    "/usr/local/share/applications",
                    "/usr/share/applications"
                ],
                er_xdg_pipe_menu_scanner:data_dirs()
            )
        end
    ).

data_dirs_honors_xdg_data_home_test() ->
    with_env(
        [{"XDG_DATA_HOME", "/custom/data"}, {"XDG_DATA_DIRS", false}, {"HOME", "/home/testuser"}],
        fun() ->
            ?assertEqual(
                [
                    "/custom/data/applications",
                    "/usr/local/share/applications",
                    "/usr/share/applications"
                ],
                er_xdg_pipe_menu_scanner:data_dirs()
            )
        end
    ).

data_dirs_honors_xdg_data_dirs_test() ->
    with_env(
        [
            {"XDG_DATA_HOME", false},
            {"XDG_DATA_DIRS", "/opt/flatpak/share:/var/lib/flatpak/exports/share"},
            {"HOME", "/home/testuser"}
        ],
        fun() ->
            ?assertEqual(
                [
                    "/home/testuser/.local/share/applications",
                    "/opt/flatpak/share/applications",
                    "/var/lib/flatpak/exports/share/applications"
                ],
                er_xdg_pipe_menu_scanner:data_dirs()
            )
        end
    ).

data_dirs_treats_empty_as_unset_test() ->
    with_env(
        [{"XDG_DATA_HOME", ""}, {"XDG_DATA_DIRS", ""}, {"HOME", "/home/testuser"}],
        fun() ->
            ?assertEqual(
                [
                    "/home/testuser/.local/share/applications",
                    "/usr/local/share/applications",
                    "/usr/share/applications"
                ],
                er_xdg_pipe_menu_scanner:data_dirs()
            )
        end
    ).

data_dirs_ignores_empty_segments_in_xdg_data_dirs_test() ->
    with_env(
        [{"XDG_DATA_HOME", false}, {"XDG_DATA_DIRS", "/a::/b:"}, {"HOME", "/home/testuser"}],
        fun() ->
            ?assertEqual(
                ["/home/testuser/.local/share/applications", "/a/applications", "/b/applications"],
                er_xdg_pipe_menu_scanner:data_dirs()
            )
        end
    ).

data_dirs_skips_data_home_without_xdg_data_home_or_home_test() ->
    with_env(
        [{"XDG_DATA_HOME", false}, {"XDG_DATA_DIRS", false}, {"HOME", false}],
        fun() ->
            ?assertEqual(
                ["/usr/local/share/applications", "/usr/share/applications"],
                er_xdg_pipe_menu_scanner:data_dirs()
            )
        end
    ).

find_desktop_files_recurses_and_skips_missing_dirs_test() ->
    Root = mk_tmp_dir(),
    SubDir = filename:join(Root, "kde4"),
    ok = file:make_dir(SubDir),
    ok = file:write_file(filename:join(Root, "top.desktop"), <<"[Desktop Entry]\n">>),
    ok = file:write_file(filename:join(SubDir, "nested.desktop"), <<"[Desktop Entry]\n">>),
    ok = file:write_file(filename:join(Root, "not-a-desktop-file.txt"), <<"ignore me">>),
    Missing = filename:join(Root, "does-not-exist"),
    Found = er_xdg_pipe_menu_scanner:find_desktop_files([Root, Missing]),
    ok = rm_rf(Root),
    ?assertEqual(
        lists:sort([filename:join(Root, "top.desktop"), filename:join(SubDir, "nested.desktop")]),
        lists:sort(Found)
    ).

find_desktop_files_empty_for_no_dirs_test() ->
    ?assertEqual([], er_xdg_pipe_menu_scanner:find_desktop_files([])).

%% -- helpers ----------------------------------------------------------------

with_env(Vars, Fun) ->
    Saved = [{Name, os:getenv(Name)} || {Name, _} <- Vars],
    try
        lists:foreach(fun({Name, Value}) -> set_env(Name, Value) end, Vars),
        Fun()
    after
        lists:foreach(fun({Name, Value}) -> set_env(Name, Value) end, Saved)
    end.

set_env(Name, false) -> os:unsetenv(Name);
set_env(Name, Value) -> os:putenv(Name, Value).

mk_tmp_dir() ->
    Path = filename:join(
        test_tmp_dir(), "eunit-scanner-" ++ integer_to_list(erlang:unique_integer([positive]))
    ),
    ok = file:make_dir(Path),
    Path.

test_tmp_dir() ->
    case os:getenv("TMPDIR") of
        false -> "/tmp";
        Dir -> Dir
    end.

rm_rf(Path) ->
    case filelib:is_dir(Path) of
        true ->
            {ok, Entries} = file:list_dir(Path),
            lists:foreach(fun(E) -> rm_rf(filename:join(Path, E)) end, Entries),
            file:del_dir(Path);
        false ->
            file:delete(Path)
    end.