Skip to content

Commit e7ff414

Browse files
feat: add capybara keyword support (#88)
* feat: add capybara keyword support * Add tests * fix spec * chore: Remove unecessary scenario keyword from test discovery --------- Co-authored-by: Ryan Mohrman <[email protected]>
1 parent 5814750 commit e7ff414

File tree

4 files changed

+66
-10
lines changed

4 files changed

+66
-10
lines changed

lib/ruby_lsp/ruby_lsp_rspec/code_lens.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,10 @@ def initialize(response_builder, uri, dispatcher, rspec_command, debug: false)
2424
#: (Prism::CallNode) -> void
2525
def on_call_node_enter(node)
2626
case node.message
27-
when "example", "it", "specify"
27+
when "example", "it", "specify", "scenario"
2828
name = generate_name(node)
2929
add_test_code_lens(node, name: name, kind: :example)
30-
when "context", "describe"
30+
when "context", "describe", "feature"
3131
return unless valid_group?(node)
3232

3333
name = generate_name(node)
@@ -41,7 +41,7 @@ def on_call_node_enter(node)
4141
#: (Prism::CallNode) -> void
4242
def on_call_node_leave(node)
4343
case node.message
44-
when "context", "describe"
44+
when "context", "describe", "feature"
4545
return unless valid_group?(node)
4646

4747
@group_id_stack.pop

lib/ruby_lsp/ruby_lsp_rspec/document_symbol.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ def initialize(response_builder, dispatcher)
1616
#: (Prism::CallNode) -> void
1717
def on_call_node_enter(node)
1818
case node.message
19-
when "example", "it", "specify"
19+
when "example", "it", "specify", "scenario"
2020
name = generate_name(node)
2121

2222
return unless name
@@ -27,7 +27,7 @@ def on_call_node_enter(node)
2727
selection_range: range_from_node(node),
2828
range: range_from_node(node),
2929
)
30-
when "context", "describe", "shared_examples", "shared_context", "shared_examples_for"
30+
when "context", "describe", "shared_examples", "shared_context", "shared_examples_for", "feature"
3131
return if node.receiver && node.receiver&.slice != "RSpec"
3232

3333
name = generate_name(node)
@@ -50,7 +50,7 @@ def on_call_node_enter(node)
5050
#: (Prism::CallNode) -> void
5151
def on_call_node_leave(node)
5252
case node.message
53-
when "context", "describe", "shared_examples", "shared_context", "shared_examples_for"
53+
when "context", "describe", "shared_examples", "shared_context", "shared_examples_for", "feature"
5454
return if node.receiver && node.receiver&.slice != "RSpec"
5555

5656
@response_builder.pop

lib/ruby_lsp/ruby_lsp_rspec/test_discovery.rb

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,22 +26,22 @@ def initialize(response_builder, dispatcher, uri, workspace_path)
2626

2727
#: (Prism::CallNode) -> void
2828
def on_call_node_enter(node)
29-
return unless ["describe", "context", "it", "specify", "example"].include?(node.message)
29+
return unless ["describe", "context", "it", "specify", "example", "feature", "scenario"].include?(node.message)
3030

3131
case node.message
32-
when "describe", "context"
32+
when "describe", "context", "feature"
3333
return unless valid_group?(node)
3434

3535
handle_describe(node)
36-
when "it", "specify", "example"
36+
when "it", "specify", "example", "scenario"
3737
handle_example(node)
3838
end
3939
end
4040

4141
#: (Prism::CallNode) -> void
4242
def on_call_node_leave(node)
4343
case node.message
44-
when "context", "describe"
44+
when "context", "describe", "feature"
4545
return unless valid_group?(node)
4646

4747
@group_stack.pop

spec/test_discovery_spec.rb

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,62 @@
8181
end
8282
end
8383

84+
# Tests capybara feature/scenario syntax
85+
# see https://github.com/teamcapybara/capybara
86+
it "discovers Capybara examples" do
87+
source = <<~RUBY
88+
feature "Sample test" do
89+
scenario "first test" do
90+
expect(true).to be(true)
91+
end
92+
93+
# Test a mixed syntax
94+
it "second test" do
95+
expect(true).to be(true)
96+
end
97+
end
98+
99+
RSpec.describe Foo do
100+
it "third test" do
101+
expect(true).to be(true)
102+
end
103+
end
104+
RUBY
105+
106+
with_server(source, uri) do |server, uri|
107+
server.process_message(
108+
{
109+
id: 1,
110+
method: "rubyLsp/discoverTests",
111+
params: {
112+
textDocument: { uri: uri },
113+
},
114+
},
115+
)
116+
117+
items = pop_result(server).response
118+
119+
expect(items.length).to eq(2)
120+
121+
first_group = items.first
122+
expect(first_group[:id]).to eq("./spec/fake_spec.rb:1")
123+
expect(first_group[:label]).to eq("Sample test")
124+
expect(first_group[:children].length).to eq(2)
125+
126+
test_ids = first_group[:children].map { |i| i[:id] }
127+
expect(test_ids).to include("./spec/fake_spec.rb:1::./spec/fake_spec.rb:2")
128+
129+
test_labels = first_group[:children].map { |i| i[:label] }
130+
expect(test_labels).to include("first test")
131+
132+
expect(test_labels).to include("second test")
133+
134+
second_group = items[1]
135+
expect(second_group[:label]).to eq("Foo")
136+
expect(second_group[:children].length).to eq(1)
137+
end
138+
end
139+
84140
it "discovers nested example groups" do
85141
source = <<~RUBY
86142
RSpec.describe "Outer group" do

0 commit comments

Comments
 (0)