shoulda 2.11.3 → 3.0.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (262) hide show
  1. data/Gemfile +9 -0
  2. data/Gemfile.lock +108 -0
  3. data/README.md +95 -0
  4. data/Rakefile +6 -50
  5. data/lib/shoulda/version.rb +1 -1
  6. metadata +50 -269
  7. data/README.rdoc +0 -154
  8. data/bin/convert_to_should_syntax +0 -42
  9. data/lib/shoulda.rb +0 -9
  10. data/lib/shoulda/action_controller.rb +0 -34
  11. data/lib/shoulda/action_controller/macros.rb +0 -221
  12. data/lib/shoulda/action_controller/matchers.rb +0 -39
  13. data/lib/shoulda/action_controller/matchers/assign_to_matcher.rb +0 -112
  14. data/lib/shoulda/action_controller/matchers/filter_param_matcher.rb +0 -74
  15. data/lib/shoulda/action_controller/matchers/redirect_to_matcher.rb +0 -62
  16. data/lib/shoulda/action_controller/matchers/render_template_matcher.rb +0 -54
  17. data/lib/shoulda/action_controller/matchers/render_with_layout_matcher.rb +0 -99
  18. data/lib/shoulda/action_controller/matchers/respond_with_content_type_matcher.rb +0 -74
  19. data/lib/shoulda/action_controller/matchers/respond_with_matcher.rb +0 -85
  20. data/lib/shoulda/action_controller/matchers/route_matcher.rb +0 -93
  21. data/lib/shoulda/action_controller/matchers/set_session_matcher.rb +0 -98
  22. data/lib/shoulda/action_controller/matchers/set_the_flash_matcher.rb +0 -100
  23. data/lib/shoulda/action_mailer.rb +0 -13
  24. data/lib/shoulda/action_mailer/assertions.rb +0 -42
  25. data/lib/shoulda/action_mailer/matchers.rb +0 -22
  26. data/lib/shoulda/action_mailer/matchers/have_sent_email.rb +0 -110
  27. data/lib/shoulda/active_record.rb +0 -16
  28. data/lib/shoulda/active_record/assertions.rb +0 -69
  29. data/lib/shoulda/active_record/helpers.rb +0 -32
  30. data/lib/shoulda/active_record/macros.rb +0 -457
  31. data/lib/shoulda/active_record/matchers.rb +0 -42
  32. data/lib/shoulda/active_record/matchers/allow_mass_assignment_of_matcher.rb +0 -83
  33. data/lib/shoulda/active_record/matchers/allow_value_matcher.rb +0 -110
  34. data/lib/shoulda/active_record/matchers/association_matcher.rb +0 -226
  35. data/lib/shoulda/active_record/matchers/ensure_inclusion_of_matcher.rb +0 -87
  36. data/lib/shoulda/active_record/matchers/ensure_length_of_matcher.rb +0 -141
  37. data/lib/shoulda/active_record/matchers/have_db_column_matcher.rb +0 -169
  38. data/lib/shoulda/active_record/matchers/have_db_index_matcher.rb +0 -112
  39. data/lib/shoulda/active_record/matchers/have_readonly_attribute_matcher.rb +0 -59
  40. data/lib/shoulda/active_record/matchers/validate_acceptance_of_matcher.rb +0 -41
  41. data/lib/shoulda/active_record/matchers/validate_format_of_matcher.rb +0 -65
  42. data/lib/shoulda/active_record/matchers/validate_numericality_of_matcher.rb +0 -39
  43. data/lib/shoulda/active_record/matchers/validate_presence_of_matcher.rb +0 -60
  44. data/lib/shoulda/active_record/matchers/validate_uniqueness_of_matcher.rb +0 -148
  45. data/lib/shoulda/active_record/matchers/validation_matcher.rb +0 -56
  46. data/lib/shoulda/assertions.rb +0 -79
  47. data/lib/shoulda/autoload_macros.rb +0 -46
  48. data/lib/shoulda/context.rb +0 -433
  49. data/lib/shoulda/helpers.rb +0 -8
  50. data/lib/shoulda/integrations/rspec.rb +0 -13
  51. data/lib/shoulda/integrations/rspec2.rb +0 -22
  52. data/lib/shoulda/integrations/test_unit.rb +0 -22
  53. data/lib/shoulda/macros.rb +0 -161
  54. data/lib/shoulda/private_helpers.rb +0 -13
  55. data/lib/shoulda/proc_extensions.rb +0 -14
  56. data/lib/shoulda/rails.rb +0 -8
  57. data/lib/shoulda/tasks.rb +0 -3
  58. data/lib/shoulda/tasks/list_tests.rake +0 -29
  59. data/lib/shoulda/tasks/yaml_to_shoulda.rake +0 -28
  60. data/rails/init.rb +0 -8
  61. data/test/README +0 -36
  62. data/test/fail_macros.rb +0 -55
  63. data/test/fixtures/addresses.yml +0 -3
  64. data/test/fixtures/friendships.yml +0 -0
  65. data/test/fixtures/posts.yml +0 -5
  66. data/test/fixtures/products.yml +0 -0
  67. data/test/fixtures/taggings.yml +0 -0
  68. data/test/fixtures/tags.yml +0 -9
  69. data/test/fixtures/users.yml +0 -6
  70. data/test/functional/posts_controller_test.rb +0 -121
  71. data/test/functional/users_controller_test.rb +0 -19
  72. data/test/matchers/action_mailer/have_sent_email_test.rb +0 -70
  73. data/test/matchers/active_record/allow_mass_assignment_of_matcher_test.rb +0 -74
  74. data/test/matchers/active_record/allow_value_matcher_test.rb +0 -64
  75. data/test/matchers/active_record/association_matcher_test.rb +0 -263
  76. data/test/matchers/active_record/ensure_inclusion_of_matcher_test.rb +0 -81
  77. data/test/matchers/active_record/ensure_length_of_matcher_test.rb +0 -158
  78. data/test/matchers/active_record/have_db_column_matcher_test.rb +0 -169
  79. data/test/matchers/active_record/have_db_index_matcher_test.rb +0 -91
  80. data/test/matchers/active_record/have_readonly_attributes_matcher_test.rb +0 -29
  81. data/test/matchers/active_record/validate_acceptance_of_matcher_test.rb +0 -44
  82. data/test/matchers/active_record/validate_format_of_matcher_test.rb +0 -39
  83. data/test/matchers/active_record/validate_numericality_of_matcher_test.rb +0 -52
  84. data/test/matchers/active_record/validate_presence_of_matcher_test.rb +0 -86
  85. data/test/matchers/active_record/validate_uniqueness_of_matcher_test.rb +0 -147
  86. data/test/matchers/controller/assign_to_matcher_test.rb +0 -45
  87. data/test/matchers/controller/filter_param_matcher_test.rb +0 -40
  88. data/test/matchers/controller/redirect_to_matcher_test.rb +0 -37
  89. data/test/matchers/controller/render_template_matcher_test.rb +0 -37
  90. data/test/matchers/controller/render_with_layout_matcher_test.rb +0 -47
  91. data/test/matchers/controller/respond_with_content_type_matcher_test.rb +0 -32
  92. data/test/matchers/controller/respond_with_matcher_test.rb +0 -96
  93. data/test/matchers/controller/route_matcher_test.rb +0 -75
  94. data/test/matchers/controller/set_session_matcher_test.rb +0 -48
  95. data/test/matchers/controller/set_the_flash_matcher.rb +0 -95
  96. data/test/other/autoload_macro_test.rb +0 -18
  97. data/test/other/context_test.rb +0 -372
  98. data/test/other/convert_to_should_syntax_test.rb +0 -63
  99. data/test/other/helpers_test.rb +0 -317
  100. data/test/other/private_helpers_test.rb +0 -32
  101. data/test/other/should_test.rb +0 -271
  102. data/test/rails2_model_builder.rb +0 -130
  103. data/test/rails2_root/app/controllers/application_controller.rb +0 -22
  104. data/test/rails2_root/app/controllers/posts_controller.rb +0 -87
  105. data/test/rails2_root/app/controllers/users_controller.rb +0 -84
  106. data/test/rails2_root/app/helpers/application_helper.rb +0 -3
  107. data/test/rails2_root/app/helpers/posts_helper.rb +0 -2
  108. data/test/rails2_root/app/helpers/users_helper.rb +0 -2
  109. data/test/rails2_root/app/models/address.rb +0 -7
  110. data/test/rails2_root/app/models/flea.rb +0 -11
  111. data/test/rails2_root/app/models/friendship.rb +0 -4
  112. data/test/rails2_root/app/models/notifier.rb +0 -8
  113. data/test/rails2_root/app/models/pets/cat.rb +0 -7
  114. data/test/rails2_root/app/models/pets/dog.rb +0 -10
  115. data/test/rails2_root/app/models/post.rb +0 -12
  116. data/test/rails2_root/app/models/product.rb +0 -12
  117. data/test/rails2_root/app/models/profile.rb +0 -2
  118. data/test/rails2_root/app/models/registration.rb +0 -2
  119. data/test/rails2_root/app/models/tag.rb +0 -8
  120. data/test/rails2_root/app/models/tagging.rb +0 -4
  121. data/test/rails2_root/app/models/treat.rb +0 -3
  122. data/test/rails2_root/app/models/user.rb +0 -32
  123. data/test/rails2_root/app/views/layouts/posts.rhtml +0 -19
  124. data/test/rails2_root/app/views/layouts/users.rhtml +0 -17
  125. data/test/rails2_root/app/views/layouts/wide.html.erb +0 -1
  126. data/test/rails2_root/app/views/notifier/the_email.html.erb +0 -1
  127. data/test/rails2_root/app/views/posts/edit.rhtml +0 -27
  128. data/test/rails2_root/app/views/posts/index.rhtml +0 -25
  129. data/test/rails2_root/app/views/posts/new.rhtml +0 -26
  130. data/test/rails2_root/app/views/posts/show.rhtml +0 -18
  131. data/test/rails2_root/app/views/users/edit.rhtml +0 -22
  132. data/test/rails2_root/app/views/users/index.rhtml +0 -22
  133. data/test/rails2_root/app/views/users/new.rhtml +0 -21
  134. data/test/rails2_root/app/views/users/show.rhtml +0 -13
  135. data/test/rails2_root/config/boot.rb +0 -110
  136. data/test/rails2_root/config/database.yml +0 -4
  137. data/test/rails2_root/config/environment.rb +0 -17
  138. data/test/rails2_root/config/environments/test.rb +0 -23
  139. data/test/rails2_root/config/initializers/new_rails_defaults.rb +0 -15
  140. data/test/rails2_root/config/initializers/shoulda.rb +0 -8
  141. data/test/rails2_root/config/routes.rb +0 -6
  142. data/test/rails2_root/db/migrate/001_create_users.rb +0 -19
  143. data/test/rails2_root/db/migrate/002_create_posts.rb +0 -13
  144. data/test/rails2_root/db/migrate/003_create_taggings.rb +0 -12
  145. data/test/rails2_root/db/migrate/004_create_tags.rb +0 -11
  146. data/test/rails2_root/db/migrate/005_create_dogs.rb +0 -12
  147. data/test/rails2_root/db/migrate/006_create_addresses.rb +0 -14
  148. data/test/rails2_root/db/migrate/007_create_fleas.rb +0 -11
  149. data/test/rails2_root/db/migrate/008_create_dogs_fleas.rb +0 -12
  150. data/test/rails2_root/db/migrate/009_create_products.rb +0 -17
  151. data/test/rails2_root/db/migrate/010_create_friendships.rb +0 -14
  152. data/test/rails2_root/db/migrate/011_create_treats.rb +0 -12
  153. data/test/rails2_root/db/migrate/20090506203502_create_profiles.rb +0 -12
  154. data/test/rails2_root/db/migrate/20090506203536_create_registrations.rb +0 -14
  155. data/test/rails2_root/db/migrate/20090513104502_create_cats.rb +0 -12
  156. data/test/rails2_root/db/schema.rb +0 -0
  157. data/test/rails2_root/log/test.log +0 -50381
  158. data/test/rails2_root/public/404.html +0 -30
  159. data/test/rails2_root/public/422.html +0 -30
  160. data/test/rails2_root/public/500.html +0 -30
  161. data/test/rails2_root/script/console +0 -3
  162. data/test/rails2_root/script/generate +0 -3
  163. data/test/rails2_root/test/shoulda_macros/custom_macro.rb +0 -6
  164. data/test/rails2_root/vendor/gems/gem_with_macro-0.0.1/shoulda_macros/gem_macro.rb +0 -6
  165. data/test/rails2_root/vendor/plugins/plugin_with_macro/shoulda_macros/plugin_macro.rb +0 -6
  166. data/test/rails2_test_helper.rb +0 -6
  167. data/test/rails3_model_builder.rb +0 -118
  168. data/test/rails3_root/Gemfile +0 -28
  169. data/test/rails3_root/README +0 -244
  170. data/test/rails3_root/Rakefile +0 -10
  171. data/test/rails3_root/app/controllers/application_controller.rb +0 -22
  172. data/test/rails3_root/app/controllers/posts_controller.rb +0 -87
  173. data/test/rails3_root/app/controllers/users_controller.rb +0 -82
  174. data/test/rails3_root/app/helpers/application_helper.rb +0 -2
  175. data/test/rails3_root/app/models/address.rb +0 -7
  176. data/test/rails3_root/app/models/flea.rb +0 -11
  177. data/test/rails3_root/app/models/friendship.rb +0 -4
  178. data/test/rails3_root/app/models/notifier.rb +0 -8
  179. data/test/rails3_root/app/models/pets/cat.rb +0 -7
  180. data/test/rails3_root/app/models/pets/dog.rb +0 -10
  181. data/test/rails3_root/app/models/post.rb +0 -12
  182. data/test/rails3_root/app/models/product.rb +0 -12
  183. data/test/rails3_root/app/models/profile.rb +0 -2
  184. data/test/rails3_root/app/models/registration.rb +0 -2
  185. data/test/rails3_root/app/models/tag.rb +0 -8
  186. data/test/rails3_root/app/models/tagging.rb +0 -4
  187. data/test/rails3_root/app/models/treat.rb +0 -3
  188. data/test/rails3_root/app/models/user.rb +0 -32
  189. data/test/rails3_root/app/views/layouts/application.html.erb +0 -14
  190. data/test/rails3_root/app/views/layouts/posts.rhtml +0 -19
  191. data/test/rails3_root/app/views/layouts/users.rhtml +0 -17
  192. data/test/rails3_root/app/views/layouts/wide.html.erb +0 -1
  193. data/test/rails3_root/app/views/notifier/the_email.html.erb +0 -1
  194. data/test/rails3_root/app/views/posts/edit.rhtml +0 -27
  195. data/test/rails3_root/app/views/posts/index.rhtml +0 -25
  196. data/test/rails3_root/app/views/posts/new.rhtml +0 -24
  197. data/test/rails3_root/app/views/posts/show.rhtml +0 -18
  198. data/test/rails3_root/app/views/users/edit.rhtml +0 -22
  199. data/test/rails3_root/app/views/users/index.rhtml +0 -22
  200. data/test/rails3_root/app/views/users/new.rhtml +0 -21
  201. data/test/rails3_root/app/views/users/show.rhtml +0 -13
  202. data/test/rails3_root/config.ru +0 -4
  203. data/test/rails3_root/config/application.rb +0 -46
  204. data/test/rails3_root/config/boot.rb +0 -6
  205. data/test/rails3_root/config/database.yml +0 -22
  206. data/test/rails3_root/config/environment.rb +0 -5
  207. data/test/rails3_root/config/environments/development.rb +0 -19
  208. data/test/rails3_root/config/environments/production.rb +0 -42
  209. data/test/rails3_root/config/environments/test.rb +0 -32
  210. data/test/rails3_root/config/initializers/backtrace_silencers.rb +0 -7
  211. data/test/rails3_root/config/initializers/inflections.rb +0 -10
  212. data/test/rails3_root/config/initializers/mime_types.rb +0 -5
  213. data/test/rails3_root/config/initializers/secret_token.rb +0 -7
  214. data/test/rails3_root/config/initializers/session_store.rb +0 -8
  215. data/test/rails3_root/config/locales/en.yml +0 -5
  216. data/test/rails3_root/config/routes.rb +0 -4
  217. data/test/rails3_root/db/migrate/001_create_users.rb +0 -19
  218. data/test/rails3_root/db/migrate/002_create_posts.rb +0 -13
  219. data/test/rails3_root/db/migrate/003_create_taggings.rb +0 -12
  220. data/test/rails3_root/db/migrate/004_create_tags.rb +0 -11
  221. data/test/rails3_root/db/migrate/005_create_dogs.rb +0 -12
  222. data/test/rails3_root/db/migrate/006_create_addresses.rb +0 -14
  223. data/test/rails3_root/db/migrate/007_create_fleas.rb +0 -11
  224. data/test/rails3_root/db/migrate/008_create_dogs_fleas.rb +0 -12
  225. data/test/rails3_root/db/migrate/009_create_products.rb +0 -17
  226. data/test/rails3_root/db/migrate/010_create_friendships.rb +0 -14
  227. data/test/rails3_root/db/migrate/011_create_treats.rb +0 -12
  228. data/test/rails3_root/db/migrate/20090506203502_create_profiles.rb +0 -12
  229. data/test/rails3_root/db/migrate/20090506203536_create_registrations.rb +0 -14
  230. data/test/rails3_root/db/migrate/20090513104502_create_cats.rb +0 -12
  231. data/test/rails3_root/db/seeds.rb +0 -7
  232. data/test/rails3_root/db/test.sqlite3 +0 -0
  233. data/test/rails3_root/log/test.log +0 -10834
  234. data/test/rails3_root/public/404.html +0 -26
  235. data/test/rails3_root/public/422.html +0 -26
  236. data/test/rails3_root/public/500.html +0 -26
  237. data/test/rails3_root/public/favicon.ico +0 -0
  238. data/test/rails3_root/public/images/rails.png +0 -0
  239. data/test/rails3_root/public/index.html +0 -279
  240. data/test/rails3_root/public/javascripts/application.js +0 -2
  241. data/test/rails3_root/public/javascripts/controls.js +0 -965
  242. data/test/rails3_root/public/javascripts/dragdrop.js +0 -974
  243. data/test/rails3_root/public/javascripts/effects.js +0 -1123
  244. data/test/rails3_root/public/javascripts/prototype.js +0 -4874
  245. data/test/rails3_root/public/javascripts/rails.js +0 -118
  246. data/test/rails3_root/public/robots.txt +0 -5
  247. data/test/rails3_root/script/rails +0 -9
  248. data/test/rails3_root/test/performance/browsing_test.rb +0 -9
  249. data/test/rails3_root/test/test_helper.rb +0 -13
  250. data/test/rails3_test_helper.rb +0 -6
  251. data/test/rspec_test.rb +0 -207
  252. data/test/test_helper.rb +0 -36
  253. data/test/unit/address_test.rb +0 -10
  254. data/test/unit/cat_test.rb +0 -7
  255. data/test/unit/dog_test.rb +0 -9
  256. data/test/unit/flea_test.rb +0 -14
  257. data/test/unit/friendship_test.rb +0 -6
  258. data/test/unit/post_test.rb +0 -15
  259. data/test/unit/product_test.rb +0 -23
  260. data/test/unit/tag_test.rb +0 -11
  261. data/test/unit/tagging_test.rb +0 -6
  262. data/test/unit/user_test.rb +0 -46
@@ -1,87 +0,0 @@
1
- module Shoulda # :nodoc:
2
- module ActiveRecord # :nodoc:
3
- module Matchers
4
-
5
- # Ensure that the attribute's value is in the range specified
6
- #
7
- # Options:
8
- # * <tt>in_range</tt> - the range of allowed values for this attribute
9
- # * <tt>with_low_message</tt> - value the test expects to find in
10
- # <tt>errors.on(:attribute)</tt>. Regexp or string. Defaults to the
11
- # translation for :inclusion.
12
- # * <tt>with_high_message</tt> - value the test expects to find in
13
- # <tt>errors.on(:attribute)</tt>. Regexp or string. Defaults to the
14
- # translation for :inclusion.
15
- #
16
- # Example:
17
- # it { should ensure_inclusion_of(:age).in_range(0..100) }
18
- #
19
- def ensure_inclusion_of(attr)
20
- EnsureInclusionOfMatcher.new(attr)
21
- end
22
-
23
- class EnsureInclusionOfMatcher < ValidationMatcher # :nodoc:
24
-
25
- def in_range(range)
26
- @range = range
27
- @minimum = range.first
28
- @maximum = range.last
29
- self
30
- end
31
-
32
- def with_message(message)
33
- if message
34
- @low_message = message
35
- @high_message = message
36
- end
37
- self
38
- end
39
-
40
- def with_low_message(message)
41
- @low_message = message if message
42
- self
43
- end
44
-
45
- def with_high_message(message)
46
- @high_message = message if message
47
- self
48
- end
49
-
50
- def description
51
- "ensure inclusion of #{@attribute} in #{@range.inspect}"
52
- end
53
-
54
- def matches?(subject)
55
- super(subject)
56
-
57
- @low_message ||= :inclusion
58
- @high_message ||= :inclusion
59
-
60
- disallows_lower_value &&
61
- allows_minimum_value &&
62
- disallows_higher_value &&
63
- allows_maximum_value
64
- end
65
-
66
- private
67
-
68
- def disallows_lower_value
69
- @minimum == 0 || disallows_value_of(@minimum - 1, @low_message)
70
- end
71
-
72
- def disallows_higher_value
73
- disallows_value_of(@maximum + 1, @high_message)
74
- end
75
-
76
- def allows_minimum_value
77
- allows_value_of(@minimum, @low_message)
78
- end
79
-
80
- def allows_maximum_value
81
- allows_value_of(@maximum, @high_message)
82
- end
83
- end
84
-
85
- end
86
- end
87
- end
@@ -1,141 +0,0 @@
1
- module Shoulda # :nodoc:
2
- module ActiveRecord # :nodoc:
3
- module Matchers
4
-
5
- # Ensures that the length of the attribute is validated.
6
- #
7
- # Options:
8
- # * <tt>is_at_least</tt> - minimum length of this attribute
9
- # * <tt>is_at_most</tt> - maximum length of this attribute
10
- # * <tt>is_equal_to</tt> - exact requred length of this attribute
11
- # * <tt>with_short_message</tt> - value the test expects to find in
12
- # <tt>errors.on(:attribute)</tt>. Regexp or string. Defaults to the
13
- # translation for :too_short.
14
- # * <tt>with_long_message</tt> - value the test expects to find in
15
- # <tt>errors.on(:attribute)</tt>. Regexp or string. Defaults to the
16
- # translation for :too_long.
17
- # * <tt>with_message</tt> - value the test expects to find in
18
- # <tt>errors.on(:attribute)</tt>. Regexp or string. Defaults to the
19
- # translation for :wrong_length. Used in conjunction with
20
- # <tt>is_equal_to</tt>.
21
- #
22
- # Examples:
23
- # it { should ensure_length_of(:password).
24
- # is_at_least(6).
25
- # is_at_most(20) }
26
- # it { should ensure_length_of(:name).
27
- # is_at_least(3).
28
- # with_short_message(/not long enough/) }
29
- # it { should ensure_length_of(:ssn).
30
- # is_equal_to(9).
31
- # with_message(/is invalid/) }
32
- def ensure_length_of(attr)
33
- EnsureLengthOfMatcher.new(attr)
34
- end
35
-
36
- class EnsureLengthOfMatcher < ValidationMatcher # :nodoc:
37
- include Helpers
38
-
39
- def is_at_least(length)
40
- @minimum = length
41
- @short_message ||= :too_short
42
- self
43
- end
44
-
45
- def is_at_most(length)
46
- @maximum = length
47
- @long_message ||= :too_long
48
- self
49
- end
50
-
51
- def is_equal_to(length)
52
- @minimum = length
53
- @maximum = length
54
- @short_message ||= :wrong_length
55
- self
56
- end
57
-
58
- def with_short_message(message)
59
- @short_message = message if message
60
- self
61
- end
62
- alias_method :with_message, :with_short_message
63
-
64
- def with_long_message(message)
65
- @long_message = message if message
66
- self
67
- end
68
-
69
- def description
70
- description = "ensure #{@attribute} has a length "
71
- if @minimum && @maximum
72
- if @minimum == @maximum
73
- description << "of exactly #{@minimum}"
74
- else
75
- description << "between #{@minimum} and #{@maximum}"
76
- end
77
- else
78
- description << "of at least #{@minimum}" if @minimum
79
- description << "of at most #{@maximum}" if @maximum
80
- end
81
- description
82
- end
83
-
84
- def matches?(subject)
85
- super(subject)
86
- translate_messages!
87
- disallows_lower_length &&
88
- allows_minimum_length &&
89
- ((@minimum == @maximum) ||
90
- (disallows_higher_length &&
91
- allows_maximum_length))
92
- end
93
-
94
- private
95
-
96
- def translate_messages!
97
- if Symbol === @short_message
98
- @short_message = default_error_message(@short_message,
99
- :count => @minimum)
100
- end
101
-
102
- if Symbol === @long_message
103
- @long_message = default_error_message(@long_message,
104
- :count => @maximum)
105
- end
106
- end
107
-
108
- def disallows_lower_length
109
- @minimum == 0 ||
110
- @minimum.nil? ||
111
- disallows_length_of(@minimum - 1, @short_message)
112
- end
113
-
114
- def disallows_higher_length
115
- @maximum.nil? || disallows_length_of(@maximum + 1, @long_message)
116
- end
117
-
118
- def allows_minimum_length
119
- allows_length_of(@minimum, @short_message)
120
- end
121
-
122
- def allows_maximum_length
123
- allows_length_of(@maximum, @long_message)
124
- end
125
-
126
- def allows_length_of(length, message)
127
- length.nil? || allows_value_of(string_of_length(length), message)
128
- end
129
-
130
- def disallows_length_of(length, message)
131
- length.nil? || disallows_value_of(string_of_length(length), message)
132
- end
133
-
134
- def string_of_length(length)
135
- 'x' * length
136
- end
137
- end
138
-
139
- end
140
- end
141
- end
@@ -1,169 +0,0 @@
1
- module Shoulda # :nodoc:
2
- module ActiveRecord # :nodoc:
3
- module Matchers
4
-
5
- # Ensures the database column exists.
6
- #
7
- # Options:
8
- # * <tt>of_type</tt> - db column type (:integer, :string, etc.)
9
- # * <tt>with_options</tt> - same options available in migrations
10
- # (:default, :null, :limit, :precision, :scale)
11
- #
12
- # Examples:
13
- # it { should_not have_db_column(:admin).of_type(:boolean) }
14
- # it { should have_db_column(:salary).
15
- # of_type(:decimal).
16
- # with_options(:precision => 10, :scale => 2) }
17
- #
18
- def have_db_column(column)
19
- HaveDbColumnMatcher.new(:have_db_column, column)
20
- end
21
-
22
- class HaveDbColumnMatcher # :nodoc:
23
- def initialize(macro, column)
24
- @macro = macro
25
- @column = column
26
- end
27
-
28
- def of_type(column_type)
29
- @column_type = column_type
30
- self
31
- end
32
-
33
- def with_options(opts = {})
34
- @precision = opts[:precision]
35
- @limit = opts[:limit]
36
- @default = opts[:default]
37
- @null = opts[:null]
38
- @scale = opts[:scale]
39
- self
40
- end
41
-
42
- def matches?(subject)
43
- @subject = subject
44
- column_exists? &&
45
- correct_column_type? &&
46
- correct_precision? &&
47
- correct_limit? &&
48
- correct_default? &&
49
- correct_null? &&
50
- correct_scale?
51
- end
52
-
53
- def failure_message
54
- "Expected #{expectation} (#{@missing})"
55
- end
56
-
57
- def negative_failure_message
58
- "Did not expect #{expectation}"
59
- end
60
-
61
- def description
62
- desc = "have db column named #{@column}"
63
- desc << " of type #{@column_type}" unless @column_type.nil?
64
- desc << " of precision #{@precision}" unless @precision.nil?
65
- desc << " of limit #{@limit}" unless @limit.nil?
66
- desc << " of default #{@default}" unless @default.nil?
67
- desc << " of null #{@null}" unless @null.nil?
68
- desc << " of primary #{@primary}" unless @primary.nil?
69
- desc << " of scale #{@scale}" unless @scale.nil?
70
- desc
71
- end
72
-
73
- protected
74
-
75
- def column_exists?
76
- if model_class.column_names.include?(@column.to_s)
77
- true
78
- else
79
- @missing = "#{model_class} does not have a db column named #{@column}."
80
- false
81
- end
82
- end
83
-
84
- def correct_column_type?
85
- return true if @column_type.nil?
86
- if matched_column.type.to_s == @column_type.to_s
87
- true
88
- else
89
- @missing = "#{model_class} has a db column named #{@column} " <<
90
- "of type #{matched_column.type}, not #{@column_type}."
91
- false
92
- end
93
- end
94
-
95
- def correct_precision?
96
- return true if @precision.nil?
97
- if matched_column.precision.to_s == @precision.to_s
98
- true
99
- else
100
- @missing = "#{model_class} has a db column named #{@column} " <<
101
- "of precision #{matched_column.precision}, " <<
102
- "not #{@precision}."
103
- false
104
- end
105
- end
106
-
107
- def correct_limit?
108
- return true if @limit.nil?
109
- if matched_column.limit.to_s == @limit.to_s
110
- true
111
- else
112
- @missing = "#{model_class} has a db column named #{@column} " <<
113
- "of limit #{matched_column.limit}, " <<
114
- "not #{@limit}."
115
- false
116
- end
117
- end
118
-
119
- def correct_default?
120
- return true if @default.nil?
121
- if matched_column.default.to_s == @default.to_s
122
- true
123
- else
124
- @missing = "#{model_class} has a db column named #{@column} " <<
125
- "of default #{matched_column.default}, " <<
126
- "not #{@default}."
127
- false
128
- end
129
- end
130
-
131
- def correct_null?
132
- return true if @null.nil?
133
- if matched_column.null.to_s == @null.to_s
134
- true
135
- else
136
- @missing = "#{model_class} has a db column named #{@column} " <<
137
- "of null #{matched_column.null}, " <<
138
- "not #{@null}."
139
- false
140
- end
141
- end
142
-
143
- def correct_scale?
144
- return true if @scale.nil?
145
- if matched_column.scale.to_s == @scale.to_s
146
- true
147
- else
148
- @missing = "#{model_class} has a db column named #{@column} " <<
149
- "of scale #{matched_column.scale}, not #{@scale}."
150
- false
151
- end
152
- end
153
-
154
- def matched_column
155
- model_class.columns.detect { |each| each.name == @column.to_s }
156
- end
157
-
158
- def model_class
159
- @subject.class
160
- end
161
-
162
- def expectation
163
- expected = "#{model_class.name} to #{description}"
164
- end
165
- end
166
-
167
- end
168
- end
169
- end
@@ -1,112 +0,0 @@
1
- module Shoulda # :nodoc:
2
- module ActiveRecord # :nodoc:
3
- module Matchers
4
-
5
- # Ensures that there are DB indices on the given columns or tuples of
6
- # columns.
7
- #
8
- # Options:
9
- # * <tt>unique</tt> - whether or not the index has a unique
10
- # constraint. Use <tt>true</tt> to explicitly test for a unique
11
- # constraint. Use <tt>false</tt> to explicitly test for a non-unique
12
- # constraint. Use <tt>nil</tt> if you don't care whether the index is
13
- # unique or not. Default = <tt>nil</tt>
14
- #
15
- # Examples:
16
- #
17
- # it { should have_db_index(:age) }
18
- # it { should have_db_index([:commentable_type, :commentable_id]) }
19
- # it { should have_db_index(:ssn).unique(true) }
20
- #
21
- def have_db_index(columns)
22
- HaveDbIndexMatcher.new(:have_index, columns)
23
- end
24
-
25
- class HaveDbIndexMatcher # :nodoc:
26
- def initialize(macro, columns)
27
- @macro = macro
28
- @columns = normalize_columns_to_array(columns)
29
- end
30
-
31
- def unique(unique)
32
- @unique = unique
33
- self
34
- end
35
-
36
- def matches?(subject)
37
- @subject = subject
38
- index_exists? && correct_unique?
39
- end
40
-
41
- def failure_message
42
- "Expected #{expectation} (#{@missing})"
43
- end
44
-
45
- def negative_failure_message
46
- "Did not expect #{expectation}"
47
- end
48
-
49
- def description
50
- "have a #{index_type} index on columns #{@columns.join(' and ')}"
51
- end
52
-
53
- protected
54
-
55
- def index_exists?
56
- ! matched_index.nil?
57
- end
58
-
59
- def correct_unique?
60
- return true if @unique.nil?
61
- if matched_index.unique == @unique
62
- true
63
- else
64
- @missing = "#{table_name} has an index named #{matched_index.name} " <<
65
- "of unique #{matched_index.unique}, not #{@unique}."
66
- false
67
- end
68
- end
69
-
70
- def matched_index
71
- indexes.detect { |each| each.columns == @columns }
72
- end
73
-
74
- def model_class
75
- @subject.class
76
- end
77
-
78
- def table_name
79
- model_class.table_name
80
- end
81
-
82
- def indexes
83
- ::ActiveRecord::Base.connection.indexes(table_name)
84
- end
85
-
86
- def expectation
87
- expected = "#{model_class.name} to #{description}"
88
- end
89
-
90
- def index_type
91
- case @unique
92
- when nil
93
- ''
94
- when false
95
- 'non-unique'
96
- else
97
- 'unique'
98
- end
99
- end
100
-
101
- def normalize_columns_to_array(columns)
102
- if columns.class == Array
103
- columns.collect { |each| each.to_s }
104
- else
105
- [columns.to_s]
106
- end
107
- end
108
- end
109
-
110
- end
111
- end
112
- end