barkest_core 1.5.3.0

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 (308) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +13 -0
  3. data/Gemfile +22 -0
  4. data/Gemfile.lock +254 -0
  5. data/MIT-LICENSE +20 -0
  6. data/README.md +364 -0
  7. data/Rakefile +37 -0
  8. data/app/assets/fonts/barkest_core/ArchivoNarrow-Bold.ttf +0 -0
  9. data/app/assets/fonts/barkest_core/ArchivoNarrow-BoldItalic.ttf +0 -0
  10. data/app/assets/fonts/barkest_core/ArchivoNarrow-Italic.ttf +0 -0
  11. data/app/assets/fonts/barkest_core/ArchivoNarrow-Regular.ttf +0 -0
  12. data/app/assets/images/barkest_core/.keep +0 -0
  13. data/app/assets/images/barkest_core/barcode-B.svg +181 -0
  14. data/app/assets/javascripts/barkest_core/.keep +0 -0
  15. data/app/assets/javascripts/barkest_core/application.js +22 -0
  16. data/app/assets/javascripts/barkest_core/bootstrap-datepicker.js +1800 -0
  17. data/app/assets/javascripts/barkest_core/field_init.js +7 -0
  18. data/app/assets/javascripts/barkest_core/jquery.doubleScroll.js +112 -0
  19. data/app/assets/javascripts/barkest_core/masked_edit.js +25 -0
  20. data/app/assets/javascripts/barkest_core/system_status.js.erb +201 -0
  21. data/app/assets/stylesheets/barkest_core/.keep +0 -0
  22. data/app/assets/stylesheets/barkest_core/application.css +17 -0
  23. data/app/assets/stylesheets/barkest_core/custom.css.scss +264 -0
  24. data/app/assets/stylesheets/barkest_core/datepicker3.css +790 -0
  25. data/app/controllers/.keep +0 -0
  26. data/app/controllers/access_groups_controller.rb +74 -0
  27. data/app/controllers/account_activations_controller.rb +29 -0
  28. data/app/controllers/application_controller.rb +5 -0
  29. data/app/controllers/barkest_core/application_controller_base.rb +113 -0
  30. data/app/controllers/barkest_core/engine_controller_base.rb +15 -0
  31. data/app/controllers/barkest_core/testsub_controller.rb +21 -0
  32. data/app/controllers/contact_controller.rb +32 -0
  33. data/app/controllers/log_view_controller.rb +31 -0
  34. data/app/controllers/password_resets_controller.rb +126 -0
  35. data/app/controllers/sessions_controller.rb +64 -0
  36. data/app/controllers/status_controller.rb +150 -0
  37. data/app/controllers/system_config_controller.rb +238 -0
  38. data/app/controllers/system_update_controller.rb +164 -0
  39. data/app/controllers/test_access_controller.rb +44 -0
  40. data/app/controllers/test_report_controller.rb +75 -0
  41. data/app/controllers/users_controller.rb +218 -0
  42. data/app/helpers/.keep +0 -0
  43. data/app/helpers/barkest_core/application_helper.rb +134 -0
  44. data/app/helpers/barkest_core/form_helper.rb +469 -0
  45. data/app/helpers/barkest_core/html_helper.rb +70 -0
  46. data/app/helpers/barkest_core/misc_helper.rb +68 -0
  47. data/app/helpers/barkest_core/pdf_helper.rb +180 -0
  48. data/app/helpers/barkest_core/recaptcha_helper.rb +115 -0
  49. data/app/helpers/barkest_core/sessions_helper.rb +94 -0
  50. data/app/helpers/barkest_core/status_helper.rb +118 -0
  51. data/app/helpers/barkest_core/users_helper.rb +32 -0
  52. data/app/mailers/.keep +0 -0
  53. data/app/mailers/application_mailer.rb +5 -0
  54. data/app/mailers/barkest_core/application_mailer_base.rb +30 -0
  55. data/app/mailers/barkest_core/contact_form.rb +20 -0
  56. data/app/mailers/barkest_core/user_mailer.rb +44 -0
  57. data/app/models/.keep +0 -0
  58. data/app/models/access_group.rb +121 -0
  59. data/app/models/access_group_group_member.rb +13 -0
  60. data/app/models/access_group_user_member.rb +11 -0
  61. data/app/models/barkest_core/auth_config.rb +95 -0
  62. data/app/models/barkest_core/authorize_failure.rb +7 -0
  63. data/app/models/barkest_core/contact_message.rb +37 -0
  64. data/app/models/barkest_core/database_config.rb +223 -0
  65. data/app/models/barkest_core/db_table.rb +21 -0
  66. data/app/models/barkest_core/email_config.rb +132 -0
  67. data/app/models/barkest_core/global_status.rb +267 -0
  68. data/app/models/barkest_core/log_entry.rb +101 -0
  69. data/app/models/barkest_core/log_view_options.rb +51 -0
  70. data/app/models/barkest_core/ms_sql_db_definition.rb +441 -0
  71. data/app/models/barkest_core/ms_sql_definition.rb +221 -0
  72. data/app/models/barkest_core/ms_sql_function.rb +423 -0
  73. data/app/models/barkest_core/not_logged_in.rb +7 -0
  74. data/app/models/barkest_core/pdf_table_builder.rb +407 -0
  75. data/app/models/barkest_core/self_update_config.rb +37 -0
  76. data/app/models/barkest_core/user_alert.rb +29 -0
  77. data/app/models/barkest_core/user_alert_generators.rb +58 -0
  78. data/app/models/barkest_core/user_manager.rb +404 -0
  79. data/app/models/barkest_core/work_path.rb +74 -0
  80. data/app/models/disable_user.rb +18 -0
  81. data/app/models/ldap_access_group.rb +15 -0
  82. data/app/models/system_config.rb +99 -0
  83. data/app/models/user.rb +405 -0
  84. data/app/models/user_login_history.rb +11 -0
  85. data/app/views/.keep +0 -0
  86. data/app/views/access_groups/_form.html.erb +19 -0
  87. data/app/views/access_groups/edit.html.erb +2 -0
  88. data/app/views/access_groups/index.html.erb +32 -0
  89. data/app/views/access_groups/new.html.erb +2 -0
  90. data/app/views/access_groups/show.html.erb +4 -0
  91. data/app/views/barkest_core/contact_form/contact.html.erb +16 -0
  92. data/app/views/barkest_core/contact_form/contact.text.erb +13 -0
  93. data/app/views/barkest_core/testsub/_links.html.erb +5 -0
  94. data/app/views/barkest_core/testsub/page1.html.erb +3 -0
  95. data/app/views/barkest_core/testsub/page2.html.erb +2 -0
  96. data/app/views/barkest_core/testsub/page3.html.erb +2 -0
  97. data/app/views/barkest_core/user_mailer/account_activation.html.erb +7 -0
  98. data/app/views/barkest_core/user_mailer/account_activation.text.erb +6 -0
  99. data/app/views/barkest_core/user_mailer/invalid_password_reset.html.erb +3 -0
  100. data/app/views/barkest_core/user_mailer/invalid_password_reset.text.erb +5 -0
  101. data/app/views/barkest_core/user_mailer/password_reset.html.erb +8 -0
  102. data/app/views/barkest_core/user_mailer/password_reset.text.erb +7 -0
  103. data/app/views/contact/index.html.erb +24 -0
  104. data/app/views/layouts/_footer_copyright.html.erb +1 -0
  105. data/app/views/layouts/_menu_admin.html.erb +5 -0
  106. data/app/views/layouts/_menu_anon.html.erb +0 -0
  107. data/app/views/layouts/_menu_auth.html.erb +3 -0
  108. data/app/views/layouts/_menu_footer.html.erb +1 -0
  109. data/app/views/layouts/_nav_logo.html.erb +1 -0
  110. data/app/views/layouts/application.html.erb +2 -0
  111. data/app/views/layouts/barkest_core/_application.html.erb +24 -0
  112. data/app/views/layouts/barkest_core/_footer.html.erb +18 -0
  113. data/app/views/layouts/barkest_core/_header.html.erb +38 -0
  114. data/app/views/layouts/barkest_core/_html_mailer.html.erb +11 -0
  115. data/app/views/layouts/barkest_core/_menu_account.html.erb +14 -0
  116. data/app/views/layouts/barkest_core/_menu_sample.html.erb +1 -0
  117. data/app/views/layouts/barkest_core/_messages.html.erb +4 -0
  118. data/app/views/layouts/barkest_core/_shim.html.erb +4 -0
  119. data/app/views/layouts/barkest_core/_subheader.html.erb +1 -0
  120. data/app/views/layouts/barkest_core/_text_mailer.text.erb +4 -0
  121. data/app/views/layouts/mailer.html.erb +1 -0
  122. data/app/views/layouts/mailer.text.erb +1 -0
  123. data/app/views/log_view/index.html.erb +100 -0
  124. data/app/views/password_resets/edit.html.erb +20 -0
  125. data/app/views/password_resets/new.html.erb +14 -0
  126. data/app/views/sessions/new.html.erb +27 -0
  127. data/app/views/shared/_error_messages.html.erb +29 -0
  128. data/app/views/shared/_generic_user_alert.html.erb +4 -0
  129. data/app/views/status/current.html.erb +34 -0
  130. data/app/views/status/test.html.erb +50 -0
  131. data/app/views/system_config/index.html.erb +25 -0
  132. data/app/views/system_config/show_auth.html.erb +28 -0
  133. data/app/views/system_config/show_database.html.erb +36 -0
  134. data/app/views/system_config/show_email.html.erb +21 -0
  135. data/app/views/system_config/show_self_update.html.erb +13 -0
  136. data/app/views/system_update/index.html.erb +31 -0
  137. data/app/views/system_update/new.html.erb +2 -0
  138. data/app/views/test_access/allow_anon.html.erb +2 -0
  139. data/app/views/test_access/require_admin.html.erb +2 -0
  140. data/app/views/test_access/require_group_x.html.erb +2 -0
  141. data/app/views/test_access/require_user.html.erb +2 -0
  142. data/app/views/test_report/index.csv.csvrb +23 -0
  143. data/app/views/test_report/index.html.erb +6 -0
  144. data/app/views/test_report/index.pdf.prawn +50 -0
  145. data/app/views/test_report/index.xlsx.axlsx +28 -0
  146. data/app/views/users/_user.html.erb +57 -0
  147. data/app/views/users/_user_details.html.erb +15 -0
  148. data/app/views/users/_user_details_for_list.html.erb +1 -0
  149. data/app/views/users/_user_form.html.erb +13 -0
  150. data/app/views/users/disable_confirm.html.erb +19 -0
  151. data/app/views/users/edit.html.erb +15 -0
  152. data/app/views/users/index.html.erb +9 -0
  153. data/app/views/users/new.html.erb +10 -0
  154. data/app/views/users/show.html.erb +46 -0
  155. data/bin/rails +12 -0
  156. data/config/routes.rb +3 -0
  157. data/db/migrate/20160617172539_create_access_groups.rb +10 -0
  158. data/db/migrate/20160617172725_create_users.rb +26 -0
  159. data/db/migrate/20160617172833_create_user_login_histories.rb +12 -0
  160. data/db/migrate/20160622151720_create_access_group_user_members.rb +9 -0
  161. data/db/migrate/20160622151925_create_access_group_group_members.rb +9 -0
  162. data/db/migrate/20160701005706_create_ldap_access_groups.rb +11 -0
  163. data/db/migrate/20161108155029_create_system_configs.rb +11 -0
  164. data/db/seeds/barkest_core_01_create_users.rb +42 -0
  165. data/db/seeds.rb +53 -0
  166. data/lib/barkest_core/concerns/association_with_defaults.rb +55 -0
  167. data/lib/barkest_core/concerns/boolean_parser.rb +88 -0
  168. data/lib/barkest_core/concerns/date_parser.rb +181 -0
  169. data/lib/barkest_core/concerns/email_tester.rb +55 -0
  170. data/lib/barkest_core/concerns/encrypted_fields.rb +156 -0
  171. data/lib/barkest_core/concerns/named_model.rb +73 -0
  172. data/lib/barkest_core/concerns/number_parser.rb +145 -0
  173. data/lib/barkest_core/concerns/utc_conversion.rb +60 -0
  174. data/lib/barkest_core/engine.rb +105 -0
  175. data/lib/barkest_core/extensions/active_record_extensions.rb +120 -0
  176. data/lib/barkest_core/extensions/application_configuration_extensions.rb +38 -0
  177. data/lib/barkest_core/extensions/application_extensions.rb +50 -0
  178. data/lib/barkest_core/extensions/axlsx_extenstions.rb +157 -0
  179. data/lib/barkest_core/extensions/fixture_set_extensions.rb +107 -0
  180. data/lib/barkest_core/extensions/generator_extensions.rb +271 -0
  181. data/lib/barkest_core/extensions/main_app_extensions.rb +35 -0
  182. data/lib/barkest_core/extensions/prawn_document_extensions.rb +367 -0
  183. data/lib/barkest_core/extensions/prawn_table_extensions.rb +131 -0
  184. data/lib/barkest_core/extensions/router_extensions.rb +106 -0
  185. data/lib/barkest_core/extensions/simple_formatter_extensions.rb +66 -0
  186. data/lib/barkest_core/extensions/test_case_extensions.rb +348 -0
  187. data/lib/barkest_core/extensions/time_extensions.rb +164 -0
  188. data/lib/barkest_core/handlers/csv_handler.rb +30 -0
  189. data/lib/barkest_core/version.rb +3 -0
  190. data/lib/barkest_core.rb +324 -0
  191. data/lib/generators/barkest/install_generator.rb +102 -0
  192. data/lib/generators/barkest_core/actions/01_patch_application_controller.rb +55 -0
  193. data/lib/generators/barkest_core/actions/02_patch_application_mailer.rb +56 -0
  194. data/lib/generators/barkest_core/actions/03_patch_assets.rb +62 -0
  195. data/lib/generators/barkest_core/actions/04_patch_layouts.rb +36 -0
  196. data/lib/generators/barkest_core/actions/05_patch_routes.rb +93 -0
  197. data/lib/generators/barkest_core/actions/06_patch_seeds.rb +60 -0
  198. data/lib/generators/barkest_core/actions/07_copy_migrations.rb +51 -0
  199. data/lib/generators/barkest_core/actions/08_configure_database.rb +52 -0
  200. data/lib/generators/barkest_core/actions/09_configure_secrets.rb +29 -0
  201. data/lib/generators/barkest_core/actions/99_patch_gitignore.rb +57 -0
  202. data/lib/generators/barkest_core/install_generator.rb +17 -0
  203. data/test/barkest_core_test.rb +83 -0
  204. data/test/controllers/access_groups_controller_test.rb +53 -0
  205. data/test/controllers/contact_controller_test.rb +10 -0
  206. data/test/controllers/sessions_controller_test.rb +10 -0
  207. data/test/controllers/users_controller_test.rb +10 -0
  208. data/test/dummy/.gitignore +10 -0
  209. data/test/dummy/README.rdoc +28 -0
  210. data/test/dummy/Rakefile +6 -0
  211. data/test/dummy/app/assets/images/.keep +0 -0
  212. data/test/dummy/app/assets/javascripts/application.js +14 -0
  213. data/test/dummy/app/assets/stylesheets/application.css +16 -0
  214. data/test/dummy/app/controllers/application_controller.rb +5 -0
  215. data/test/dummy/app/controllers/concerns/.keep +0 -0
  216. data/test/dummy/app/helpers/application_helper.rb +2 -0
  217. data/test/dummy/app/mailers/.keep +0 -0
  218. data/test/dummy/app/mailers/application_mailer.rb +3 -0
  219. data/test/dummy/app/models/.keep +0 -0
  220. data/test/dummy/app/models/concerns/.keep +0 -0
  221. data/test/dummy/app/views/layouts/application.html.erb +1 -0
  222. data/test/dummy/app/views/layouts/mailer.html.erb +1 -0
  223. data/test/dummy/app/views/layouts/mailer.text.erb +1 -0
  224. data/test/dummy/app/views/system_config/show_fake.html.erb +3 -0
  225. data/test/dummy/bin/bundle +3 -0
  226. data/test/dummy/bin/rails +4 -0
  227. data/test/dummy/bin/rake +4 -0
  228. data/test/dummy/bin/setup +29 -0
  229. data/test/dummy/config/application.rb +27 -0
  230. data/test/dummy/config/boot.rb +5 -0
  231. data/test/dummy/config/environment.rb +5 -0
  232. data/test/dummy/config/environments/development.rb +47 -0
  233. data/test/dummy/config/environments/production.rb +79 -0
  234. data/test/dummy/config/environments/test.rb +44 -0
  235. data/test/dummy/config/initializers/assets.rb +11 -0
  236. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  237. data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
  238. data/test/dummy/config/initializers/db_updater_ext.rb +33 -0
  239. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  240. data/test/dummy/config/initializers/inflections.rb +16 -0
  241. data/test/dummy/config/initializers/mime_types.rb +4 -0
  242. data/test/dummy/config/initializers/session_store.rb +3 -0
  243. data/test/dummy/config/initializers/sys_config_ext.rb +12 -0
  244. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  245. data/test/dummy/config/locales/en.yml +23 -0
  246. data/test/dummy/config/routes.rb +60 -0
  247. data/test/dummy/config.ru +4 -0
  248. data/test/dummy/db/schema.rb +95 -0
  249. data/test/dummy/db/seeds/barkest_core_01_create_users.rb +42 -0
  250. data/test/dummy/db/seeds.rb +51 -0
  251. data/test/dummy/lib/assets/.keep +0 -0
  252. data/test/dummy/log/.keep +0 -0
  253. data/test/dummy/public/404.html +67 -0
  254. data/test/dummy/public/422.html +67 -0
  255. data/test/dummy/public/500.html +66 -0
  256. data/test/dummy/public/favicon.ico +0 -0
  257. data/test/dummy/sql/my_test_view.sql +3 -0
  258. data/test/fixtures/access_groups.yml +21 -0
  259. data/test/fixtures/users.yml +71 -0
  260. data/test/helpers/barkest_core/sessions_helper_test.rb +22 -0
  261. data/test/integration/access_group_mgmt_test.rb +33 -0
  262. data/test/integration/access_test.rb +24 -0
  263. data/test/integration/account_activations_access_test.rb +12 -0
  264. data/test/integration/contact_test.rb +98 -0
  265. data/test/integration/extra_partial_test.rb +41 -0
  266. data/test/integration/log_view_access_test.rb +12 -0
  267. data/test/integration/password_resets_test.rb +101 -0
  268. data/test/integration/reports_test.rb +53 -0
  269. data/test/integration/status_access_test.rb +27 -0
  270. data/test/integration/system_config_access_test.rb +24 -0
  271. data/test/integration/system_update_access_test.rb +19 -0
  272. data/test/integration/users_access_test.rb +34 -0
  273. data/test/integration/users_edit_test.rb +178 -0
  274. data/test/integration/users_index_test.rb +62 -0
  275. data/test/integration/users_login_test.rb +67 -0
  276. data/test/integration/users_signup_test.rb +54 -0
  277. data/test/mailers/.keep +0 -0
  278. data/test/mailers/barkest_core/contact_form_test.rb +28 -0
  279. data/test/mailers/barkest_core/user_mailer_test.rb +43 -0
  280. data/test/mailers/previews/barkest_core/contact_form_preview.rb +17 -0
  281. data/test/mailers/previews/barkest_core/user_mailer_preview.rb +26 -0
  282. data/test/models/access_group_group_member_test.rb +28 -0
  283. data/test/models/access_group_test.rb +114 -0
  284. data/test/models/access_group_user_member_test.rb +28 -0
  285. data/test/models/barkest_core/auth_config_test.rb +57 -0
  286. data/test/models/barkest_core/bool_parser_test.rb +28 -0
  287. data/test/models/barkest_core/contact_message_test.rb +61 -0
  288. data/test/models/barkest_core/database_config_test.rb +33 -0
  289. data/test/models/barkest_core/date_parser_test.rb +110 -0
  290. data/test/models/barkest_core/email_config_test.rb +57 -0
  291. data/test/models/barkest_core/global_status_test.rb +50 -0
  292. data/test/models/barkest_core/ms_sql_db_updater_test.rb +115 -0
  293. data/test/models/barkest_core/ms_sql_definition_test.rb +102 -0
  294. data/test/models/barkest_core/ms_sql_function_test.rb +131 -0
  295. data/test/models/barkest_core/number_parser_test.rb +29 -0
  296. data/test/models/barkest_core/self_update_config_test.rb +29 -0
  297. data/test/models/barkest_core/user_alert_test.rb +19 -0
  298. data/test/models/barkest_core/user_manager_test.rb +34 -0
  299. data/test/models/barkest_core/work_path_test.rb +26 -0
  300. data/test/models/disable_user_test.rb +27 -0
  301. data/test/models/generic_time_test.rb +66 -0
  302. data/test/models/ldap_access_group_test.rb +31 -0
  303. data/test/models/pdf_table_builder_test.rb +6 -0
  304. data/test/models/system_config_test.rb +78 -0
  305. data/test/models/user_login_history_test.rb +37 -0
  306. data/test/models/user_test.rb +130 -0
  307. data/test/test_helper.rb +63 -0
  308. metadata +798 -0
@@ -0,0 +1,33 @@
1
+ module BarkestCore
2
+ class DatabaseConfigTest < ActiveSupport::TestCase
3
+
4
+ def setup
5
+ @item = BarkestCore::DatabaseConfig.new('my_db', adapter: :sqlite3, database: 'mydb.sqlite', pool: 5, timeout: 5000)
6
+ end
7
+
8
+ test 'should be valid' do
9
+ assert @item.valid?
10
+ end
11
+
12
+ test 'should require name' do
13
+ assert_required @item, :name
14
+ end
15
+
16
+ test 'should require adapter' do
17
+ assert_required @item, :adapter
18
+ end
19
+
20
+ test 'should require database' do
21
+ assert_required @item, :database
22
+ end
23
+
24
+ test 'should require pool' do
25
+ assert_required @item, :pool
26
+ end
27
+
28
+ test 'should require timeout' do
29
+ assert_required @item, :timeout
30
+ end
31
+
32
+ end
33
+ end
@@ -0,0 +1,110 @@
1
+ require 'test_helper'
2
+
3
+ module BarkestCore
4
+ class DateParserTest < ActiveSupport::TestCase
5
+
6
+
7
+ test 'should parse valid date values' do
8
+ {
9
+ '1/1/2000' => Time.utc(2000,1,1),
10
+ '01/01/00' => Time.utc(2000,1,1),
11
+ '2000-01-01' => Time.utc(2000,1,1),
12
+ '00-01-01' => Time.utc(2000,1,1),
13
+ '0000-01-01' => Time.utc(2000,1,1), # dates less than 100 are converted to 1940-2039.
14
+ '1/1/40' => Time.utc(1940,1,1),
15
+ '40-1-1' => Time.utc(1940,1,1),
16
+ '12/25/2016' => Time.utc(2016,12,25),
17
+ '2016-12-25' => Time.utc(2016,12,25),
18
+ '11/01/2015 1:45 PM' => Time.utc(2015,11,1),
19
+ '2015-11-01 13:45' => Time.utc(2015,11,1),
20
+ }.each do |k,v|
21
+ assert_equal v, BarkestCore::DateParser.parse_for_date_column(k), "#{k} should parse to #{v}"
22
+ assert_equal v.strftime("'%Y-%m-%d'"), BarkestCore::DateParser.parse_for_date_filter(k), "#{k} should filter to #{v.strftime("'%Y-%m-%d'")}"
23
+ end
24
+ end
25
+
26
+ test 'should nullify invalid date values' do
27
+ [
28
+ nil,
29
+ '',
30
+ ' ',
31
+ '25/12/2016', # DD/MM/YYYY is not supported
32
+ '2016/12/25', # YYYY/MM/DD is not supported
33
+ '2016.12.25', # YYYY.MM.DD is not supported
34
+ '12-25-2016', # MM-DD-YYYY is not supported
35
+ '25-12-2016', # DD-MM-YYYY is not supported
36
+ '12.25.2016', # MM.DD.YYYY is not supported
37
+ '0/0/0000', # Invalid day & month.
38
+ '2/30/2000', # Invalid day.
39
+ '13/13/2000', # Invalid month.
40
+ '1/1/2000 24:01', # invalid time.
41
+ '1/1/2000 24:00:01', # invalid time.
42
+ 'Sunday, December 25, 2016', # only numeric dates are supported
43
+ 'December 25, 2016', # only numeric dates are supported
44
+ ].each do |v|
45
+ assert_nil BarkestCore::DateParser.parse_for_date_column(v), "#{v.inspect} should parse to nil"
46
+ assert_equal "NULL", BarkestCore::DateParser.parse_for_date_filter(v), "#{v.inspect} should parse to NULL"
47
+ end
48
+ end
49
+
50
+ test 'should parse valid time values' do
51
+ {
52
+ '1/1/2000 00:00' => Time.utc(2000,1,1),
53
+ '01/01/00 00:00' => Time.utc(2000,1,1),
54
+ '2000-01-01 00:00' => Time.utc(2000,1,1),
55
+ '00-01-01 00:00' => Time.utc(2000,1,1),
56
+ '1/1/40 00:00' => Time.utc(1940,1,1),
57
+ '40-1-1 00:00' => Time.utc(1940,1,1),
58
+ '12/25/2016 00:00' => Time.utc(2016,12,25),
59
+ '2016-12-25 00:00' => Time.utc(2016,12,25),
60
+ '11/01/2015 1:45 PM' => Time.utc(2015,11,1,13,45),
61
+ '2015-11-01 13:45' => Time.utc(2015,11,1,13,45),
62
+ '12:15 AM' => Time.utc(1900,1,1,0,15),
63
+ '12:15 PM' => Time.utc(1900,1,1,12,15),
64
+ '00:15' => Time.utc(1900,1,1,0,15),
65
+ '12:15' => Time.utc(1900,1,1,12,15),
66
+ '2:30 PM' => Time.utc(1900,1,1,14,30),
67
+ '2:30 AM' => Time.utc(1900,1,1,2,30),
68
+ '18:45:50' => Time.utc(1900,1,1,18,45,50),
69
+ '6:45:50 AM' => Time.utc(1900,1,1,6,45,50),
70
+ '6:45:50 PM' => Time.utc(1900,1,1,18,45,50),
71
+ '12/25/2016 9:05:10 AM' => Time.utc(2016,12,25,9,5,10),
72
+ '12/25/2016 9:05:10 PM' => Time.utc(2016,12,25,21,5,10),
73
+ '1/1/2000 24:00' => Time.utc(2000,1,2,0,0), # 24:00 is 00:00 the next day.
74
+ }.each do |k,v|
75
+ assert_equal v, BarkestCore::DateParser.parse_for_time_column(k), "#{k} should parse to #{v}"
76
+ assert_equal v.strftime("'%Y-%m-%d %H:%M:%S'"), BarkestCore::DateParser.parse_for_time_filter(k), "#{k} should filter to #{v.strftime("'%Y-%m-%d %H:%M:%S'")}"
77
+ end
78
+ end
79
+
80
+ test 'should nullify invalid time values' do
81
+ [
82
+ nil,
83
+ '',
84
+ ' ',
85
+ '25/12/2016 00:00', # DD/MM/YYYY is not supported
86
+ '2016/12/25 00:00', # YYYY/MM/DD is not supported
87
+ '2016.12.25 00:00', # YYYY.MM.DD is not supported
88
+ '12-25-2016 00:00', # MM-DD-YYYY is not supported
89
+ '25-12-2016 00:00', # DD-MM-YYYY is not supported
90
+ '12.25.2016 00:00', # MM.DD.YYYY is not supported
91
+ '0/0/0000 00:00', # Invalid day & month.
92
+ '2/30/2000 00:00', # Invalid day.
93
+ '13/13/2000 00:00', # Invalid month.
94
+ '25:00', # invalid hour
95
+ '23:66', # invalid minute
96
+ '23:59:66', # invalid second
97
+ '13:00 PM', # invalid mixed 12/24
98
+ '13:00 AM', # invalid mixed 12/24
99
+ '00:00 PM', # invalid mixed 12/24
100
+ '00:00 AM', # invalid mixed 12/24
101
+ 'Sunday, December 25, 2016 12:18 AM', # only numeric dates are supported
102
+ 'December 25, 2016 12:18 AM', # only numeric dates are supported
103
+ ].each do |v|
104
+ assert_nil BarkestCore::DateParser.parse_for_date_column(v), "#{v.inspect} should parse to nil"
105
+ assert_equal "NULL", BarkestCore::DateParser.parse_for_date_filter(v), "#{v.inspect} should parse to NULL"
106
+ end
107
+ end
108
+
109
+ end
110
+ end
@@ -0,0 +1,57 @@
1
+ module BarkestCore
2
+ class EmailConfigTest < ActiveSupport::TestCase
3
+
4
+ def setup
5
+ @item = BarkestCore::EmailConfig.new(config_mode: :none, default_sender: 'abc@xyz.com', default_recipient: 'abc@xyz.com', default_hostname: 'xyz.com')
6
+ @item2 = @item.dup
7
+ @item2.config_mode = 'smtp'
8
+ @item2.address = 'localhost'
9
+ @item2.port = 25
10
+ @item2.authentication = 'none'
11
+ end
12
+
13
+ test 'should be valid' do
14
+ assert @item.valid?, 'item 1 is invalid'
15
+ assert @item2.valid?, 'item 2 is invalid'
16
+ end
17
+
18
+ test 'should require config_mode' do
19
+ assert_required @item, :config_mode
20
+ assert_required @item2, :config_mode
21
+ end
22
+
23
+ test 'should require default_sender' do
24
+ assert_required @item, :default_sender
25
+ assert_required @item2, :default_sender
26
+ end
27
+
28
+ test 'should require default_recipient' do
29
+ assert_required @item, :default_recipient
30
+ assert_required @item2, :default_recipient
31
+ end
32
+
33
+ test 'should require default_hostname' do
34
+ assert_required @item, :default_hostname
35
+ assert_required @item2, :default_hostname
36
+ end
37
+
38
+ test 'switching to smtp should invalidate item1' do
39
+ @item.config_mode = 'smtp'
40
+ assert_not @item.valid?
41
+ end
42
+
43
+ test 'should require address for smtp' do
44
+ assert_required @item2, :address
45
+ end
46
+
47
+ test 'should require port for smtp' do
48
+ assert_required @item2, :port
49
+ end
50
+
51
+ test 'should require authentication for smtp' do
52
+ assert_required @item2, :authentication
53
+ end
54
+
55
+
56
+ end
57
+ end
@@ -0,0 +1,50 @@
1
+ require 'test_helper'
2
+
3
+ module BarkestCore
4
+ class GlobalStatusTest < ActiveSupport::TestCase
5
+
6
+ test 'should allow running code in a block' do
7
+ assert_not BarkestCore::GlobalStatus.locked?
8
+
9
+ BarkestCore::GlobalStatus.lock_for do |stat|
10
+ assert BarkestCore::GlobalStatus.locked?
11
+ assert stat
12
+
13
+ # set the status using our stat object.
14
+ stat.set_status 'Hello', 10
15
+ cur_stat = stat.get_status
16
+ assert_equal 'Hello', cur_stat[:message]
17
+ assert_equal 10, cur_stat[:percent].to_s.to_i
18
+
19
+ # verify the global status reports correctly.
20
+ cur_stat = BarkestCore::GlobalStatus.current
21
+ assert_equal 'Hello', cur_stat[:message]
22
+ assert_equal 10, cur_stat[:percent].to_s.to_i
23
+ end
24
+
25
+ # after the block, the status should be cleared.
26
+ cur_stat = BarkestCore::GlobalStatus.current
27
+ assert_not_equal 'Hello', cur_stat[:message]
28
+ assert_not_equal 10, cur_stat[:percent].to_s.to_i
29
+ assert_not BarkestCore::GlobalStatus.locked?
30
+ end
31
+
32
+ test 'should block code as necessary' do
33
+ stat = BarkestCore::GlobalStatus.new
34
+ assert_not BarkestCore::GlobalStatus.locked?
35
+ assert stat.acquire_lock
36
+ BarkestCore::GlobalStatus.lock_for do |my_stat|
37
+ assert BarkestCore::GlobalStatus.locked?
38
+ assert_not my_stat # should be false when already locked.
39
+ end
40
+ assert_raises BarkestCore::GlobalStatus::FailureToLock do
41
+ BarkestCore::GlobalStatus.lock_for(true) do |my_stat|
42
+ assert false, 'This block should not execute.'
43
+ end
44
+ end
45
+ assert BarkestCore::GlobalStatus.locked?
46
+ stat.release_lock
47
+ end
48
+
49
+ end
50
+ end
@@ -0,0 +1,115 @@
1
+ require 'test_helper'
2
+
3
+ module BarkestCore
4
+ class MsSqlDbUpdaterTest < ActiveSupport::TestCase
5
+
6
+ TEST_DEFS = [
7
+ 'CREATE TABLE [alpha_beta] ( [id] INTEGER IDENTITY NOT NULL PRIMARY KEY, [name] VARCHAR(30) NOT NULL )',
8
+ 'CREATE VIEW [something] AS SELECT 1 AS [one], \'abc\' as [two]',
9
+ 'CREATE FUNCTION [multiply] (@a INTEGER, @b INTEGER) RETURNS TABLE AS RETURN SELECT ISNULL(@a,0) * ISNULL(@b,0) AS [result]',
10
+ 'CREATE VIEW [alpha_bravo] AS SELECT COUNT(*) AS [beta_count] FROM [@Z~alpha_beta]', # referencing another object.
11
+ # A sample procedure that shows how a procedure can be used to enact more diverse updates.
12
+ # For instance, incremental table updates could be done with an ALTER, but they wouldn't necessarily be safe.
13
+ # Inside a procedure you can check for column existence and update as necessary, making the procedure safe to be
14
+ # called multiple times. The updater only sees the procedure so it won't try to manage the updates carried out
15
+ # by the procedure.
16
+ <<-EOPROC
17
+ CREATE PROCEDURE [add_delta]
18
+ AS
19
+ BEGIN
20
+ SET NOCOUNT ON;
21
+ DECLARE @cnt INTEGER;
22
+ SELECT @cnt=ISNULL((SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS C WHERE C.[TABLE_NAME]='@Z~alpha_beta' AND C.[COLUMN_NAME]='delta'), 0);
23
+ IF @cnt <> 1
24
+ BEGIN
25
+ ALTER TABLE [@Z~alpha_beta] ADD [delta] FLOAT;
26
+ EXEC sp_sqlexec 'UPDATE [@Z~alpha_beta] SET [delta] = 1.0';
27
+ RETURN 1;
28
+ END
29
+ ELSE
30
+ BEGIN
31
+ RETURN 0;
32
+ END
33
+ END
34
+ EOPROC
35
+
36
+ ]
37
+
38
+ class CleanupConn < ActiveRecord::Base
39
+ self.abstract_class = true
40
+ end
41
+
42
+ test 'should be able to update MSSQL db' do
43
+ updater = ::BarkestCore::MsSqlDbDefinition.new
44
+
45
+ # add the sources.
46
+ TEST_DEFS.each do |test_def|
47
+ updater.add_source "-- #{Date.today.strftime('%Y-%m-%d')}\n" + test_def
48
+ end
49
+
50
+ cfg = BarkestCore.db_config(:ms_sql_test)
51
+ cntr = 0
52
+ begin
53
+ updater.update_db(
54
+ cfg,
55
+ before_update: Proc.new do |conn,user|
56
+ assert_equal cfg[:username], user
57
+ cntr = conn.exec_query("SELECT COUNT(*) AS [cnt] FROM [#{::BarkestCore::MsSqlDbDefinition::VERSION_TABLE_NAME}]").first['cnt']
58
+ updater.sources.each do |src|
59
+ assert_equal 0, conn.exec_query("SELECT COUNT(*) AS [cnt] FROM [#{::BarkestCore::MsSqlDbDefinition::VERSION_TABLE_NAME}] WHERE [object_name]='#{src.prefixed_name}'").first['cnt']
60
+ assert_not conn.object_exists?(src.prefixed_name)
61
+ end
62
+ end,
63
+ after_update: Proc.new do |conn,_|
64
+ assert_equal cntr + TEST_DEFS.count, conn.exec_query("SELECT COUNT(*) AS [cnt] FROM [#{::BarkestCore::MsSqlDbDefinition::VERSION_TABLE_NAME}]").first['cnt']
65
+ updater.sources.each do |src|
66
+ assert_equal 1, conn.exec_query("SELECT COUNT(*) AS [cnt] FROM [#{::BarkestCore::MsSqlDbDefinition::VERSION_TABLE_NAME}] WHERE [object_name]='#{src.prefixed_name}'").first['cnt']
67
+ assert conn.object_exists?(src.prefixed_name)
68
+ end
69
+ assert_not_equal 0, conn.exec_query("SELECT COUNT(*) AS [cnt] FROM [#{::BarkestCore::MsSqlDbDefinition::VERSION_TABLE_NAME}]").first['cnt']
70
+ assert_equal 1, conn.exec_query("SELECT [one] FROM [#{updater.object_name 'something'}]").first['one']
71
+ assert_equal 'abc', conn.exec_query("SELECT [two] FROM [#{updater.object_name 'something'}]").first['two']
72
+ assert_equal 20, conn.exec_query("SELECT [result] FROM [#{updater.object_name 'multiply'}](4, 5)").first['result']
73
+
74
+ (1..5).each do |i|
75
+ conn.exec_query "INSERT INTO [#{updater.object_name 'alpha_beta'}] ([name]) VALUES ('Number #{i}')"
76
+ end
77
+
78
+ # pass one, a return value of 1 indicates the SP made the necessary changes.
79
+ assert_equal 1, conn.exec_sp("EXECUTE [#{updater.object_name 'add_delta'}]")
80
+ # pass two, a return value of 0 indicates the SP didn't need to make changes.
81
+ assert_equal 0, conn.exec_sp("EXECUTE [#{updater.object_name 'add_delta'}]")
82
+
83
+ # Now we can directly access the new [delta] fields added to our table.
84
+ assert_equal 5, conn.exec_query("SELECT COUNT(*) AS [delta_count] FROM [#{updater.object_name 'alpha_beta'}] WHERE [delta]=1.0").first['delta_count']
85
+ # And the view should still work as well.
86
+ assert_equal 5, conn.exec_query("SELECT [beta_count] FROM [#{updater.object_name 'alpha_bravo'}]").first['beta_count']
87
+ end
88
+ )
89
+
90
+ rescue ::BarkestCore::MsSqlDbDefinition::NeedFullAccess => e
91
+ skip "Invalid test MSSQL configuration: #{e.message}"
92
+ ensure
93
+ begin
94
+ CleanupConn.remove_connection
95
+ CleanupConn.establish_connection cfg
96
+ conn = CleanupConn.connection
97
+ updater.sources.reverse.each do |test_def|
98
+ begin
99
+ conn.execute "DELETE FROM [#{::BarkestCore::MsSqlDbDefinition::VERSION_TABLE_NAME}] WHERE [object_name]='#{test_def.prefixed_name}'" rescue nil
100
+ conn.execute test_def.drop_sql rescue nil
101
+ rescue =>e
102
+ nil
103
+ end
104
+ end
105
+ CleanupConn.remove_connection
106
+ rescue
107
+ nil
108
+ end
109
+ end
110
+
111
+ end
112
+
113
+
114
+ end
115
+ end
@@ -0,0 +1,102 @@
1
+ require 'test_helper'
2
+
3
+ module BarkestCore
4
+ class MsSqlDefinitionTest < ActiveSupport::TestCase
5
+
6
+ VALID_LIST = [
7
+ ['XYZ', 'VIEW', 'CREATE VIEW [XYZ] AS SELECT 123 AS [VALUE]'],
8
+ ['XYZ_123', 'VIEW', 'CREATE VIEW XYZ_123 AS SELECT \'ABC\'\'XYZ\' AS [123]'],
9
+ ['ABC', 'VIEW', "-- This is a comment about this view.\nCREATE VIEW [ABC] AS SELECT 1 AS [VALUE]\n/* Just a simple comment. */"],
10
+ ['ABC_123', 'VIEW', "CREATE VIEW ABC_123 AS SELECT 1 AS [Index]\nUNION SELECT 2\nUNION SELECT 3\n-- This is not a drop statement."],
11
+
12
+ ['AEIOU', 'FUNCTION', 'CREATE FUNCTION [AEIOU] (@num AS INTEGER) RETURNS TABLE AS SELECT ISNULL(@num,0) * 5 AS [five_times_more]'],
13
+
14
+ ['ZYX', 'TABLE', 'CREATE TABLE [ZYX] ([id] INTEGER NOT NULL PRIMARY KEY, [name] VARCHAR(200))'],
15
+ ['ZYX', 'TABLE', 'ALTER TABLE [ZYX] ADD COLUMN [col2] INTEGER'],
16
+ ]
17
+
18
+ INVALID_LIST = [
19
+ [
20
+ BarkestCore::MsSqlDefinition::EmptyDefinition,
21
+ ''
22
+ ],
23
+ [
24
+ BarkestCore::MsSqlDefinition::EmptyDefinition,
25
+ "-- This is a comment\n-- This is another comment\n/* And a final comment.\nNote that this definition still has no content.\n/* We should also support embedded comments */ because they may occur. */"
26
+ ],
27
+ [
28
+ BarkestCore::MsSqlDefinition::MissingCreateStatement,
29
+ 'SELECT 1 AS Value'
30
+ ],
31
+ [
32
+ BarkestCore::MsSqlDefinition::ExtraDDL,
33
+ "CREATE VIEW XYZ AS SELECT 1 AS [Value]\nCREATE VIEW ABC AS SELECT 2 AS [Value]"
34
+ ],
35
+ [
36
+ BarkestCore::MsSqlDefinition::ExtraDDL,
37
+ "create view xyz as select 1 as [value]\ndrop view xyz"
38
+ ],
39
+ [
40
+ BarkestCore::MsSqlDefinition::UnmatchedBracket,
41
+ 'create view xyz as select 1 as [value, 2 as [another_value]'
42
+ ],
43
+ [
44
+ BarkestCore::MsSqlDefinition::UnmatchedBracket,
45
+ 'create view xyz as select 1 as [value]]'
46
+ ],
47
+ [
48
+ BarkestCore::MsSqlDefinition::UnclosedQuote,
49
+ "create view xyz as select 'hello as [value]"
50
+ ],
51
+ [
52
+ BarkestCore::MsSqlDefinition::UnclosedQuote,
53
+ "create view xyz as select 'hello 'world' as value"
54
+ ],
55
+ [
56
+ BarkestCore::MsSqlDefinition::UnclosedQuote,
57
+ "create view xyz as select 1 as \"value"
58
+ ],
59
+ [
60
+ BarkestCore::MsSqlDefinition::UnclosedQuote,
61
+ "create view xyz as select 1 as value\""
62
+ ],
63
+ [
64
+ BarkestCore::MsSqlDefinition::UnmatchedComment,
65
+ 'create view xyz as select 1 as value /* /* a comment that was opened twice */'
66
+ ],
67
+ [
68
+ BarkestCore::MsSqlDefinition::UnmatchedComment,
69
+ 'create view xyz as select 1 as value /* a comment that is closed twice */ */'
70
+ ],
71
+ [
72
+ BarkestCore::MsSqlDefinition::MissingReturnType,
73
+ 'create function xyz (alpha integer) as select alpha'
74
+ ],
75
+ [ # alter is only valid for tables (for our purposes) since views and functions are recreated.
76
+ BarkestCore::MsSqlDefinition::MissingCreateStatement,
77
+ 'alter function xyz (@alpha integer) returns table as select @alpha'
78
+ ],
79
+ ]
80
+
81
+ test 'should be valid samples' do
82
+ VALID_LIST.each_with_index do |(name,type,sql), index|
83
+ begin
84
+ d = MsSqlDefinition.new(sql)
85
+ rescue MsSqlDefinition::InvalidDefinition => e
86
+ raise Minitest::Assertion, "Encountered #{e.class} error when processing statement #{index}."
87
+ end
88
+ assert_equal name, d.name, "Name mismatch error #{d.name.inspect} <> #{name.inspect} for statement #{index}."
89
+ assert_equal type, d.type, "Type mismatch error #{d.type.inspect} <> #{type.inspect} for statement #{index}."
90
+ end
91
+ end
92
+
93
+ test 'should be invalid samples' do
94
+ INVALID_LIST.each_with_index do |(error,sql),index|
95
+ assert_raises error, "Expected error of type #{error} for statement #{index}." do
96
+ MsSqlDefinition.new(sql)
97
+ end
98
+ end
99
+ end
100
+
101
+ end
102
+ end