incline 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (303) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +13 -0
  3. data/Gemfile +17 -0
  4. data/Gemfile.lock +186 -0
  5. data/MIT-LICENSE +20 -0
  6. data/README.rdoc +208 -0
  7. data/Rakefile +37 -0
  8. data/app/assets/fonts/incline/.keep +0 -0
  9. data/app/assets/images/incline/.keep +0 -0
  10. data/app/assets/images/incline/barcode-B.svg +181 -0
  11. data/app/assets/javascripts/incline/activate_classed_items.js +11 -0
  12. data/app/assets/javascripts/incline/application.js +30 -0
  13. data/app/assets/javascripts/incline/bootstrap-datepicker.js +1800 -0
  14. data/app/assets/javascripts/incline/datatables.js +22193 -0
  15. data/app/assets/javascripts/incline/escapeHtml.js +10 -0
  16. data/app/assets/javascripts/incline/inline_actions.js +479 -0
  17. data/app/assets/javascripts/incline/jquery.doubleScroll.js +112 -0
  18. data/app/assets/javascripts/incline/jquery.number.js +764 -0
  19. data/app/assets/javascripts/incline/regexMask.js +27 -0
  20. data/app/assets/javascripts/incline/select2/i18n/en.js +3 -0
  21. data/app/assets/javascripts/incline/select2/select2.full.js +6436 -0
  22. data/app/assets/stylesheets/incline/application.css +18 -0
  23. data/app/assets/stylesheets/incline/bootstrap-theme.min.css +5 -0
  24. data/app/assets/stylesheets/incline/custom.scss +279 -0
  25. data/app/assets/stylesheets/incline/datatables.css +494 -0
  26. data/app/assets/stylesheets/incline/datepicker3.css +790 -0
  27. data/app/assets/stylesheets/incline/select2.css +484 -0
  28. data/app/controllers/incline/access_groups_controller.rb +127 -0
  29. data/app/controllers/incline/access_test_controller.rb +30 -0
  30. data/app/controllers/incline/account_activations_controller.rb +28 -0
  31. data/app/controllers/incline/application_controller.rb +11 -0
  32. data/app/controllers/incline/contact_controller.rb +34 -0
  33. data/app/controllers/incline/password_resets_controller.rb +113 -0
  34. data/app/controllers/incline/security_controller.rb +100 -0
  35. data/app/controllers/incline/sessions_controller.rb +50 -0
  36. data/app/controllers/incline/users_controller.rb +304 -0
  37. data/app/controllers/incline/welcome_controller.rb +19 -0
  38. data/app/helpers/incline/.keep +0 -0
  39. data/app/mailers/incline/application_mailer_base.rb +11 -0
  40. data/app/mailers/incline/contact_form.rb +19 -0
  41. data/app/mailers/incline/user_mailer.rb +45 -0
  42. data/app/models/incline/access_group.rb +121 -0
  43. data/app/models/incline/access_group_group_member.rb +12 -0
  44. data/app/models/incline/access_group_user_member.rb +10 -0
  45. data/app/models/incline/action_group.rb +12 -0
  46. data/app/models/incline/action_security.rb +222 -0
  47. data/app/models/incline/contact_message.rb +37 -0
  48. data/app/models/incline/disable_info.rb +20 -0
  49. data/app/models/incline/password_reset.rb +14 -0
  50. data/app/models/incline/password_reset_request.rb +14 -0
  51. data/app/models/incline/user.rb +437 -0
  52. data/app/models/incline/user_login_history.rb +30 -0
  53. data/app/views/incline/access_groups/_details.json.jbuilder +10 -0
  54. data/app/views/incline/access_groups/_form.html.erb +19 -0
  55. data/app/views/incline/access_groups/_list.html.erb +60 -0
  56. data/app/views/incline/access_groups/_messages.json.jbuilder +6 -0
  57. data/app/views/incline/access_groups/edit.html.erb +2 -0
  58. data/app/views/incline/access_groups/index.html.erb +6 -0
  59. data/app/views/incline/access_groups/index.json.jbuilder +16 -0
  60. data/app/views/incline/access_groups/new.html.erb +2 -0
  61. data/app/views/incline/access_groups/show.html.erb +9 -0
  62. data/app/views/incline/access_groups/show.json.jbuilder +11 -0
  63. data/app/views/incline/contact/new.html.erb +22 -0
  64. data/app/views/incline/contact_form/contact.html.erb +16 -0
  65. data/app/views/incline/contact_form/contact.text.erb +13 -0
  66. data/app/views/incline/password_resets/edit.html.erb +16 -0
  67. data/app/views/incline/password_resets/new.html.erb +12 -0
  68. data/app/views/incline/security/_details.json.jbuilder +7 -0
  69. data/app/views/incline/security/_form.html.erb +20 -0
  70. data/app/views/incline/security/_list.html.erb +89 -0
  71. data/app/views/incline/security/_messages.json.jbuilder +6 -0
  72. data/app/views/incline/security/edit.html.erb +2 -0
  73. data/app/views/incline/security/index.html.erb +6 -0
  74. data/app/views/incline/security/index.json.jbuilder +16 -0
  75. data/app/views/incline/security/show.html.erb +31 -0
  76. data/app/views/incline/security/show.json.jbuilder +11 -0
  77. data/app/views/incline/sessions/new.html.erb +26 -0
  78. data/app/views/incline/user_mailer/account_activation.html.erb +7 -0
  79. data/app/views/incline/user_mailer/account_activation.text.erb +6 -0
  80. data/app/views/incline/user_mailer/invalid_password_reset.html.erb +3 -0
  81. data/app/views/incline/user_mailer/invalid_password_reset.text.erb +5 -0
  82. data/app/views/incline/user_mailer/password_reset.html.erb +8 -0
  83. data/app/views/incline/user_mailer/password_reset.text.erb +7 -0
  84. data/app/views/incline/users/_details.json.jbuilder +32 -0
  85. data/app/views/incline/users/_form.html.erb +21 -0
  86. data/app/views/incline/users/_list.html.erb +102 -0
  87. data/app/views/incline/users/_messages.json.jbuilder +6 -0
  88. data/app/views/incline/users/disable_confirm.html.erb +19 -0
  89. data/app/views/incline/users/edit.html.erb +5 -0
  90. data/app/views/incline/users/index.html.erb +6 -0
  91. data/app/views/incline/users/index.json.jbuilder +16 -0
  92. data/app/views/incline/users/new.html.erb +5 -0
  93. data/app/views/incline/users/show.html.erb +12 -0
  94. data/app/views/incline/users/show.json.jbuilder +11 -0
  95. data/app/views/incline/welcome/home.html.erb +5 -0
  96. data/app/views/layouts/application.html.erb +1 -0
  97. data/app/views/layouts/incline/_account_menu.html.erb +18 -0
  98. data/app/views/layouts/incline/_app_menu_anon.html.erb +1 -0
  99. data/app/views/layouts/incline/_app_menu_authenticated.html.erb +1 -0
  100. data/app/views/layouts/incline/_footer.html.erb +13 -0
  101. data/app/views/layouts/incline/_header.html.erb +21 -0
  102. data/app/views/layouts/incline/_html_mailer.html.erb +5 -0
  103. data/app/views/layouts/incline/_incline_app.html.erb +25 -0
  104. data/app/views/layouts/incline/_messages.html.erb +3 -0
  105. data/app/views/layouts/incline/_shim.html.erb +3 -0
  106. data/app/views/layouts/incline/_text_mailer.text.erb +1 -0
  107. data/app/views/layouts/incline/application.html.erb +1 -0
  108. data/app/views/layouts/mailer.html.erb +2 -0
  109. data/app/views/layouts/mailer.text.erb +2 -0
  110. data/bin/rails +12 -0
  111. data/bin/test_scaffold.sh +10 -0
  112. data/config/routes.rb +61 -0
  113. data/db/migrate/20170511230126_create_incline_users.rb +26 -0
  114. data/db/migrate/20170515003052_create_incline_access_groups.rb +10 -0
  115. data/db/migrate/20170515003221_create_incline_user_login_histories.rb +12 -0
  116. data/db/migrate/20170515150908_create_incline_access_group_user_members.rb +11 -0
  117. data/db/migrate/20170515151058_create_incline_access_group_group_members.rb +11 -0
  118. data/db/migrate/20170517193432_add_comments_to_incline_user.rb +5 -0
  119. data/db/migrate/20170622132700_create_incline_action_securities.rb +16 -0
  120. data/db/migrate/20170622172712_create_incline_action_groups.rb +11 -0
  121. data/db/migrate/20170622195742_add_non_standard_to_action_security.rb +5 -0
  122. data/db/migrate/20170622230422_add_visible_to_action_security.rb +5 -0
  123. data/db/seeds.rb +81 -0
  124. data/exe/new_incline_app +42 -0
  125. data/lib/generators/incline/install_generator.rb +259 -0
  126. data/lib/generators/incline/templates/_app_menu_anon.html.erb +1 -0
  127. data/lib/generators/incline/templates/_app_menu_authenticated.html.erb +1 -0
  128. data/lib/generators/incline/templates/incline_application.css +17 -0
  129. data/lib/generators/incline/templates/incline_application.html.erb +1 -0
  130. data/lib/generators/incline/templates/incline_application.js +12 -0
  131. data/lib/generators/incline/templates/incline_database.yml +25 -0
  132. data/lib/generators/incline/templates/incline_email.yml +20 -0
  133. data/lib/generators/incline/templates/incline_mailer.html.erb +2 -0
  134. data/lib/generators/incline/templates/incline_mailer.text.erb +2 -0
  135. data/lib/generators/incline/templates/incline_users.yml +64 -0
  136. data/lib/generators/incline/templates/incline_version.rb +3 -0
  137. data/lib/incline/auth_engine_base.rb +52 -0
  138. data/lib/incline/data_tables_request.rb +336 -0
  139. data/lib/incline/date_time_formats.rb +6 -0
  140. data/lib/incline/engine.rb +212 -0
  141. data/lib/incline/errors.rb +15 -0
  142. data/lib/incline/extensions/action_controller_base.rb +526 -0
  143. data/lib/incline/extensions/action_mailer_base.rb +66 -0
  144. data/lib/incline/extensions/action_view_base.rb +489 -0
  145. data/lib/incline/extensions/active_record_base.rb +308 -0
  146. data/lib/incline/extensions/application.rb +137 -0
  147. data/lib/incline/extensions/application_configuration.rb +50 -0
  148. data/lib/incline/extensions/connection_adapter.rb +55 -0
  149. data/lib/incline/extensions/date_time_value.rb +123 -0
  150. data/lib/incline/extensions/date_value.rb +77 -0
  151. data/lib/incline/extensions/decimal_value.rb +55 -0
  152. data/lib/incline/extensions/erb_scaffold_generator.rb +31 -0
  153. data/lib/incline/extensions/float_value.rb +59 -0
  154. data/lib/incline/extensions/form_builder.rb +617 -0
  155. data/lib/incline/extensions/integer_value.rb +54 -0
  156. data/lib/incline/extensions/jbuilder_generator.rb +38 -0
  157. data/lib/incline/extensions/jbuilder_template.rb +39 -0
  158. data/lib/incline/extensions/main_app.rb +40 -0
  159. data/lib/incline/extensions/numeric.rb +63 -0
  160. data/lib/incline/extensions/object.rb +31 -0
  161. data/lib/incline/extensions/resource_route_generator.rb +53 -0
  162. data/lib/incline/extensions/session.rb +113 -0
  163. data/lib/incline/extensions/string.rb +50 -0
  164. data/lib/incline/extensions/test_case.rb +764 -0
  165. data/lib/incline/extensions/time_zone_converter.rb +40 -0
  166. data/lib/incline/global_status.rb +236 -0
  167. data/lib/incline/helpers/route_hash_formatter.rb +46 -0
  168. data/lib/incline/json_log_formatter.rb +96 -0
  169. data/lib/incline/json_logger.rb +17 -0
  170. data/lib/incline/log.rb +153 -0
  171. data/lib/incline/number_formats.rb +17 -0
  172. data/lib/incline/recaptcha.rb +346 -0
  173. data/lib/incline/user_manager.rb +212 -0
  174. data/lib/incline/validators/email_validator.rb +45 -0
  175. data/lib/incline/validators/ip_address_validator.rb +32 -0
  176. data/lib/incline/validators/recaptcha_validator.rb +37 -0
  177. data/lib/incline/validators/safe_name_validator.rb +31 -0
  178. data/lib/incline/version.rb +3 -0
  179. data/lib/incline/work_path.rb +75 -0
  180. data/lib/incline.rb +197 -0
  181. data/lib/tasks/incline_tasks.rake +4 -0
  182. data/lib/templates/erb/scaffold/_form.html.erb +43 -0
  183. data/lib/templates/erb/scaffold/_list.html.erb +81 -0
  184. data/lib/templates/erb/scaffold/edit.html.erb +1 -0
  185. data/lib/templates/erb/scaffold/index.html.erb +6 -0
  186. data/lib/templates/erb/scaffold/new.html.erb +1 -0
  187. data/lib/templates/erb/scaffold/show.html.erb +34 -0
  188. data/lib/templates/jbuilder/scaffold/_details.json.jbuilder +20 -0
  189. data/lib/templates/jbuilder/scaffold/index.json.jbuilder +16 -0
  190. data/lib/templates/jbuilder/scaffold/show.json.jbuilder +16 -0
  191. data/lib/templates/rails/scaffold_controller/controller.rb +128 -0
  192. data/test/controllers/incline/access_groups_controller_test.rb +65 -0
  193. data/test/controllers/incline/access_test_controller_test.rb +53 -0
  194. data/test/controllers/incline/contact_controller_test.rb +32 -0
  195. data/test/controllers/incline/security_controller_test.rb +39 -0
  196. data/test/controllers/incline/welcome_controller_test.rb +16 -0
  197. data/test/dummy/README.rdoc +28 -0
  198. data/test/dummy/Rakefile +6 -0
  199. data/test/dummy/app/assets/images/.keep +0 -0
  200. data/test/dummy/app/assets/javascripts/application.js +12 -0
  201. data/test/dummy/app/assets/stylesheets/application.css +17 -0
  202. data/test/dummy/app/controllers/application_controller.rb +5 -0
  203. data/test/dummy/app/controllers/concerns/.keep +0 -0
  204. data/test/dummy/app/helpers/application_helper.rb +2 -0
  205. data/test/dummy/app/mailers/.keep +0 -0
  206. data/test/dummy/app/models/.keep +0 -0
  207. data/test/dummy/app/models/concerns/.keep +0 -0
  208. data/test/dummy/app/views/layouts/application.html.erb +1 -0
  209. data/test/dummy/app/views/layouts/incline/_app_menu_anon.html.erb +1 -0
  210. data/test/dummy/app/views/layouts/incline/_app_menu_authenticated.html.erb +1 -0
  211. data/test/dummy/app/views/layouts/mailer.html.erb +2 -0
  212. data/test/dummy/app/views/layouts/mailer.text.erb +2 -0
  213. data/test/dummy/bin/bundle +3 -0
  214. data/test/dummy/bin/rails +4 -0
  215. data/test/dummy/bin/rake +4 -0
  216. data/test/dummy/bin/setup +29 -0
  217. data/test/dummy/config/application.rb +38 -0
  218. data/test/dummy/config/boot.rb +5 -0
  219. data/test/dummy/config/database.yml +34 -0
  220. data/test/dummy/config/email.yml +24 -0
  221. data/test/dummy/config/environment.rb +5 -0
  222. data/test/dummy/config/environments/development.rb +45 -0
  223. data/test/dummy/config/environments/production.rb +85 -0
  224. data/test/dummy/config/environments/test.rb +44 -0
  225. data/test/dummy/config/initializers/assets.rb +11 -0
  226. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  227. data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
  228. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  229. data/test/dummy/config/initializers/inflections.rb +16 -0
  230. data/test/dummy/config/initializers/mime_types.rb +4 -0
  231. data/test/dummy/config/initializers/session_store.rb +3 -0
  232. data/test/dummy/config/initializers/to_time_preserves_timezone.rb +10 -0
  233. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  234. data/test/dummy/config/locales/en.yml +23 -0
  235. data/test/dummy/config/routes.rb +6 -0
  236. data/test/dummy/config.ru +4 -0
  237. data/test/dummy/db/schema.rb +108 -0
  238. data/test/dummy/lib/assets/.keep +0 -0
  239. data/test/dummy/log/.keep +0 -0
  240. data/test/dummy/public/404.html +67 -0
  241. data/test/dummy/public/422.html +67 -0
  242. data/test/dummy/public/500.html +66 -0
  243. data/test/dummy/public/favicon.ico +0 -0
  244. data/test/extensions/action_controller_base_extensions_test.rb +21 -0
  245. data/test/extensions/action_mailer_base_extensions_test.rb +20 -0
  246. data/test/extensions/action_view_base_extensions_test.rb +267 -0
  247. data/test/extensions/active_record_extensions_test.rb +173 -0
  248. data/test/extensions/application_configuration_extensions_test.rb +46 -0
  249. data/test/extensions/application_extensions_test.rb +23 -0
  250. data/test/extensions/connection_adapter_extensions_test.rb +54 -0
  251. data/test/extensions/date_time_value_extensions_test.rb +104 -0
  252. data/test/extensions/date_value_extensions_test.rb +102 -0
  253. data/test/extensions/decimal_value_extensions_test.rb +85 -0
  254. data/test/extensions/erb_scaffold_generator_extensions_test.rb +17 -0
  255. data/test/extensions/float_value_extensions_test.rb +78 -0
  256. data/test/extensions/form_builder_extensions_test.rb +28 -0
  257. data/test/extensions/integer_value_extensions_test.rb +78 -0
  258. data/test/extensions/jbuilder_generator_extensions_test.rb +21 -0
  259. data/test/extensions/jbuilder_template_extensions_test.rb +47 -0
  260. data/test/extensions/main_app_extensions_test.rb +55 -0
  261. data/test/extensions/numeric_extensions_test.rb +76 -0
  262. data/test/extensions/object_extensions_test.rb +104 -0
  263. data/test/extensions/session_extensions_test.rb +69 -0
  264. data/test/extensions/string_extensions_test.rb +32 -0
  265. data/test/extensions/test_case_extensions_test.rb +538 -0
  266. data/test/extensions/time_zone_converter_extensions_test.rb +10 -0
  267. data/test/fixtures/incline/access_group_group_members.yml +1 -0
  268. data/test/fixtures/incline/access_group_user_members.yml +1 -0
  269. data/test/fixtures/incline/access_groups.yml +13 -0
  270. data/test/fixtures/incline/action_groups.yml +6 -0
  271. data/test/fixtures/incline/action_securities.yml +18 -0
  272. data/test/fixtures/incline/user_login_histories.yml +1 -0
  273. data/test/fixtures/incline/users.yml +64 -0
  274. data/test/incline_test.rb +63 -0
  275. data/test/integration/incline/users_edit_test.rb +180 -0
  276. data/test/integration/incline/users_login_test.rb +105 -0
  277. data/test/integration/incline/users_signup_test.rb +147 -0
  278. data/test/integration/navigation_test.rb +11 -0
  279. data/test/lib/data_tables_request_test.rb +245 -0
  280. data/test/lib/date_time_formats_test.rb +111 -0
  281. data/test/lib/global_status_test.rb +89 -0
  282. data/test/lib/json_log_formatter_test.rb +43 -0
  283. data/test/lib/log_test.rb +36 -0
  284. data/test/lib/recaptcha_test.rb +75 -0
  285. data/test/lib/user_manager_test.rb +47 -0
  286. data/test/lib/work_path_test.rb +18 -0
  287. data/test/models/incline/access_group_group_member_test.rb +30 -0
  288. data/test/models/incline/access_group_test.rb +60 -0
  289. data/test/models/incline/access_group_user_member_test.rb +29 -0
  290. data/test/models/incline/action_group_test.rb +27 -0
  291. data/test/models/incline/action_security_test.rb +176 -0
  292. data/test/models/incline/contact_message_test.rb +66 -0
  293. data/test/models/incline/disable_info_test.rb +29 -0
  294. data/test/models/incline/password_reset_request_test.rb +35 -0
  295. data/test/models/incline/password_reset_test.rb +51 -0
  296. data/test/models/incline/user_login_history_test.rb +31 -0
  297. data/test/models/incline/user_test.rb +91 -0
  298. data/test/test_helper.rb +42 -0
  299. data/test/validators/email_validator_test.rb +102 -0
  300. data/test/validators/ip_address_validator_test.rb +107 -0
  301. data/test/validators/recaptcha_validator_test.rb +57 -0
  302. data/test/validators/safe_name_validator_test.rb +101 -0
  303. metadata +584 -0
@@ -0,0 +1,267 @@
1
+ require 'test_helper'
2
+ require 'cgi/util'
3
+
4
+ class ActionViewBaseExtensionsTest < ActiveSupport::TestCase
5
+
6
+ class TestModel
7
+ def errors
8
+ @errors ||= TestErrors.new
9
+ end
10
+ end
11
+
12
+ class TestErrors
13
+ def any?
14
+ true
15
+ end
16
+ def count
17
+ 10
18
+ end
19
+ def full_messages
20
+ @full_messages ||= (1..10).to_a.map{ |v| "This is error ##{v}." }
21
+ end
22
+ end
23
+
24
+
25
+ def setup
26
+ @view = ActionView::Base.new
27
+ end
28
+
29
+ test 'should have extension methods' do
30
+ assert @view.respond_to?(:full_title)
31
+ assert @view.respond_to?(:show_check_if)
32
+ assert @view.respond_to?(:glyph)
33
+ assert @view.respond_to?(:render_alert)
34
+ assert @view.respond_to?(:error_summary)
35
+ assert @view.respond_to?(:fmt_date)
36
+ assert @view.respond_to?(:fmt_num)
37
+ assert @view.respond_to?(:gravatar_for)
38
+ assert @view.respond_to?(:panel)
39
+ end
40
+
41
+ test 'full_title should work as expected' do
42
+ app_name = Rails.application.app_name.strip
43
+ assert_equal app_name, @view.full_title
44
+ assert_equal "Hello World | #{app_name}", @view.full_title('Hello World')
45
+ end
46
+
47
+ test 'show_check_if should work as expected' do
48
+ # false should be nil.
49
+ assert_nil @view.show_check_if(false)
50
+ assert_nil @view.show_check_if(nil)
51
+
52
+ # true should not be nil.
53
+ expected = '<i class="glyphicon glyphicon-ok glyphicon-small"></i>'
54
+ val = @view.show_check_if(true)
55
+ assert_not val.blank?
56
+ assert_equal expected, val
57
+ assert val.html_safe?
58
+
59
+ # values that convert to true should also work.
60
+ assert_equal val, @view.show_check_if(:true)
61
+ assert_equal val, @view.show_check_if('true')
62
+ assert_equal val, @view.show_check_if('yes')
63
+ assert_equal val, @view.show_check_if('1')
64
+ assert_equal val, @view.show_check_if(1)
65
+
66
+ # and those that convert to false should be nil
67
+ assert_nil @view.show_check_if(:false)
68
+ assert_nil @view.show_check_if('false')
69
+ assert_nil @view.show_check_if('no')
70
+ assert_nil @view.show_check_if('0')
71
+ assert_nil @view.show_check_if(0)
72
+ end
73
+
74
+ test 'glyph should work as expected' do
75
+ # blank values should return nil.
76
+ assert_nil @view.glyph(nil)
77
+ assert_nil @view.glyph('')
78
+ assert_nil @view.glyph(' ')
79
+
80
+ expected = '<i class="glyphicon glyphicon-ok"></i>'
81
+ assert_equal expected, @view.glyph(:ok)
82
+ assert_equal expected, @view.glyph('ok')
83
+ assert_equal expected, @view.glyph(' ok ')
84
+ assert_equal expected, @view.glyph(:ok, :normal) # invalid size
85
+ assert_equal expected, @view.glyph(:ok, :big) # invalid size
86
+ assert_equal expected, @view.glyph(:ok, :tiny) # invalid size
87
+
88
+ expected = '<i class="glyphicon glyphicon-cloud glyphicon-small"></i>'
89
+ assert_equal expected, @view.glyph(:cloud, :small)
90
+ assert_equal expected, @view.glyph('cloud', 'small')
91
+ assert_equal expected, @view.glyph(:cloud, 'sm')
92
+ assert_equal expected, @view.glyph('cloud', :sm)
93
+
94
+ expected = '<i class="glyphicon glyphicon-remove glyphicon-large"></i>'
95
+ assert_equal expected, @view.glyph(:remove, :large)
96
+ assert_equal expected, @view.glyph(:remove, 'lg')
97
+ end
98
+
99
+ test 'fmt_date should work as expected' do
100
+ assert_nil @view.fmt_date(nil)
101
+ assert_nil @view.fmt_date('')
102
+ assert_nil @view.fmt_date(' ')
103
+
104
+ # test the string formats.
105
+ assert_equal '1/1/2017', @view.fmt_date('1/1/2017')
106
+ assert_equal '12/31/2017', @view.fmt_date('12/31/2017')
107
+ assert_equal '1/1/2017', @view.fmt_date('2017-01-01')
108
+ assert_equal '12/31/2017', @view.fmt_date('2017-12-31')
109
+ assert_equal '1/1/2017', @view.fmt_date('2017-1-1 12:30 PM')
110
+ assert_equal '12/31/2017', @view.fmt_date('12/31/2017 12:30 PM')
111
+
112
+ val = Time.parse('2016-05-08')
113
+ assert_equal '5/8/2016', @view.fmt_date(val)
114
+
115
+ val = Date.new(2016,12,31)
116
+ assert_equal '12/31/2016', @view.fmt_date(val)
117
+
118
+ val = Time.parse('2016-12-31 23:00:00 -04:00')
119
+ assert_equal '12/31/2016', @view.fmt_date(val)
120
+ assert_equal '1/1/2017', @view.fmt_date(val.utc)
121
+ end
122
+
123
+ test 'fmt_num should work as expected' do
124
+ assert_nil @view.fmt_num(nil)
125
+ assert_nil @view.fmt_num('')
126
+ assert_nil @view.fmt_num(' ')
127
+
128
+ assert_equal '0.00', @view.fmt_num(0)
129
+ assert_equal '0.00', @view.fmt_num('0')
130
+
131
+ assert_equal '1.50', @view.fmt_num(1.499997)
132
+ assert_equal '123.45', @view.fmt_num('123.450678')
133
+
134
+ assert_equal '150', @view.fmt_num(150, 0)
135
+ assert_equal '123', @view.fmt_num(123.456, 0)
136
+
137
+ assert_equal '1.0000', @view.fmt_num(1, 4)
138
+ assert_equal '123.4567', @view.fmt_num(123.4567, 4)
139
+ end
140
+
141
+ test 'render_alert accepts valid alert types' do
142
+ {
143
+ :success => :success,
144
+ :info => :info,
145
+ :warning => :warning,
146
+ :danger => :danger,
147
+ :notice => :info,
148
+ :alert => :danger,
149
+ :error => :danger,
150
+ :warn => :warning,
151
+ :safe_success => :success,
152
+ :safe_info => :info,
153
+ :safe_warning => :warning,
154
+ :safe_danger => :danger,
155
+ :safe_notice => :info,
156
+ :safe_alert => :danger,
157
+ :safe_error => :danger,
158
+ :safe_warn => :warning
159
+ }.each do |type, klass|
160
+ expected = "<div class=\"alert alert-#{klass} alert-dismissible\">" +
161
+ '<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>' +
162
+ '<span>Hello World</span>' +
163
+ '</div>'
164
+ assert_equal expected, @view.render_alert(type, 'Hello World'), "Mismatch for #{type.inspect}"
165
+ end
166
+ end
167
+
168
+ test 'render_alert converts invalid alert types to info' do
169
+ [
170
+ :good, :not_good, :fatal, :information, :xyz
171
+ ].each do |type|
172
+ expected = '<div class="alert alert-info alert-dismissible">' +
173
+ '<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>' +
174
+ '<span>Hello World</span>' +
175
+ '</div>'
176
+ assert_equal expected, @view.render_alert(type, 'Hello World')
177
+ end
178
+ end
179
+
180
+ test 'render_alert supports simple markdown' do
181
+ expected = '<div class="alert alert-info alert-dismissible">' +
182
+ '<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>' +
183
+ '<span><strong>Hello</strong> World</span>' +
184
+ '</div>'
185
+ assert_equal expected, @view.render_alert(:info, '__Hello__ World')
186
+ end
187
+
188
+ test 'render_alert handles arrays correctly' do
189
+ expected = '<div class="alert alert-info alert-dismissible">' +
190
+ '<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>' +
191
+ '<span>Line 1</span><br>' +
192
+ '<span>Line 2</span>' +
193
+ '</div>'
194
+ assert_equal expected, @view.render_alert(:info, [ 'Line 1', 'Line 2' ])
195
+ end
196
+
197
+ test 'render_alert handles hashes correctly' do
198
+ expected = '<div class="alert alert-danger alert-dismissible">' +
199
+ '<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>' +
200
+ '<div>Name<ul><li>cannot be blank</li><li>must be unique</li></ul></div>' +
201
+ '<div>Age<ul><li>must be greater than 18</li></ul></div>' +
202
+ '</div>'
203
+ assert_equal expected, @view.render_alert(:error, { :name => [ 'cannot be blank', 'must be unique' ], :age => 'must be greater than 18' })
204
+ end
205
+
206
+ test 'render_alert handles mixed message correctly' do
207
+ expected = '<div class="alert alert-danger alert-dismissible">' +
208
+ '<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>' +
209
+ '<span><strong>The model could not be saved.</strong></span><br>' +
210
+ '<div>Name<ul><li>cannot be blank</li><li>must be unique</li></ul></div>' +
211
+ '<div>Age<ul><li>must be greater than 18</li></ul></div>' +
212
+ '</div>'
213
+ assert_equal expected, @view.render_alert(:error, [ '__The model could not be saved.__', { :name => [ 'cannot be blank', 'must be unique' ], :age => 'must be greater than 18' } ])
214
+ end
215
+
216
+ test 'render_alert safe vs unsafe test' do
217
+
218
+ text = 'This is <em>my</em> test value &#9786;<br>There is <strong>nothing</strong> you can do about it.'
219
+ safe_text = CGI::escape_html(text)
220
+
221
+ expected = '<div class="alert alert-info alert-dismissible">' +
222
+ '<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>' +
223
+ "<span>#{safe_text}</span>" +
224
+ '</div>'
225
+ assert_equal expected, @view.render_alert(:info, text)
226
+
227
+ expected = '<div class="alert alert-info alert-dismissible">' +
228
+ '<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>' +
229
+ "<span>#{text}</span>" +
230
+ '</div>'
231
+ assert_equal expected, @view.render_alert(:safe_info, text)
232
+ end
233
+
234
+ test 'error_summary should work as expected' do
235
+ expected = "<div id=\"error_explanation\"><div class=\"alert alert-danger\">" +
236
+ "<div><strong>The form contains 10 errors.</strong><ul>" +
237
+ "<li>This is error #1.</li><li>This is error #2.</li><li>This is error #3.</li><li>This is error #4.</li>" +
238
+ "<li>This is error #5.</li>" +
239
+ "<li class=\"alert_52444_show\"><a href=\"javascript:show_alert_52444()\" title=\"Show 5 more\">... plus 5 more</a></li>" +
240
+ "<li class=\"alert_52444\" style=\"display: none;\">This is error #6.</li>" +
241
+ "<li class=\"alert_52444\" style=\"display: none;\">This is error #7.</li>" +
242
+ "<li class=\"alert_52444\" style=\"display: none;\">This is error #8.</li>" +
243
+ "<li class=\"alert_52444\" style=\"display: none;\">This is error #9.</li>" +
244
+ "<li class=\"alert_52444\" style=\"display: none;\">This is error #10.</li>" +
245
+ "</ul></div>" +
246
+ "<script type=\"text/javascript\">\n<![CDATA[\nfunction show_alert_52444() { $('.alert_52444_show').hide(); $('.alert_52444').show(); }\n\n]]>\n</script>\n" +
247
+ "</div></div>"
248
+
249
+ val = @view.error_summary(TestModel.new)
250
+
251
+ assert val
252
+ assert val =~ /show_alert_([0-9a-fA-F]{5})\(\)/
253
+ id = $1
254
+ expected = expected.gsub('52444', id)
255
+
256
+ assert_equal expected, val
257
+ end
258
+
259
+ test 'gravatar_for should work as expected' do
260
+ # TODO: Fill in test.
261
+ end
262
+
263
+ test 'panel should work as expected' do
264
+ # TODO: Fill in test.
265
+ end
266
+
267
+ end
@@ -0,0 +1,173 @@
1
+ require 'test_helper'
2
+
3
+ class ActiveRecordExtensionsTest < ActiveSupport::TestCase
4
+
5
+ TEST_TABLE_NAME = "test_table_#{SecureRandom.random_number(1<<16).to_s(16).rjust(4,'0')}"
6
+ TEST_TABLE_CLASS = TEST_TABLE_NAME.classify.to_sym
7
+
8
+ def setup
9
+ # Create a test table.
10
+ silence_stream STDOUT do
11
+ ActiveRecord::Migration::create_table TEST_TABLE_NAME do |t|
12
+ t.string :name
13
+ end
14
+ end
15
+
16
+ # And then create a test model.
17
+ eval <<-EOM
18
+ class #{TEST_TABLE_CLASS} < ActiveRecord::Base
19
+ self.table_name = #{TEST_TABLE_NAME.inspect}
20
+ end
21
+ EOM
22
+
23
+ # Store the model class for use.
24
+ @model_class = self.class.const_get TEST_TABLE_CLASS
25
+
26
+ # Add a few records just to have something to play with.
27
+ @model_class.create name: 'Item 1'
28
+ @model_class.create name: 'Item 2'
29
+ @model_class.create name: 'Item 3'
30
+ @model_class.create name: 'Item 2' # one duplicate name...
31
+ end
32
+
33
+ def teardown
34
+ # Undefine the model class (or at least remove it from the Object namespace).
35
+ self.class.send :remove_const, TEST_TABLE_CLASS
36
+
37
+ # Remove the table from the database.
38
+ silence_stream STDOUT do
39
+ ActiveRecord::Migration::drop_table TEST_TABLE_NAME
40
+ end
41
+ end
42
+
43
+ test 'has extension methods' do
44
+ assert @model_class.respond_to?(:get_id)
45
+ assert @model_class.respond_to?(:get)
46
+ assert @model_class.respond_to?('[]')
47
+ end
48
+
49
+ test 'to_s and inspect are overridden' do
50
+ item = @model_class.first
51
+ assert_equal item.name, item.to_s
52
+ assert_equal "#<#{item.class}:#{item.object_pointer} #{item.to_s}>", item.inspect
53
+ end
54
+
55
+ test 'get_id returns ids' do
56
+ item = @model_class.first
57
+ # recognize a model and return the ID.
58
+ assert_equal item.id, @model_class.get_id(item)
59
+
60
+ # return the integer value unmodified.
61
+ assert_equal item.id, @model_class.get_id(item.id)
62
+
63
+ # recognize an integer string and return the integer value.
64
+ assert_equal item.id, @model_class.get_id(item.id.to_s)
65
+
66
+ # locate the item by name and return the ID.
67
+ assert_equal item.id, @model_class.get_id(item.name)
68
+
69
+ # do it all again with arrays.
70
+ assert_equal [ item.id ], @model_class.get_id([ item ])
71
+ assert_equal [ item.id ], @model_class.get_id([ item.id ])
72
+ assert_equal [ item.id ], @model_class.get_id([ item.id.to_s ])
73
+ assert_equal [ item.id ], @model_class.get_id([ item.name ])
74
+
75
+ # does not validate integers.
76
+ assert_equal 99, @model_class.get_id(99)
77
+
78
+ # Searches by :code and :name attributes if the model has them.
79
+ # This is apparent where we are searching with the item name.
80
+ # However if the name doesn't match, nil should be returned.
81
+ assert_nil @model_class.get_id('Item 4')
82
+ end
83
+
84
+ test 'get works as expected' do
85
+ # get() will always return an array unless there are no results.
86
+ # It will search by :code and :name attributes if the model has them.
87
+
88
+ # There should be two items named 'Item 2'.
89
+ ids = @model_class.get_id('Item 2')
90
+ assert_equal 2, ids.count
91
+
92
+ items = @model_class.get('Item 2')
93
+ assert items
94
+ assert_equal 2, items.count
95
+ assert_equal ids, items.map{|i| i.id}
96
+
97
+ items = @model_class.get(ids)
98
+ assert items
99
+ assert_equal 2, items.count
100
+ assert_equal ids, items.map{|i| i.id}
101
+
102
+ # There should only be one item named 'Item 3'.
103
+ ids = @model_class.get_id('Item 3')
104
+ assert ids.is_a?(::Integer)
105
+
106
+ items = @model_class.get('Item 3')
107
+ assert items
108
+ assert_equal 1, items.count
109
+ assert_equal ids, items.first.id
110
+
111
+ items = @model_class.get(ids)
112
+ assert items
113
+ assert_equal 1, items.count
114
+ assert_equal ids, items.first.id
115
+
116
+ # Should allow an array as an argument.
117
+ items = @model_class.get(['Item 1', 'Item 3'])
118
+ assert items
119
+ assert_equal 2, items.count
120
+ assert items.find{|i| i.name == 'Item 1'}
121
+ assert items.find{|i| i.name == 'Item 3'}
122
+
123
+ # There should be no item named 'Item 4'.
124
+ assert_nil @model_class.get('Item 4')
125
+
126
+ # There should be no ID of 99.
127
+ assert_nil @model_class.get(99)
128
+ end
129
+
130
+ test '[] works as expected' do
131
+ # [] will always return one item if any items are found or nil if none are found.
132
+ # It will search by :code and :name attributes if the model has them.
133
+
134
+ # There should be two items named 'Item 2'.
135
+ # But [] will only return the first, sorted by ID since the name is the same.
136
+ ids = @model_class.get_id('Item 2')
137
+ assert_equal 2, ids.count
138
+
139
+ item = @model_class['Item 2']
140
+ assert item
141
+ assert_equal ids.first, item.id
142
+
143
+ # Even when an array is used for the argument, only one item will be returned.
144
+ item = @model_class[ids]
145
+ assert item
146
+ assert_equal ids.first, item.id
147
+
148
+ # There should only be one item named 'Item 3'.
149
+ id = @model_class.get_id('Item 3')
150
+ assert id.is_a?(::Integer)
151
+
152
+ item = @model_class['Item 3']
153
+ assert item
154
+ assert_equal id, item.id
155
+
156
+ item = @model_class[id]
157
+ assert item
158
+ assert_equal id, item.id
159
+
160
+ # Should allow an array as an argument, but only the first item will be returned.
161
+ item = @model_class[['Item 1', 'Item 3']]
162
+ assert item
163
+ assert_equal @model_class.get_id('Item 1'), item.id
164
+
165
+ # There should be no item named 'Item 4'.
166
+ assert_nil @model_class['Item 4']
167
+
168
+ # There should be no ID of 99.
169
+ assert_nil @model_class[99]
170
+ end
171
+
172
+
173
+ end
@@ -0,0 +1,46 @@
1
+ require 'test_helper'
2
+
3
+ class ApplicationConfigurationExtensionsTest < ActiveSupport::TestCase
4
+
5
+ test 'Rails.application.config has extension' do
6
+ cfg = Rails.application&.config
7
+ skip unless cfg
8
+ assert cfg.respond_to?(:incline_appconfig_original_database_configuration)
9
+ end
10
+
11
+ test 'provide default when config missing' do
12
+ cfg = Rails::Application::Configuration.new
13
+
14
+ # method must already be defined.
15
+ assert cfg.methods.include?(:incline_appconfig_original_database_configuration)
16
+
17
+ # first we'll confirm that the overridden method is getting called.
18
+ silence_warnings do
19
+ def cfg.incline_appconfig_original_database_configuration
20
+ raise 'Just Testing'
21
+ end
22
+ end
23
+
24
+ begin
25
+ cfg.database_configuration
26
+ assert false
27
+ rescue
28
+ assert $!.message =~ /just testing/i
29
+ end
30
+
31
+ # now we'll pretend there is no configuration file.
32
+ silence_warnings do
33
+ def cfg.incline_appconfig_original_database_configuration
34
+ raise 'Could not load database configuration. No such file - fake/database.yml'
35
+ end
36
+ end
37
+
38
+ db_cfg = cfg.database_configuration
39
+
40
+ assert db_cfg.is_a?(::Hash)
41
+ assert db_cfg['test']
42
+ assert db_cfg['development']
43
+ assert_nil db_cfg['production']
44
+ end
45
+
46
+ end
@@ -0,0 +1,23 @@
1
+ require 'test_helper'
2
+
3
+ class ApplicationExtensionsTest < ActiveSupport::TestCase
4
+
5
+ test 'should have extension methods' do
6
+ app = Rails.application
7
+ skip unless app
8
+ assert app.respond_to?(:running?)
9
+ assert app.respond_to?(:app_name)
10
+ assert app.respond_to?(:app_instance_name)
11
+ assert app.respond_to?(:app_version)
12
+ assert app.respond_to?(:app_company)
13
+ assert app.respond_to?(:app_info)
14
+ assert app.respond_to?(:app_copyright_year)
15
+ assert app.respond_to?(:app_copyright)
16
+ assert app.respond_to?(:restart_pending?)
17
+ assert app.respond_to?(:request_restart!)
18
+ assert app.respond_to?(:cookie_name)
19
+ end
20
+
21
+ # TODO: Test output of various methods.
22
+
23
+ end
@@ -0,0 +1,54 @@
1
+ require 'test_helper'
2
+
3
+ class ConnectionAdapterExtensionsTest < ActiveSupport::TestCase
4
+
5
+ TEST_OBJECT_NAME = "test_object_#{SecureRandom.random_number(1<<16).to_s(16).rjust(4, '0')}"
6
+
7
+ def setup
8
+ @conn = ActiveRecord::Base::connection
9
+ end
10
+
11
+ test 'should have extension methods' do
12
+ assert @conn.respond_to?(:object_exists?)
13
+ assert @conn.respond_to?(:exec_sp)
14
+ end
15
+
16
+ test 'should be able to determine existence' do
17
+ assert_not @conn.object_exists?(TEST_OBJECT_NAME)
18
+ @conn.execute "CREATE TABLE #{TEST_OBJECT_NAME} ( some_value INTEGER NOT NULL )"
19
+ begin
20
+ assert @conn.object_exists?(TEST_OBJECT_NAME)
21
+ ensure
22
+ @conn.execute "DROP TABLE #{TEST_OBJECT_NAME}"
23
+ end
24
+ end
25
+
26
+ test 'should be able to execute a stored proc' do
27
+ skip if MsSqlTestConn.skip_tests?
28
+ @conn = MsSqlTestConn.connection
29
+
30
+ assert_not @conn.object_exists?(TEST_OBJECT_NAME)
31
+
32
+ @conn.execute <<-EOS
33
+ CREATE PROCEDURE #{TEST_OBJECT_NAME}
34
+ @i_val INTEGER
35
+ AS
36
+ BEGIN
37
+ SET NOCOUNT ON;
38
+ DECLARE @d_val INTEGER;
39
+ SELECT @d_val = ISNULL(@i_val, 0) + 55;
40
+ RETURN @d_val;
41
+ END
42
+ EOS
43
+ begin
44
+ # It should exist now.
45
+ assert @conn.object_exists?(TEST_OBJECT_NAME)
46
+ # And it should retrieve the return value.
47
+ assert_equal 55, @conn.exec_sp("exec #{TEST_OBJECT_NAME} NULL")
48
+ assert_equal 100, @conn.exec_sp("exec #{TEST_OBJECT_NAME} 45")
49
+ ensure
50
+ @conn.execute "DROP PROCEDURE #{TEST_OBJECT_NAME}"
51
+ end
52
+ end
53
+
54
+ end
@@ -0,0 +1,104 @@
1
+ require 'test_helper'
2
+
3
+ class DateTimeValueExtensionsTest < ActiveSupport::TestCase
4
+
5
+ TEST_TABLE_NAME = "test_table_#{SecureRandom.random_number(1<<16).to_s(16).rjust(4,'0')}"
6
+ TEST_TABLE_CLASS = TEST_TABLE_NAME.classify.to_sym
7
+
8
+ def setup
9
+ # Create a test table.
10
+ silence_stream STDOUT do
11
+ ActiveRecord::Migration::create_table TEST_TABLE_NAME do |t|
12
+ t.datetime :tz_value
13
+ t.datetime :utc_value
14
+ end
15
+ end
16
+
17
+ # And then create a test model.
18
+ eval <<-EOM
19
+ class #{TEST_TABLE_CLASS} < ActiveRecord::Base
20
+ self.table_name = #{TEST_TABLE_NAME.inspect}
21
+ self.time_zone_aware_attributes = true
22
+ self.skip_time_zone_conversion_for_attributes << :utc_value
23
+ end
24
+ EOM
25
+
26
+ @backup_ar_tz = ActiveRecord::Base.default_timezone
27
+ @backup_tm_tz = Time.zone.name
28
+ ActiveRecord::Base.default_timezone = :utc
29
+ Time.zone = 'EST'
30
+
31
+ # Store the model class for use.
32
+ @model_class = self.class.const_get TEST_TABLE_CLASS
33
+ @item = @model_class.new
34
+ end
35
+
36
+ def teardown
37
+ # Undefine the model class (or at least remove it from the Object namespace).
38
+ self.class.send :remove_const, TEST_TABLE_CLASS
39
+
40
+ # Remove the table from the database.
41
+ silence_stream STDOUT do
42
+ ActiveRecord::Migration::drop_table TEST_TABLE_NAME
43
+ end
44
+
45
+ ActiveRecord::Base.default_timezone = @backup_ar_tz
46
+ Time.zone = @backup_tm_tz
47
+ end
48
+
49
+ test 'uses correct types' do
50
+ col = @model_class.columns.find{|c| c.name == 'tz_value'}
51
+ assert col
52
+ assert col.cast_type.is_a?(::ActiveRecord::AttributeMethods::TimeZoneConversion::TimeZoneConverter)
53
+ col = @model_class.columns.find{|c| c.name == 'utc_value'}
54
+ assert col
55
+ assert_not col.cast_type.is_a?(::ActiveRecord::AttributeMethods::TimeZoneConversion::TimeZoneConverter)
56
+ assert col.cast_type.is_a?(::ActiveRecord::Type::DateTime)
57
+ end
58
+
59
+ test 'accepts valid values' do
60
+ {
61
+ '2016-12-31' => Time.utc(2016,12,31),
62
+ '12/31/2016' => Time.utc(2016,12,31),
63
+ '16-12-31' => Time.utc(2016,12,31),
64
+ '12/31/16' => Time.utc(2016,12,31),
65
+ '2016-12-31 1:20' => Time.utc(2016,12,31,1,20),
66
+ '12/31/2016 1:20' => Time.utc(2016,12,31,1,20),
67
+ '12/31/2016 1:20 PM' => Time.utc(2016,12,31,13,20),
68
+ '12/31/2016 12:20 AM' => Time.utc(2016,12,31,0,20),
69
+ '12/31/2016 12:20 PM' => Time.utc(2016,12,31,12,20),
70
+ '12/31/2016 24:00' => Time.utc(2017,1,1,0,0),
71
+ '2016-12-31T24:00' => Time.utc(2017,1,1,0,0),
72
+ '2016-12-31 24:00+01:00' => Time.utc(2016,12,31,23,0),
73
+ }.each do |s,v|
74
+ @item.utc_value = s
75
+ assert_equal v, @item.utc_value, "Should have accepted #{s.inspect}"
76
+ @item.tz_value = s
77
+ assert_equal v.in_time_zone, @item.tz_value, "Should have accepted #{s.inspect}"
78
+ end
79
+
80
+ end
81
+
82
+ test 'rejects invalid values' do
83
+
84
+ [
85
+ '',
86
+ ' ',
87
+ '0000-00-00',
88
+ '0000-00-00 00:00:00',
89
+ '2016-13-31',
90
+ '2016-12-32',
91
+ '2016-02-30',
92
+ '2/30/2016',
93
+ '1/1/2017 24:01',
94
+ '12:30'
95
+ ].each do |val|
96
+ @item.tz_value = val
97
+ assert_nil @item.tz_value, "Should have rejected #{val.inspect}"
98
+ @item.utc_value = val
99
+ assert_nil @item.utc_value, "Should have rejected #{val.inspect}"
100
+ end
101
+
102
+ end
103
+
104
+ end