Skip to content

Commit bd909cb

Browse files
committed
Simplify message ordering assertions
1 parent aee1747 commit bd909cb

File tree

1 file changed

+37
-129
lines changed

1 file changed

+37
-129
lines changed

lib/mix/test/mix/tasks/deps_test.exs

Lines changed: 37 additions & 129 deletions
Original file line numberDiff line numberDiff line change
@@ -75,28 +75,27 @@ defmodule Mix.Tasks.DepsTest do
7575

7676
## deps
7777

78-
test "prints list of dependencies and their status" do
78+
test "prints list of dependencies and their status alphabetically" do
7979
in_fixture("deps_status", fn ->
8080
Mix.Project.push(DepsApp)
81-
8281
Mix.Tasks.Deps.run([])
8382

84-
assert_received {:mix_shell, :info, ["* ok (https://github.com/elixir-lang/ok.git) (mix)"]}
85-
msg = " the dependency is not available, run \"mix deps.get\""
86-
assert_received {:mix_shell, :info, [^msg]}
87-
88-
assert_received {:mix_shell, :info, ["* invalidvsn (deps/invalidvsn)"]}
89-
assert_received {:mix_shell, :info, [" the app file contains an invalid version: :ok"]}
90-
91-
assert_received {:mix_shell, :info, ["* invalidapp (deps/invalidapp) (mix)"]}
92-
msg = " the app file at \"_build/dev/lib/invalidapp/ebin/invalidapp.app\" is invalid"
93-
assert_received {:mix_shell, :info, [^msg]}
94-
95-
assert_received {:mix_shell, :info, ["* noappfile (deps/noappfile)"]}
96-
assert_received {:mix_shell, :info, [" could not find an app file at" <> _]}
97-
98-
assert_received {:mix_shell, :info, ["* nosemver (deps/nosemver)"]}
99-
assert_received {:mix_shell, :info, [" the app file specified a non-Semantic" <> _]}
83+
invalid_app_file =
84+
" the app file at \"_build/dev/lib/invalidapp/ebin/invalidapp.app\" is invalid"
85+
86+
assert {:messages,
87+
[
88+
{:mix_shell, :info, ["* invalidapp (deps/invalidapp) (mix)"]},
89+
{:mix_shell, :info, [^invalid_app_file]},
90+
{:mix_shell, :info, ["* invalidvsn (deps/invalidvsn)"]},
91+
{:mix_shell, :info, [" the app file contains an invalid version: :ok"]},
92+
{:mix_shell, :info, ["* noappfile (deps/noappfile)"]},
93+
{:mix_shell, :info, [" could not find an app file at " <> _]},
94+
{:mix_shell, :info, ["* nosemver (deps/nosemver)"]},
95+
{:mix_shell, :info, [" the app file specified a non-Semantic" <> _]},
96+
{:mix_shell, :info, ["* ok (https://github.com/elixir-lang/ok.git) (mix)"]},
97+
{:mix_shell, :info, [" the dependency is not available, run \"mix deps.get\""]}
98+
]} = Process.info(self(), :messages)
10099
end)
101100
end
102101

@@ -125,51 +124,31 @@ defmodule Mix.Tasks.DepsTest do
125124
end)
126125
end
127126

128-
test "filters dependencies preserving argument order" do
127+
test "filters dependencies and deals with duplicates" do
129128
in_fixture("deps_status", fn ->
130129
Mix.Project.push(DepsApp)
131130

132-
Mix.Tasks.Deps.run(["nosemver", "unknowndep2", "ok", "unknowndep1", "invalidapp"])
133-
134-
assert_output_order([
135-
{:info, "nosemver"},
136-
{:info, "ok"},
137-
{:info, "invalidapp"},
138-
{:error, "unknowndep2"},
139-
{:error, "unknowndep1"}
131+
Mix.Tasks.Deps.run([
132+
"nosemver",
133+
"unknowndep2",
134+
"ok",
135+
"ok",
136+
"unknowndep1",
137+
"invalidapp",
138+
"ok"
140139
])
141-
end)
142-
end
143140

144-
test "deduplicates arguments preserving first occurrence order" do
145-
in_fixture("deps_status", fn ->
146-
Mix.Project.push(DepsApp)
147-
148-
Mix.Tasks.Deps.run(["ok", "ok", "nosemver", "unknowndep", "ok", "unknowndep"])
149-
150-
messages = receive_shell_messages()
151-
152-
assert_output_once(messages, "ok")
153-
assert_output_once(messages, "nosemver")
154-
assert_output_once(messages, "unknowndep")
155-
156-
assert_output_order(messages, [{:info, "ok"}, {:info, "nosemver"}, {:error, "unknowndep"}])
157-
end)
158-
end
159-
160-
test "lists all dependencies in alphabetical order when no filter is given" do
161-
in_fixture("deps_status", fn ->
162-
Mix.Project.push(DepsApp)
163-
164-
Mix.Tasks.Deps.run([])
165-
166-
assert_output_order([
167-
{:info, "invalidapp"},
168-
{:info, "invalidvsn"},
169-
{:info, "noappfile"},
170-
{:info, "nosemver"},
171-
{:info, "ok"}
172-
])
141+
assert {:messages,
142+
[
143+
{:mix_shell, :info, ["* nosemver (deps/nosemver)"]},
144+
{:mix_shell, :info, [" the app file specified a non-Semantic" <> _]},
145+
{:mix_shell, :info, ["* ok (https://github.com/elixir-lang/ok.git) (mix)"]},
146+
{:mix_shell, :info, [" the dependency is not available, run \"mix deps.get\""]},
147+
{:mix_shell, :info, ["* invalidapp (deps/invalidapp) (mix)"]},
148+
{:mix_shell, :info, [" the app file at " <> _]},
149+
{:mix_shell, :error, ["warning: unknown dependency unknowndep2"]},
150+
{:mix_shell, :error, ["warning: unknown dependency unknowndep1"]}
151+
]} = Process.info(self(), :messages)
173152
end)
174153
end
175154

@@ -1050,75 +1029,4 @@ defmodule Mix.Tasks.DepsTest do
10501029
assert File.exists?("deps/ok")
10511030
end)
10521031
end
1053-
1054-
## Helpers
1055-
1056-
defp assert_output_once(messages, dep) do
1057-
matches = Enum.count(messages, &(info_message?(&1, dep) or warning_message?(&1, dep)))
1058-
1059-
if matches != 1 do
1060-
flunk("""
1061-
Expected output for #{dep} to appear only once!
1062-
1063-
Output:
1064-
#{inspect(messages)}
1065-
""")
1066-
end
1067-
end
1068-
1069-
defp assert_output_order(expected) do
1070-
assert_output_order(receive_shell_messages(), expected)
1071-
end
1072-
1073-
defp assert_output_order(output, expected) do
1074-
# Find the index of each expected output line
1075-
indices =
1076-
Enum.map(expected, fn
1077-
{:info, dep} -> Enum.find_index(output, &info_message?(&1, dep))
1078-
{:error, dep} -> Enum.find_index(output, &warning_message?(&1, dep))
1079-
end)
1080-
1081-
if not Enum.all?(indices) do
1082-
flunk("""
1083-
Expected output not found!
1084-
1085-
Expected:
1086-
#{inspect(expected)}
1087-
1088-
Output:
1089-
#{inspect(output)}
1090-
""")
1091-
end
1092-
1093-
if not strictly_increasing?(indices) do
1094-
flunk("""
1095-
Output not in expected order!
1096-
1097-
Expected:
1098-
#{inspect(expected)}
1099-
1100-
Output:
1101-
#{inspect(output)}
1102-
""")
1103-
end
1104-
end
1105-
1106-
defp receive_shell_messages(acc \\ []) do
1107-
receive do
1108-
{:mix_shell, level, [line]} when level in [:info, :error] ->
1109-
receive_shell_messages([{level, line} | acc])
1110-
after
1111-
0 -> Enum.reverse(acc)
1112-
end
1113-
end
1114-
1115-
defp info_message?({:info, line}, dep), do: line =~ ~r/^\* #{dep} /
1116-
defp info_message?(_message, _dep), do: false
1117-
1118-
defp warning_message?({:error, line}, dep), do: line =~ ~r/^warning: .* #{dep}/
1119-
defp warning_message?(_message, _dep), do: false
1120-
1121-
defp strictly_increasing?([]), do: true
1122-
defp strictly_increasing?([_]), do: true
1123-
defp strictly_increasing?([a, b | rest]), do: a < b and strictly_increasing?([b | rest])
11241032
end

0 commit comments

Comments
 (0)