65 lines
1.8 KiB
Elixir
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
|