incline 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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,245 @@
1
+ require 'test_helper'
2
+
3
+ class DataTablesRequestTest < 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, null: false, limit: 100
13
+ t.string :classification, limit: 100
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
+ end
22
+ EOM
23
+
24
+ # Store the model class for use.
25
+ @model_class = self.class.const_get TEST_TABLE_CLASS
26
+
27
+ @model_class.create name: 'Fred Flintstone', classification: 'Cartoon Character'
28
+ @model_class.create name: 'Barney Rubble', classification: 'Cartoon Character'
29
+ @model_class.create name: 'Homer Simpson', classification: 'Cartoon Character'
30
+ @model_class.create name: 'Percy Jackson', classification: 'Book Character'
31
+ @model_class.create name: 'Harry Potter', classification: 'Book Character'
32
+ @model_class.create name: 'George Washington', classification: 'Historical Figure'
33
+ @model_class.create name: 'Albert Einstein', classification: 'Historical Figure'
34
+
35
+ @columns = [
36
+ { data: 'dt_name', name: 'name', searchable: true, orderable: true },
37
+ { data: 'dt_class', name: 'classification', searchable: true, orderable: true },
38
+ ]
39
+
40
+ end
41
+
42
+ def teardown
43
+ # Undefine the model class (or at least remove it from the Object namespace).
44
+ self.class.send :remove_const, TEST_TABLE_CLASS
45
+
46
+ # Remove the table from the database.
47
+ silence_stream STDOUT do
48
+ ActiveRecord::Migration::drop_table TEST_TABLE_NAME
49
+ end
50
+ end
51
+
52
+ test 'should flag as not provided' do
53
+ request = Incline::DataTablesRequest.new do
54
+ @model_class.all
55
+ end
56
+ assert_not request.provided?
57
+ end
58
+
59
+ test 'should require a block' do
60
+ assert_raises ::ArgumentError do
61
+ Incline::DataTablesRequest.new
62
+ end
63
+ end
64
+
65
+ test 'should retrieve all records' do
66
+ request = Incline::DataTablesRequest.new(
67
+ draw: 1,
68
+ start: 0,
69
+ length: 5,
70
+ columns: @columns
71
+ ) do
72
+ @model_class.all
73
+ end
74
+ assert request.provided?
75
+ assert_not request.error?, "Did not expect #{request.error.inspect}"
76
+ assert_equal 1, request.draw
77
+ assert_equal 7, request.records_total
78
+ assert_equal 7, request.records_filtered
79
+ assert_equal 5, request.records.count
80
+ assert_equal 'Fred Flintstone', request.records.first.name
81
+
82
+ request = Incline::DataTablesRequest.new(
83
+ draw: 10,
84
+ start: 5,
85
+ length: 5,
86
+ columns: @columns
87
+ ) do
88
+ @model_class.all
89
+ end
90
+ assert_not request.error?, "Did not expect #{request.error.inspect}"
91
+ assert_equal 10, request.draw
92
+ assert_equal 7, request.records_total
93
+ assert_equal 7, request.records_filtered
94
+ assert_equal 2, request.records.count
95
+ assert_equal 'George Washington', request.records.first.name
96
+ end
97
+
98
+ test 'should honor the ordering' do
99
+ request = Incline::DataTablesRequest.new(
100
+ draw: 2,
101
+ start: 0,
102
+ length: 5,
103
+ columns: @columns,
104
+ order: [ { column: 0, dir: 'asc' } ]
105
+ ) do
106
+ @model_class.all
107
+ end
108
+ assert_not request.error?, "Did not expect #{request.error.inspect}"
109
+ assert_equal 2, request.draw
110
+ assert_equal 'Albert Einstein', request.records.first.name
111
+
112
+ request = Incline::DataTablesRequest.new(
113
+ draw: 2,
114
+ start: 0,
115
+ length: 5,
116
+ columns: @columns,
117
+ order: [ { column: 1, dir: 'asc' }, { column: 0, dir: 'asc' } ]
118
+ ) do
119
+ @model_class.all
120
+ end
121
+ assert_equal 'Harry Potter', request.records.first.name
122
+ end
123
+
124
+ test 'should search by text' do
125
+ request = Incline::DataTablesRequest.new(
126
+ draw: 3,
127
+ start: 0,
128
+ length: 5,
129
+ columns: @columns,
130
+ search: { value: 'toon', regex: false },
131
+ order: [ { column: 0, dir: 'asc' } ]
132
+ ) do
133
+ @model_class.all
134
+ end
135
+ assert_not request.error?, "Did not expect #{request.error.inspect}"
136
+ assert_equal 3, request.draw
137
+ assert_equal 7, request.records_total
138
+ assert_equal 3, request.records_filtered
139
+ assert_equal 3, request.records.count
140
+ assert_equal 'Barney Rubble', request.records.first.name
141
+
142
+ c = @columns.dup
143
+ c[0][:search] = { value: 'ar', regex: false }
144
+ request = Incline::DataTablesRequest.new(
145
+ draw: 3,
146
+ start: 0,
147
+ length: 5,
148
+ columns: c,
149
+ order: [ { column: 0, dir: 'desc' } ]
150
+ ) do
151
+ @model_class.all
152
+ end
153
+ assert_not request.error?, "Did not expect #{request.error.inspect}"
154
+ assert_equal 7, request.records_total
155
+ assert_equal 2, request.records_filtered
156
+ assert_equal 2, request.records.count
157
+ assert_equal 'Harry Potter', request.records.first.name
158
+ end
159
+
160
+ test 'should search by regex' do
161
+ request = Incline::DataTablesRequest.new(
162
+ draw: 4,
163
+ start: 0,
164
+ length: 5,
165
+ columns: @columns,
166
+ search: { value: /book/i, regex: true },
167
+ order: [ { column: 0, dir: 'asc' } ]
168
+ ) do
169
+ @model_class.all
170
+ end
171
+ assert_not request.error?, "Did not expect #{request.error.inspect}"
172
+ assert_equal 4, request.draw
173
+ assert_equal 7, request.records_total
174
+ assert_equal 2, request.records_filtered
175
+ assert_equal 2, request.records.count
176
+ assert_equal 'Harry Potter', request.records.first.name
177
+
178
+ c = @columns.dup
179
+ c[0][:search] = { value: /[ts]on/i, regex: true }
180
+ request = Incline::DataTablesRequest.new(
181
+ draw: 4,
182
+ start: 0,
183
+ length: 5,
184
+ columns: c,
185
+ order: [ { column: 0, dir: 'desc' } ]
186
+ ) do
187
+ @model_class.all
188
+ end
189
+ assert_not request.error?, "Did not expect #{request.error.inspect}"
190
+ assert_equal 7, request.records_total
191
+ assert_equal 4, request.records_filtered
192
+ assert_equal 4, request.records.count
193
+ assert_equal 'Percy Jackson', request.records.first.name
194
+ end
195
+
196
+ test 'should handle errors' do
197
+ request = Incline::DataTablesRequest.new(
198
+ draw: 5,
199
+ start: 0,
200
+ length: 5,
201
+ columns: @columns
202
+ ) do
203
+ raise 'Uh oh, something bad happened.'
204
+ end
205
+
206
+ assert request.provided?
207
+ assert request.error?
208
+ assert_equal 'Uh oh, something bad happened.', request.error
209
+ assert_equal 5, request.draw
210
+ assert_equal 0, request.records_total
211
+ assert_equal 0, request.records_filtered
212
+ assert_equal 0, request.records.count
213
+ end
214
+
215
+ test 'should refresh' do
216
+ request = Incline::DataTablesRequest.new(
217
+ draw: 6,
218
+ start: 0,
219
+ length: 5,
220
+ columns: @columns,
221
+ search: { value: 'toon', regex: false },
222
+ order: [ { column: 0, dir: 'desc' } ]
223
+ ) do
224
+ @model_class.all
225
+ end
226
+ assert_not request.error?, "Did not expect #{request.error.inspect}"
227
+ assert_equal 6, request.draw
228
+ assert_equal 7, request.records_total
229
+ assert_equal 3, request.records_filtered
230
+ assert_equal 3, request.records.count
231
+ assert_equal 'Homer Simpson', request.records.first.name
232
+
233
+ @model_class.create name: 'Lisa Simpson', classification: 'Cartoon Character'
234
+ assert_nil request.records.find{|i| i.name == 'Lisa Simpson'}
235
+
236
+ assert_equal request, request.refresh!
237
+ assert_equal 6, request.draw
238
+ assert_equal 8, request.records_total
239
+ assert_equal 4, request.records_filtered
240
+ assert_equal 4, request.records.count
241
+ assert_equal 'Lisa Simpson', request.records.first.name
242
+ end
243
+
244
+
245
+ end
@@ -0,0 +1,111 @@
1
+ require 'test_helper'
2
+
3
+ class DateTimeFormatsTest < ActiveSupport::TestCase
4
+
5
+ test 'should process valid US dates' do
6
+ {
7
+ '12/31/2016' => { year: 2016, month: 12, day: 31 },
8
+ '12/31/2016 11:35' => { year: 2016, month: 12, day: 31, hour: 11, minute: 35 },
9
+ '12/31/2016 11:35:48' => { year: 2016, month: 12, day: 31, hour: 11, minute: 35, second: 48 },
10
+ '12/31/2016 11:35:48.1024' => { year: 2016, month: 12, day: 31, hour: 11, minute: 35, second: 48, fraction: 1024 },
11
+ '12/31/2016 11:35:48.1024 PM' => { year: 2016, month: 12, day: 31, hour: 11, minute: 35, second: 48, fraction: 1024, ampm: 'P' },
12
+ '12/31/2016 11:35:48.1024 AM' => { year: 2016, month: 12, day: 31, hour: 11, minute: 35, second: 48, fraction: 1024, ampm: 'A' },
13
+ '12/31/2016 11:35:48.0001' => { year: 2016, month: 12, day: 31, hour: 11, minute: 35, second: 48, fraction: '0001' },
14
+ '1/1/2017 1:15' => { year: 2017, month: 1, day: 1, hour: 1, minute: 15 },
15
+ '01/01/2017 01:15' => { year: 2017, month: '01', day: '01', hour: '01', minute: 15 },
16
+ '1/1/16' => { year: 16, month: 1, day: 1 },
17
+ '12/31/2016 11:35PM' => { year: 2016, month: 12, day: 31, hour: 11, minute: 35, ampm: 'P' },
18
+ '12/31/2016 11:35P' => { year: 2016, month: 12, day: 31, hour: 11, minute: 35, ampm: 'P' },
19
+ '12/31/2016 11:35 PM' => { year: 2016, month: 12, day: 31, hour: 11, minute: 35, ampm: 'P' },
20
+ '12/31/2016 11:35 P' => { year: 2016, month: 12, day: 31, hour: 11, minute: 35, ampm: 'P' },
21
+ }.each do |dt, parts|
22
+ match = Incline::DateTimeFormats::US_DATE_FORMAT.match(dt)
23
+ assert match, "Should match '#{dt}'."
24
+ parts.each do |k,v|
25
+ assert_equal v.to_s, match[k.to_s.upcase], "Part #{k} does not equal '#{v}' for '#{dt}'."
26
+ end
27
+ end
28
+ end
29
+
30
+ test 'should reject invalid US dates' do
31
+ [
32
+ '12.31.2016',
33
+ '12-31-2016',
34
+ '12/31/2016 1550',
35
+ '12/31/201612:25',
36
+ '12/31/2016 AM',
37
+ '12/31/2016 12 PM',
38
+ '12/31/2016 12P'
39
+ ].each do |dt|
40
+ assert_nil Incline::DateTimeFormats::US_DATE_FORMAT.match(dt), "Should not match '#{dt}'."
41
+ end
42
+ end
43
+
44
+ test 'should process valid ISO-ish dates' do
45
+ {
46
+ '2016-12-31' => { year: 2016, month: 12, day: 31 },
47
+ '2016-12-31 11:35' => { year: 2016, month: 12, day: 31, hour: 11, minute: 35 },
48
+ '2016-12-31 11:35:48' => { year: 2016, month: 12, day: 31, hour: 11, minute: 35, second: 48 },
49
+ '2016-12-31 11:35:48.1024' => { year: 2016, month: 12, day: 31, hour: 11, minute: 35, second: 48, fraction: 1024 },
50
+ '2016-12-31 11:35:48.0001' => { year: 2016, month: 12, day: 31, hour: 11, minute: 35, second: 48, fraction: '0001' },
51
+ '2016-12-31 11:35:48.1024 -05:00' => { year: 2016, month: 12, day: 31, hour: 11, minute: 35, second: 48, fraction: 1024, tz: '-05:00' },
52
+ '2016-12-31 11:35:48.1024-05:00' => { year: 2016, month: 12, day: 31, hour: 11, minute: 35, second: 48, fraction: 1024, tz: '-05:00' },
53
+ '2016-12-31 11:35:48.1024 -0500' => { year: 2016, month: 12, day: 31, hour: 11, minute: 35, second: 48, fraction: 1024, tz: '-0500' },
54
+ '2016-12-31 11:35:48.1024-0500' => { year: 2016, month: 12, day: 31, hour: 11, minute: 35, second: 48, fraction: 1024, tz: '-0500' },
55
+ '2016-12-31 11:35:48.1024 +05:00' => { year: 2016, month: 12, day: 31, hour: 11, minute: 35, second: 48, fraction: 1024, tz: '+05:00' },
56
+ '2016-12-31 11:35:48.1024+05:00' => { year: 2016, month: 12, day: 31, hour: 11, minute: 35, second: 48, fraction: 1024, tz: '+05:00' },
57
+ '2016-12-31 11:35:48.1024 +0500' => { year: 2016, month: 12, day: 31, hour: 11, minute: 35, second: 48, fraction: 1024, tz: '+0500' },
58
+ '2016-12-31 11:35:48.1024+0500' => { year: 2016, month: 12, day: 31, hour: 11, minute: 35, second: 48, fraction: 1024, tz: '+0500' },
59
+ '2016-12-31 11:35:48.1024Z' => { year: 2016, month: 12, day: 31, hour: 11, minute: 35, second: 48, fraction: 1024, tz: 'Z' },
60
+ '2016-12-31 11:35:48.1024 Z' => { year: 2016, month: 12, day: 31, hour: 11, minute: 35, second: 48, fraction: 1024, tz: 'Z' },
61
+ '2017-1-1 1:15' => { year: 2017, month: 1, day: 1, hour: 1, minute: 15 },
62
+ '2017-01-01 01:15' => { year: 2017, month: '01', day: '01', hour: '01', minute: 15 },
63
+ '2016-12-31T11:35' => { year: 2016, month: 12, day: 31, hour: 11, minute: 35 },
64
+ '2016-12-31T11:35:48' => { year: 2016, month: 12, day: 31, hour: 11, minute: 35, second: 48 },
65
+ '2016-12-31T11:35:48.1024' => { year: 2016, month: 12, day: 31, hour: 11, minute: 35, second: 48, fraction: 1024 },
66
+ '2016-12-31T11:35:48.1024 -05:00' => { year: 2016, month: 12, day: 31, hour: 11, minute: 35, second: 48, fraction: 1024, tz: '-05:00' },
67
+ '2016-12-31T11:35:48.1024-05:00' => { year: 2016, month: 12, day: 31, hour: 11, minute: 35, second: 48, fraction: 1024, tz: '-05:00' },
68
+ '2016-12-31T11:35:48.1024 -0500' => { year: 2016, month: 12, day: 31, hour: 11, minute: 35, second: 48, fraction: 1024, tz: '-0500' },
69
+ '2016-12-31T11:35:48.1024-0500' => { year: 2016, month: 12, day: 31, hour: 11, minute: 35, second: 48, fraction: 1024, tz: '-0500' },
70
+ '2016-12-31T11:35:48.1024 +05:00' => { year: 2016, month: 12, day: 31, hour: 11, minute: 35, second: 48, fraction: 1024, tz: '+05:00' },
71
+ '2016-12-31T11:35:48.1024+05:00' => { year: 2016, month: 12, day: 31, hour: 11, minute: 35, second: 48, fraction: 1024, tz: '+05:00' },
72
+ '2016-12-31T11:35:48.1024 +0500' => { year: 2016, month: 12, day: 31, hour: 11, minute: 35, second: 48, fraction: 1024, tz: '+0500' },
73
+ '2016-12-31T11:35:48.1024+0500' => { year: 2016, month: 12, day: 31, hour: 11, minute: 35, second: 48, fraction: 1024, tz: '+0500' },
74
+ '2016-12-31T11:35:48.1024Z' => { year: 2016, month: 12, day: 31, hour: 11, minute: 35, second: 48, fraction: 1024, tz: 'Z' },
75
+ '2016-12-31T11:35:48.1024 Z' => { year: 2016, month: 12, day: 31, hour: 11, minute: 35, second: 48, fraction: 1024, tz: 'Z' },
76
+ '2016-12-31T11:35:48.0001' => { year: 2016, month: 12, day: 31, hour: 11, minute: 35, second: 48, fraction: '0001' },
77
+ '2017-1-1T1:15' => { year: 2017, month: 1, day: 1, hour: 1, minute: 15 },
78
+ '2017-01-01T01:15' => { year: 2017, month: '01', day: '01', hour: '01', minute: 15 },
79
+ '16-1-1' => { year: 16, month: 1, day: 1 },
80
+ '2016-12-31 11:35 PM' => { year: 2016, month: 12, day: 31, hour: 11, minute: 35, ampm: 'P' },
81
+ '2016-12-31 11:35:48 PM' => { year: 2016, month: 12, day: 31, hour: 11, minute: 35, second: 48, ampm: 'P' },
82
+ '2016-12-31 11:35P' => { year: 2016, month: 12, day: 31, hour: 11, minute: 35, ampm: 'P' },
83
+ '2016-12-31 11:35:48P' => { year: 2016, month: 12, day: 31, hour: 11, minute: 35, second: 48, ampm: 'P' },
84
+ '2016-12-31 11:35:48.1024 PM -05:00' => { year: 2016, month: 12, day: 31, hour: 11, minute: 35, second: 48, fraction: 1024, tz: '-05:00', ampm: 'P' },
85
+ '2016-12-31 11:35:48.1024P-05:00' => { year: 2016, month: 12, day: 31, hour: 11, minute: 35, second: 48, fraction: 1024, tz: '-05:00', ampm: 'P' },
86
+ }.each do |dt, parts|
87
+ match = Incline::DateTimeFormats::ALMOST_ISO_DATE_FORMAT.match(dt)
88
+ assert match, "Should match '#{dt}'."
89
+ parts.each do |k,v|
90
+ assert_equal v.to_s, match[k.to_s.upcase], "Part #{k} does not equal '#{v}' for '#{dt}'."
91
+ end
92
+ end
93
+ end
94
+
95
+ test 'should reject invalid ISO-ish dates' do
96
+ [
97
+ '2016.12.31',
98
+ '2016/12/31',
99
+ '2016-12-31 1550',
100
+ '2016-12-3112:25',
101
+ '2016-12-31 -05:00',
102
+ '2016-12-31-05:00',
103
+ '2016-12-31 11:45:00 05:00',
104
+ '2016-12-31Z',
105
+ '2016-12-31 Z'
106
+ ].each do |dt|
107
+ assert_nil Incline::DateTimeFormats::ALMOST_ISO_DATE_FORMAT.match(dt), "Should not match '#{dt}'."
108
+ end
109
+ end
110
+
111
+ end
@@ -0,0 +1,89 @@
1
+ require 'test_helper'
2
+
3
+ class GlobalStatusTest < ActiveSupport::TestCase
4
+
5
+ def setup
6
+ @stat = Incline::GlobalStatus.new
7
+ end
8
+
9
+ test 'should allow locking' do
10
+ begin
11
+ assert @stat.acquire_lock
12
+ assert @stat.is_locked?
13
+ assert @stat.have_lock?
14
+ assert Incline::GlobalStatus::locked?
15
+ ensure
16
+ @stat.release_lock
17
+ end
18
+ assert_not @stat.is_locked?
19
+ assert_not @stat.have_lock?
20
+ assert_not Incline::GlobalStatus::locked?
21
+ end
22
+
23
+ test 'should allow blocks' do
24
+ # block is successful, but @stat cannot acquire a lock.
25
+ Incline::GlobalStatus::lock_for do |stat|
26
+ assert stat
27
+ assert stat.is_locked?
28
+ assert stat.have_lock?
29
+ assert @stat.is_locked?
30
+ assert_not @stat.have_lock?
31
+ assert_not @stat.acquire_lock
32
+ end
33
+ assert_not @stat.is_locked?
34
+
35
+ # @stat is successful, but block cannot acquire a lock.
36
+ begin
37
+ assert @stat.acquire_lock
38
+ assert @stat.is_locked?
39
+ assert @stat.have_lock?
40
+ assert Incline::GlobalStatus::locked?
41
+ Incline::GlobalStatus::lock_for do |stat|
42
+ assert_not stat
43
+ end
44
+ ensure
45
+ @stat.release_lock
46
+ end
47
+ end
48
+
49
+ test 'should be able to set status' do
50
+ Incline::GlobalStatus::lock_for do |stat|
51
+ assert stat
52
+
53
+ # We haven't set a status, so the default messages should be in place.
54
+ # There should be no percentage yet either.
55
+ data = stat.get_status
56
+ assert data.is_a?(::Hash)
57
+ assert data[:locked]
58
+ assert_equal 'The current process is busy.', data[:message]
59
+ assert data[:percent].blank?
60
+
61
+ # The helpers should match.
62
+ assert_equal data[:message], stat.get_message
63
+ assert_nil stat.get_percentage
64
+
65
+ # The message should be slightly different, but otherwise the data is the same.
66
+ data = Incline::GlobalStatus::current
67
+ assert data.is_a?(::Hash)
68
+ assert data[:locked]
69
+ assert_equal 'The system is busy.', data[:message]
70
+ assert data[:percent].blank?
71
+
72
+ # Set the message.
73
+ stat.set_status 'Doing something.', 25
74
+
75
+ # The new status should be set correctly.
76
+ data = stat.get_status
77
+ assert_equal 'Doing something.', data[:message]
78
+ assert_equal '25', data[:percent]
79
+ assert_equal data[:message], stat.get_message
80
+ assert_equal 25, stat.get_percentage
81
+
82
+ # And this should be the same.
83
+ data = Incline::GlobalStatus::current
84
+ assert_equal 'Doing something.', data[:message]
85
+ assert_equal '25', data[:percent]
86
+ end
87
+ end
88
+
89
+ end
@@ -0,0 +1,43 @@
1
+ require 'test_helper'
2
+ require 'json'
3
+ require 'ansi/code'
4
+
5
+ class JsonLogFormatterTest < ActiveSupport::TestCase
6
+
7
+ def setup
8
+ @fmt = Incline::JsonLogFormatter.new
9
+ end
10
+
11
+ test 'should create valid JSON' do
12
+ t = Time.now
13
+ s = @fmt.call(Logger::WARN, t, :ignored, 'Something happened!')
14
+ assert_not s.blank?
15
+
16
+ # ends with CRLF?
17
+ assert s =~ /\r\n\Z/
18
+
19
+ h = JSON.parse(s.strip) rescue nil
20
+ assert h.is_a?(::Hash)
21
+ assert_equal 'WARN', h['level']
22
+ assert_equal t.strftime('%Y-%m-%d %H:%M:%S'), h['time']
23
+ assert_equal 'Something happened!', h['message']
24
+ assert_equal Rails.application.app_name, h['app_name']
25
+ assert_equal Rails.application.app_version, h['app_version']
26
+ assert_equal Process.pid, h['process_id']
27
+ end
28
+
29
+ test 'should log all CRLF as LF' do
30
+ h = JSON.parse(@fmt.call(Logger::INFO, Time.now, :ignored, "This message has \r\n CRLF \r\n sequences in it!\r\n").strip)
31
+ assert_not h['message'] =~ /\r\n/
32
+ assert h['message'] =~ /\n/
33
+ end
34
+
35
+ test 'should strip out ANSI formatting' do
36
+ test = 'This text has ' + ANSI.ansi('red', :bright, :red) + ' and ' + ANSI.ansi('green', :green) + ' text.'
37
+ clean = 'This text has red and green text.'
38
+ assert_not_equal clean, test
39
+ h = JSON.parse(@fmt.call(Logger::INFO, Time.now, :ignored, test))
40
+ assert_equal clean, h['message']
41
+ end
42
+
43
+ end
@@ -0,0 +1,36 @@
1
+ require 'test_helper'
2
+
3
+ class LogTest < ActiveSupport::TestCase
4
+
5
+ def setup
6
+ @io = StringIO.new
7
+ end
8
+
9
+ test 'output is always set' do
10
+ assert Incline::Log::get_output
11
+ end
12
+
13
+ test 'output can be changed' do
14
+ begin
15
+ Incline::Log::set_output @io
16
+ assert_equal @io, Incline::Log::get_output
17
+
18
+ Incline::Log::debug 'This is a debug message.'
19
+ Incline::Log::info 'This is an informative message.'
20
+ Incline::Log::warn 'This is a warning message.'
21
+ Incline::Log::error 'This is an error message.'
22
+
23
+ assert @io.string =~ /DEBUG/
24
+ assert @io.string =~ /INFO/
25
+ assert @io.string =~ /WARN/
26
+ assert @io.string =~ /ERROR/
27
+
28
+ ensure
29
+ Incline::Log::set_output false
30
+ end
31
+ assert_not_equal @io, Incline::Log::get_output
32
+ Incline::Log::info 'If you see this, everything is OK.'
33
+ assert_not @io.string =~ /everything is OK/
34
+ end
35
+
36
+ end
@@ -0,0 +1,75 @@
1
+ require 'test_helper'
2
+
3
+ class RecaptchaTest < ActiveSupport::TestCase
4
+
5
+ test 'should be disabled by default in test mode' do
6
+ assert ::Incline::Recaptcha.disabled?
7
+ end
8
+
9
+ test 'should enable for testing' do
10
+ assert_not ::Incline::Recaptcha.send :enabled_for_testing?
11
+ ::Incline::Recaptcha.send(:enable_for_testing) do
12
+ assert ::Incline::Recaptcha.send :enabled_for_testing?
13
+ end
14
+ assert_not ::Incline::Recaptcha.send :enabled_for_testing?
15
+ end
16
+
17
+ test 'when configured should allow testing' do
18
+ skip if ::Incline::Recaptcha.public_key.blank? || ::Incline::Recaptcha.private_key.blank?
19
+
20
+ assert ::Incline::Recaptcha.disabled?
21
+ ::Incline::Recaptcha.send(:enable_for_testing) do
22
+ assert_not ::Incline::Recaptcha.disabled?
23
+ end
24
+ assert ::Incline::Recaptcha.disabled?
25
+ end
26
+
27
+ test 'add should work appropriately' do
28
+ assert ::Incline::Recaptcha.add.blank?
29
+
30
+ ::Incline::Recaptcha.send(:enable_for_testing, 'my_site_key', 'my_secret_key') do
31
+ html = ::Incline::Recaptcha.add
32
+ assert_not html.blank?
33
+ assert html =~ /my_site_key/
34
+ assert_nil html =~ /my_secret_key/
35
+ end
36
+ end
37
+
38
+ test 'verify should work appropriately' do
39
+
40
+ assert_raises ::ArgumentError do
41
+ ::Incline::Recaptcha.verify
42
+ end
43
+
44
+
45
+ # fake request class.
46
+ req = Class.new do
47
+ def params
48
+ @params ||= { 'g-recaptcha-response' => ::Incline::Recaptcha::DISABLED.partition('|')[2] }
49
+ end
50
+ def remote_ip
51
+ @remote_ip ||= ::Incline::Recaptcha::DISABLED.partition('|')[0]
52
+ end
53
+ end.new
54
+
55
+ # and standard parameters.
56
+ rem_ip, _, resp = ::Incline::Recaptcha::DISABLED.partition('|')
57
+
58
+ # these are all valid method calls.
59
+ assert ::Incline::Recaptcha.verify(req)
60
+ assert ::Incline::Recaptcha.verify(request: req)
61
+ assert ::Incline::Recaptcha.verify(remote_ip: rem_ip, response: resp)
62
+
63
+ req.params['g-recaptcha-response'] = 'something-invalid'
64
+
65
+ # these should all fail
66
+ assert_not ::Incline::Recaptcha.verify(req)
67
+ assert_not ::Incline::Recaptcha.verify(request: req)
68
+ assert_not ::Incline::Recaptcha.verify(remote_ip: rem_ip, response: 'something-invalid')
69
+
70
+ end
71
+
72
+
73
+
74
+
75
+ end
@@ -0,0 +1,47 @@
1
+ require 'test_helper'
2
+
3
+ class UserManagerTest < ::ActiveSupport::TestCase
4
+
5
+ class MyAuthEngine < ::Incline::AuthEngineBase
6
+ def initialize(options = {})
7
+ @valid_password = options[:valid_password] || 'password'
8
+ end
9
+
10
+ def authenticate(email, password, client_ip)
11
+ return nil unless password == @valid_password
12
+ ::Incline::User.find_by(email: email)
13
+ end
14
+ end
15
+
16
+ def setup
17
+ @manager = ::Incline::UserManager.new valid_password: 'super-secret'
18
+ @user = incline_users(:one)
19
+ end
20
+
21
+ test 'password should be based on database value' do
22
+ assert_nil @manager.authenticate(@user.email, 'super-secret', '0.0.0.0')
23
+ assert @manager.authenticate(@user.email, 'Password123', '0.0.0.0')
24
+ end
25
+
26
+ test 'password should be based on auth engine' do
27
+ @manager.register_auth_engine ::UserManagerTest::MyAuthEngine, 'example.com'
28
+ assert @manager.authenticate(@user.email, 'super-secret', '0.0.0.0')
29
+ assert_nil @manager.authenticate(@user.email, 'Password123', '0.0.0.0')
30
+ end
31
+
32
+ test 'default instance also works with auth engine' do
33
+ assert ::Incline::UserManager.authenticate(@user.email, 'Password123', '0.0.0.0')
34
+ assert_nil ::Incline::UserManager.authenticate(@user.email, 'password', '0.0.0.0')
35
+ begin
36
+ ::Incline::UserManager.register_auth_engine(::UserManagerTest::MyAuthEngine, 'example.com')
37
+ assert_nil ::Incline::UserManager.authenticate(@user.email, 'Password123', '0.0.0.0')
38
+ assert ::Incline::UserManager.authenticate(@user.email, 'password', '0.0.0.0')
39
+ ensure
40
+ ::Incline::UserManager.clear_auth_engine('example.com')
41
+ end
42
+
43
+ end
44
+
45
+
46
+
47
+ end
@@ -0,0 +1,18 @@
1
+ require 'test_helper'
2
+
3
+ class WorkPathTest < ActiveSupport::TestCase
4
+
5
+ test 'should have a location' do
6
+ assert Incline::WorkPath::location
7
+ assert Dir.exist?(Incline::WorkPath::location)
8
+ path = Incline::WorkPath::path_for 'test.file'
9
+
10
+ File.write path, 'Hello World'
11
+ assert File.exist?(path)
12
+ assert_equal 'Hello World', File.read(path)
13
+
14
+ File.delete path
15
+ assert_not File.exist?(path)
16
+ end
17
+
18
+ end