# Formulaic Remove the tedium of formulaic form filling with Capybara. Formulaic allows you to specify a hash of attributes to be input rather than procedurally calling Capybara’s DSL methods. ## Usage ```ruby feature 'New user registration' do scenario 'successfull sign up' do visit sign_in_path fill_form(:user, { name: 'Caleb', email: 'caleb@thoughtbot.com', 'Terms of Service': true }) click_on submit(:user) expect(page).to have_content t('user.create.success') end end ``` ### `fill_form` ```ruby fill_form(model_name, attributes) ``` `fill_form` provides an interface to completely filling out a form. Provide the `model_name` as a symbol and `attributes` as a hash of `column name => database value` or `label string => database value`. If an `attributes` key is a `String`, it will be used as the literal label. For `Symbol` we will attempt to translate, fall back to `human_attribute_name` if available, then call `to_s`. ### `input` ```ruby input(model_name, field) ``` `input` gives an easy way to find the translated text of an input. It is primarily used internally to fill ``s, but is provided in the public API as it could be useful. ### `submit` ```ruby submit(model_name, action = :create) ``` `submit` functions like [`input`](#input), but finds the translation for the submit button of the form. `model_name` should be the same as what you provide to [`fill_form`](#fill\_form). Typically, the return value of `submit` will be passed directly to Capybara’s `click_on` method. If you are submitting a form that is not for the `create` action, you may need to pass the `action`: ```ruby submit(:user, :update) ``` The `model_name` and `action` should match up to the `helpers.submit..` translations. ### Integration with RSpec: ```ruby # spec/spec_helper.rb RSpec.configure do |config| config.include Formulaic::Dsl end ``` ### Integration with [FactoryGirl](https://github.com/thoughtbot/factory_girl) ```ruby fill_form(:user, attributes_for(:user)) ``` You may have attributes included in your `User` factory that don’t pertain to sign up: ```ruby fill_form(:user, attributes_for(:user).slice(sign_up_attributes)) # ... def sign_up_attributes [:name, :email, :terms_of_service] end ``` ## Known Limitations * Formulaic currently supports the following mappings from the `#class` of the attribute values to Capybara method calls: | Classes | Formulaic’s action | | --------------------------------------|-------------------------------| | `String` | `fill_in` | | `Date`, `ActiveSupport::TimeWithZone` | `select` year, month, and day | | `TrueClass` | `check` | | `FalseClass` | `uncheck` | | `Array` | `check` each array member, which should all be strings | * Formulaic is currently tied to `simple_form` translations and field structure. If you pass a string for the attribute, we’ll try to fill the input that relates to that label. We would be happy to work with you to add support for other form builders. * Formulaic currently does not support forms with duplicate labels, as it is designed to be as similar as possible to a user completing a form—it looks at the labels to determine where to fill what data. * Formulaic can’t figure out how to fill fields with HTML labels: `page.fill_in('Text here', with: 'something')` doesn’t work with Capybara. The usual workaround is to pass a CSS selector. ## About Formulaic is maintained by [Caleb Thompson](http://github.com/calebthompson). It was written by [thoughtbot](http://thoughtbot.com) with the help of our [contributors](http://github.com/thoughtbot/formulaic/contributors). [![Ralph](http://thoughtbot.com/assets/thoughtbot-logo.png)](http://thoughtbot.com)