hungryform-rails 0.0.1 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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