aprs.me/test/mix/tasks/aprs.parse_file_test.exs

65 lines
1.8 KiB
Elixir

defmodule Mix.Tasks.Aprs.ParseFileTest do
use ExUnit.Case, async: false
alias Mix.Tasks.Aprs.ParseFile
@tmp_dir System.tmp_dir!()
setup do
input = Path.join(@tmp_dir, "aprs_parse_file_input_#{System.unique_integer([:positive])}.txt")
output = Path.join(@tmp_dir, "aprs_parse_file_output_#{System.unique_integer([:positive])}.txt")
on_exit(fn ->
File.rm(input)
File.rm(output)
end)
%{input: input, output: output}
end
test "skips blank and comment lines and writes failed lines to the output", %{
input: input,
output: output
} do
File.write!(input, """
# a comment
N0CALL>APRS:this is not a valid packet at all
""")
# Mix tasks emit output via Mix.shell; silence it during the test.
Mix.shell(Mix.Shell.Process)
ParseFile.run([input, "--output", output])
assert File.exists?(output)
contents = File.read!(output)
# The garbage line should be written; comments and blank lines should not.
refute contents =~ "# a comment"
# The parser may or may not accept the "not a valid packet" line depending
# on its lenience — but if anything is written, it's that one line.
case String.trim(contents) do
"" -> :ok
line -> assert line == "N0CALL>APRS:this is not a valid packet at all"
end
assert_received {:mix_shell, :info, [msg]}
assert msg =~ "Processed"
end
test "errors and exits when input file is missing", %{output: output} do
Mix.shell(Mix.Shell.Process)
missing = Path.join(@tmp_dir, "does_not_exist_#{System.unique_integer([:positive])}.txt")
try do
ParseFile.run([missing, "--output", output])
flunk("expected run to exit")
catch
:exit, {:shutdown, 1} -> :ok
end
assert_received {:mix_shell, :error, [err]}
assert err =~ "input file not found"
end
end