diff --git a/lib/ruby_lsp/ruby_lsp_rspec/code_lens.rb b/lib/ruby_lsp/ruby_lsp_rspec/code_lens.rb index abd1399..ff996c6 100644 --- a/lib/ruby_lsp/ruby_lsp_rspec/code_lens.rb +++ b/lib/ruby_lsp/ruby_lsp_rspec/code_lens.rb @@ -24,10 +24,10 @@ def initialize(response_builder, uri, dispatcher, rspec_command, debug: false) #: (Prism::CallNode) -> void def on_call_node_enter(node) case node.message - when "example", "it", "specify" + when "example", "it", "specify", "scenario" name = generate_name(node) add_test_code_lens(node, name: name, kind: :example) - when "context", "describe" + when "context", "describe", "feature" return unless valid_group?(node) name = generate_name(node) @@ -41,7 +41,7 @@ def on_call_node_enter(node) #: (Prism::CallNode) -> void def on_call_node_leave(node) case node.message - when "context", "describe" + when "context", "describe", "feature" return unless valid_group?(node) @group_id_stack.pop diff --git a/lib/ruby_lsp/ruby_lsp_rspec/document_symbol.rb b/lib/ruby_lsp/ruby_lsp_rspec/document_symbol.rb index 83b9ceb..36fab7b 100644 --- a/lib/ruby_lsp/ruby_lsp_rspec/document_symbol.rb +++ b/lib/ruby_lsp/ruby_lsp_rspec/document_symbol.rb @@ -16,7 +16,7 @@ def initialize(response_builder, dispatcher) #: (Prism::CallNode) -> void def on_call_node_enter(node) case node.message - when "example", "it", "specify" + when "example", "it", "specify", "scenario" name = generate_name(node) return unless name @@ -27,7 +27,7 @@ def on_call_node_enter(node) selection_range: range_from_node(node), range: range_from_node(node), ) - when "context", "describe", "shared_examples", "shared_context", "shared_examples_for" + when "context", "describe", "shared_examples", "shared_context", "shared_examples_for", "feature" return if node.receiver && node.receiver&.slice != "RSpec" name = generate_name(node) @@ -50,7 +50,7 @@ def on_call_node_enter(node) #: (Prism::CallNode) -> void def on_call_node_leave(node) case node.message - when "context", "describe", "shared_examples", "shared_context", "shared_examples_for" + when "context", "describe", "shared_examples", "shared_context", "shared_examples_for", "feature" return if node.receiver && node.receiver&.slice != "RSpec" @response_builder.pop diff --git a/lib/ruby_lsp/ruby_lsp_rspec/test_discovery.rb b/lib/ruby_lsp/ruby_lsp_rspec/test_discovery.rb index 41ff7ca..399fabb 100644 --- a/lib/ruby_lsp/ruby_lsp_rspec/test_discovery.rb +++ b/lib/ruby_lsp/ruby_lsp_rspec/test_discovery.rb @@ -26,14 +26,14 @@ def initialize(response_builder, dispatcher, uri, workspace_path) #: (Prism::CallNode) -> void def on_call_node_enter(node) - return unless ["describe", "context", "it", "specify", "example"].include?(node.message) + return unless ["describe", "context", "it", "specify", "example", "feature", "scenario"].include?(node.message) case node.message - when "describe", "context" + when "describe", "context", "feature" return unless valid_group?(node) handle_describe(node) - when "it", "specify", "example" + when "it", "specify", "example", "scenario" handle_example(node) end end @@ -41,7 +41,7 @@ def on_call_node_enter(node) #: (Prism::CallNode) -> void def on_call_node_leave(node) case node.message - when "context", "describe" + when "context", "describe", "feature" return unless valid_group?(node) @group_stack.pop diff --git a/spec/test_discovery_spec.rb b/spec/test_discovery_spec.rb index bbe01e4..c80b4ec 100644 --- a/spec/test_discovery_spec.rb +++ b/spec/test_discovery_spec.rb @@ -81,6 +81,62 @@ end end + # Tests capybara feature/scenario syntax + # see https://github.com/teamcapybara/capybara + it "discovers Capybara examples" do + source = <<~RUBY + feature "Sample test" do + scenario "first test" do + expect(true).to be(true) + end + + # Test a mixed syntax + it "second test" do + expect(true).to be(true) + end + end + + RSpec.describe Foo do + it "third test" do + expect(true).to be(true) + end + end + RUBY + + with_server(source, uri) do |server, uri| + server.process_message( + { + id: 1, + method: "rubyLsp/discoverTests", + params: { + textDocument: { uri: uri }, + }, + }, + ) + + items = pop_result(server).response + + expect(items.length).to eq(2) + + first_group = items.first + expect(first_group[:id]).to eq("./spec/fake_spec.rb:1") + expect(first_group[:label]).to eq("Sample test") + expect(first_group[:children].length).to eq(2) + + test_ids = first_group[:children].map { |i| i[:id] } + expect(test_ids).to include("./spec/fake_spec.rb:1::./spec/fake_spec.rb:2") + + test_labels = first_group[:children].map { |i| i[:label] } + expect(test_labels).to include("first test") + + expect(test_labels).to include("second test") + + second_group = items[1] + expect(second_group[:label]).to eq("Foo") + expect(second_group[:children].length).to eq(1) + end + end + it "discovers nested example groups" do source = <<~RUBY RSpec.describe "Outer group" do