rspec-hanami
rspec-hanami copied to clipboard
Form matcher's failure message unexpected behaviour
Ok, I would actually address 3 issues here but since they all related to the same method they might have a single solution.
First
Each matcher includes following code:
failure_message { |actual| "expect #{form.inspect} (#{attributes}) to have #{method} method param" }
Anytime any of the matchers fails I receive the following error:
Failure/Error: it { expect(view.form).to have_form_field(node: "input", type: "password") }
FrozenError: can't modify frozen String
This error comes from the #{form.inspect} operation when RSpec generates failure message and originates in haml's inspect method (which calls gsub! with a frozen string option enabled).
I was not able to reproduce this error using rspec-hanami repo and haml though. However I'm sure I'm just missing out something that happens under Hanami's hood.
Second
Whenever form matcher fail failure_message would output multi page diff of a FormBuilder object which is overkill.
Third
have_field matcher's failure_message includes errors. Look at that, there is no #{form.inspect}, #{attributes} or #{method} defined within matcher. Obviously that's must be a copy-paste issue from 'have_method' matcher.
matcher :have_field do |params|
require 'hanami/utils/hash'
attr_reader :form, :form_data, :params
description { "have field with params" }
match do |form|
@form = form
@params = ::Hanami::Utils::Hash.new(params).symbolize!
@form_data = RSpec::Hanami::FormParser.new.call(form.to_s)
form_data.any? do |input|
input.merge(params) == params.merge(input)
end
end
failure_message { |actual| "expect #{form.inspect} (#{attributes}) to have #{method} method param" }
diffable
end
Solution
So as I mentioned one approach might handle all three issues:
- Output
@form_data = RSpec::Hanami::FormParser.new.call(form.to_s)instead of '#{form.inspect}' in `failure_message' of every matcher. - Remove
diffablefor every form matcher. - Fix
have_fieldmatcher'sfailure_messagewithparams.
PR #25 as a proposal