Skip to content

Commit 26fe78e

Browse files
author
Étienne Lévesque
committed
Add provider unit tests
1 parent 95f205a commit 26fe78e

File tree

2 files changed

+196
-12
lines changed
  • apps/language_server

2 files changed

+196
-12
lines changed

apps/language_server/lib/language_server/providers/code_lens/test.ex

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -105,23 +105,22 @@ defmodule ElixirLS.LanguageServer.Providers.CodeLens.Test do
105105
end
106106
end
107107

108-
def get_test_lenses(test_blocks, file_path) do
109-
test_blocks
110-
|> Enum.map(fn block ->
111-
CodeLens.build_code_lens(block.line, "Run test", @run_test_command, %{
108+
defp get_test_lenses(test_blocks, file_path) do
109+
args = fn block ->
110+
%{
112111
"filePath" => file_path,
113-
"describe" =>
114-
if block.describe != nil do
115-
block.describe.name
116-
else
117-
nil
118-
end,
119112
"testName" => block.name
120-
})
113+
}
114+
|> Map.merge(if block.describe != nil, do: %{"describe" => block.describe.name}, else: %{})
115+
end
116+
117+
test_blocks
118+
|> Enum.map(fn block ->
119+
CodeLens.build_code_lens(block.line, "Run test", @run_test_command, args.(block))
121120
end)
122121
end
123122

124-
def get_describe_lenses(describe_blocks, file_path) do
123+
defp get_describe_lenses(describe_blocks, file_path) do
125124
describe_blocks
126125
|> Enum.map(fn block ->
127126
CodeLens.build_code_lens(block.line, "Run tests", @run_test_command, %{
Lines changed: 185 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,185 @@
1+
defmodule ElixirLS.LanguageServer.Providers.CodeLens.TestTest do
2+
use ExUnit.Case
3+
4+
alias ElixirLS.LanguageServer.Providers.CodeLens
5+
6+
setup context do
7+
ElixirLS.LanguageServer.Build.load_all_modules()
8+
9+
unless context[:skip_server] do
10+
server = ElixirLS.LanguageServer.Test.ServerTestHelpers.start_server()
11+
12+
{:ok, %{server: server}}
13+
else
14+
:ok
15+
end
16+
end
17+
18+
test "returns all module code lenses" do
19+
uri = "file://project/file.ex"
20+
21+
text = """
22+
defmodule MyModule do
23+
use ExUnit.Case
24+
end
25+
26+
defmodule MyModule2 do
27+
use ExUnit.Case
28+
end
29+
"""
30+
31+
{:ok, lenses} = CodeLens.Test.code_lens(uri, text)
32+
33+
assert lenses ==
34+
[
35+
build_code_lens(0, :module, "/file.ex", %{"module" => MyModule}),
36+
build_code_lens(4, :module, "/file.ex", %{"module" => MyModule2})
37+
]
38+
end
39+
40+
test "returns all nested module code lenses" do
41+
uri = "file://project/file.ex"
42+
43+
text = """
44+
defmodule MyModule do
45+
use ExUnit.Case
46+
47+
defmodule MyModule2 do
48+
use ExUnit.Case
49+
end
50+
end
51+
"""
52+
53+
{:ok, lenses} = CodeLens.Test.code_lens(uri, text)
54+
55+
assert lenses ==
56+
[
57+
build_code_lens(0, :module, "/file.ex", %{"module" => MyModule}),
58+
build_code_lens(3, :module, "/file.ex", %{"module" => MyModule.MyModule2})
59+
]
60+
end
61+
62+
test "does not return lenses for modules that don't import ExUnit.case" do
63+
uri = "file://project/file.ex"
64+
65+
text = """
66+
defmodule MyModule do
67+
end
68+
"""
69+
70+
{:ok, lenses} = CodeLens.Test.code_lens(uri, text)
71+
72+
assert lenses == []
73+
end
74+
75+
test "returns lenses for all describe blocks" do
76+
uri = "file://project/file.ex"
77+
78+
text = """
79+
defmodule MyModule do
80+
use ExUnit.Case
81+
82+
describe "describe1" do
83+
end
84+
85+
describe "describe2" do
86+
end
87+
end
88+
"""
89+
90+
{:ok, lenses} = CodeLens.Test.code_lens(uri, text)
91+
92+
assert Enum.member?(
93+
lenses,
94+
build_code_lens(3, :describe, "/file.ex", %{"describe" => "describe1"})
95+
)
96+
97+
assert Enum.member?(
98+
lenses,
99+
build_code_lens(6, :describe, "/file.ex", %{"describe" => "describe2"})
100+
)
101+
end
102+
103+
test "returns lenses for all test blocks" do
104+
uri = "file://project/file.ex"
105+
106+
text = """
107+
defmodule MyModule do
108+
use ExUnit.Case
109+
110+
test "test1" do
111+
end
112+
113+
test "test2" do
114+
end
115+
end
116+
"""
117+
118+
{:ok, lenses} = CodeLens.Test.code_lens(uri, text)
119+
120+
assert Enum.member?(
121+
lenses,
122+
build_code_lens(3, :test, "/file.ex", %{"testName" => "test1"})
123+
)
124+
125+
assert Enum.member?(
126+
lenses,
127+
build_code_lens(6, :test, "/file.ex", %{"testName" => "test2"})
128+
)
129+
end
130+
131+
test "given test blocks inside describe blocks, should return code lenses with the test and describe name" do
132+
uri = "file://project/file.ex"
133+
134+
text = """
135+
defmodule MyModule do
136+
use ExUnit.Case
137+
138+
describe "describe1" do
139+
test "test1" do
140+
end
141+
end
142+
end
143+
"""
144+
145+
{:ok, lenses} = CodeLens.Test.code_lens(uri, text)
146+
147+
assert Enum.member?(
148+
lenses,
149+
build_code_lens(4, :test, "/file.ex", %{
150+
"testName" => "test1",
151+
"describe" => "describe1"
152+
})
153+
)
154+
end
155+
156+
defp build_code_lens(line, target, file_path, args) do
157+
arguments =
158+
%{
159+
"filePath" => file_path
160+
}
161+
|> Map.merge(args)
162+
163+
%{
164+
"range" => %{
165+
"start" => %{
166+
"line" => line,
167+
"character" => 0
168+
},
169+
"end" => %{
170+
"line" => line,
171+
"character" => 0
172+
}
173+
},
174+
"command" => %{
175+
"title" => get_lens_title(target),
176+
"command" => "elixir.lens.test.run",
177+
"arguments" => [arguments]
178+
}
179+
}
180+
end
181+
182+
defp get_lens_title(:module), do: "Run tests in module"
183+
defp get_lens_title(:describe), do: "Run tests"
184+
defp get_lens_title(:test), do: "Run test"
185+
end

0 commit comments

Comments
 (0)