aboutsummaryrefslogtreecommitdiff
path: root/test/xdg_pipe_menu_scanner_tests.erl
diff options
context:
space:
mode:
Diffstat (limited to 'test/xdg_pipe_menu_scanner_tests.erl')
-rw-r--r--test/xdg_pipe_menu_scanner_tests.erl144
1 files changed, 144 insertions, 0 deletions
diff --git a/test/xdg_pipe_menu_scanner_tests.erl b/test/xdg_pipe_menu_scanner_tests.erl
new file mode 100644
index 0000000..fa321ad
--- /dev/null
+++ b/test/xdg_pipe_menu_scanner_tests.erl
@@ -0,0 +1,144 @@
+-module(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"
+ ],
+ 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"
+ ],
+ 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"
+ ],
+ 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"
+ ],
+ 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"],
+ 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"],
+ 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 = 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([], 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.