Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions ruby/lib/cucumber/query.rb
Original file line number Diff line number Diff line change
Expand Up @@ -191,6 +191,22 @@ def find_step_definitions_by(message)
ids.filter_map { |id| repository.step_definition_by_id[id] }
end

# @param message [Pickle, PickleStep]
# @return [Array<Suggestion>]
def find_suggestions_by(message)
ensure_only_message_types!(
message,
[Cucumber::Messages::Pickle, Cucumber::Messages::PickleStep],
'#find_suggestions_by'
)

if message.is_a?(Cucumber::Messages::PickleStep)
repository.suggestions_by_pickle_step_id[message.id]
else
message.steps.flat_map { |pickle_step| find_suggestions_by(pickle_step) }
end
end

# @param message [TestCaseStarted, TestCaseFinished, TestStepStarted, TestStepFinished]
# @return [TestCase]
def find_test_case_by(message)
Expand Down
14 changes: 6 additions & 8 deletions ruby/lib/cucumber/repository.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ class Repository
attr_reader :attachments_by_test_case_started_id, :attachments_by_test_run_hook_started_id,
:hook_by_id,
:pickle_by_id, :pickle_step_by_id,
:suggestions_by_pickle_step_id,
:step_by_id, :step_definition_by_id,
:test_case_by_id, :test_case_started_by_id, :test_case_finished_by_test_case_started_id,
:test_run_hook_started_by_id, :test_run_hook_finished_by_test_run_hook_started_id,
Expand All @@ -21,6 +22,7 @@ def initialize
@pickle_step_by_id = {}
@step_by_id = {}
@step_definition_by_id = {}
@suggestions_by_pickle_step_id = _hash_with_array_default
@test_case_by_id = {}
@test_case_started_by_id = {}
@test_case_finished_by_test_case_started_id = {}
Expand All @@ -40,8 +42,6 @@ def update(envelope)

private

# Missing handlers

def method_missing(method_name, *args, &)
if method_name.to_s.start_with?('update_')
Kernel.warn("Attempting to update the repository with #{method_name}. Please raise this as a missing message handler")
Expand All @@ -56,12 +56,6 @@ def respond_to_missing?(method_name, include_private = false)
method_name.to_s.start_with?('update_') || super
end

def update_suggestion(_suggestion)
:no_op # Not Implemented Yet. But method will be inherently called from `#update`
end

# Defined handlers

def update_attachment(attachment)
attachments_by_test_case_started_id[attachment.test_case_started_id] << attachment if attachment.test_case_started_id
attachments_by_test_run_hook_started_id[attachment.test_run_hook_started_id] << attachment if attachment.test_run_hook_started_id
Expand Down Expand Up @@ -110,6 +104,10 @@ def update_step_definition(step_definition)
step_definition_by_id[step_definition.id] = step_definition
end

def update_suggestion(suggestion)
suggestions_by_pickle_step_id[suggestion.pickle_step_id] << suggestion
end

def update_test_case(test_case)
test_case_by_id[test_case.id] = test_case
test_case.test_steps.each { |test_step| test_step_by_id[test_step.id] = test_step }
Expand Down
6 changes: 6 additions & 0 deletions ruby/spec/cucumber/query_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,12 @@ def parse_ndjson_file(path)
'findPickleStepBy' => ->(query) { query.find_all_test_steps.filter_map { |message| query.find_pickle_step_by(message)&.text } },
'findStepBy' => ->(query) { query.find_all_pickle_steps.map { |message| query.find_step_by(message).text } },
'findStepDefinitionsBy' => ->(query) { query.find_all_test_steps.map { |message| query.find_step_definitions_by(message).map(&:id) } },
'findSuggestionsBy' => lambda do |query|
results = {}
results['pickleStep'] = query.find_all_pickle_steps.filter_map { |message| query.find_suggestions_by(message).map(&:id) }.flatten
results['pickle'] = query.find_all_pickles.filter_map { |message| query.find_suggestions_by(message).map(&:id) }.flatten
results
end,
'findTestCaseBy' => lambda do |query|
results = {}
results['testCaseStarted'] = query.find_all_test_case_started.map { |message| query.find_test_case_by(message).id }
Expand Down