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.