From ca1bce9d8ae2b2142c8fbb095ffb3f8b5a77bb3e Mon Sep 17 00:00:00 2001 From: Pranav Babu Date: Sat, 10 Feb 2024 14:40:08 +0100 Subject: [PATCH 1/6] Add ability to specify non-exist field for combobox --- app/presenters/hotwire_combobox/component.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/presenters/hotwire_combobox/component.rb b/app/presenters/hotwire_combobox/component.rb index 8a86814..60a89e0 100644 --- a/app/presenters/hotwire_combobox/component.rb +++ b/app/presenters/hotwire_combobox/component.rb @@ -204,7 +204,11 @@ def hidden_field_data end def hidden_field_value - form&.object&.public_send(name) || value + if form&.object&.respond_to?(name) + form.object.public_send(name) + else + value + end end From 845964d67264dade45ec647101065e1a4b226d8c Mon Sep 17 00:00:00 2001 From: Pranav Babu Date: Sun, 11 Feb 2024 12:13:30 +0100 Subject: [PATCH 2/6] Use try instead of respond_to? --- app/presenters/hotwire_combobox/component.rb | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/app/presenters/hotwire_combobox/component.rb b/app/presenters/hotwire_combobox/component.rb index 60a89e0..8a53a98 100644 --- a/app/presenters/hotwire_combobox/component.rb +++ b/app/presenters/hotwire_combobox/component.rb @@ -204,11 +204,7 @@ def hidden_field_data end def hidden_field_value - if form&.object&.respond_to?(name) - form.object.public_send(name) - else - value - end + form&.object&.try(name) || value end From aeaf6238cf632e7700b740ccddcd93174a1ed496 Mon Sep 17 00:00:00 2001 From: Pranav Babu Date: Sun, 11 Feb 2024 12:13:44 +0100 Subject: [PATCH 3/6] Add mock_form helper --- test/application_view_test_case.rb | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/test/application_view_test_case.rb b/test/application_view_test_case.rb index 25a726a..106fb0c 100644 --- a/test/application_view_test_case.rb +++ b/test/application_view_test_case.rb @@ -10,6 +10,21 @@ def assert_attrs(tag, tag_name: :input, **attrs) assert_match /<#{tag_name}.* #{attrs}/, tag end + def mock_form(form_object: OpenStruct.new) + form = OpenStruct.new + form.define_singleton_method(:field_id) { |name| "#{name}_id" } + form.define_singleton_method(:field_name) { |name| name } + form.define_singleton_method(:object) { form_object } + form_object.define_singleton_method(:public_send) do |method_name, *args| + if form_object.respond_to?(method_name) + super(method_name, *args) + else + raise NoMethodError, "undefined method `#{method_name}` for #{form_object.inspect}" + end + end + form + end + private def escape_specials(value) special_characters = Regexp.union "[]".chars From aa1f93b5bb8e07b0f5866728cc655de744b25c90 Mon Sep 17 00:00:00 2001 From: Pranav Babu Date: Sun, 11 Feb 2024 12:14:11 +0100 Subject: [PATCH 4/6] Add component tests for hidden_field_attrs method --- .../hotwire_combobox/component_test.rb | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 test/presenters/hotwire_combobox/component_test.rb diff --git a/test/presenters/hotwire_combobox/component_test.rb b/test/presenters/hotwire_combobox/component_test.rb new file mode 100644 index 0000000..b6bd8c0 --- /dev/null +++ b/test/presenters/hotwire_combobox/component_test.rb @@ -0,0 +1,51 @@ +require 'test_helper' + +class HotwireCombobox::ComponentTest < ApplicationViewTestCase + setup do + @view = ActionView::Base.new(ActionController::Base.view_paths, {}, ActionController::Base.new) + end + + test "hidden_field_attrs returns value from form object if available" do + existent_field_on_model = "Peter" + field_name = :name + component = HotwireCombobox::Component.new( + @view, field_name, + form: mock_form(form_object: OpenStruct.new("#{field_name}": existent_field_on_model)), + ) + + assert_equal component.hidden_field_attrs, { id: "#{field_name}_id-hw-hidden-field", + name: :name, + data: { hw_combobox_target: "hiddenField" }, + value: existent_field_on_model } + end + + test "hidden_field_attrs returns component value if not available in form object" do + field_name = "options[name]" + specified_value = "Peter" + component = HotwireCombobox::Component.new( + @view, field_name, + form: mock_form, + value: specified_value + ) + + assert_equal component.hidden_field_attrs, { id: "#{field_name}_id-hw-hidden-field", + name: field_name, + data: { hw_combobox_target: "hiddenField" }, + value: specified_value } + + end + + test "hidden_field_attrs returns nil for value if neither form object nor component value is available" do + field_name = "options[name]" + component = HotwireCombobox::Component.new( + @view, field_name, + form: mock_form, + ) + + assert_equal component.hidden_field_attrs, { id: "#{field_name}_id-hw-hidden-field", + name: field_name, + data: { hw_combobox_target: "hiddenField" }, + value: nil } + + end +end \ No newline at end of file From 2ac2d1091e0d89a5cd644f9aad3843d66454c5e9 Mon Sep 17 00:00:00 2001 From: pranavbabu <54139019+pranavbabu@users.noreply.github.com> Date: Mon, 12 Feb 2024 15:52:26 +0100 Subject: [PATCH 5/6] Update test/presenters/hotwire_combobox/component_test.rb Co-authored-by: Jose Farias <31393016+josefarias@users.noreply.github.com> --- test/presenters/hotwire_combobox/component_test.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/presenters/hotwire_combobox/component_test.rb b/test/presenters/hotwire_combobox/component_test.rb index b6bd8c0..07feb5e 100644 --- a/test/presenters/hotwire_combobox/component_test.rb +++ b/test/presenters/hotwire_combobox/component_test.rb @@ -1,4 +1,4 @@ -require 'test_helper' +require "test_helper" class HotwireCombobox::ComponentTest < ApplicationViewTestCase setup do From ac411b63c0d59eaf7409fad91c34a66d98958a67 Mon Sep 17 00:00:00 2001 From: pranavbabu <54139019+pranavbabu@users.noreply.github.com> Date: Mon, 12 Feb 2024 15:52:53 +0100 Subject: [PATCH 6/6] Update test/presenters/hotwire_combobox/component_test.rb Co-authored-by: Jose Farias <31393016+josefarias@users.noreply.github.com> --- test/presenters/hotwire_combobox/component_test.rb | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/test/presenters/hotwire_combobox/component_test.rb b/test/presenters/hotwire_combobox/component_test.rb index 07feb5e..ebe4ad4 100644 --- a/test/presenters/hotwire_combobox/component_test.rb +++ b/test/presenters/hotwire_combobox/component_test.rb @@ -8,10 +8,8 @@ class HotwireCombobox::ComponentTest < ApplicationViewTestCase test "hidden_field_attrs returns value from form object if available" do existent_field_on_model = "Peter" field_name = :name - component = HotwireCombobox::Component.new( - @view, field_name, - form: mock_form(form_object: OpenStruct.new("#{field_name}": existent_field_on_model)), - ) + component = HotwireCombobox::Component.new @view, field_name, + form: mock_form(form_object: OpenStruct.new("#{field_name}": existent_field_on_model)) assert_equal component.hidden_field_attrs, { id: "#{field_name}_id-hw-hidden-field", name: :name,