require 'minitest/autorun' require 'prism' class FormForHelperTest < Minitest::Test FakeModel = Struct.new(:id, :title) do def persisted? !id.nil? end end HelpersWithCsrf = Struct.new(:csrf_token) def render(source, helpers = nil) Prism::Template.render(source, {}, nil, helpers) end def test_form_for_new_record_uses_post html = render(<<~ERB) <% form_for(FormForHelperTest::FakeModel.new, url: "/posts") do |f| %> <%== f.text_field(:title) %> <% end %> ERB assert_includes html, '
' refute_includes html, '_method' assert_includes html, 'name="fake_model[title]"' assert_includes html, '
' end def test_form_for_persisted_record_defaults_to_patch_via_method_override html = render(<<~ERB) <% form_for(FormForHelperTest::FakeModel.new(1, "hi"), url: "/posts/1") do |f| %> <%== f.submit %> <% end %> ERB assert_includes html, '
' assert_includes html, '' end def test_form_for_explicit_method_delete html = render(<<~ERB) <% form_for(FormForHelperTest::FakeModel.new, url: "/posts/1", method: :delete) do |f| %> <% end %> ERB assert_includes html, '' end def test_form_for_embeds_csrf_token_when_helpers_provide_one helpers = HelpersWithCsrf.new('secrettoken') html = render(<<~ERB, helpers) <% form_for(FormForHelperTest::FakeModel.new, url: "/posts") do |f| %> <% end %> ERB assert_includes html, '' end def test_form_for_without_helpers_has_no_csrf_field html = render(<<~ERB) <% form_for(FormForHelperTest::FakeModel.new, url: "/posts") do |f| %> <% end %> ERB refute_includes html, 'authenticity_token' end def test_form_for_get_has_no_csrf_field helpers = HelpersWithCsrf.new('secrettoken') html = render(<<~ERB, helpers) <% form_for(FormForHelperTest::FakeModel.new, url: "/posts", method: :get) do |f| %> <% end %> ERB refute_includes html, 'authenticity_token' end def test_content_between_form_fields_is_placed_in_order html = render(<<~ERB) <% form_for(FormForHelperTest::FakeModel.new, url: "/posts") do |f| %> <%== f.label(:title) %> <%== f.text_field(:title) %> <% end %> ERB assert html.index('') end end