Skip to content

Commit e3cab75

Browse files
authored
Prevent describe blocks with the same name in ExUnit (#6237)
1 parent 90296aa commit e3cab75

File tree

2 files changed

+34
-5
lines changed

2 files changed

+34
-5
lines changed

lib/ex_unit/lib/ex_unit/case.ex

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@ defmodule ExUnit.DuplicateTestError do
22
defexception [:message]
33
end
44

5+
defmodule ExUnit.DuplicateDescribeError do
6+
defexception [:message]
7+
end
8+
59
defmodule ExUnit.Case do
610
@moduledoc """
711
Helpers for defining test cases.
@@ -217,7 +221,7 @@ defmodule ExUnit.Case do
217221
async = !!unquote(opts)[:async]
218222

219223
unless Module.get_attribute(__MODULE__, :ex_unit_tests) do
220-
Enum.each [:ex_unit_tests, :tag, :describetag, :moduletag, :ex_unit_registered],
224+
Enum.each [:ex_unit_tests, :tag, :describetag, :moduletag, :ex_unit_registered, :ex_unit_used_describes],
221225
&Module.register_attribute(__MODULE__, &1, accumulate: true)
222226

223227
@before_compile ExUnit.Case
@@ -359,10 +363,19 @@ defmodule ExUnit.Case do
359363
"for describe/2 on named setups and how to handle hierarchies"
360364
end
361365

362-
@ex_unit_describe (case unquote(message) do
363-
msg when is_binary(msg) -> msg
364-
msg -> raise ArgumentError, "describe name must be a string, got: #{inspect msg}"
365-
end)
366+
message = unquote(message)
367+
cond do
368+
not is_binary(message) ->
369+
raise ArgumentError, "describe name must be a string, got: #{inspect(message)}"
370+
message in @ex_unit_used_describes ->
371+
raise ExUnit.DuplicateDescribeError,
372+
"describe #{inspect(message)} is already defined in #{inspect(__MODULE__)}"
373+
true ->
374+
:ok
375+
end
376+
377+
@ex_unit_describe message
378+
@ex_unit_used_describes message
366379
Module.delete_attribute(__ENV__.module, :describetag)
367380

368381
try do

lib/ex_unit/test/ex_unit/describe_test.exs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,22 @@ defmodule ExUnit.DescribeTest do
7070
end
7171
end
7272
end
73+
74+
test "when using the same name for two describe blocks" do
75+
message = ~s(describe "some tests" is already defined in ExUnit.DescribeTest.DescribeWithSameNames)
76+
77+
assert_raise ExUnit.DuplicateDescribeError, message, fn ->
78+
defmodule DescribeWithSameNames do
79+
use ExUnit.Case
80+
81+
describe "some tests" do
82+
end
83+
84+
describe "some tests" do
85+
end
86+
end
87+
end
88+
end
7389
end
7490

7591
describe "test names" do

0 commit comments

Comments
 (0)