railsstrap 3.3.1 → 3.3.2

Sign up to get free protection for your applications and to get access to all the features.
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