The formatter used for --format json
# File lib/cucumber/formatter/json.rb, line 13 def initialize(config) config.on_event :before_test_case, &method(:on_before_test_case) config.on_event :after_test_case, &method(:on_after_test_case) config.on_event :before_test_step, &method(:on_before_test_step) config.on_event :after_test_step, &method(:on_after_test_step) config.on_event :finished_testing, &method(:on_finished_testing) @io = ensure_io(config.out_stream) @feature_hashes = [] end
# File lib/cucumber/formatter/json.rb, line 80 def embed(src, mime_type, _label) if File.file?(src) content = File.open(src, 'rb') { |f| f.read } data = encode64(content) else if mime_type =~ /;base64$/ mime_type = mime_type[0..-8] data = src else data = encode64(src) end end test_step_embeddings << { mime_type: mime_type, data: data } end
# File lib/cucumber/formatter/json.rb, line 67 def on_after_test_case(event) result = event.result.with_filtered_backtrace(Cucumber::Formatter::BacktraceFilter) add_failed_around_hook(result) if result.failed? && !@any_step_failed end
# File lib/cucumber/formatter/json.rb, line 59 def on_after_test_step(event) test_step = event.test_step result = event.result.with_filtered_backtrace(Cucumber::Formatter::BacktraceFilter) return if internal_hook?(test_step) add_match_and_result(test_step, result) @any_step_failed = true if result.failed? end
# File lib/cucumber/formatter/json.rb, line 23 def on_before_test_case(event) test_case = event.test_case builder = Builder.new(test_case) unless same_feature_as_previous_test_case?(test_case.feature) @feature_hash = builder.feature_hash @feature_hashes << @feature_hash end @test_case_hash = builder.test_case_hash if builder.background? feature_elements << builder.background_hash @element_hash = builder.background_hash else feature_elements << @test_case_hash @element_hash = @test_case_hash end @any_step_failed = false end
# File lib/cucumber/formatter/json.rb, line 41 def on_before_test_step(event) test_step = event.test_step return if internal_hook?(test_step) hook_query = HookQueryVisitor.new(test_step) if hook_query.hook? @step_or_hook_hash = {} hooks_of_type(hook_query) << @step_or_hook_hash return end if first_step_after_background?(test_step) feature_elements << @test_case_hash @element_hash = @test_case_hash end @step_or_hook_hash = create_step_hash(test_step.source.last) steps << @step_or_hook_hash @step_hash = @step_or_hook_hash end
# File lib/cucumber/formatter/json.rb, line 72 def on_finished_testing(event) @io.write(MultiJson.dump(@feature_hashes, pretty: true)) end
# File lib/cucumber/formatter/json.rb, line 76 def puts(message) test_step_output << message end
# File lib/cucumber/formatter/json.rb, line 190 def add_failed_around_hook(result) @step_or_hook_hash = {} around_hooks << @step_or_hook_hash @step_or_hook_hash[:match] = { location: "unknown_hook_location:1" } @step_or_hook_hash[:result] = create_result_hash(result) end
# File lib/cucumber/formatter/json.rb, line 185 def add_match_and_result(test_step, result) @step_or_hook_hash[:match] = create_match_hash(test_step, result) @step_or_hook_hash[:result] = create_result_hash(result) end
# File lib/cucumber/formatter/json.rb, line 138 def after_hooks @element_hash[:after] ||= [] end
# File lib/cucumber/formatter/json.rb, line 146 def after_step_hooks @step_hash[:after] ||= [] end
# File lib/cucumber/formatter/json.rb, line 142 def around_hooks @element_hash[:around] ||= [] end
# File lib/cucumber/formatter/json.rb, line 134 def before_hooks @element_hash[:before] ||= [] end
# File lib/cucumber/formatter/json.rb, line 179 def create_data_table_value(data_table) data_table.raw.map do |row| { cells: row } end end
# File lib/cucumber/formatter/json.rb, line 170 def create_doc_string_hash(doc_string) content_type = doc_string.content_type ? doc_string.content_type : "" { value: doc_string.content, content_type: content_type, line: doc_string.location.line } end
# File lib/cucumber/formatter/json.rb, line 211 def create_error_message(result) message_element = result.failed? ? result.exception : result message = "#{message_element.message} (#{message_element.class})" ([message] + message_element.backtrace).join("\n") end
# File lib/cucumber/formatter/json.rb, line 198 def create_match_hash(test_step, result) { location: test_step.action_location.to_s } end
# File lib/cucumber/formatter/json.rb, line 202 def create_result_hash(result) result_hash = { status: result.to_sym } result_hash[:error_message] = create_error_message(result) if result.failed? || result.pending? result.duration.tap { |duration| result_hash[:duration] = duration.nanoseconds } result_hash end
# File lib/cucumber/formatter/json.rb, line 158 def create_step_hash(step_source) step_hash = { keyword: step_source.keyword, name: step_source.name, line: step_source.location.line } step_hash[:comments] = Formatter.create_comments_array(step_source.comments) unless step_source.comments.empty? step_hash[:doc_string] = create_doc_string_hash(step_source.multiline_arg) if step_source.multiline_arg.doc_string? step_hash[:rows] = create_data_table_value(step_source.multiline_arg) if step_source.multiline_arg.data_table? step_hash end
# File lib/cucumber/formatter/json.rb, line 109 def current_feature @feature_hash ||= {} end
# File lib/cucumber/formatter/json.rb, line 217 def encode64(data) # strip newlines from the encoded data Base64.encode64(data).gsub(/\n/, '') end
# File lib/cucumber/formatter/json.rb, line 113 def feature_elements @feature_hash[:elements] ||= [] end
# File lib/cucumber/formatter/json.rb, line 101 def first_step_after_background?(test_step) test_step.source[1].name != @element_hash[:name] end
# File lib/cucumber/formatter/json.rb, line 121 def hooks_of_type(hook_query) case hook_query.type when :before return before_hooks when :after return after_hooks when :after_step return after_step_hooks else fail 'Unkown hook type ' + hook_query.type.to_s end end
# File lib/cucumber/formatter/json.rb, line 105 def internal_hook?(test_step) test_step.source.last.location.file.include?('lib/cucumber/') end
# File lib/cucumber/formatter/json.rb, line 97 def same_feature_as_previous_test_case?(feature) current_feature[:uri] == feature.file && current_feature[:line] == feature.location.line end
# File lib/cucumber/formatter/json.rb, line 117 def steps @element_hash[:steps] ||= [] end
# File lib/cucumber/formatter/json.rb, line 154 def test_step_embeddings @step_or_hook_hash[:embeddings] ||= [] end
# File lib/cucumber/formatter/json.rb, line 150 def test_step_output @step_or_hook_hash[:output] ||= [] end