Back to Repositories

Testing Input Field Generation and Attributes in SimpleForm

This test suite validates the functionality of input field generation and attribute handling in SimpleForm. It focuses on testing various input types, CSS class generation, and autofocus attribute behavior across different form elements.

Test Coverage Overview

The test suite provides comprehensive coverage of SimpleForm’s input field generation capabilities.

Key areas tested include:
  • CSS class generation for different input types (string, text, integer, date, datetime)
  • Autofocus attribute handling across all input types
  • Input class configuration and customization
  • Form generation without an associated object

Implementation Analysis

The testing approach uses ActionView::TestCase as the base framework, implementing systematic validation of form input behaviors. The tests utilize SimpleForm’s configuration swapping to verify different scenarios and employ assertion patterns to validate both presence and absence of specific HTML attributes and classes.

Technical Details

Testing tools and setup:
  • Minitest framework
  • ActionView::TestCase for view testing
  • SimpleForm configuration methods
  • CSS selector assertions for HTML validation
  • Test helper methods for input generation

Best Practices Demonstrated

The test suite exemplifies strong testing practices through systematic organization and thorough coverage.

Notable practices include:
  • Isolated test cases for each feature
  • Comprehensive edge case testing
  • Clear test naming conventions
  • Proper setup and teardown using configuration swapping

heartcombo/simple_form

test/inputs/general_test.rb

            
# frozen_string_literal: true
# encoding: UTF-8
require 'test_helper'

class InputTest < ActionView::TestCase
  test 'input generates css class based on default input type' do
    with_input_for @user, :name, :string
    assert_select 'input.string'
    with_input_for @user, :description, :text
    assert_select 'textarea.text'
    with_input_for @user, :age, :integer
    assert_select 'input.integer'
    with_input_for @user, :born_at, :date
    assert_select 'select.date'
    with_input_for @user, :created_at, :datetime
    assert_select 'select.datetime'
  end

  test 'string input generates autofocus attribute when autofocus option is true' do
    with_input_for @user, :name, :string, autofocus: true
    assert_select 'input.string[autofocus]'
  end

  test 'input accepts input_class configuration' do
    swap SimpleForm, input_class: :xlarge do
      with_input_for @user, :name, :string
      assert_select 'input.xlarge'
      assert_no_select 'div.xlarge'
    end
  end

  test 'input does not add input_class when configured to not generate additional classes for input' do
    swap SimpleForm, input_class: 'xlarge', generate_additional_classes_for: [:wrapper] do
      with_input_for @user, :name, :string
      assert_select 'input'
      assert_no_select '.xlarge'
    end
  end

  test 'text input generates autofocus attribute when autofocus option is true' do
    with_input_for @user, :description, :text, autofocus: true
    assert_select 'textarea.text[autofocus]'
  end

  test 'numeric input generates autofocus attribute when autofocus option is true' do
    with_input_for @user, :age, :integer, autofocus: true
    assert_select 'input.integer[autofocus]'
  end

  test 'date input generates autofocus attribute when autofocus option is true' do
    with_input_for @user, :born_at, :date, autofocus: true
    assert_select 'select.date[autofocus]'
  end

  test 'datetime input generates autofocus attribute when autofocus option is true' do
    with_input_for @user, :created_at, :datetime, autofocus: true
    assert_select 'select.datetime[autofocus]'
  end

  test 'string input generates autofocus attribute when autofocus option is false' do
    with_input_for @user, :name, :string, autofocus: false
    assert_no_select 'input.string[autofocus]'
  end

  test 'text input generates autofocus attribute when autofocus option is false' do
    with_input_for @user, :description, :text, autofocus: false
    assert_no_select 'textarea.text[autofocus]'
  end

  test 'numeric input generates autofocus attribute when autofocus option is false' do
    with_input_for @user, :age, :integer, autofocus: false
    assert_no_select 'input.integer[autofocus]'
  end

  test 'date input generates autofocus attribute when autofocus option is false' do
    with_input_for @user, :born_at, :date, autofocus: false
    assert_no_select 'select.date[autofocus]'
  end

  test 'datetime input generates autofocus attribute when autofocus option is false' do
    with_input_for @user, :created_at, :datetime, autofocus: false
    assert_no_select 'select.datetime[autofocus]'
  end

  test 'string input generates autofocus attribute when autofocus option is not present' do
    with_input_for @user, :name, :string
    assert_no_select 'input.string[autofocus]'
  end

  test 'text input generates autofocus attribute when autofocus option is not present' do
    with_input_for @user, :description, :text
    assert_no_select 'textarea.text[autofocus]'
  end

  test 'numeric input generates autofocus attribute when autofocus option is not present' do
    with_input_for @user, :age, :integer
    assert_no_select 'input.integer[autofocus]'
  end

  test 'date input generates autofocus attribute when autofocus option is not present' do
    with_input_for @user, :born_at, :date
    assert_no_select 'select.date[autofocus]'
  end

  test 'datetime input generates autofocus attribute when autofocus option is not present' do
    with_input_for @user, :created_at, :datetime
    assert_no_select 'select.datetime[autofocus]'
  end

  # With no object
  test 'input is generated properly when object is not present' do
    with_input_for :project, :name, :string
    assert_select 'input.string.required#project_name'
  end

  test 'input as radio is generated properly when object is not present ' do
    with_input_for :project, :name, :radio_buttons
    assert_select 'input.radio_buttons#project_name_true'
    assert_select 'input.radio_buttons#project_name_false'
  end

  test 'input as select with collection is generated properly when object is not present' do
    with_input_for :project, :name, :select, collection: %w[Jose Carlos]
    assert_select 'select.select#project_name'
  end

  test 'input does not generate empty css class' do
    swap SimpleForm, generate_additional_classes_for: %i[wrapper label] do
      with_input_for :project, :name, :string
      assert_no_select 'input#project_name[class]'
    end
  end
end