kowl 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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