diff options
Diffstat (limited to 'test/xdg_pipe_menu_scanner_tests.erl')
| -rw-r--r-- | test/xdg_pipe_menu_scanner_tests.erl | 144 |
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. |
