hungryform-rails 0.0.1 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/.rspec +2 -0
  4. data/.ruby-version +1 -0
  5. data/.travis.yml +16 -0
  6. data/Gemfile +4 -0
  7. data/README.md +37 -1
  8. data/Rakefile +3 -0
  9. data/app/assets/javascripts/hungryform.js +145 -0
  10. data/app/assets/stylesheets/hungryform.css +8 -0
  11. data/app/views/hungryform/_checkbox_field.html.erb +12 -0
  12. data/app/views/hungryform/_form.html.erb +11 -0
  13. data/app/views/hungryform/_group.html.erb +7 -0
  14. data/app/views/hungryform/_html.html.erb +5 -0
  15. data/app/views/hungryform/_radio_group.html.erb +11 -0
  16. data/app/views/hungryform/_select_field.html.erb +9 -0
  17. data/app/views/hungryform/_text_area.html.erb +9 -0
  18. data/app/views/hungryform/_text_field.html.erb +9 -0
  19. data/gemfiles/rails3.gemfile +5 -0
  20. data/gemfiles/rails4.gemfile +5 -0
  21. data/gemfiles/rails41.gemfile +5 -0
  22. data/gemfiles/rails42.gemfile +5 -0
  23. data/hungryform-rails.gemspec +31 -0
  24. data/lib/hungryform/rails/action_view.rb +90 -0
  25. data/lib/hungryform/rails/engine.rb +6 -0
  26. data/lib/hungryform/rails/railtie.rb +24 -0
  27. data/lib/hungryform/rails/renderable.rb +13 -0
  28. data/lib/hungryform/rails/version.rb +5 -0
  29. data/lib/hungryform/rails.rb +11 -0
  30. data/lib/hungryform-rails.rb +1 -0
  31. data/spec/action_view_spec.rb +106 -0
  32. data/spec/dummy/app.rb +96 -0
  33. data/spec/dummy/vendor/assets/javascripts/jquery-2.1.3.min.js +4 -0
  34. data/spec/features/field_dependencies_spec.rb +51 -0
  35. data/spec/features/form_walk_spec.rb +92 -0
  36. data/spec/spec_helper.rb +21 -0
  37. data/spec/views/checkbox_field_spec.rb +28 -0
  38. data/spec/views/form_spec.rb +42 -0
  39. data/spec/views/group_spec.rb +35 -0
  40. data/spec/views/html_spec.rb +22 -0
  41. data/spec/views/select_field_spec.rb +35 -0
  42. data/spec/views/shared_examples/rendered_active_element.rb +34 -0
  43. data/spec/views/shared_examples/wrapped.rb +28 -0
  44. data/spec/views/text_area_spec.rb +28 -0
  45. data/spec/views/text_field_spec.rb +28 -0
  46. metadata +69 -18
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a38fbe1effb02a387bf5119e4db7a89eb3aaf878
4
- data.tar.gz: ebc355dc8c070ef660fb45891b927602aac42ce3
3
+ metadata.gz: 5e1dbc3db77663b5d70ffed6dc331c8567ddb438
4
+ data.tar.gz: 68cb11ae8193f7047e1a4cd74b6c2ac0fe481f26
5
5
  SHA512:
6
- metadata.gz: a2027d47d9bf11c2b46e2b424f282644cef5180d41cbe3f385cb1f80d1656fda846dfe82b8a46119a9f0a3b3a24d9bb835e660a6bc81aa9f075fd674d2fe5c77
7
- data.tar.gz: e23f29f6152a65c01c219105d4aacf7124958ae4fa6a134faff741a38e76cb82ac1c1d279276446e476e27c21477d1cb188901a2f9d04bf53d3b9b00a80437e7
6
+ metadata.gz: 61346d2de43d07701d7375cb85f0982e789e90d752060ae205fadfc8a37b84fb947a898d5935bfdb83fd10148d0e2eb950372212222403b86d90c02df6c19337
7
+ data.tar.gz: 3b4da5e9334f8d65bf48a78fee4aa2fe873256fb245d1630ed5febe67a9d9709960dc56098e8d136f154fdc9bd47b0d5f1122de2b1ef61520a61553f063144cd
data/.gitignore CHANGED
@@ -1,10 +1,12 @@
1
1
  *.gem
2
2
  *.rbc
3
+ *.log
3
4
  /.config
4
5
  /coverage/
5
6
  /InstalledFiles
6
7
  /pkg/
7
8
  /spec/reports/
9
+ /spec/dummy/tmp/
8
10
  /test/tmp/
9
11
  /test/version_tmp/
10
12
  /tmp/
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format progress
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.1.5
data/.travis.yml ADDED
@@ -0,0 +1,16 @@
1
+ language: ruby
2
+
3
+ install:
4
+ - 'travis_retry bundle install'
5
+
6
+ gemfile:
7
+ - gemfiles/rails3
8
+ - gemfiles/rails4
9
+ - gemfiles/rails41
10
+ - gemfiles/rails42
11
+
12
+ sudo: false
13
+
14
+ cache: bundler
15
+
16
+ script: bundle exec rspec spec
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in hungryform-rails.gemspec
4
+ gemspec
data/README.md CHANGED
@@ -1 +1,37 @@
1
- # hungryform-rails
1
+ #Hungryform Rails [![Build Status](https://travis-ci.org/andrba/hungryform-rails.svg?branch=master)](https://travis-ci.org/andrba/hungryform-rails)
2
+
3
+ This gem is an adaptor between the HungryForm gem and Rails.
4
+
5
+ ##Installation:
6
+
7
+ Add the hungryform gem to your Gemfile:
8
+ ```ruby
9
+ gem "hungryform-rails"
10
+ ```
11
+
12
+ Add the Hungryform require to your application.js:
13
+ ```
14
+ //= require hungryform
15
+ ```
16
+
17
+ Add the Hungryform require to your application.css:
18
+ ```
19
+ //= require hungryform
20
+ ```
21
+
22
+ Use the following helper to generate the form in your views:
23
+
24
+ ```ruby
25
+ <%= hungry_form_for(@form) %>
26
+ ```
27
+
28
+ ##Configuration
29
+
30
+ This gem extends the configuration options provided by Hungryform. Create initializer in ```config/initializers/hungryform.rb``` and place the configuration code inside:
31
+
32
+ ```ruby
33
+ Hungryform.configure do |config|
34
+ config.rails.elements_templates = 'hungryform'
35
+ end
36
+ ```
37
+
data/Rakefile ADDED
@@ -0,0 +1,3 @@
1
+ # encoding: utf-8
2
+
3
+ require "bundler/gem_tasks"
@@ -0,0 +1,145 @@
1
+ // Module to handle form interactions such as
2
+ // prev, next links and dependency resolution
3
+ (function($) {
4
+
5
+ function HungryForm(form) {
6
+ this.form = form;
7
+ this.$form = $(form);
8
+
9
+ this.init();
10
+ }
11
+
12
+ HungryForm.prototype = {
13
+ init: function() {
14
+ this.bindEvents();
15
+ },
16
+
17
+ bindEvents: function() {
18
+ var form_action = this.$form.find("input[name='form_action']"),
19
+ that = this;
20
+
21
+ this.$form.find(':input').on('change select', function() {
22
+ that.updateVisibility();
23
+ });
24
+
25
+ this.$form.find('input, select').keypress(function(event) {
26
+ return event.keyCode !== 13;
27
+ });
28
+
29
+ $("a[data-rel='" + this.$form.data('rel') + "'][data-form-action]").on('click', function(event) {
30
+ if ($(this).data('form-method') === 'get') {
31
+ return true;
32
+ }
33
+
34
+ event.preventDefault();
35
+
36
+ var action = $(this).data('form-action');
37
+ form_action.val(action);
38
+ that.$form.attr('action', $(this).attr('href'));
39
+
40
+ that.$form.submit();
41
+ });
42
+ },
43
+
44
+ updateVisibility: function() {
45
+ var that = this;
46
+ this.$form.find('div[data-dependency], fieldset[data-dependency]').each(function() {
47
+ var obj = $(this);
48
+ var dependency = obj.data('dependency');
49
+
50
+ if (that.resolveDependency(dependency)) {
51
+ that._setObjectVisibility(obj, true);
52
+ } else {
53
+ that._setObjectVisibility(obj, false);
54
+ }
55
+ });
56
+ },
57
+
58
+ resolveDependency: function(dependency) {
59
+ var isDependent = false;
60
+ var that = this;
61
+
62
+ $.each(dependency, function(operator, args) {
63
+ if (operator === 'eq') {
64
+ isDependent = that._isEqual(args);
65
+ return false;
66
+ } else if (operator === 'lt') {
67
+ isDependent = that._isLessThan(args);
68
+ return false;
69
+ } else if (operator === 'gt') {
70
+ isDependent = that._isGreaterThan(args);
71
+ return false;
72
+ } else if (operator === 'not') {
73
+ isDependent = !that.resolveDependency(args);
74
+ return false;
75
+ } else if (operator === 'is') {
76
+ isDependent = that._isSet(args);
77
+ return false;
78
+ } else if (operator === 'and') {
79
+ isDependent = true;
80
+ $.each(args, function(index, argument) {
81
+ isDependent = that.resolveDependency(argument) && isDependent;
82
+ if (isDependent === false) {
83
+ //No need to check the rest of the dependencies
84
+ return false;
85
+ }
86
+ });
87
+ return false;
88
+ } else if (operator === 'or') {
89
+ $.each(args, function(index, argument) {
90
+ isDependent = that.resolveDependency(argument) || isDependent;
91
+ if (isDependent === true) {
92
+ //No need to check the rest of the dependencies
93
+ return false;
94
+ }
95
+ });
96
+ return false;
97
+ }
98
+ });
99
+
100
+ return isDependent;
101
+ },
102
+ _isEqual: function(args) {
103
+ return args.length > 1 && this._getArgument(args[0]).toString() === this._getArgument(args[1]).toString();
104
+ },
105
+ _isLessThan: function(args) {
106
+ return args.length > 1 && parseFloat(this._getArgument(args[0])) < parseFloat(this._getArgument(args[1]));
107
+ },
108
+ _isGreaterThan: function(args) {
109
+ return args.length > 1 && parseFloat(this._getArgument(args[0])) > parseFloat(this._getArgument(args[1]));
110
+ },
111
+ _isSet: function(args) {
112
+ return typeof(args[0]) !== 'undefined' && this._getArgument(args[0]).length > 0;
113
+ },
114
+ _getArgument: function(argument) {
115
+ var input = this.$form.find("input[name='" + argument + "'], textarea[name='" + argument + "'], select[name='" + argument + "']");
116
+
117
+ if (input.length > 0) {
118
+ if (input.filter(':radio').length > 0) {
119
+ return input.filter(':radio:checked').length > 0? input.filter(':radio:checked').val() : '';
120
+ } else if (input.filter(':checkbox').length > 0) {
121
+ return input.filter(':checkbox:checked').length > 0? input.filter(':checkbox:checked').val() : '';
122
+ } else {
123
+ return input.val();
124
+ }
125
+ }
126
+ else {
127
+ return argument;
128
+ }
129
+ },
130
+ _setObjectVisibility: function(obj, visible) {
131
+ if (visible) {
132
+ obj.removeClass('hidden');
133
+ }
134
+ else {
135
+ obj.addClass('hidden');
136
+ }
137
+ }
138
+ };
139
+
140
+ $(function() {
141
+ $('form.hungryform').each(function() {
142
+ new HungryForm(this);
143
+ });
144
+ });
145
+ }(jQuery));
@@ -0,0 +1,8 @@
1
+ .hungryform .hidden {
2
+ display: none;
3
+ }
4
+
5
+ .hungryform .invalid span.error {
6
+ display: block;
7
+ color: #dc0024;
8
+ }
@@ -0,0 +1,12 @@
1
+ <%= content_tag :div, id: "#{field.name}_wrapper", class: field.html_class, 'data-dependency' => field.dependency_json do
2
+
3
+ concat label_tag field.name, field.label << ("*" if field.required?).to_s
4
+ concat hidden_field_tag field.name, 0
5
+ concat check_box_tag field.name, 1, field.checked?, field.attributes.except(:class, :checked)
6
+ unless field.error.empty?
7
+ concat content_tag :span, field.error, class: 'error'
8
+ end
9
+
10
+ end %>
11
+
12
+ <%= field.attributes.inspect %>
@@ -0,0 +1,11 @@
1
+ <%= hidden_field_tag :form_action %>
2
+
3
+ <h1><%= form.current_page.label %></h1>
4
+
5
+ <% form.current_page.elements.each do |el| %>
6
+ <%= render partial: "#{views_prefix}/#{el.class.name.demodulize.underscore}", locals: { field: el, views_prefix: views_prefix } %>
7
+ <% end %>
8
+
9
+ <%= hungry_link_to_prev_page(form, "Prev", method: :post) if form.prev_page %>
10
+ <%= hungry_link_to_next_page(form, "Next", method: :post) if form.next_page %>
11
+ <%= hungry_link_to_submit(form, "Submit") if form.current_page == form.pages.last %>
@@ -0,0 +1,7 @@
1
+ <%= content_tag :div, id: "#{field.name}_wrapper", class: field.html_class, 'data-dependency' => field.dependency_json do
2
+
3
+ field.elements.each do |el|
4
+ concat render partial: "#{views_prefix}/#{el.class.name.demodulize.underscore}", locals: { field: el, views_prefix: views_prefix }
5
+ end
6
+
7
+ end %>
@@ -0,0 +1,5 @@
1
+ <%= content_tag :div, id: "#{field.name}_wrapper", class: field.html_class, 'data-dependency' => field.dependency_json do -%>
2
+
3
+ <%= field.value.html_safe %>
4
+
5
+ <% end -%>
@@ -0,0 +1,11 @@
1
+ <%= content_tag :div, id: "#{field.name}_wrapper", class: field.html_class, 'data-dependency' => field.dependency_json do
2
+
3
+ concat label_tag field.name, field.label << ("*" if field.required?).to_s
4
+ field.options.each do |key, value|
5
+ concat radio_button_tag key, value, field.value == value, field.attributes.except(:class)
6
+ end
7
+ unless field.error.empty?
8
+ concat content_tag :span, field.error, class: 'error'
9
+ end
10
+
11
+ end %>
@@ -0,0 +1,9 @@
1
+ <%= content_tag :div, id: "#{field.name}_wrapper", class: field.html_class, 'data-dependency' => field.dependency_json do
2
+
3
+ concat label_tag field.name, field.label << ("*" if field.required?).to_s
4
+ concat select_tag field.name, options_for_select(field.options.invert, field.value), field.attributes.except(:class)
5
+ unless field.error.empty?
6
+ concat content_tag :span, field.error, class: 'error'
7
+ end
8
+
9
+ end %>
@@ -0,0 +1,9 @@
1
+ <%= content_tag :div, id: "#{field.name}_wrapper", class: field.html_class, 'data-dependency' => field.dependency_json do
2
+
3
+ concat label_tag field.name, field.label << ("*" if field.required?).to_s
4
+ concat text_area_tag field.name, field.value, field.attributes.except(:class)
5
+ unless field.error.empty?
6
+ concat content_tag :span, field.error, class: 'error'
7
+ end
8
+
9
+ end %>
@@ -0,0 +1,9 @@
1
+ <%= content_tag :div, id: "#{field.name}_wrapper", class: field.html_class, 'data-dependency' => field.dependency_json do
2
+
3
+ concat label_tag field.name, field.label << ("*" if field.required?).to_s
4
+ concat text_field_tag field.name, field.value, field.attributes.except(:class)
5
+ unless field.error.empty?
6
+ concat content_tag :span, field.error, class: 'error'
7
+ end
8
+
9
+ end %>
@@ -0,0 +1,5 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'rails', '~> 3.2.19'
4
+
5
+ gemspec :path => '../'
@@ -0,0 +1,5 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'rails', '~> 4.0.9'
4
+
5
+ gemspec :path => '../'
@@ -0,0 +1,5 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'rails', '~> 4.1.5'
4
+
5
+ gemspec :path => '../'
@@ -0,0 +1,5 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'rails', '~> 4.2.0'
4
+
5
+ gemspec :path => '../'
@@ -0,0 +1,31 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'hungryform/rails/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "hungryform-rails"
8
+ spec.version = HungryForm::Rails::VERSION
9
+ spec.platform = Gem::Platform::RUBY
10
+ spec.authors = ["Andrey Bazhutkin"]
11
+ spec.email = ["andrey.bazhutkin@gmail.com"]
12
+ spec.summary = "Use HungryForm with Rails"
13
+ spec.description = "A gem to automate using HungryForm with Rails"
14
+ spec.homepage = "https://github.com/andrba/hungryform-rails"
15
+ spec.license = "MIT"
16
+
17
+ spec.files = `git ls-files -z`.split("\x0")
18
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
19
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
20
+ spec.require_paths = ["lib"]
21
+
22
+ spec.required_ruby_version = '>= 2.0.0'
23
+
24
+ spec.add_dependency 'hungryform', '~> 0.0', '>= 0.0.9'
25
+ spec.add_dependency 'rails', '>= 3.2.1'
26
+
27
+ spec.add_development_dependency "rspec", '~> 3.0'
28
+ spec.add_development_dependency "rspec-rails", '~> 3.0'
29
+ spec.add_development_dependency "capybara", '~> 2.4'
30
+ spec.add_development_dependency "poltergeist", '~> 1.6'
31
+ end
@@ -0,0 +1,90 @@
1
+ module HungryForm
2
+ module Rails
3
+ module ActionView
4
+ # Render a form
5
+ def hungry_form_for(form, options = {})
6
+ options[:data] ||= {}
7
+ options[:data][:rel] ||= form_rel(form)
8
+ options[:class] = [options[:class], "hungryform"].compact.join(' ')
9
+
10
+ views_prefix = options.delete(:views_prefix) || HungryForm.configuration.rails.elements_templates
11
+
12
+ form_tag('', options) do
13
+ render partial: "#{views_prefix}/form", locals: {
14
+ form: form,
15
+ views_prefix: views_prefix
16
+ }
17
+ end
18
+ end
19
+
20
+ # Render a link to the next page
21
+ def hungry_link_to_next_page(form, name, options = {}, &block)
22
+ link_to name, *link_params(form, options, action: :next), &block
23
+ end
24
+
25
+ # Render a link to the previous page
26
+ def hungry_link_to_prev_page(form, name, options = {}, &block)
27
+ link_to name, *link_params(form, options, action: :prev), &block
28
+ end
29
+
30
+ # Render a link to a provided page
31
+ def hungry_link_to_page(form, page, options = {}, &block)
32
+ link_to page.label, *link_params(form, options, action: :page, page: page), &block
33
+ end
34
+
35
+ # Render a link that submits the form
36
+ def hungry_link_to_submit(form, name, options = {}, &block)
37
+ params = clean_params(form, options.delete(:params))
38
+
39
+ link_to name, url_for(params), options.reverse_merge(
40
+ data: { form_method: :post, form_action: :submit, rel: form_rel(form) }
41
+ ), &block
42
+ end
43
+
44
+ private
45
+
46
+ # Form ralation attribute is used to streamline js selection of a form
47
+ # and its navigational elements like next/prev buttons and pages lists
48
+ def form_rel(form)
49
+ "hungry-form-#{form.__id__}"
50
+ end
51
+
52
+ # Builds link_to params except for the link's name
53
+ def link_params(form, options, action_options = {})
54
+ method = options.delete(:method) || 'get'
55
+ params = clean_params(form, options.delete(:params))
56
+
57
+ params[:page] = method.to_s == 'get' ? get_page(form, action_options) : form.current_page.name
58
+
59
+ options.reverse_merge!(
60
+ data: {
61
+ form_method: method,
62
+ form_action: action_options[:action],
63
+ rel: form_rel(form)
64
+ }
65
+ )
66
+
67
+ [url_for(params), options]
68
+ end
69
+
70
+ # Find the name of the page to go to when the 'get' method is used in a
71
+ # form navigation
72
+ def get_page(form, action_options)
73
+ case action_options[:action]
74
+ when :page
75
+ action_options[:page].name
76
+ when :next, :prev
77
+ form.send("#{action_options[:action]}_page").try(:name) || ''
78
+ end
79
+ end
80
+
81
+ # Remove Rails specific params from the params hash as well as
82
+ # all the form params
83
+ def clean_params(form, params)
84
+ rails_params = [:authenticity_token, :commit, :utf8, :_method]
85
+ form_params = form.elements.keys + [:form_action, :errors]
86
+ self.params.except(*(rails_params + form_params)).merge(params || {})
87
+ end
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,6 @@
1
+ module HungryForm
2
+ module Rails
3
+ class Engine < ::Rails::Engine
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,24 @@
1
+ module HungryForm
2
+ module Rails
3
+ class Railtie < ::Rails::Railtie
4
+
5
+ module Configuration
6
+ attr_accessor :rails
7
+ end
8
+
9
+ initializer 'hungryform', before: :load_config_initializers do
10
+ HungryForm::Elements::Base::Element.send :include, Renderable
11
+
12
+ HungryForm.configuration.extend Configuration
13
+ HungryForm.configuration.rails = ActiveSupport::OrderedOptions.new
14
+ HungryForm.configuration.rails.elements_templates = 'hungryform'
15
+ end
16
+
17
+ initializer 'active_support' do
18
+ ActiveSupport.on_load(:action_view) do
19
+ ::ActionView::Base.send :include, ActionView
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,13 @@
1
+ module HungryForm
2
+ module Rails
3
+ module Renderable
4
+ def html_class
5
+ classes = []
6
+ classes << attributes[:class] if attributes[:class]
7
+ classes << 'hidden' unless visible?
8
+ classes << 'invalid' if self.is_a?(HungryForm::Elements::Base::ActiveElement) && self.error.present?
9
+ classes.join(' ') if classes.any?
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,5 @@
1
+ module HungryForm
2
+ module Rails
3
+ VERSION = "0.0.3"
4
+ end
5
+ end
@@ -0,0 +1,11 @@
1
+ module HungryForm
2
+ module Rails
3
+ end
4
+ end
5
+
6
+ require 'hungryform'
7
+ require 'hungryform/rails/version'
8
+ require 'hungryform/rails/railtie'
9
+ require 'hungryform/rails/engine'
10
+ require 'hungryform/rails/action_view'
11
+ require 'hungryform/rails/renderable'
@@ -0,0 +1 @@
1
+ require 'hungryform/rails'
@@ -0,0 +1,106 @@
1
+ require 'spec_helper'
2
+
3
+ describe HungryForm::Rails::ActionView, :type => :helper do
4
+ let(:form_params) { {} }
5
+ let(:form) do
6
+ HungryForm::Form.new params: form_params do
7
+ page :first do
8
+ text_field :first_name
9
+ text_field :last_name
10
+ end
11
+
12
+ page :second do
13
+ text_field :email
14
+ end
15
+ end
16
+ end
17
+
18
+ before { helper.params.merge!(controller: 'hungry_form', action: 'show') }
19
+
20
+ describe '#hungry_link_to_next_page' do
21
+ let(:params) { {} }
22
+ subject { helper.hungry_link_to_next_page(form, "Next", params) }
23
+
24
+ it { is_expected.to include("data-rel=\"hungry-form-#{form.__id__}\"") }
25
+ it { is_expected.to include('data-form-action="next"') }
26
+
27
+ context 'when method is GET' do
28
+ it { is_expected.to include('/hungryform/second') }
29
+ it { is_expected.to include('data-form-method="get"') }
30
+ end
31
+
32
+ context 'when method is POST' do
33
+ before { params[:method] = :post }
34
+
35
+ it { is_expected.to include('/hungryform/first') }
36
+ it { is_expected.to include('data-form-method="post"') }
37
+ end
38
+ end
39
+
40
+ describe '#hungry_link_to_prev_page' do
41
+ let(:form_params) { { page: 'second' } }
42
+ let(:params) { {} }
43
+ subject { helper.hungry_link_to_prev_page(form, "Prev", params) }
44
+
45
+ it { is_expected.to include("data-rel=\"hungry-form-#{form.__id__}\"") }
46
+ it { is_expected.to include('data-form-action="prev"') }
47
+
48
+ context 'when method is GET' do
49
+ it { is_expected.to include('/hungryform/first') }
50
+ it { is_expected.to include('data-form-method="get"') }
51
+ end
52
+
53
+ context 'when method is POST' do
54
+ before { params[:method] = :post }
55
+
56
+ it { is_expected.to include('/hungryform/second') }
57
+ it { is_expected.to include('data-form-method="post"') }
58
+ end
59
+ end
60
+
61
+ describe '#hungry_link_to_page' do
62
+ let(:params) { {} }
63
+ subject { helper.hungry_link_to_page(form, form.pages.last, params) }
64
+
65
+ it { is_expected.to include("data-rel=\"hungry-form-#{form.__id__}\"") }
66
+ it { is_expected.to include('data-form-action="page"') }
67
+
68
+ context 'when method is GET' do
69
+ it { is_expected.to include('/hungryform/second') }
70
+ it { is_expected.to include('data-form-method="get"') }
71
+ end
72
+
73
+ context 'when method is POST' do
74
+ before { params[:method] = :post }
75
+
76
+ it { is_expected.to include('/hungryform/first') }
77
+ it { is_expected.to include('data-form-method="post"') }
78
+ end
79
+ end
80
+
81
+ describe '#hungry_form_for' do
82
+ subject { helper.hungry_form_for(form) }
83
+
84
+ it 'renders a form' do
85
+ expect(subject).to include('<form')
86
+ expect(subject).to include("data-rel=\"hungry-form-#{form.__id__}\"")
87
+ expect(subject).to match /<input(?=.*name="form_action")(?=.*id="form_action")/ #Mandatory hidden action field
88
+ expect(subject).to include('First name')
89
+ expect(subject).to include('Last name')
90
+ expect(subject).to include('Next')
91
+ end
92
+
93
+ it 'renders only a current page' do
94
+ expect(subject).to include('<h1>First</h1>')
95
+ expect(subject).not_to include('<h1>Second</h1>')
96
+ end
97
+ end
98
+
99
+ describe '#hungry_link_to_submit' do
100
+ let(:params) { {} }
101
+ subject { helper.hungry_link_to_submit(form, "Submit", params) }
102
+
103
+ it { is_expected.to include("data-rel=\"hungry-form-#{form.__id__}\"") }
104
+ it { is_expected.to include('data-form-action="submit"') }
105
+ end
106
+ end