class Chop::Form

Public Class Methods

diff!(selector, table, session: Capybara.current_session, &block) click to toggle source
# File lib/chop/form.rb, line 10
def self.diff! selector, table, session: Capybara.current_session, &block
  root = begin
    if selector.is_a?(Capybara::Node::Element)
      selector
    else
      session.find(selector)
    end
  rescue Capybara::ElementNotFound
    raise unless @allow_not_found
    Node("")
  end

  all_fields = root.all("input, textarea, select")
  relevant_fields = all_fields.inject([]) do |fields, field|
    next fields if field[:name].blank?
    next fields if field[:type] == "submit"
    next fields if field[:type] == "hidden"
    fields + [field]
  end
  deduplicated_fields = relevant_fields.inject([]) do |fields, field|
    next fields if fields.map { |field| field[:name] }.include?(field[:name])
    fields + [field]
  end
  actual = deduplicated_fields.inject([]) do |fields, field|
    next fields unless label = find_label_for(field)
    field = Field.from(session, field)
    fields + [[label.text(:all), field.get_value.to_s]]
  end
  table.diff! actual, surplus_row: false, misplaced_col: false
end
fill_in!(table, session: Capybara.current_session, path: "features/support/fixtures") click to toggle source
# File lib/chop/form.rb, line 6
def self.fill_in! table, session: Capybara.current_session, path: "features/support/fixtures"
  new(table, session, path).fill_in!
end
find_label_for(field, session: Capybara.current_session) click to toggle source
# File lib/chop/form.rb, line 41
def self.find_label_for field, session: Capybara.current_session
  if field[:id].present?
    session.first("label[for='#{field[:id]}']", visible: :all)
  else
    raise "cannot find label without id... yet"
  end
end

Public Instance Methods

fill_in!() click to toggle source
# File lib/chop/form.rb, line 49
def fill_in!
  table.rows_hash.each do |label, value|
    Field.for(session, label, value, path).fill_in!
  end
end