railsstrap 3.3.1 → 3.3.2

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 (125) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +13 -27
  3. data/app/helpers/railsstrap/aside_helper.rb +59 -0
  4. data/app/helpers/railsstrap/badge_label_helper.rb +0 -4
  5. data/app/helpers/railsstrap/bootstrap_flash_helper.rb +1 -1
  6. data/app/helpers/railsstrap/date_picker_helper.rb +16 -8
  7. data/app/helpers/railsstrap/modal_helper.rb +18 -24
  8. data/lib/generators/railsstrap/install/templates/bootstrap_and_overrides.less +42 -26
  9. data/lib/railsstrap/constants.rb +1 -1
  10. data/lib/railsstrap/engine.rb +9 -5
  11. data/spec/lib/railsstrap/aside_helper_spec.rb +140 -0
  12. data/spec/lib/railsstrap/badge_label_helper_spec.rb +42 -0
  13. data/spec/lib/railsstrap/bootstrap_flash_helper_spec.rb +130 -0
  14. data/spec/lib/railsstrap/breadcrumbs_spec.rb +75 -0
  15. data/spec/lib/railsstrap/datepicker_helper_spec.rb +59 -0
  16. data/spec/lib/railsstrap/form_errors_helper_spec.rb +147 -0
  17. data/spec/lib/railsstrap/glyph_helper_spec.rb +24 -0
  18. data/spec/lib/railsstrap/icon_helper_spec.rb +24 -0
  19. data/spec/lib/railsstrap/modal_helper_spec.rb +140 -0
  20. data/spec/lib/railsstrap/navbar_helper_spec.rb +373 -0
  21. data/spec/lib/railsstrap/uri_state_spec.rb +49 -0
  22. data/spec/spec_helper.rb +20 -0
  23. data/vendor/assets/bower_components/bootstrap/Gruntfile.js +45 -8
  24. data/vendor/assets/bower_components/bootstrap/LICENSE +1 -1
  25. data/vendor/assets/bower_components/bootstrap/README.md +12 -9
  26. data/vendor/assets/bower_components/bootstrap/bower.json +1 -1
  27. data/vendor/assets/bower_components/bootstrap/dist/css/bootstrap-theme.css +8 -2
  28. data/vendor/assets/bower_components/bootstrap/dist/css/bootstrap-theme.css.map +1 -1
  29. data/vendor/assets/bower_components/bootstrap/dist/css/bootstrap-theme.min.css +3 -3
  30. data/vendor/assets/bower_components/bootstrap/dist/css/bootstrap.css +257 -23
  31. data/vendor/assets/bower_components/bootstrap/dist/css/bootstrap.css.map +1 -1
  32. data/vendor/assets/bower_components/bootstrap/dist/css/bootstrap.min.css +3 -3
  33. data/vendor/assets/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.eot +0 -0
  34. data/vendor/assets/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.svg +273 -214
  35. data/vendor/assets/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf +0 -0
  36. data/vendor/assets/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.woff +0 -0
  37. data/vendor/assets/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.woff2 +0 -0
  38. data/vendor/assets/bower_components/bootstrap/dist/js/bootstrap.js +55 -69
  39. data/vendor/assets/bower_components/bootstrap/dist/js/bootstrap.min.js +4 -4
  40. data/vendor/assets/bower_components/bootstrap/fonts/glyphicons-halflings-regular.eot +0 -0
  41. data/vendor/assets/bower_components/bootstrap/fonts/glyphicons-halflings-regular.svg +273 -214
  42. data/vendor/assets/bower_components/bootstrap/fonts/glyphicons-halflings-regular.ttf +0 -0
  43. data/vendor/assets/bower_components/bootstrap/fonts/glyphicons-halflings-regular.woff +0 -0
  44. data/vendor/assets/bower_components/bootstrap/fonts/glyphicons-halflings-regular.woff2 +0 -0
  45. data/vendor/assets/bower_components/bootstrap/grunt/bs-glyphicons-data-generator.js +41 -0
  46. data/vendor/assets/bower_components/bootstrap/grunt/configBridge.json +1 -0
  47. data/vendor/assets/bower_components/bootstrap/grunt/sauce_browsers.yml +4 -4
  48. data/vendor/assets/bower_components/bootstrap/js/affix.js +4 -4
  49. data/vendor/assets/bower_components/bootstrap/js/alert.js +3 -3
  50. data/vendor/assets/bower_components/bootstrap/js/button.js +3 -3
  51. data/vendor/assets/bower_components/bootstrap/js/carousel.js +7 -10
  52. data/vendor/assets/bower_components/bootstrap/js/collapse.js +4 -4
  53. data/vendor/assets/bower_components/bootstrap/js/dropdown.js +3 -3
  54. data/vendor/assets/bower_components/bootstrap/js/modal.js +3 -3
  55. data/vendor/assets/bower_components/bootstrap/js/popover.js +7 -13
  56. data/vendor/assets/bower_components/bootstrap/js/scrollspy.js +3 -3
  57. data/vendor/assets/bower_components/bootstrap/js/tab.js +3 -3
  58. data/vendor/assets/bower_components/bootstrap/js/tooltip.js +10 -16
  59. data/vendor/assets/bower_components/bootstrap/js/transition.js +2 -2
  60. data/vendor/assets/bower_components/bootstrap/less/alerts.less +5 -0
  61. data/vendor/assets/bower_components/bootstrap/less/badges.less +4 -0
  62. data/vendor/assets/bower_components/bootstrap/less/button-groups.less +2 -2
  63. data/vendor/assets/bower_components/bootstrap/less/buttons.less +1 -1
  64. data/vendor/assets/bower_components/bootstrap/less/carousel.less +8 -6
  65. data/vendor/assets/bower_components/bootstrap/less/close.less +1 -0
  66. data/vendor/assets/bower_components/bootstrap/less/dropdowns.less +2 -1
  67. data/vendor/assets/bower_components/bootstrap/less/forms.less +41 -21
  68. data/vendor/assets/bower_components/bootstrap/less/glyphicons.less +67 -0
  69. data/vendor/assets/bower_components/bootstrap/less/jumbotron.less +1 -0
  70. data/vendor/assets/bower_components/bootstrap/less/media.less +14 -0
  71. data/vendor/assets/bower_components/bootstrap/less/mixins/vendor-prefixes.less +1 -1
  72. data/vendor/assets/bower_components/bootstrap/less/navbar.less +1 -0
  73. data/vendor/assets/bower_components/bootstrap/less/panels.less +5 -1
  74. data/vendor/assets/bower_components/bootstrap/less/popovers.less +1 -1
  75. data/vendor/assets/bower_components/bootstrap/less/tables.less +3 -3
  76. data/vendor/assets/bower_components/bootstrap/less/theme.less +3 -2
  77. data/vendor/assets/bower_components/bootstrap/less/tooltip.less +1 -1
  78. data/vendor/assets/bower_components/bootstrap/less/variables.less +3 -2
  79. data/vendor/assets/bower_components/bootstrap/package.json +14 -13
  80. data/vendor/assets/bower_components/jquery/bower.json +2 -2
  81. data/vendor/assets/bower_components/jquery/dist/jquery.js +277 -262
  82. data/vendor/assets/bower_components/jquery/dist/jquery.min.js +4 -4
  83. data/vendor/assets/bower_components/jquery/dist/jquery.min.map +1 -1
  84. data/vendor/assets/bower_components/jquery/src/ajax.js +11 -31
  85. data/vendor/assets/bower_components/jquery/src/ajax/xhr.js +3 -2
  86. data/vendor/assets/bower_components/jquery/src/attributes/attr.js +0 -2
  87. data/vendor/assets/bower_components/jquery/src/attributes/classes.js +4 -4
  88. data/vendor/assets/bower_components/jquery/src/attributes/prop.js +1 -3
  89. data/vendor/assets/bower_components/jquery/src/attributes/support.js +8 -8
  90. data/vendor/assets/bower_components/jquery/src/attributes/val.js +3 -5
  91. data/vendor/assets/bower_components/jquery/src/core.js +6 -7
  92. data/vendor/assets/bower_components/jquery/src/core/init.js +3 -3
  93. data/vendor/assets/bower_components/jquery/src/core/ready.js +1 -1
  94. data/vendor/assets/bower_components/jquery/src/css.js +28 -29
  95. data/vendor/assets/bower_components/jquery/src/css/addGetHookIf.js +2 -4
  96. data/vendor/assets/bower_components/jquery/src/css/curCSS.js +1 -1
  97. data/vendor/assets/bower_components/jquery/src/css/defaultDisplay.js +1 -1
  98. data/vendor/assets/bower_components/jquery/src/css/support.js +5 -0
  99. data/vendor/assets/bower_components/jquery/src/css/var/getStyles.js +8 -1
  100. data/vendor/assets/bower_components/jquery/src/data.js +10 -11
  101. data/vendor/assets/bower_components/jquery/src/data/Data.js +3 -3
  102. data/vendor/assets/bower_components/jquery/src/deferred.js +2 -2
  103. data/vendor/assets/bower_components/jquery/src/dimensions.js +1 -1
  104. data/vendor/assets/bower_components/jquery/src/effects.js +29 -30
  105. data/vendor/assets/bower_components/jquery/src/effects/Tween.js +7 -7
  106. data/vendor/assets/bower_components/jquery/src/event.js +5 -5
  107. data/vendor/assets/bower_components/jquery/src/event/ajax.js +13 -0
  108. data/vendor/assets/bower_components/jquery/src/exports/global.js +2 -2
  109. data/vendor/assets/bower_components/jquery/src/intro.js +8 -8
  110. data/vendor/assets/bower_components/jquery/src/jquery.js +1 -0
  111. data/vendor/assets/bower_components/jquery/src/manipulation.js +9 -11
  112. data/vendor/assets/bower_components/jquery/src/manipulation/support.js +6 -5
  113. data/vendor/assets/bower_components/jquery/src/offset.js +9 -6
  114. data/vendor/assets/bower_components/jquery/src/queue.js +3 -3
  115. data/vendor/assets/bower_components/jquery/src/sizzle/dist/sizzle.js +83 -60
  116. data/vendor/assets/bower_components/jquery/src/sizzle/dist/sizzle.min.js +3 -3
  117. data/vendor/assets/bower_components/jquery/src/sizzle/dist/sizzle.min.map +1 -1
  118. data/vendor/assets/bower_components/jquery/src/traversing.js +3 -4
  119. data/vendor/assets/bower_components/jquery/src/wrap.js +1 -0
  120. data/vendor/assets/stylesheets/aside/aside.less +18 -2
  121. data/vendor/assets/stylesheets/bootstrap.less +2 -0
  122. data/vendor/assets/stylesheets/dist/railsstrap.css +28 -6
  123. data/vendor/assets/stylesheets/fontawesome-local.less +15 -0
  124. data/vendor/assets/stylesheets/glyphicons.less +12 -0
  125. metadata +278 -7
@@ -0,0 +1,42 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+ require 'action_view'
4
+ require 'active_support'
5
+ require_relative '../../../app/helpers/railsstrap/badge_label_helper'
6
+
7
+ include ActionView::Helpers
8
+ include ActionView::Context
9
+ include Railsstrap::BadgeLabelHelper
10
+
11
+ describe Railsstrap::BadgeLabelHelper, :type => :helper do
12
+ it 'should return a basic railsstrap badge' do
13
+ expect(badge('New!').gsub(/\s/, '').downcase)
14
+ .to eql(BASIC_BADGE.gsub(/\s/, '').downcase)
15
+ end
16
+
17
+ it 'should return a railsstrap badge with class' do
18
+ expect(badge('2', :warning).gsub(/\s/, '').downcase)
19
+ .to eql(BADGE_WITH_CLASS.gsub(/\s/, '').downcase)
20
+ end
21
+
22
+ it 'should take a Number as its first parameter' do
23
+ expect(badge(12).gsub(/\s/, '').downcase).to eql(BADGE_WITH_NUMBER_PARAM.gsub(/\s/, '').downcase)
24
+ end
25
+
26
+ end
27
+
28
+ BASIC_BADGE = <<-HTML
29
+ <span class="badge">New!</span>
30
+ HTML
31
+
32
+ BADGE_WITH_CLASS = <<-HTML
33
+ <span class="badge badge-warning">2</span>
34
+ HTML
35
+
36
+ BADGE_WITH_NUMBER_PARAM = <<-HTML
37
+ <span class="badge">12</span>
38
+ HTML
39
+
40
+ LABEL_WITH_NUMBER_PARAM = <<-HTML
41
+ <label class="badge">42</label>
42
+ HTML
@@ -0,0 +1,130 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+ require_relative '../../../app/helpers/railsstrap/bootstrap_flash_helper'
4
+
5
+ include ActionView::Helpers
6
+ include Railsstrap::BootstrapFlashHelper
7
+
8
+ describe Railsstrap::BootstrapFlashHelper, :type => :helper do
9
+ describe 'bootstrap_flash' do
10
+ let(:flash) { ActionDispatch::Flash::FlashHash.new }
11
+ before { allow(self).to receive(:flash).and_return flash }
12
+
13
+ context 'when type is :notice' do
14
+ before { flash[:notice] = 'success flash' }
15
+
16
+ it 'should return a success flash message' do
17
+ expect(bootstrap_flash.gsub(/\s/, '').downcase)
18
+ .to eql(BASIC_SUCCESS_FLASH.gsub(/\s/, '').downcase)
19
+ end
20
+ end
21
+
22
+ context 'when type is :alert' do
23
+ before { flash[:alert] = 'danger flash' }
24
+
25
+ it 'should return a danger flash message' do
26
+ expect(bootstrap_flash.gsub(/\s/, '').downcase)
27
+ .to eql(BASIC_DANGER_FLASH.gsub(/\s/, '').downcase)
28
+ end
29
+ end
30
+
31
+ context 'when type is :error' do
32
+ before { flash[:error] = 'danger flash' }
33
+
34
+ it 'should return a danger flash message' do
35
+ expect(bootstrap_flash.gsub(/\s/, '').downcase)
36
+ .to eql(BASIC_DANGER_FLASH.gsub(/\s/, '').downcase)
37
+ end
38
+ end
39
+
40
+ context 'when class is set' do
41
+ before { flash[:notice] = 'success flash' }
42
+
43
+ it 'should display the class' do
44
+ expect(bootstrap_flash({class: 'success-class'}).gsub(/\s/, '').downcase)
45
+ .to eql(BASIC_SUCCESS_FLASH_WITH_CLASS.gsub(/\s/, '').downcase)
46
+ end
47
+ end
48
+
49
+ context 'when animation is set' do
50
+ before { flash[:notice] = 'success flash' }
51
+
52
+ it 'should display the animation class' do
53
+ expect(bootstrap_flash({animation: 'flip-x'}).gsub(/\s/, '').downcase)
54
+ .to eql(BASIC_SUCCESS_FLASH_WITH_ANIMATION.gsub(/\s/, '').downcase)
55
+ end
56
+ end
57
+
58
+ context 'when container_tag is set' do
59
+ before { flash[:notice] = 'success flash' }
60
+ it 'should use a span for the container' do
61
+ expect(bootstrap_flash({container_tag: :span}).gsub(/\s/, '').downcase)
62
+ .to eql(BASIC_SUCCESS_FLASH_WITH_SPAN.gsub(/\s/, '').downcase)
63
+ end
64
+ end
65
+
66
+ context 'when show_button is set to false' do
67
+ before { flash[:notice] = 'success flash' }
68
+ it 'should not output a close button' do
69
+ expect(bootstrap_flash({show_close: false}).gsub(/\s/, '').downcase)
70
+ .to eql(BASIC_SUCCESS_WITHOUT_BUTTON.gsub(/\s/, '').downcase)
71
+ end
72
+ end
73
+
74
+ context 'when html is set in the message' do
75
+ before { flash[:notice] = 'success flash <a href="#">Link</a>' }
76
+ it 'should output the html' do
77
+ expect(bootstrap_flash.gsub(/\s/, '').downcase)
78
+ .to eql(BASIC_SUCCESS_WITH_HTML.gsub(/\s/, '').downcase)
79
+ end
80
+ end
81
+
82
+ end
83
+ end
84
+
85
+ BASIC_DANGER_FLASH = <<-HTML
86
+ <div class="alert fade in alert-danger">
87
+ <button type="button" class="close" data-dismiss="alert">&times;</button>danger flash
88
+ </div>
89
+ HTML
90
+
91
+ BASIC_SUCCESS_FLASH = <<-HTML
92
+ <div class="alert fade in alert-success">
93
+ <button type="button" class="close" data-dismiss="alert">&times;</button>success flash
94
+ </div>
95
+ HTML
96
+
97
+ BASIC_SUCCESS_WITH_HTML = <<-HTML
98
+ <div class="alert fade in alert-success">
99
+ <button type="button" class="close" data-dismiss="alert">&times;</button>success flash
100
+ <a href="#">Link</a>
101
+ </div>
102
+ HTML
103
+
104
+ BASIC_SUCCESS_WITHOUT_BUTTON = <<-HTML
105
+ <div class="alert fade in alert-success">
106
+ success flash
107
+ </div>
108
+ HTML
109
+
110
+ BASIC_SUCCESS_FLASH_WITH_CLASS = <<-HTML
111
+ <div class="alert fade in alert-success success-class">
112
+ <button type="button" class="close" data-dismiss="alert">&times;</button>success flash
113
+ </div>
114
+ HTML
115
+
116
+ BASIC_SUCCESS_FLASH_WITH_ANIMATION = <<-HTML
117
+ <div class="alert flip-x alert-success">
118
+ <button type="button" class="close" data-dismiss="alert">&times;</button>success flash
119
+ </div>
120
+ HTML
121
+
122
+ BASIC_SUCCESS_FLASH_WITH_SPAN = <<-HTML
123
+ <span class="alert fade in alert-success">
124
+ <button type="button" class="close" data-dismiss="alert">&times;</button>success flash
125
+ </span>
126
+ HTML
127
+
128
+ BLOCK_FLASH = <<-HTML
129
+ <span>wat</span>
130
+ HTML
@@ -0,0 +1,75 @@
1
+ require 'spec_helper'
2
+ require_relative '../../../app/helpers/railsstrap/breadcrumbs'
3
+
4
+ describe Railsstrap::Breadcrumbs do
5
+ class TestModel
6
+ include ActiveModel::Model
7
+
8
+ def to_s
9
+ 'test_model'
10
+ end
11
+ end
12
+
13
+ class BaseTestController < AbstractController::Base
14
+ include Railsstrap::Breadcrumbs
15
+ include AbstractController::Callbacks
16
+ include AbstractController::UrlFor
17
+
18
+ add_breadcrumb 'base', '/base'
19
+ add_breadcrumb :base_i18n, '/base_i18n'
20
+
21
+ def breadcrumbs
22
+ @breadcrumbs
23
+ end
24
+ end
25
+
26
+ class TestController < BaseTestController
27
+ add_breadcrumb 'class', '/class'
28
+ add_breadcrumb :class_i18n, '/class_i18n'
29
+
30
+ def show
31
+ add_breadcrumb 'instance', '/instance'
32
+ add_breadcrumb :instance_i18n, '/instance_i18n'
33
+
34
+ test_model = TestModel.new
35
+ add_breadcrumb test_model
36
+
37
+ add_breadcrumb :symbolized
38
+ add_breadcrumb :show
39
+ end
40
+
41
+ def symbolized_path
42
+ '/symbolized'
43
+ end
44
+
45
+ def test_models_path
46
+ '/test_model'
47
+ end
48
+ end
49
+
50
+ before do
51
+ options = { :scope => [:breadcrumbs, 'test'] }
52
+ [:class_i18n, :instance_i18n, :show, :symbolized].each do |name|
53
+ I18n.expects(:t).with(name, options).returns(name.to_s)
54
+ end
55
+
56
+ name = :base_i18n
57
+ options = { :scope => [:breadcrumbs, 'base_test'] }
58
+ I18n.expects(:t).with(name, options).returns(name)
59
+
60
+ @controller = TestController.new
61
+ @controller.process(:show)
62
+ end
63
+
64
+ it 'has breadcrumbs' do
65
+ [:base, :base_i18n, :class, :class_i18n, :instance, :instance_i18n, :test_model, :symbolized].each do |name|
66
+ path = "/#{name}"
67
+ idx = @controller.breadcrumbs.index { |b| b[:name] == name.to_s && b[:url] == path }
68
+ expect(idx).to be, -> { name }
69
+ end
70
+
71
+ idx = @controller.breadcrumbs.index { |b| b[:name] == "show" && b[:url] == '' }
72
+ expect(idx).to be
73
+ end
74
+
75
+ end
@@ -0,0 +1,59 @@
1
+ # encoding: utf-8
2
+ require 'action_view'
3
+ require 'active_support'
4
+ require 'spec_helper'
5
+
6
+ include ActionView::Helpers
7
+ include ActionView::Context
8
+
9
+ require_relative '../../../app/helpers/railsstrap/date_picker_helper'
10
+ include Railsstrap::DatePickerHelper
11
+ describe Railsstrap::DatePickerHelper, :type => :helper do
12
+
13
+ it 'should render a date_picker html block' do
14
+ expect(date_picker.gsub(/\s/, ''))
15
+ .to eql(DEFAULT_DATEPICKER.gsub(/\s/, ''))
16
+ end
17
+
18
+ it 'should override default options' do
19
+ expect(date_picker({id: 'testing'}).gsub(/\s/, ''))
20
+ .to eql(DATEPICKER_ID_CHANGED.gsub(/\s/, ''))
21
+ end
22
+
23
+ it 'should render a script tag' do
24
+ expect(date_picker_javascript.gsub(/\s/, ''))
25
+ .to eql(DEFAULT_JS_DATEPICKER.gsub(/\s/, ''))
26
+ end
27
+
28
+ it 'date_picker_javascript should accept a hash of options' do
29
+ expect(date_picker_javascript({language: 'ru'}).gsub(/\s/, ''))
30
+ .to eql(DEFAULT_JS_DATEPICKER_OPTIONS.gsub(/\s/, ''))
31
+ end
32
+
33
+ end
34
+
35
+ DEFAULT_DATEPICKER = <<-HTML
36
+ <div id="date_picker" class="input-group date" data-datepicker="true" data-date-language="en">
37
+ <input type="text" name="date_picker" id="date_picker" value="" class="form-control" />
38
+ <span class="input-group-addon">
39
+ <i class="fa fa-calendar"></i>
40
+ </span>
41
+ </div>
42
+ HTML
43
+
44
+ DATEPICKER_ID_CHANGED = <<-HTML
45
+ <div id="testing" class="input-group date" data-datepicker="true" data-date-language="en">
46
+ <input type="text" name="date_picker" id="date_picker" value="" class="form-control" />
47
+ <span class="input-group-addon">
48
+ <i class="fa fa-calendar"></i>
49
+ </span>
50
+ </div>
51
+ HTML
52
+
53
+ DEFAULT_JS_DATEPICKER = <<-HTML
54
+ <script>//<![CDATA[(function($){$('[data-datepicker=\"true\"]').datetimepicker({\"selector\":\"[data-datepicker=\\\"true\\\"]\",\"language\":\"en\",\"icons\":{\"time\":\"fafa-clock-o\",\"date\":\"fafa-calendar\",\"up\":\"fafa-chevron-up\",\"down\":\"fafa-chevron-down\"}});})(jQuery);//]]></script>
55
+ HTML
56
+
57
+ DEFAULT_JS_DATEPICKER_OPTIONS = <<-HTML
58
+ <script>//<![CDATA[(function($){$('[data-datepicker=\"true\"]').datetimepicker({\"selector\":\"[data-datepicker=\\\"true\\\"]\",\"language\":\"ru\",\"icons\":{\"time\":\"fafa-clock-o\",\"date\":\"fafa-calendar\",\"up\":\"fafa-chevron-up\",\"down\":\"fafa-chevron-down\"}});})(jQuery);//]]></script>
59
+ HTML
@@ -0,0 +1,147 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+ require 'action_view'
4
+ require 'active_support'
5
+ require 'rspec/active_model/mocks'
6
+
7
+ require_relative '../../../app/helpers/railsstrap/form_errors_helper'
8
+
9
+ include ActionView::Helpers
10
+ include ActionView::Context
11
+ include Railsstrap::FormErrorsHelper
12
+
13
+ describe Railsstrap::FormErrorsHelper, :type => :helper do
14
+
15
+ before do
16
+ @base_errors = ['base error message', 'nasty error']
17
+ @base_error = 'one base error'
18
+
19
+
20
+ @title_errors = ["can't be blank", 'is too short (minimum is 5 characters)']
21
+ @title_error = "can't be blank"
22
+
23
+ @errors = double('errors')
24
+ @new_post = mock_model( 'Post' )
25
+ allow(@new_post).to receive_messages(:errors => @errors)
26
+ allow(self).to receive_messages(:post_path => '/post/1')
27
+ allow(self).to receive_messages(:protect_against_forgery? => false)
28
+ allow(self).to receive_messages(:polymorphic_path => '')
29
+
30
+ @default_class = 'help-block'
31
+ @default_error_class = 'has-error'
32
+ end
33
+
34
+
35
+ describe 'error[:base] is a string' do
36
+
37
+ before do
38
+ allow(@errors).to receive(:[]).with(:base).and_return(@base_error)
39
+ end
40
+
41
+ it 'should render base error on :base key' do
42
+ form_for(@new_post) do |builder|
43
+ expect(builder.error_span(:base)).to have_tag("div.#{@default_error_class}") do
44
+ with_tag("span.#{@default_class}", :text => @base_error)
45
+ end
46
+ end
47
+ end
48
+
49
+ end
50
+
51
+ describe 'when there is only one error on base' do
52
+
53
+ before do
54
+ allow(@errors).to receive(:[]).with(:base).and_return(@base_error)
55
+ end
56
+
57
+ it 'should render base error on :base key' do
58
+ form_for(@new_post) do |builder|
59
+ expect(builder.error_span(:base)).to have_tag("div.#{@default_error_class}") do
60
+ with_tag("span.#{@default_class}", :text => @base_error)
61
+ end
62
+ end
63
+ end
64
+
65
+ end
66
+
67
+ describe 'when there is only one error on title' do
68
+
69
+ before do
70
+ allow(@errors).to receive(:[]).with(:title).and_return(@title_error)
71
+ end
72
+
73
+ it 'should render base errors join with comma' do
74
+ form_for(@new_post) do |builder|
75
+ expect(builder.error_span(:title)).to have_tag("div.#{@default_error_class}") do
76
+ with_tag("span.#{@default_class}", :text => @title_error)
77
+ end
78
+ end
79
+ end
80
+ end
81
+
82
+
83
+
84
+ describe 'when there is more than one error on title' do
85
+
86
+ before do
87
+ allow(@errors).to receive(:[]).with(:title).and_return(@title_errors)
88
+ end
89
+
90
+ it 'should render base errors join with comma' do
91
+ form_for(@new_post) do |builder|
92
+ expect(builder.error_span(:title)).to have_tag("div.#{@default_error_class}") do
93
+ with_tag("span.#{@default_class}", :text => @title_errors.join(', '))
94
+ end
95
+ end
96
+ end
97
+ end
98
+
99
+
100
+ describe 'when there are no errors' do
101
+ before do
102
+ allow(@errors).to receive(:[]).with(:title).and_return(nil)
103
+ end
104
+
105
+ it 'should return nil' do
106
+ form_for(@new_post) do |builder|
107
+ expect(builder.error_span(:title)).to be_nil
108
+ end
109
+ end
110
+ end
111
+
112
+ describe 'when :error_class option is passed' do
113
+ let(:error_class) { 'has_warning' }
114
+
115
+ before do
116
+ allow(@errors).to receive(:[]).with(:title).and_return(@title_error)
117
+ end
118
+
119
+ it "should render with passed error class " do
120
+ form_for(@new_post) do |builder|
121
+ expect(builder.error_span(:title, :error_class => error_class))
122
+ .to have_tag("div.#{error_class}") do
123
+ with_tag("span.#{@default_class}", :text => @title_error)
124
+ end
125
+ end
126
+ end
127
+ end
128
+
129
+ describe 'when :error_class option is passed' do
130
+ let(:span_class) { 'help-inline' }
131
+
132
+ before do
133
+ allow(@errors).to receive(:[]).with(:title).and_return(@title_error)
134
+ end
135
+
136
+ it "should render with passed error class " do
137
+ form_for(@new_post) do |builder|
138
+ expect(builder.error_span(:title, :span_class => span_class))
139
+ .to have_tag("div.#{@default_error_class}") do
140
+ with_tag("span.#{span_class}", :text => @title_error)
141
+ end
142
+ end
143
+ end
144
+
145
+ end
146
+
147
+ end