kowl 0.0.1

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 (250) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +7 -0
  3. data/README.md +383 -0
  4. data/bin/console +14 -0
  5. data/bin/kowl +106 -0
  6. data/bin/setup +13 -0
  7. data/lib/kowl/actions.rb +240 -0
  8. data/lib/kowl/docker.rb +447 -0
  9. data/lib/kowl/generators/README.md +5 -0
  10. data/lib/kowl/generators/action_generator.rb +113 -0
  11. data/lib/kowl/generators/admin_generator.rb +114 -0
  12. data/lib/kowl/generators/assets_generator.rb +188 -0
  13. data/lib/kowl/generators/base.rb +40 -0
  14. data/lib/kowl/generators/circleci_generator.rb +11 -0
  15. data/lib/kowl/generators/config_generator.rb +180 -0
  16. data/lib/kowl/generators/controller_generator.rb +64 -0
  17. data/lib/kowl/generators/database_generator.rb +42 -0
  18. data/lib/kowl/generators/decorators_generator.rb +16 -0
  19. data/lib/kowl/generators/docker_generator.rb +40 -0
  20. data/lib/kowl/generators/dotfiles_generator.rb +73 -0
  21. data/lib/kowl/generators/libs_generator.rb +19 -0
  22. data/lib/kowl/generators/mailer_generator.rb +58 -0
  23. data/lib/kowl/generators/misc_generator.rb +20 -0
  24. data/lib/kowl/generators/overrides/app_base.rb +15 -0
  25. data/lib/kowl/generators/overrides/app_builder.rb +58 -0
  26. data/lib/kowl/generators/overrides/app_generator.rb +249 -0
  27. data/lib/kowl/generators/pages_generator.rb +46 -0
  28. data/lib/kowl/generators/routes_generator.rb +20 -0
  29. data/lib/kowl/generators/sidekiq_generator.rb +31 -0
  30. data/lib/kowl/generators/staging_generator.rb +14 -0
  31. data/lib/kowl/generators/test_generator.rb +42 -0
  32. data/lib/kowl/generators/text_files_generator.rb +41 -0
  33. data/lib/kowl/generators/users_and_auth_generator.rb +143 -0
  34. data/lib/kowl/generators/uuid_generator.rb +39 -0
  35. data/lib/kowl/generators/views_and_helpers_generator.rb +104 -0
  36. data/lib/kowl/geodb.rb +96 -0
  37. data/lib/kowl/helpers.rb +139 -0
  38. data/lib/kowl/templates/Gemfile.erb.tt +253 -0
  39. data/lib/kowl/templates/README.md.erb +33 -0
  40. data/lib/kowl/templates/app/assets/javascripts/semantic.js.tt +26 -0
  41. data/lib/kowl/templates/app/assets/stylesheets/administrate/application.scss +44 -0
  42. data/lib/kowl/templates/app/assets/stylesheets/bootstrap/_custom_styling.scss +38 -0
  43. data/lib/kowl/templates/app/assets/stylesheets/bootstrap/application-mailer.scss +1 -0
  44. data/lib/kowl/templates/app/assets/stylesheets/bootstrap/application.scss +14 -0
  45. data/lib/kowl/templates/app/assets/stylesheets/bootstrap/components/_alerts.scss +7 -0
  46. data/lib/kowl/templates/app/assets/stylesheets/bootstrap/components/_errors.scss +28 -0
  47. data/lib/kowl/templates/app/assets/stylesheets/bootstrap/components/_navbar.scss +17 -0
  48. data/lib/kowl/templates/app/assets/stylesheets/bootstrap/variables.scss +6 -0
  49. data/lib/kowl/templates/app/assets/stylesheets/semantic/_custom_styling.scss +20 -0
  50. data/lib/kowl/templates/app/assets/stylesheets/semantic/application.scss +24 -0
  51. data/lib/kowl/templates/app/controllers/admin/application_controller.rb +29 -0
  52. data/lib/kowl/templates/app/controllers/admin/login_activities_controller.rb +29 -0
  53. data/lib/kowl/templates/app/controllers/admin/users_controller.rb +37 -0
  54. data/lib/kowl/templates/app/controllers/concerns/auth/authentication.rb +18 -0
  55. data/lib/kowl/templates/app/controllers/concerns/auth/authorization.rb +20 -0
  56. data/lib/kowl/templates/app/controllers/concerns/auth/error_handlers.rb +27 -0
  57. data/lib/kowl/templates/app/controllers/concerns/noauth/error_handlers.rb +25 -0
  58. data/lib/kowl/templates/app/controllers/users_controller.rb +17 -0
  59. data/lib/kowl/templates/app/dashboards/login_activity_dashboard.rb.tt +59 -0
  60. data/lib/kowl/templates/app/dashboards/rich_text_body_dashboard.rb.tt +17 -0
  61. data/lib/kowl/templates/app/dashboards/user_dashboard.rb.tt +60 -0
  62. data/lib/kowl/templates/app/fields/gravatar_field.rb +10 -0
  63. data/lib/kowl/templates/app/fields/rich_text_area_field.rb +8 -0
  64. data/lib/kowl/templates/app/inputs/rich_text_area_input.rb +11 -0
  65. data/lib/kowl/templates/app/javascript/administrate/components/date_time_picker.js.tt +32 -0
  66. data/lib/kowl/templates/app/javascript/administrate/components/table.js.tt +49 -0
  67. data/lib/kowl/templates/app/javascript/administrate/index.js +3 -0
  68. data/lib/kowl/templates/app/javascript/packs/administrate.js.tt +21 -0
  69. data/lib/kowl/templates/app/javascript/packs/semantic.js +11 -0
  70. data/lib/kowl/templates/app/mailers/application_mailer.rb +7 -0
  71. data/lib/kowl/templates/app/mailers/devise_mailer.rb +5 -0
  72. data/lib/kowl/templates/app/models/login_activity.rb.tt +29 -0
  73. data/lib/kowl/templates/app/models/user.rb.tt +72 -0
  74. data/lib/kowl/templates/app/policies/application_policy.rb +38 -0
  75. data/lib/kowl/templates/app/policies/login_activity_policy.rb +35 -0
  76. data/lib/kowl/templates/app/policies/user_policy.rb +43 -0
  77. data/lib/kowl/templates/app/views/admin/templates/navigation.erb.tt +23 -0
  78. data/lib/kowl/templates/app/views/admin/views/application/_javascript.html.erb +21 -0
  79. data/lib/kowl/templates/app/views/admin/views/users/_collection.html.erb +102 -0
  80. data/lib/kowl/templates/app/views/admin/views/users/_form.html.erb +46 -0
  81. data/lib/kowl/templates/app/views/admin/views/users/edit.html.erb +36 -0
  82. data/lib/kowl/templates/app/views/admin/views/users/index.html.erb +66 -0
  83. data/lib/kowl/templates/app/views/fields/gravatar_field/_form.html.erb +6 -0
  84. data/lib/kowl/templates/app/views/fields/gravatar_field/_index.html.erb +1 -0
  85. data/lib/kowl/templates/app/views/fields/gravatar_field/_show.html.erb +1 -0
  86. data/lib/kowl/templates/app/views/fields/rich_text_area_field/_form.html.erb +6 -0
  87. data/lib/kowl/templates/app/views/fields/rich_text_area_field/_index.html.erb +1 -0
  88. data/lib/kowl/templates/app/views/fields/rich_text_area_field/_show.html.erb +1 -0
  89. data/lib/kowl/templates/app/views/layouts/admin.html.erb.tt +47 -0
  90. data/lib/kowl/templates/app/views/layouts/devise_mailer.html.erb +14 -0
  91. data/lib/kowl/templates/app/views/pages/welcome/bootstrap.html.erb +18 -0
  92. data/lib/kowl/templates/app/views/pages/welcome/bootstrap.html.haml +17 -0
  93. data/lib/kowl/templates/app/views/pages/welcome/bootstrap.html.slim +17 -0
  94. data/lib/kowl/templates/app/views/pages/welcome/default.html.erb +0 -0
  95. data/lib/kowl/templates/app/views/pages/welcome/default.html.haml +0 -0
  96. data/lib/kowl/templates/app/views/pages/welcome/default.html.slim +0 -0
  97. data/lib/kowl/templates/app/views/pages/welcome/semantic.html.erb +20 -0
  98. data/lib/kowl/templates/app/views/pages/welcome/semantic.html.haml +17 -0
  99. data/lib/kowl/templates/app/views/pages/welcome/semantic.html.slim +17 -0
  100. data/lib/kowl/templates/app/views/shared/footer/bootstrap.html.erb.tt +5 -0
  101. data/lib/kowl/templates/app/views/shared/footer/bootstrap.html.haml.tt +3 -0
  102. data/lib/kowl/templates/app/views/shared/footer/bootstrap.html.slim.tt +3 -0
  103. data/lib/kowl/templates/app/views/shared/footer/semantic.html.erb.tt +7 -0
  104. data/lib/kowl/templates/app/views/shared/footer/semantic.html.haml.tt +5 -0
  105. data/lib/kowl/templates/app/views/shared/footer/semantic.html.slim.tt +5 -0
  106. data/lib/kowl/templates/app/views/shared/navigation/bootstrap.html.erb.tt +51 -0
  107. data/lib/kowl/templates/app/views/shared/navigation/bootstrap.html.haml.tt +36 -0
  108. data/lib/kowl/templates/app/views/shared/navigation/bootstrap.html.slim.tt +36 -0
  109. data/lib/kowl/templates/app/views/shared/navigation/semantic.html.erb.tt +48 -0
  110. data/lib/kowl/templates/app/views/shared/navigation/semantic.html.haml.tt +36 -0
  111. data/lib/kowl/templates/app/views/shared/navigation/semantic.html.slim.tt +36 -0
  112. data/lib/kowl/templates/app/workers/scheduler/pghero_scheduler.rb +11 -0
  113. data/lib/kowl/templates/config/autoprefixer.yml +4 -0
  114. data/lib/kowl/templates/config/db/mysql.yml.tt +43 -0
  115. data/lib/kowl/templates/config/db/oracle.yml.tt +29 -0
  116. data/lib/kowl/templates/config/db/postgresql.yml.tt +37 -0
  117. data/lib/kowl/templates/config/db/sqlite3.yml.tt +20 -0
  118. data/lib/kowl/templates/config/db/sqlserver.yml.tt +28 -0
  119. data/lib/kowl/templates/config/initializers/administrate.rb.tt +9 -0
  120. data/lib/kowl/templates/config/initializers/bullet.rb +21 -0
  121. data/lib/kowl/templates/config/initializers/devise-security.rb +44 -0
  122. data/lib/kowl/templates/config/initializers/devise_argon2.rb +29 -0
  123. data/lib/kowl/templates/config/initializers/faker.rb +6 -0
  124. data/lib/kowl/templates/config/initializers/generators.rb.tt +31 -0
  125. data/lib/kowl/templates/config/initializers/geocoder.rb +10 -0
  126. data/lib/kowl/templates/config/initializers/letter_opener.rb +13 -0
  127. data/lib/kowl/templates/config/initializers/lockbox.rb +11 -0
  128. data/lib/kowl/templates/config/initializers/logging.rb +6 -0
  129. data/lib/kowl/templates/config/initializers/lograge.rb +7 -0
  130. data/lib/kowl/templates/config/initializers/logstop.rb +4 -0
  131. data/lib/kowl/templates/config/initializers/middleware.rb +9 -0
  132. data/lib/kowl/templates/config/initializers/oj.rb +7 -0
  133. data/lib/kowl/templates/config/initializers/pagy.rb.tt +16 -0
  134. data/lib/kowl/templates/config/initializers/postmark.rb +8 -0
  135. data/lib/kowl/templates/config/initializers/rack_attack.rb.tt +71 -0
  136. data/lib/kowl/templates/config/initializers/sass.rb +5 -0
  137. data/lib/kowl/templates/config/initializers/sidekiq.rb +11 -0
  138. data/lib/kowl/templates/config/initializers/simpleform/semantic.rb +225 -0
  139. data/lib/kowl/templates/config/initializers/slim.rb +6 -0
  140. data/lib/kowl/templates/config/initializers/sparkpost.rb +13 -0
  141. data/lib/kowl/templates/config/routes.rb.tt +28 -0
  142. data/lib/kowl/templates/config/sidekiq.yml.tt +17 -0
  143. data/lib/kowl/templates/db/migrations/create_action_text_tables.action_text.rb.tt +16 -0
  144. data/lib/kowl/templates/db/migrations/create_active_storage_tables.active_storage.rb.tt +29 -0
  145. data/lib/kowl/templates/db/migrations/devise.rb.tt +59 -0
  146. data/lib/kowl/templates/db/migrations/login_activities.rb.tt +41 -0
  147. data/lib/kowl/templates/db/seeds.rb.tt +14 -0
  148. data/lib/kowl/templates/docker/Dockerfile.alpine.tt +92 -0
  149. data/lib/kowl/templates/docker/Dockerfile.debian.tt +133 -0
  150. data/lib/kowl/templates/docker/docker-compose.yml.tt +55 -0
  151. data/lib/kowl/templates/docker/mysql/Dockerfile.tt +15 -0
  152. data/lib/kowl/templates/dotfiles/Aptfile.tt +34 -0
  153. data/lib/kowl/templates/dotfiles/Brewfile.tt +49 -0
  154. data/lib/kowl/templates/dotfiles/Procfile.tt +12 -0
  155. data/lib/kowl/templates/dotfiles/codeclimate.yml +76 -0
  156. data/lib/kowl/templates/dotfiles/coffeelint.json +10 -0
  157. data/lib/kowl/templates/dotfiles/coffeelintignore +15 -0
  158. data/lib/kowl/templates/dotfiles/dockerignore +23 -0
  159. data/lib/kowl/templates/dotfiles/editorconfig +13 -0
  160. data/lib/kowl/templates/dotfiles/env.tt +58 -0
  161. data/lib/kowl/templates/dotfiles/erb-lint.yml +10 -0
  162. data/lib/kowl/templates/dotfiles/erdconfig.tt +24 -0
  163. data/lib/kowl/templates/dotfiles/eslintignore +20 -0
  164. data/lib/kowl/templates/dotfiles/eslintrc.js +31 -0
  165. data/lib/kowl/templates/dotfiles/fasterer.yml +14 -0
  166. data/lib/kowl/templates/dotfiles/foreman +1 -0
  167. data/lib/kowl/templates/dotfiles/gitattributes +15 -0
  168. data/lib/kowl/templates/dotfiles/gitignore +69 -0
  169. data/lib/kowl/templates/dotfiles/haml-lint.yml +23 -0
  170. data/lib/kowl/templates/dotfiles/jsbeautifyrc +15 -0
  171. data/lib/kowl/templates/dotfiles/jshintrc +3 -0
  172. data/lib/kowl/templates/dotfiles/mailmap +3 -0
  173. data/lib/kowl/templates/dotfiles/nvmrc +1 -0
  174. data/lib/kowl/templates/dotfiles/prettierignore +21 -0
  175. data/lib/kowl/templates/dotfiles/prettierrc.js +62 -0
  176. data/lib/kowl/templates/dotfiles/pryrc +7 -0
  177. data/lib/kowl/templates/dotfiles/rspec +3 -0
  178. data/lib/kowl/templates/dotfiles/rubocop.yml.tt +78 -0
  179. data/lib/kowl/templates/dotfiles/scss-lint.yml +132 -0
  180. data/lib/kowl/templates/dotfiles/simplecov +19 -0
  181. data/lib/kowl/templates/dotfiles/slim-lint.yml +23 -0
  182. data/lib/kowl/templates/dotfiles/slugignore +10 -0
  183. data/lib/kowl/templates/dotfiles/yamllint +7 -0
  184. data/lib/kowl/templates/dotfiles/yarnclean +46 -0
  185. data/lib/kowl/templates/lib/tasks/stats.rake +42 -0
  186. data/lib/kowl/templates/tests/factories/README.md +0 -0
  187. data/lib/kowl/templates/tests/factories/login_activity.rb +11 -0
  188. data/lib/kowl/templates/tests/factories/user.rb +11 -0
  189. data/lib/kowl/templates/tests/minitest/README.md +3 -0
  190. data/lib/kowl/templates/tests/minitest/application_system_test_case.rb +7 -0
  191. data/lib/kowl/templates/tests/minitest/controllers/pages_controller_test.rb +10 -0
  192. data/lib/kowl/templates/tests/minitest/models/login_activity_test.rb +8 -0
  193. data/lib/kowl/templates/tests/minitest/models/user_test.rb +15 -0
  194. data/lib/kowl/templates/tests/minitest/policies/login_activity_policy_test.rb +7 -0
  195. data/lib/kowl/templates/tests/minitest/policies/user_policy_test.rb +7 -0
  196. data/lib/kowl/templates/tests/minitest/support/capybara.rb +38 -0
  197. data/lib/kowl/templates/tests/minitest/support/database_cleaner.rb +20 -0
  198. data/lib/kowl/templates/tests/minitest/support/database_cleaner_support.rb +15 -0
  199. data/lib/kowl/templates/tests/minitest/support/deferred_garbage_collection.rb +21 -0
  200. data/lib/kowl/templates/tests/minitest/support/devise.rb +16 -0
  201. data/lib/kowl/templates/tests/minitest/support/factories.rb +6 -0
  202. data/lib/kowl/templates/tests/minitest/support/formulaic.rb +8 -0
  203. data/lib/kowl/templates/tests/minitest/support/helpers/devise_helper.rb +57 -0
  204. data/lib/kowl/templates/tests/minitest/support/papertrail.rb +17 -0
  205. data/lib/kowl/templates/tests/minitest/support/pundit.rb +0 -0
  206. data/lib/kowl/templates/tests/minitest/support/shoulda.rb +11 -0
  207. data/lib/kowl/templates/tests/minitest/support/simplecov.rb +8 -0
  208. data/lib/kowl/templates/tests/minitest/test_helper.rb +17 -0
  209. data/lib/kowl/templates/tests/rspec/README.md +9 -0
  210. data/lib/kowl/templates/tests/rspec/controllers/admin/application_controller_spec.rb +12 -0
  211. data/lib/kowl/templates/tests/rspec/controllers/admin/users_controller_spec.rb +14 -0
  212. data/lib/kowl/templates/tests/rspec/controllers/pages_controller_spec.rb +10 -0
  213. data/lib/kowl/templates/tests/rspec/features/README.md +15 -0
  214. data/lib/kowl/templates/tests/rspec/features/visitor_sign_up_spec.rb +25 -0
  215. data/lib/kowl/templates/tests/rspec/helpers/application_helper_spec.rb +7 -0
  216. data/lib/kowl/templates/tests/rspec/helpers/pages_helper_spec.rb +15 -0
  217. data/lib/kowl/templates/tests/rspec/models/login_activity_spec.rb +11 -0
  218. data/lib/kowl/templates/tests/rspec/models/user_spec.rb +21 -0
  219. data/lib/kowl/templates/tests/rspec/policies/login_activity_policy_spec.rb +59 -0
  220. data/lib/kowl/templates/tests/rspec/policies/user_policy_spec.rb +56 -0
  221. data/lib/kowl/templates/tests/rspec/rails_helper.rb +72 -0
  222. data/lib/kowl/templates/tests/rspec/requests/pages_spec.rb +11 -0
  223. data/lib/kowl/templates/tests/rspec/spec_helper.rb +96 -0
  224. data/lib/kowl/templates/tests/rspec/support/bullet.rb +17 -0
  225. data/lib/kowl/templates/tests/rspec/support/capybara.rb +37 -0
  226. data/lib/kowl/templates/tests/rspec/support/controller_testing.rb +10 -0
  227. data/lib/kowl/templates/tests/rspec/support/database_cleaner.rb +55 -0
  228. data/lib/kowl/templates/tests/rspec/support/deferred_garbage_collection.rb +32 -0
  229. data/lib/kowl/templates/tests/rspec/support/devise.rb +21 -0
  230. data/lib/kowl/templates/tests/rspec/support/factories.rb +5 -0
  231. data/lib/kowl/templates/tests/rspec/support/formulaic.rb +8 -0
  232. data/lib/kowl/templates/tests/rspec/support/helpers/devise_helpers.rb +56 -0
  233. data/lib/kowl/templates/tests/rspec/support/papertrail.rb +5 -0
  234. data/lib/kowl/templates/tests/rspec/support/pi_ci.rb +6 -0
  235. data/lib/kowl/templates/tests/rspec/support/pundit.rb +6 -0
  236. data/lib/kowl/templates/tests/rspec/support/shoulda.rb +10 -0
  237. data/lib/kowl/templates/tests/rspec/support/sidekiq.rb +10 -0
  238. data/lib/kowl/templates/tests/rspec/support/simplecov.rb +7 -0
  239. data/lib/kowl/templates/tests/rspec/support/warden.rb +8 -0
  240. data/lib/kowl/templates/text_files/AUTHORS.md +4 -0
  241. data/lib/kowl/templates/text_files/CHANGELOG.md.tt +12 -0
  242. data/lib/kowl/templates/text_files/CODE_OF_CONDUCT.md +76 -0
  243. data/lib/kowl/templates/text_files/TODO.md +7 -0
  244. data/lib/kowl/templates/text_files/VERSION +1 -0
  245. data/lib/kowl/templates/text_files/humans.txt.tt +15 -0
  246. data/lib/kowl/templates/text_files/robots.txt.tt +6 -0
  247. data/lib/kowl/templates/text_files/security.txt +6 -0
  248. data/lib/kowl/version.rb +9 -0
  249. data/lib/kowl.rb +18 -0
  250. metadata +404 -0
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Modified from => https://github.com/rails/rails/blob/feb97dfabd027a73a41ca8bd2ab7c3196ab76d3d/railties/lib/rails/tasks/statistics.rake
4
+ # While global constants are bad, many 3rd party tools depend on this one (e.g
5
+ # rspec-rails & cucumber-rails). So a deprecation warning is needed if we want
6
+ # to remove it.
7
+ STATS_FOLDERS = [
8
+ %w(Controllers app/controllers),
9
+ %w(Helpers app/helpers),
10
+ %w(Jobs app/jobs),
11
+ %w(Models app/models),
12
+ %w(Mailers app/mailers),
13
+ %w(Mailboxes app/mailboxes),
14
+ %w(Channels app/channels),
15
+ %w(JavaScripts app/assets/javascripts),
16
+ %w(Webpacker app/javascript),
17
+ %w(Dashboards app/dashboards),
18
+ %w(Fields app/fields),
19
+ %w(Inputs app/inputs),
20
+ %w(Policies app/policies),
21
+ %w(Services app/services),
22
+ %w(Workers app/workers),
23
+ %w(Libraries lib/),
24
+ %w(APIs app/apis),
25
+ %w(Controller\ tests test/controllers),
26
+ %w(Helper\ tests test/helpers),
27
+ %w(Model\ tests test/models),
28
+ %w(Mailer\ tests test/mailers),
29
+ %w(Mailbox\ tests test/mailboxes),
30
+ %w(Channel\ tests test/channels),
31
+ %w(Job\ tests test/jobs),
32
+ %w(Integration\ tests test/integration),
33
+ %w(System\ tests test/system),
34
+ ].collect do |name, dir|
35
+ [ name, "#{File.dirname(Rake.application.rakefile_location)}/#{dir}" ]
36
+ end.select { |name, dir| File.directory?(dir) }
37
+
38
+ desc 'Report code statistics (KLOCs, etc) from the application or engine'
39
+ task :more_stats do
40
+ require 'rails/code_statistics'
41
+ CodeStatistics.new(*STATS_FOLDERS).to_s
42
+ end
File without changes
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :LoginActivity do
5
+ identity { Faker::Internet.email }
6
+ ip { Faker::Internet.ip_v4_address }
7
+ success { Faker::Boolean.boolean }
8
+ user_type { 'User' }
9
+ association :user, factory: :user
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :user do
5
+ email { Faker::Internet.email }
6
+ role { :user }
7
+ password { 'Pa$$w0rd!' }
8
+ password_confirmation { 'Pa$$w0rd!' }
9
+ # password { Faker::Internet.password(min_length: 6, mix_case: true, special_characters: true) }
10
+ end
11
+ end
@@ -0,0 +1,3 @@
1
+ [https://guides.rubyonrails.org/testing.html](Rails Testing Guide)
2
+
3
+ [The difference between Integraton Tests vs Controller Tests](https://www.codewithjason.com/difference-integration-tests-controller-tests-rails/)
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ class ApplicationSystemTestCase < ActionDispatch::SystemTestCase
6
+ driven_by :selenium, using: :chrome, screen_size: [1400, 1400]
7
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ class PageControllerTest < ActionController::TestCase
6
+ def welcome
7
+ get welcome_path
8
+ assert_response :success
9
+ end
10
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ class LoginActivityTest < ActiveSupport::TestCase
6
+ # Associations
7
+ # should belong_to(:user)
8
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ # https://www.rubydoc.info/github/thoughtbot/shoulda-matchers/master/Shoulda%2FMatchers%2FActiveModel:validate_numericality_of
6
+ class UserTest < ActiveSupport::TestCase
7
+ # Associations
8
+ # should have_many(:login_activies)
9
+
10
+ # Validations
11
+ # should validate_presence_of(:email)
12
+ # should validate_length_of(:email).is_at_least(5).is_at_most(255)
13
+ # should validate_presence_of(:role)
14
+ # should define_enum_for(:role)
15
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ class LoginActivityPolicyTest < ActiveSupport::TestCase
6
+
7
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ class UserPolicyTest < ActiveSupport::TestCase
6
+
7
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'capybara/rails'
4
+ require 'capybara/minitest'
5
+ require 'webdrivers'
6
+ # Integration testing
7
+
8
+ # default capybara/selenium configuration
9
+ # https://github.com/itmammoth/capybara-bootstrap/blob/master/scrape.rb
10
+ # https://thoughtbot.com/blog/headless-feature-specs-with-chrome
11
+ # run as headless mode with set window size
12
+ Capybara.register_driver :headless_chrome do |app|
13
+ options = Selenium::WebDriver::Chrome::Options.new(
14
+ args: %w[headless disable-extensions disable-gpu disable-infobars disable-translate no-sandbox window-size=1280,800]
15
+ )
16
+ Capybara::Selenium::Driver.new(app, browser: :chrome, options: options)
17
+ end
18
+
19
+ Capybara.javascript_driver = :headless_chrome
20
+ Capybara.configure do |config|
21
+ config.default_max_wait_time = 5 # seconds
22
+ config.default_driver = :headless_chrome
23
+ end
24
+
25
+ # used for Integration Testing
26
+ class ActionDispatch::IntegrationTest
27
+ # Make the Capybara DSL available in all integration tests
28
+ include Capybara::DSL
29
+ # Make `assert_*` methods behave like Minitest assertions
30
+ include Capybara::Minitest::Assertions
31
+
32
+ # Reset sessions and driver between tests
33
+ # Use super wherever this method is redefined in your individual test classes
34
+ def teardown
35
+ Capybara.reset_sessions!
36
+ Capybara.use_default_driver
37
+ end
38
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ # https://github.com/DatabaseCleaner/database_cleaner
4
+ # https://medium.com/brief-stops/testing-with-rspec-factorygirl-faker-and-database-cleaner-651c71ca0688
5
+ # Flush the database during tests to keep test data from clustering or hitting other tests
6
+ require 'capybara/minitest'
7
+ require 'database_cleaner'
8
+
9
+ if defined?(DatabaseCleaner)
10
+ DatabaseCleaner.clean_with :truncation
11
+ DatabaseCleaner.strategy = :transaction
12
+
13
+ class ActionDispatch::IntegrationTest
14
+ include DatabaseCleanerSupport
15
+ end
16
+
17
+ class ActiveSupport::TestCase
18
+ include DatabaseCleanerSupport
19
+ end
20
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'database_cleaner'
4
+ # https://gist.github.com/lujanfernaud/67644f8ea4263f4e638be1090ec85580
5
+ module DatabaseCleanerSupport
6
+ def before_setup
7
+ super
8
+ DatabaseCleaner.start
9
+ end
10
+
11
+ def after_teardown
12
+ DatabaseCleaner.clean
13
+ super
14
+ end
15
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ # https://stackoverflow.com/questions/10937366/find-a-list-of-slow-rspec-tests
4
+ # https://makandracards.com/makandra/950-speed-up-rspec-by-deferring-garbage-collection
5
+ class DeferredGarbageCollection
6
+ DEFERRED_GC_THRESHOLD = (ENV['DEFER_GC'] || 10.0).to_f
7
+ @@last_gc_run = Time.now
8
+
9
+ def self.start
10
+ GC.disable if DEFERRED_GC_THRESHOLD.positive?
11
+ end
12
+
13
+ def self.reconsider
14
+ return unless DEFERRED_GC_THRESHOLD.positive? && Time.now - @@last_gc_run >= DEFERRED_GC_THRESHOLD
15
+
16
+ GC.enable
17
+ GC.start
18
+ GC.disable
19
+ @@last_gc_run = Time.now
20
+ end
21
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ if defined?(Devise)
4
+ ###
5
+ # For testing devise_cas
6
+ # https://github.com/nbudin/devise_cas_authenticatable/wiki/Testing
7
+ class ActionController::TestCase
8
+ # include Devise::TestHelpers
9
+ include Devise::Test::ControllerHelpers
10
+ end
11
+
12
+ class ActionDispatch::IntegrationTest
13
+ include Warden::Test::Helpers
14
+ Warden.test_mode!
15
+ end
16
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ class ActiveSupport::TestCase
4
+ # Include factoryboy for object creation
5
+ include FactoryBot::Syntax::Methods
6
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ if defined?(Formulaic)
4
+ class ActionDispatch::IntegrationTest
5
+ include Capybara::DSL
6
+ include Formulaic::Dsl
7
+ end
8
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'devise'
4
+
5
+ module DeviseHelpers
6
+ # Used for accessing the action as an admin/superuser (a member of devgroup)
7
+ def login_as_admin
8
+ user = FactoryBot.create(:user, role: 'superuser')
9
+ login_as(user)
10
+ end
11
+ # EXAMPLE: ----------------------------------------
12
+ # describe 'GET #index' do
13
+ # it 'returns http success' do
14
+ # login_as_admin
15
+ # get :index
16
+ # expect(response).to have_http_status(:success)
17
+ # end
18
+ # end
19
+
20
+ def login_as_staff
21
+ user = FactoryBot.create(:user, role: :staff)
22
+ login_as(user)
23
+ end
24
+
25
+ # Used for hitting the user as a generic user
26
+ def login_as_user
27
+ user = FactoryBot.create(:user)
28
+ login_as(user)
29
+ end
30
+ # EXAMPLE: ----------------------------------------
31
+ # describe 'GET #index' do
32
+ # it 'returns http success' do
33
+ # login_as_user
34
+ # get :index
35
+ # expect(response).to have_http_status(:success)
36
+ # end
37
+ # end
38
+
39
+ # Used for simulating a login as the specified user
40
+ def login_as(user)
41
+ user = FactoryBot.create(:user) if user.nil?
42
+ allow(controller).to receive(:authenticate_user!).and_return(true)
43
+ allow(controller).to receive(:current_user).and_return(user)
44
+ end
45
+ # EXAMPLE: ----------------------------------------
46
+ # This is also good to use if you need to add custom paramters to test against the user
47
+ # before do
48
+ # @user = FactoryBot.create(:user, superuser: false, position: 'Nurse', )
49
+ # end
50
+ # describe 'GET #index' do
51
+ # it 'returns http success' do
52
+ # login_as @user
53
+ # get :welcome
54
+ # expect(response).to have_http_status(:success)
55
+ # end
56
+ # end
57
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ # for enabling versioning to verify event captioning
4
+ if defined?(PaperTrail)
5
+ def with_versioning
6
+ was_enabled = PaperTrail.enabled?
7
+ was_enabled_for_request = PaperTrail.request.enabled?
8
+ PaperTrail.enabled = true
9
+ PaperTrail.request.enabled = true
10
+ begin
11
+ yield
12
+ ensure
13
+ PaperTrail.enabled = was_enabled
14
+ PaperTrail.request.enabled = was_enabled_for_request
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ # dsl matchers for controllers, models, and views
4
+ # Add shoulda test helpers: https://matchers.shoulda.io/
5
+ require 'shoulda'
6
+ Shoulda::Matchers.configure do |config|
7
+ config.integrate do |with|
8
+ with.test_framework :minitest
9
+ with.library :rails
10
+ end
11
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Used to generate a test coverage report
4
+ require 'simplecov'
5
+ SimpleCov.start do
6
+ # Excluded, because in order to test it. It would have to a set of login requests
7
+ add_filter 'app/controllers/users_controller.rb'
8
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ ENV['RAILS_ENV'] ||= 'test'
4
+ require_relative '../config/environment'
5
+ require 'rails/test_help'
6
+ require 'minitest/reporters'
7
+ Minitest::Reporters.use!
8
+
9
+ # load test engines and set their configurations
10
+ Dir[Rails.root.join('test/support/**/*.rb')].each { |f| require f }
11
+
12
+ class ActiveSupport::TestCase
13
+ # Run tests in parallel with specified workers
14
+ parallelize(workers: :number_of_processors)
15
+
16
+ # Add more helper methods to be used by all tests here...
17
+ end
@@ -0,0 +1,9 @@
1
+ [RSpec Rails Docs](https://relishapp.com/rspec/rspec-rails/docs)
2
+
3
+ [RSpec](https://rspec.info/)
4
+
5
+ [Better Specs](http://www.betterspecs.org/)
6
+
7
+ [rspec-best-practices](https://github.com/codica2/rspec-best-practices)
8
+
9
+ [Rails Testing with RSpec](https://blog.trk.in.rs/2015/11/09/rails-testing/)
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_helper'
4
+
5
+ RSpec.describe Admin::ApplicationController, type: :controller do
6
+ describe 'Require authentication' do
7
+ context 'when requesting /admin/*' do
8
+ it { is_expected.to use_before_action(:authenticate_user!) }
9
+ it { is_expected.to use_before_action(:ensure_admin!) }
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_helper'
4
+
5
+ RSpec.describe Admin::UsersController, type: :controller do
6
+ describe 'When user' do
7
+ before { login_as_user }
8
+
9
+ it 'GET index' do
10
+ get :index
11
+ expect(response).to be_redirect
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_helper'
4
+
5
+ RSpec.describe PagesController, type: :controller do
6
+ describe 'GET #welcome' do
7
+ subject { get :welcome }
8
+ it { expect(response).to have_http_status(:success) }
9
+ end
10
+ end
@@ -0,0 +1,15 @@
1
+ # RSpec and Capybara
2
+
3
+ [RSpec feature tests](https://relishapp.com/rspec/rspec-rails/docs/feature-specs/feature-spec)
4
+
5
+ [Capybara Cheatsheet](https://gist.github.com/zhengjia/428105)
6
+
7
+ [Integration Tests with Capybara](https://thoughtbot.com/blog/rspec-integration-tests-with-capybara)
8
+
9
+ [Writing unit tests as feature tests](https://bhserna.com/writing-unit-tests-as-feature-tests.html)
10
+
11
+ [Capybara](https://github.com/teamcapybara/capybara)
12
+
13
+ [RSpec/Capybara integration tests: the ultimate guide](https://www.codewithjason.com/rails-integration-tests-rspec-capybara/)
14
+
15
+ [Gitlab moving to headless chrome](https://about.gitlab.com/2017/12/19/moving-to-headless-chrome/)
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_helper'
4
+
5
+ feature 'Signup User' do
6
+ scenario 'with valid credentails' do
7
+ sign_up_user('test@test.com', 'Passw0rd!')
8
+
9
+ expect(page).to have_text('Welcome! You have signed up successfully.')
10
+ end
11
+
12
+ scenario 'with invalid credentials' do
13
+ sign_up_user('test@test.com', 'password')
14
+
15
+ expect(page).to have_text('Password must contain at least one digit')
16
+ end
17
+
18
+ def sign_up_user(email, password)
19
+ visit new_user_registration_path
20
+ fill_in 'user_email', with: email
21
+ fill_in 'user_password', with: password
22
+ fill_in 'user_password_confirmation', with: password
23
+ click_button 'Sign up'
24
+ end
25
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_helper'
4
+
5
+ RSpec.describe ApplicationHelper, type: :helper do
6
+
7
+ end
@@ -0,0 +1,15 @@
1
+ require 'rails_helper'
2
+
3
+ # Specs in this file have access to a helper object that includes
4
+ # the PagesHelper. For example:
5
+ #
6
+ # describe PagesHelper do
7
+ # describe "string concat" do
8
+ # it "concats two strings with spaces" do
9
+ # expect(helper.concat_strings("this","that")).to eq("this that")
10
+ # end
11
+ # end
12
+ # end
13
+ RSpec.describe PagesHelper, type: :helper do
14
+
15
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_helper'
4
+
5
+ RSpec.describe LoginActivity, type: :model do
6
+ describe 'associations do' do
7
+ context 'when users' do
8
+ it { is_expected.to belong_to(:user) }
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_helper'
4
+
5
+ RSpec.describe User, type: :model do
6
+ describe 'validations' do
7
+ context 'with email' do
8
+ it { is_expected.to validate_presence_of(:email) }
9
+ it { is_expected.to validate_length_of(:email).is_at_least(5).is_at_most(255) }
10
+ # it { is_expected.to validate_uniqueness_of(:email).case_insensitive }
11
+ end
12
+
13
+ context 'with roles' do
14
+ it { is_expected.to define_enum_for(:role).with(described_class.roles.keys) }
15
+ end
16
+
17
+ context 'with associations' do
18
+ it { is_expected.to have_many(:login_activities).order(created_at: :desc) }
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_helper'
4
+
5
+ RSpec.describe UserPolicy, type: :policy do
6
+ subject { described_class.new(member, user) }
7
+
8
+ let(:user) { FactoryBot.create(:user) }
9
+
10
+ context 'when user' do
11
+ let(:member) { FactoryBot.create(:user) }
12
+
13
+ it { is_expected.to forbid_actions(%i[index show destroy impersonate]) }
14
+ it { is_expected.to forbid_new_and_create_actions }
15
+ it { is_expected.to forbid_edit_and_update_actions }
16
+ end
17
+
18
+ context 'when staff' do
19
+ let(:member) { FactoryBot.create(:user, role: 'staff') }
20
+
21
+ it { is_expected.to forbid_actions(%i[index destroy impersonate]) }
22
+ it { is_expected.to permit_action(:show) }
23
+ it { is_expected.to forbid_new_and_create_actions }
24
+ it { is_expected.to permit_edit_and_update_actions }
25
+ end
26
+
27
+ context 'when superuser' do
28
+ let(:member) { FactoryBot.create(:user, role: 'superuser') }
29
+
30
+ it { is_expected.to permit_actions(%i[index show destroy impersonate]) }
31
+ it { is_expected.to forbid_new_and_create_actions }
32
+ it { is_expected.to permit_edit_and_update_actions }
33
+ end
34
+
35
+ permissions :update? do
36
+ let(:staff) { FactoryBot.create(:user, role: 'staff') }
37
+ let(:superuser) { FactoryBot.create(:user, role: 'superuser') }
38
+
39
+ context 'when user' do
40
+
41
+ describe 'when updating user' do
42
+ it { expect(described_class).to permit(staff, user) }
43
+ end
44
+
45
+ describe 'when updating superusers' do
46
+ it { expect(described_class).not_to permit(staff, superuser) }
47
+ end
48
+ end
49
+ end
50
+
51
+ permissions :show? do
52
+ let(:staff) { FactoryBot.create(:user, role: 'staff') }
53
+ let(:superuser) { FactoryBot.create(:user, role: 'superuser') }
54
+
55
+ it "staff can't view superuser" do
56
+ expect(described_class).not_to permit(staff, superuser)
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_helper'
4
+
5
+ RSpec.describe UserPolicy, type: :policy do
6
+ subject { described_class.new(member, user) }
7
+
8
+ let(:user) { FactoryBot.create(:user) }
9
+
10
+ context 'when user' do
11
+ let(:member) { FactoryBot.create(:user) }
12
+
13
+ it { is_expected.to forbid_actions(%i[index show destroy impersonate]) }
14
+ it { is_expected.to forbid_new_and_create_actions }
15
+ it { is_expected.to forbid_edit_and_update_actions }
16
+ end
17
+
18
+ context 'when staff' do
19
+ let(:member) { FactoryBot.create(:user, role: 'staff') }
20
+
21
+ it { is_expected.to forbid_actions(%i[index destroy impersonate]) }
22
+ it { is_expected.to permit_action(:show) }
23
+ it { is_expected.to forbid_new_and_create_actions }
24
+ it { is_expected.to permit_edit_and_update_actions }
25
+ end
26
+
27
+ context 'when superuser' do
28
+ let(:member) { FactoryBot.create(:user, role: 'superuser') }
29
+
30
+ it { is_expected.to permit_actions(%i[index show destroy impersonate]) }
31
+ it { is_expected.to forbid_new_and_create_actions }
32
+ it { is_expected.to permit_edit_and_update_actions }
33
+ end
34
+
35
+ permissions :update? do
36
+ let(:staff) { FactoryBot.create(:user, role: 'staff') }
37
+ let(:superuser) { FactoryBot.create(:user, role: 'superuser') }
38
+
39
+ it 'when staff and updating users' do
40
+ expect(described_class).to permit(staff, user)
41
+ end
42
+
43
+ it 'when staff and updating superusers' do
44
+ expect(described_class).not_to permit(staff, superuser)
45
+ end
46
+ end
47
+
48
+ permissions :show? do
49
+ let(:staff) { FactoryBot.create(:user, role: 'staff') }
50
+ let(:superuser) { FactoryBot.create(:user, role: 'superuser') }
51
+
52
+ it "staff can't view superuser" do
53
+ expect(described_class).not_to permit(staff, superuser)
54
+ end
55
+ end
56
+ end