Ransack Integration Test
In my efforts to test the right stuff, I wanted to test that my basic search was working properly. I have a collection of plates that we’re storing a bunch of information on. Each plate has a unique serial number. We also have a unique id for each plate, but for our users, the serial number is what they’ll use to identify it. So I wanted to make a form that would let people search for a particular plate based on the serial number. And since this search form will be on my home controller and not the plate controller, I need to use an integration test to do this.
I’m using ransack for search. In this case, my form has one field, so this is it:
<%= search_form_for @q, :url => search_plates_path, :html => {:method => :post} do |f| %> <%= f.submit 'Go to Incom Serial Number' %> <%= f.text_field :incom_serial_number_eq %> <% end %>
It works perfectly. Now I want to have a test for it.
yo:mcp maryh$ rails g integration_test basic_search invoke test_unit create test/integration/basic_search_test.rb
I have two fixtures and I’ll search and see if I can find one of them.
text/fixtures/plates.yml
one: incom_serial_number: 13600-001 incom_part_code: S203-P20-L60-O60-B08-C00 incom_part_number: 300-2672-C two: incom_serial_number: 13600-002 incom_part_code: S203-P20-L60-O60-B08-C00 incom_part_number: 300-3657-A
Here’s what my integration test looks like.
require 'test_helper' class BasicSearchTest < ActionDispatch::IntegrationTest fixtures :all # Always use all, might need things in other fixtures def logger Logger.new(STDOUT) end test 'find good plate' do get "/home/index" assert_response :success post "/plates/search", "q" => { "incom_serial_number_eq" => "13600-002"} assert_response :success assert_template "show" # No easy way to check the table values for the result of the search # Using tag ids to enable selection, get the entry, turn it into a string, # split it on the line break and check that the value is correct serial_number = css_select("td#serial_number") value = serial_number[0].to_s.split("
") assert_equal '13600-002</td>', value[1],"Serial Number wrong" part_code = css_select("td#part_code") value = part_code[0].to_s.split("
") assert_equal 'S203-P20-L60-O60-B08-C00</td>', value[1], "Part Code wrong" part_number = css_select("td#part_number") value = part_number[0].to_s.split("
") assert_equal '300-3657-A</td>', value[1], "Part Number wrong" end test 'do not find missing plate' do post "/plates/search", "q" => { "incom_serial_number_eq" => "1111-11"} assert_redirected_to search_path, "Not redirected correctly" assert_equal '1111-11 does not exist', flash[:notice], "Wrong flash notice" end end
I made it easy on myself by using an id in the html tags for the stuff I wanted. Then I just converted the results to a string and got it down to something I could compare. It’s probably not the prettiest test ever written, but it works, so I’m happy.