rockstart 0.1.0 → 0.1.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 (240) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +6 -0
  3. data/lib/generators/rockstart/authorization/USAGE +9 -0
  4. data/lib/generators/rockstart/authorization/auth0/USAGE +10 -0
  5. data/lib/generators/rockstart/authorization/auth0/auth0_generator.rb +49 -0
  6. data/lib/generators/rockstart/authorization/auth0/templates/app/controllers/auth_controller.rb.tt +47 -0
  7. data/lib/generators/rockstart/authorization/auth0/templates/app/controllers/concerns/session_auth.rb +23 -0
  8. data/lib/generators/rockstart/authorization/auth0/templates/app/models/user.rb.tt +82 -0
  9. data/lib/generators/rockstart/authorization/auth0/templates/app/views/auth/new.html.erb +3 -0
  10. data/lib/generators/rockstart/authorization/auth0/templates/app/views/auth/sign_out.html.erb +1 -0
  11. data/lib/generators/rockstart/authorization/auth0/templates/auth0.en.yml +5 -0
  12. data/lib/generators/rockstart/authorization/auth0/templates/auth0_initializer.rb +27 -0
  13. data/lib/generators/rockstart/authorization/auth0/templates/auth0_util.rb.tt +38 -0
  14. data/lib/generators/rockstart/authorization/auth0/templates/auth0_util_spec.rb +21 -0
  15. data/lib/generators/rockstart/authorization/auth0/templates/spec/factories/users.rb.tt +32 -0
  16. data/lib/generators/rockstart/authorization/auth0/templates/spec/models/user_spec.rb.tt +91 -0
  17. data/lib/generators/rockstart/authorization/auth0/templates/spec/requests/auth_spec.rb +94 -0
  18. data/lib/generators/rockstart/authorization/auth0/templates/spec/support/auth_request_helper.rb +27 -0
  19. data/lib/generators/rockstart/authorization/authorization_generator.rb +29 -0
  20. data/lib/generators/rockstart/{devise → authorization/devise}/USAGE +3 -1
  21. data/lib/generators/rockstart/authorization/devise/devise_generator.rb +208 -0
  22. data/lib/generators/rockstart/authorization/devise/templates/add_devise_to_users_migration.rb.tt +50 -0
  23. data/lib/generators/rockstart/{devise → authorization/devise}/templates/controllers/passwords_controller.rb +0 -0
  24. data/lib/generators/rockstart/{devise → authorization/devise}/templates/controllers/registrations_controller.rb +0 -0
  25. data/lib/generators/rockstart/{devise → authorization/devise}/templates/controllers/sessions_controller.rb +0 -0
  26. data/lib/generators/rockstart/{devise → authorization/devise}/templates/create_user_migration.rb.tt +0 -0
  27. data/lib/generators/rockstart/{devise → authorization/devise}/templates/models/user.rb +14 -2
  28. data/lib/generators/rockstart/{devise → authorization/devise}/templates/spec/factories/users.rb +0 -0
  29. data/lib/generators/rockstart/{devise → authorization/devise}/templates/spec/models/user_spec.rb +9 -21
  30. data/lib/generators/rockstart/{devise → authorization/devise}/templates/spec/requests/users/passwords_spec.rb +0 -0
  31. data/lib/generators/rockstart/{devise → authorization/devise}/templates/spec/requests/users/registrations_spec.rb +2 -11
  32. data/lib/generators/rockstart/{devise → authorization/devise}/templates/spec/requests/users/sessions_spec.rb +1 -38
  33. data/lib/generators/rockstart/{devise → authorization/devise}/templates/spec/support/devise_request_spec_helper.rb +0 -0
  34. data/lib/generators/rockstart/{devise → authorization/devise}/templates/translations.en.yml +0 -0
  35. data/lib/generators/rockstart/{pundit → authorization/pundit}/USAGE +1 -1
  36. data/lib/generators/rockstart/authorization/pundit/pundit_generator.rb +41 -0
  37. data/lib/generators/rockstart/{pundit → authorization/pundit}/templates/app/controllers/concerns/pundit_error_handling.rb +0 -0
  38. data/lib/generators/rockstart/{pundit → authorization/pundit}/templates/app/policies/application_policy.rb +0 -0
  39. data/lib/generators/rockstart/{pundit/templates/app/policies/user_policy.rb → authorization/pundit/templates/app/policies/user_policy.rb.tt} +4 -0
  40. data/lib/generators/rockstart/{pundit → authorization/pundit}/templates/config/locales/pundit.en.yml +0 -0
  41. data/lib/generators/rockstart/authorization/pundit/templates/lib/admin_constraint.rb +11 -0
  42. data/lib/generators/rockstart/{pundit/templates/lib/templates/pundit/policy/policy.rb → authorization/pundit/templates/scaffold/policy.rb.tt} +0 -0
  43. data/lib/generators/rockstart/{pundit/templates/lib/templates/rspec/policy/policy_spec.rb → authorization/pundit/templates/scaffold/policy_spec.rb.tt} +0 -0
  44. data/lib/generators/rockstart/{pundit/templates/spec/policies/user_policy_spec.rb → authorization/pundit/templates/spec/policies/user_policy_spec.rb.tt} +43 -5
  45. data/lib/generators/rockstart/{pundit → authorization/pundit}/templates/spec/support/pundit_matchers.rb +0 -0
  46. data/lib/generators/rockstart/deployment/USAGE +8 -0
  47. data/lib/generators/rockstart/deployment/deployment_generator.rb +78 -0
  48. data/lib/generators/rockstart/{docker → deployment/docker}/USAGE +0 -0
  49. data/lib/generators/rockstart/deployment/docker/docker_generator.rb +70 -0
  50. data/lib/generators/rockstart/{docker → deployment/docker}/templates/app/Dockerfile-app +6 -5
  51. data/lib/generators/rockstart/{docker → deployment/docker}/templates/docker-compose.test.yml +5 -2
  52. data/lib/generators/rockstart/deployment/docker/templates/docker-compose.yml +74 -0
  53. data/lib/generators/rockstart/{docker → deployment/docker}/templates/dockerignore +0 -0
  54. data/lib/generators/rockstart/deployment/docker/templates/dotenv.docker-db.tt +3 -0
  55. data/lib/generators/rockstart/deployment/docker/templates/dotenv.docker.tt +20 -0
  56. data/lib/generators/rockstart/{docker → deployment/docker}/templates/web/Dockerfile-web +0 -0
  57. data/lib/generators/rockstart/{docker → deployment/docker}/templates/web/nginx.conf +24 -1
  58. data/lib/generators/rockstart/deployment/heroku/USAGE +9 -0
  59. data/lib/generators/rockstart/deployment/heroku/heroku_generator.rb +50 -0
  60. data/lib/generators/rockstart/deployment/heroku/templates/Procfile.tt +5 -0
  61. data/lib/generators/rockstart/deployment/heroku/templates/app.json.tt +50 -0
  62. data/lib/generators/rockstart/deployment/heroku/templates/deploy-heroku.tt +42 -0
  63. data/lib/generators/rockstart/deployment/heroku/templates/heroku.rake.tt +25 -0
  64. data/lib/generators/rockstart/deployment/heroku/templates/slugignore +3 -0
  65. data/lib/generators/rockstart/deployment/nginx/USAGE +8 -0
  66. data/lib/generators/rockstart/deployment/nginx/nginx_generator.rb +20 -0
  67. data/lib/generators/rockstart/deployment/templates/hooks-postdeploy.tt +22 -0
  68. data/lib/generators/rockstart/deployment/templates/hooks-release.tt +17 -0
  69. data/lib/generators/rockstart/deployment/templates/rack_deflater_spec.rb +28 -0
  70. data/lib/generators/rockstart/deployment/templates/web.tt +3 -0
  71. data/lib/generators/rockstart/deployment/templates/worker.tt +3 -0
  72. data/lib/generators/rockstart/development/USAGE +10 -0
  73. data/lib/generators/rockstart/development/audited/USAGE +10 -0
  74. data/lib/generators/rockstart/development/audited/audited_generator.rb +35 -0
  75. data/lib/generators/rockstart/development/audited/templates/audit.rb.tt +35 -0
  76. data/lib/generators/rockstart/development/audited/templates/audit_spec.rb.tt +54 -0
  77. data/lib/generators/rockstart/development/audited/templates/audited_initializer.rb +5 -0
  78. data/lib/generators/rockstart/development/audited/templates/audited_support.rb +3 -0
  79. data/lib/generators/rockstart/development/audited/templates/install_audited.rb.tt +45 -0
  80. data/lib/generators/rockstart/development/development_generator.rb +42 -0
  81. data/lib/generators/rockstart/development/env/USAGE +8 -0
  82. data/lib/generators/rockstart/development/env/env_generator.rb +17 -0
  83. data/lib/generators/rockstart/development/env/templates/dotenv.development.tt +4 -0
  84. data/lib/generators/rockstart/development/friendly_id/USAGE +8 -0
  85. data/lib/generators/rockstart/development/friendly_id/friendly_id_generator.rb +15 -0
  86. data/lib/generators/rockstart/development/friendly_id/templates/friendly_id_initializer.rb +52 -0
  87. data/lib/generators/rockstart/development/generator_overrides/USAGE +8 -0
  88. data/lib/generators/rockstart/development/generator_overrides/generator_overrides_generator.rb +31 -0
  89. data/lib/generators/rockstart/development/generator_overrides/templates/resource_route_generator.rb.tt +54 -0
  90. data/lib/generators/rockstart/development/localhost_setup/USAGE +8 -0
  91. data/lib/generators/rockstart/development/localhost_setup/localhost_setup_generator.rb +34 -0
  92. data/lib/generators/rockstart/{docker → development/localhost_setup}/templates/localhost_domains.ext.tt +0 -0
  93. data/lib/generators/rockstart/{docker → development/localhost_setup}/templates/setup-localhost.tt +5 -5
  94. data/lib/generators/rockstart/development/readme/USAGE +8 -0
  95. data/lib/generators/rockstart/development/readme/readme_generator.rb +18 -0
  96. data/lib/generators/rockstart/development/readme/templates/README.md +74 -0
  97. data/lib/generators/rockstart/development/rebuild/USAGE +8 -0
  98. data/lib/generators/rockstart/development/rebuild/rebuild_generator.rb +21 -0
  99. data/lib/generators/rockstart/development/rebuild/templates/rockstart.tt +28 -0
  100. data/lib/generators/rockstart/{scaffold_templates → development/scaffolds}/USAGE +1 -1
  101. data/lib/generators/rockstart/development/scaffolds/scaffolds_generator.rb +46 -0
  102. data/lib/generators/rockstart/{scaffold_templates → development/scaffolds}/templates/api_controller.rb.tt +15 -7
  103. data/lib/generators/rockstart/{scaffold_templates → development/scaffolds}/templates/controller.rb.tt +18 -9
  104. data/lib/generators/rockstart/development/scaffolds/templates/factory_bot/factories.erb +8 -0
  105. data/lib/generators/rockstart/development/scaffolds/templates/model.rb.tt +61 -0
  106. data/lib/generators/rockstart/development/scaffolds/templates/rspec/api_request_spec.rb.tt +142 -0
  107. data/lib/generators/rockstart/development/scaffolds/templates/rspec/model_spec.rb.tt +35 -0
  108. data/lib/generators/rockstart/development/scaffolds/templates/rspec/request_spec.rb.tt +492 -0
  109. data/lib/generators/rockstart/frontend_app/USAGE +10 -0
  110. data/lib/generators/rockstart/frontend_app/application_urls/USAGE +8 -0
  111. data/lib/generators/rockstart/frontend_app/application_urls/application_urls_generator.rb +28 -0
  112. data/lib/generators/rockstart/{frontend_helpers → frontend_app/application_urls}/templates/application_urls.rb +0 -0
  113. data/lib/generators/rockstart/{frontend_helpers → frontend_app/application_urls}/templates/application_urls_helper.rb +0 -0
  114. data/lib/generators/rockstart/frontend_app/assets/USAGE +8 -0
  115. data/lib/generators/rockstart/frontend_app/assets/assets_generator.rb +11 -0
  116. data/lib/generators/rockstart/frontend_app/assets/templates/assets.rake +22 -0
  117. data/lib/generators/rockstart/frontend_app/frontend_app_generator.rb +38 -0
  118. data/lib/generators/rockstart/frontend_app/simple_form/USAGE +8 -0
  119. data/lib/generators/rockstart/frontend_app/simple_form/simple_form_generator.rb +9 -0
  120. data/lib/generators/rockstart/frontend_app/titles/USAGE +8 -0
  121. data/lib/generators/rockstart/{frontend_helpers → frontend_app/titles}/templates/titles.en.yml.tt +0 -0
  122. data/lib/generators/rockstart/frontend_app/titles/titles_generator.rb +22 -0
  123. data/lib/generators/rockstart/gemset/USAGE +8 -0
  124. data/lib/generators/rockstart/gemset/gemset_generator.rb +129 -0
  125. data/lib/generators/rockstart/mailers/USAGE +8 -0
  126. data/lib/generators/rockstart/mailers/mailers_generator.rb +7 -0
  127. data/lib/generators/rockstart/{smtp_mailer → mailers/smtp_mailer}/USAGE +0 -0
  128. data/lib/generators/rockstart/mailers/smtp_mailer/smtp_mailer_generator.rb +36 -0
  129. data/lib/generators/rockstart/{smtp_mailer/templates/config/initializers/action_mailer.rb → mailers/smtp_mailer/templates/action_mailer_initializer.rb} +0 -0
  130. data/lib/generators/rockstart/monitoring/USAGE +8 -0
  131. data/lib/generators/rockstart/{logging → monitoring/lograge}/USAGE +1 -1
  132. data/lib/generators/rockstart/monitoring/lograge/lograge_generator.rb +19 -0
  133. data/lib/generators/rockstart/monitoring/lograge/templates/lograge_initializer.rb +44 -0
  134. data/lib/generators/rockstart/monitoring/lograge/templates/lograge_util.rb +42 -0
  135. data/lib/generators/rockstart/monitoring/monitoring_generator.rb +35 -0
  136. data/lib/generators/rockstart/monitoring/okcomputer/USAGE +8 -0
  137. data/lib/generators/rockstart/monitoring/okcomputer/okcomputer_generator.rb +28 -0
  138. data/lib/generators/rockstart/monitoring/okcomputer/templates/okcomputer.en.yml +5 -0
  139. data/lib/generators/rockstart/monitoring/okcomputer/templates/okcomputer_initializer.rb.tt +34 -0
  140. data/lib/generators/rockstart/monitoring/okcomputer/templates/okcomputer_spec.rb +62 -0
  141. data/lib/generators/rockstart/monitoring/rollbar/USAGE +8 -0
  142. data/lib/generators/rockstart/monitoring/rollbar/rollbar_generator.rb +20 -0
  143. data/lib/generators/rockstart/monitoring/rollbar/templates/rollbar_initializer.rb.tt +80 -0
  144. data/lib/generators/rockstart/monitoring/sidekiq_ui/USAGE +8 -0
  145. data/lib/generators/rockstart/monitoring/sidekiq_ui/sidekiq_ui_generator.rb +38 -0
  146. data/lib/generators/rockstart/monitoring/sidekiq_ui/templates/sidekiq_spec.rb +32 -0
  147. data/lib/generators/rockstart/quality/quality_generator.rb +5 -16
  148. data/lib/generators/rockstart/quality/rubocop/USAGE +11 -0
  149. data/lib/generators/rockstart/quality/rubocop/rubocop_generator.rb +23 -0
  150. data/lib/generators/rockstart/quality/rubocop/templates/rubocop.rake +19 -0
  151. data/lib/generators/rockstart/quality/{templates → rubocop/templates}/rubocop.yml +0 -0
  152. data/lib/generators/rockstart/rockstart_generator.rb +13 -65
  153. data/lib/generators/rockstart/run/USAGE +17 -0
  154. data/lib/generators/rockstart/run/run_generator.rb +73 -0
  155. data/lib/generators/rockstart/security/brakeman/USAGE +9 -0
  156. data/lib/generators/rockstart/security/brakeman/brakeman_generator.rb +15 -0
  157. data/lib/generators/rockstart/security/{templates → brakeman/templates}/brakeman.rake +1 -1
  158. data/lib/generators/rockstart/security/bundler_audit/USAGE +8 -0
  159. data/lib/generators/rockstart/security/bundler_audit/bundler_audit_generator.rb +11 -0
  160. data/lib/generators/rockstart/security/bundler_audit/templates/bundler_audit.rake +14 -0
  161. data/lib/generators/rockstart/security/content_security/USAGE +8 -0
  162. data/lib/generators/rockstart/security/content_security/content_security_generator.rb +41 -0
  163. data/lib/generators/rockstart/security/{templates → content_security/templates}/content_security_policy_initializer.rb.tt +2 -2
  164. data/lib/generators/rockstart/security/{templates → content_security/templates}/content_security_spec.rb.tt +12 -13
  165. data/lib/generators/rockstart/security/{templates/csp_violations_controller.rb → content_security/templates/csp_violations_controller.rb.tt} +14 -6
  166. data/lib/generators/rockstart/security/{templates → content_security/templates}/session_store_initializer.rb.tt +1 -2
  167. data/lib/generators/rockstart/security/rack_attack/USAGE +8 -0
  168. data/lib/generators/rockstart/security/rack_attack/rack_attack_generator.rb +37 -0
  169. data/lib/generators/rockstart/security/{templates → rack_attack/templates}/cache_support.rb +1 -1
  170. data/lib/generators/rockstart/security/{templates/rack_attack.rb → rack_attack/templates/rack_attack_initializer.rb.tt} +34 -1
  171. data/lib/generators/rockstart/security/rack_attack/templates/rack_attack_spec.rb.tt +116 -0
  172. data/lib/generators/rockstart/security/security_generator.rb +20 -84
  173. data/lib/generators/rockstart/storage/USAGE +8 -0
  174. data/lib/generators/rockstart/storage/active_storage/USAGE +8 -0
  175. data/lib/generators/rockstart/storage/active_storage/active_storage_generator.rb +59 -0
  176. data/lib/generators/rockstart/storage/active_storage/templates/active_storage_initializer.rb +9 -0
  177. data/lib/generators/rockstart/storage/active_storage/templates/better_s3_service.rb +27 -0
  178. data/lib/generators/rockstart/storage/active_storage/templates/cloudcube_util.rb +30 -0
  179. data/lib/generators/rockstart/storage/active_storage/templates/cloudcube_util_spec.rb +73 -0
  180. data/lib/generators/rockstart/storage/active_storage/templates/storage.yml.tt +15 -0
  181. data/lib/generators/rockstart/storage/memcached/USAGE +8 -0
  182. data/lib/generators/rockstart/storage/memcached/memcached_generator.rb +27 -0
  183. data/lib/generators/rockstart/{postgres → storage/postgres}/USAGE +1 -1
  184. data/lib/generators/rockstart/storage/postgres/postgres_generator.rb +20 -0
  185. data/lib/generators/rockstart/{postgres → storage/postgres}/templates/config/database.yml.tt +6 -0
  186. data/lib/generators/rockstart/{postgres → storage/postgres}/templates/migration.rb.tt +0 -0
  187. data/lib/generators/rockstart/storage/storage_generator.rb +26 -0
  188. data/lib/generators/rockstart/testing/USAGE +9 -0
  189. data/lib/generators/rockstart/testing/env/USAGE +8 -0
  190. data/lib/generators/rockstart/testing/env/env_generator.rb +24 -0
  191. data/lib/generators/rockstart/testing/env/templates/climate_control_helpers_support.rb +14 -0
  192. data/lib/generators/rockstart/testing/env/templates/dotenv.test.tt +8 -0
  193. data/lib/generators/rockstart/{rspec → testing/rspec}/USAGE +1 -1
  194. data/lib/generators/rockstart/testing/rspec/rspec_generator.rb +52 -0
  195. data/lib/generators/rockstart/{rspec → testing/rspec}/templates/support/factory_bot.rb +0 -0
  196. data/lib/generators/rockstart/{rspec → testing/rspec}/templates/support/shoulda_matchers.rb +0 -0
  197. data/lib/generators/rockstart/{rspec → testing/rspec}/templates/support/test_helpers.rb +0 -0
  198. data/lib/generators/rockstart/testing/rspec/templates/support/vcr.rb +11 -0
  199. data/lib/generators/rockstart/testing/simplecov/USAGE +9 -0
  200. data/lib/generators/rockstart/testing/simplecov/simplecov_generator.rb +11 -0
  201. data/lib/generators/rockstart/testing/testing_generator.rb +24 -0
  202. data/lib/generators/rockstart/workers/USAGE +8 -0
  203. data/lib/generators/rockstart/workers/sidekiq/USAGE +9 -0
  204. data/lib/generators/rockstart/workers/sidekiq/sidekiq_generator.rb +29 -0
  205. data/lib/generators/rockstart/workers/sidekiq/templates/sidekiq.yml.tt +5 -0
  206. data/lib/generators/rockstart/workers/sidekiq/templates/sidekiq_initializer.rb +5 -0
  207. data/lib/generators/rockstart/workers/workers_generator.rb +18 -0
  208. data/lib/rockstart/base_generator.rb +4 -5
  209. data/lib/rockstart/env.rb +3 -1
  210. data/lib/rockstart/generators/class_option_helpers.rb +154 -0
  211. data/lib/rockstart/generators/content_security_options.rb +61 -0
  212. data/lib/rockstart/generators/migration_helpers.rb +30 -0
  213. data/lib/rockstart/generators/system_helpers.rb +14 -0
  214. data/lib/rockstart/generators/template_helpers.rb +27 -0
  215. data/lib/rockstart/version.rb +1 -1
  216. metadata +212 -83
  217. data/lib/generators/rockstart/devise/devise_generator.rb +0 -258
  218. data/lib/generators/rockstart/docker/docker_generator.rb +0 -86
  219. data/lib/generators/rockstart/docker/templates/docker-compose.yml +0 -47
  220. data/lib/generators/rockstart/docker/templates/dotenv.docker.tt +0 -4
  221. data/lib/generators/rockstart/frontend_helpers/USAGE +0 -8
  222. data/lib/generators/rockstart/frontend_helpers/frontend_helpers_generator.rb +0 -65
  223. data/lib/generators/rockstart/logging/logging_generator.rb +0 -12
  224. data/lib/generators/rockstart/logging/templates/rockstart/lograge_initializer.rb +0 -50
  225. data/lib/generators/rockstart/postgres/postgres_generator.rb +0 -32
  226. data/lib/generators/rockstart/pundit/pundit_generator.rb +0 -32
  227. data/lib/generators/rockstart/quality/templates/rubocop.rake +0 -4
  228. data/lib/generators/rockstart/rspec/rspec_generator.rb +0 -70
  229. data/lib/generators/rockstart/rspec/templates/dotenv.development +0 -1
  230. data/lib/generators/rockstart/rspec/templates/dotenv.test +0 -1
  231. data/lib/generators/rockstart/rspec/templates/rspec_templates/model/model_spec.rb +0 -13
  232. data/lib/generators/rockstart/scaffold_templates/scaffold_templates_generator.rb +0 -39
  233. data/lib/generators/rockstart/scaffold_templates/templates/rspec/scaffold/api_request_spec.rb +0 -139
  234. data/lib/generators/rockstart/scaffold_templates/templates/rspec/scaffold/request_spec.rb +0 -408
  235. data/lib/generators/rockstart/security/templates/bundler_audit.rake +0 -4
  236. data/lib/generators/rockstart/smtp_mailer/smtp_mailer_generator.rb +0 -30
  237. data/lib/generators/rockstart/tailwindcss/USAGE +0 -8
  238. data/lib/generators/rockstart/tailwindcss/tailwindcss_generator.rb +0 -30
  239. data/lib/generators/rockstart/tailwindcss/templates/application.css +0 -3
  240. data/lib/generators/rockstart/tailwindcss/templates/postcss.config.js +0 -32
@@ -0,0 +1,61 @@
1
+ <% module_namespacing do -%>
2
+ class <%= class_name %> < <%= parent_class_name.classify %>
3
+ <% if attributes_names.any? { |name| name == "position" } -%>
4
+ # Use acts_as_list to maintain position of the <%= class_name %>
5
+ acts_as_list column: :position, top_of_list: 0 #, scope: :parent
6
+
7
+ <% end -%>
8
+ # Allow Pagination of <%= class_name %> collections
9
+ paginates_per 25
10
+
11
+ # Log changes made to the <%= class_name %>
12
+ audited only: %i[<%= attributes_names.join(" ") %>]
13
+
14
+ # Generate human-readable tokens as params (friendly_id)
15
+ <%-
16
+ # Generate scaffold with name or title, and a `slug:uniq` field to enable friendly_id
17
+ identifier_attribute_names = attributes_names.filter { |name| %w(name title).include?(name) }
18
+ friendly_id_attribute = identifier_attribute_names.first
19
+ if friendly_id_attribute && attributes_names.any? { |name| name == "slug" }
20
+ -%>
21
+ extend FriendlyId
22
+ friendly_id :<%= friendly_id_attribute %>
23
+ <% else -%>
24
+ # extend FriendlyId
25
+ # friendly_id :<%= friendly_id_attribute || "name" %>
26
+ <% end -%>
27
+
28
+ <%- identifier_attribute_names.each do |attribute_name| -%>
29
+ validates :<%= attribute_name %>, presence: true
30
+ <% end -%>
31
+ <% attributes.select(&:reference?).each do |attribute| -%>
32
+ belongs_to :<%= attribute.name %><%= ', polymorphic: true' if attribute.polymorphic? %>
33
+ <% end -%>
34
+ <% attributes.select(&:reference?).each do |attribute| -%>
35
+ belongs_to :<%= attribute.name %><%= ', polymorphic: true' if attribute.polymorphic? %>
36
+ <% end -%>
37
+ <% attributes.select(&:rich_text?).each do |attribute| -%>
38
+ has_rich_text :<%= attribute.name %>
39
+ <% end -%>
40
+ <% attributes.select(&:attachment?).each do |attribute| -%>
41
+ has_one_attached :<%= attribute.name %>
42
+ <% end -%>
43
+ <% attributes.select(&:attachments?).each do |attribute| -%>
44
+ has_many_attached :<%= attribute.name %>
45
+ <% end -%>
46
+ <% attributes.select(&:token?).each do |attribute| -%>
47
+ has_secure_token<% if attribute.name != "token" %> :<%= attribute.name %><% end %>
48
+ <% end -%>
49
+ <% if attributes.any?(&:password_digest?) -%>
50
+ has_secure_password
51
+ <% end -%>
52
+
53
+ def to_s
54
+ <% if friendly_id_attribute -%>
55
+ <%= friendly_id_attribute %>_was # Use original <%= friendly_id_attribute %> for display labels
56
+ <% else -%>
57
+ "<%= class_name %>" # TODO: Provide a display label
58
+ <% end -%>
59
+ end
60
+ end
61
+ <% end -%>
@@ -0,0 +1,142 @@
1
+ <%%-
2
+ resource_path = name.underscore.pluralize
3
+ permitted_attributes = attributes.reject { |a| a.name == "slug" }
4
+ permitted_params = permitted_attributes.map { |a| ":#{a.name}" }.join(", ")
5
+ -%>
6
+ # frozen_string_literal: true
7
+
8
+ require "rails_helper"
9
+
10
+ <%% module_namespacing do -%>
11
+ RSpec.describe "/<%%= controller_class_name %>", <%%= type_metatag(:request) %> do
12
+ # This should return the minimal set of values that should be in the headers
13
+ # in order to pass any filters (e.g. authentication) defined in
14
+ # <%%= controller_class_name %>Controller, or in your router and rack
15
+ # middleware. Be sure to keep this updated too.
16
+ let(:valid_headers) do
17
+ {}
18
+ end
19
+
20
+ <%% unless options[:singleton] -%>
21
+ describe "GET /<%%= resource_path %>" do
22
+ it "renders a successful response" do
23
+ create(:<%%= file_name %>)
24
+ get <%%= index_helper %>_url, headers: valid_headers, as: :json
25
+ expect(response).to be_successful
26
+ end
27
+ end
28
+ <%% end -%>
29
+
30
+ describe "GET /<%%= resource_path %>/:id" do
31
+ it "renders a successful response" do
32
+ <%%= file_name %> = create(:<%%= file_name %>)
33
+ get <%%= show_helper.tr('@', '') %>, as: :json
34
+ expect(response).to be_successful
35
+ end
36
+ end
37
+
38
+ describe "POST /<%%= resource_path %>" do
39
+ context "with valid parameters" do
40
+ let(:valid_attributes) do
41
+ <%%- if permitted_attributes.any? -%>
42
+ attributes_for(:<%%= ns_file_name %>).slice(<%%= permitted_params %>)
43
+ <%%- else -%>
44
+ skip("Add a hash of attributes valid for your model")
45
+ <%%- end -%>
46
+ end
47
+
48
+ it "creates a new <%%= class_name %>" do
49
+ expect do
50
+ post <%%= index_helper %>_url,
51
+ params: { <%%= ns_file_name %>: valid_attributes }, headers: valid_headers, as: :json
52
+ end.to change(<%%= class_name %>, :count).by(1)
53
+ end
54
+
55
+ it "renders a JSON response with the new <%%= ns_file_name %>" do
56
+ post <%%= index_helper %>_url,
57
+ params: { <%%= ns_file_name %>: valid_attributes }, headers: valid_headers, as: :json
58
+ expect(response).to have_http_status(:created)
59
+ expect(response.content_type).to match(a_string_including("application/json"))
60
+ end
61
+ end
62
+
63
+ context "with invalid parameters" do
64
+ let(:invalid_attributes) do
65
+ skip("Add a hash of attributes invalid for your model")
66
+ end
67
+
68
+ it "does not create a new <%%= class_name %>" do
69
+ expect do
70
+ post <%%= index_helper %>_url,
71
+ params: { <%%= ns_file_name %>: invalid_attributes }, as: :json
72
+ end.to change(<%%= class_name %>, :count).by(0)
73
+ end
74
+
75
+ it "renders a JSON response with errors for the new <%%= ns_file_name %>" do
76
+ post <%%= index_helper %>_url,
77
+ params: { <%%= ns_file_name %>: invalid_attributes }, headers: valid_headers, as: :json
78
+ expect(response).to have_http_status(:unprocessable_entity)
79
+ expect(response.content_type).to eq("application/json")
80
+ end
81
+ end
82
+ end
83
+
84
+ describe "PATCH /<%%= resource_path %>/:id" do
85
+ context "with valid parameters" do
86
+ let(:new_attributes) do
87
+ <%%- if permitted_attributes.any? -%>
88
+ attributes_for(:<%%= ns_file_name %>).slice(<%%= permitted_params %>)
89
+ <%%- else -%>
90
+ skip("Add a hash of attributes valid for your model")
91
+ <%%- end -%>
92
+ end
93
+
94
+ it "updates the requested <%%= ns_file_name %>" do
95
+ <%%= file_name %> = create(:<%%= file_name %>)
96
+ patch <%%= show_helper.tr('@', '') %>,
97
+ params: { <%%= singular_table_name %>: invalid_attributes }, headers: valid_headers, as: :json
98
+
99
+ <%%= file_name %>.reload
100
+ <%%- if permitted_attributes.any? -%>
101
+ <%%- permitted_attributes.each do |attribute| -%>
102
+ expect(<%%= file_name %>.<%%= attribute.name %>).to eq(new_attributes[:<%%= attribute.name %>])
103
+ <%%- end -%>
104
+ <%%- else -%>
105
+ skip("Add assertions for updated state")
106
+ <%%- end -%>
107
+ end
108
+
109
+ it "renders a JSON response with the <%%= ns_file_name %>" do
110
+ <%%= file_name %> = create(:<%%= file_name %>)
111
+ patch <%%= show_helper.tr('@', '') %>,
112
+ params: { <%%= singular_table_name %>: invalid_attributes }, headers: valid_headers, as: :json
113
+ expect(response).to have_http_status(:ok)
114
+ expect(response.content_type).to eq("application/json")
115
+ end
116
+ end
117
+
118
+ context "with invalid parameters" do
119
+ let(:invalid_attributes) do
120
+ skip("Add a hash of attributes invalid for your model")
121
+ end
122
+
123
+ it "renders a JSON response with errors for the <%%= ns_file_name %>" do
124
+ <%%= file_name %> = create(:<%%= file_name %>)
125
+ patch <%%= show_helper.tr('@', '') %>,
126
+ params: { <%%= singular_table_name %>: invalid_attributes }, headers: valid_headers, as: :json
127
+ expect(response).to have_http_status(:unprocessable_entity)
128
+ expect(response.content_type).to eq("application/json")
129
+ end
130
+ end
131
+ end
132
+
133
+ describe "DELETE /<%%= resource_path %>/:id" do
134
+ it "destroys the requested <%%= ns_file_name %>" do
135
+ <%%= file_name %> = create(:<%%= file_name %>)
136
+ expect do
137
+ delete <%%= show_helper.tr('@', '') %>, headers: valid_headers, as: :json
138
+ end.to change(<%%= class_name %>, :count).by(-1)
139
+ end
140
+ end
141
+ end
142
+ <%% end -%>
@@ -0,0 +1,35 @@
1
+ require "rails_helper"
2
+
3
+ <% module_namespacing do -%>
4
+ RSpec.describe <%= class_name %>, <%= type_metatag(:model) %> do
5
+ <%-
6
+ # Generate scaffold with name or title, and a `slug:uniq` field to enable friendly_id
7
+ friendly_id_attribute = attributes_names.detect { |name| %w(name title).include?(name) }
8
+ using_friendly_id = friendly_id_attribute && attributes_names.any? { |name| %w(slug).include?(name) }
9
+ -%>
10
+ <%- for attribute in attributes -%>
11
+ # <%= attribute.name %>:<%= attribute.type %>
12
+ it { is_expected.to have_db_column(:<%= attribute.name %>) }
13
+ <%- if %w(email name title).include?(attribute.name) -%>
14
+ it { is_expected.to validate_presence_of(:<%= attribute.name %>) }
15
+ <%- end -%>
16
+ <%- end -%>
17
+
18
+ describe "audited" do
19
+ it { should be_audited.only(%i[<%= attributes_names.join(" ") %>]) }
20
+ <% attributes.select(&:reference?).each do |attribute| -%>
21
+ # it { should be_audited.associated_with(:<%= attribute.name %>) }
22
+ <% end -%>
23
+ end
24
+ <% if using_friendly_id -%>
25
+
26
+ describe "friendly_id" do
27
+ it "generates a slug from <%= friendly_id_attribute %>" do
28
+ <%= file_name %> = <%= class_name %>.new <%= friendly_id_attribute %>: "Example Slug"
29
+ <%= file_name %>.send(:set_slug) # callback method used by friendly_id
30
+ expect(<%= file_name %>.slug).to eq "example-slug"
31
+ end
32
+ end
33
+ <%- end -%>
34
+ end
35
+ <% end -%>
@@ -0,0 +1,492 @@
1
+ <%%-
2
+ resource_path = name.underscore.pluralize
3
+ permitted_attributes = attributes.reject { |a| a.name == "slug" }
4
+ permitted_params = permitted_attributes.map { |a| ":#{a.name}" }.join(", ")
5
+ -%>
6
+ # frozen_string_literal: true
7
+
8
+ require "rails_helper"
9
+
10
+ <%% module_namespacing do -%>
11
+ RSpec.describe "<%%= controller_class_name %>", <%%= type_metatag(:request) %> do
12
+ <%% unless options[:singleton] -%>
13
+ describe "GET /<%%= resource_path %>" do
14
+ context "with an authenticated admin" do
15
+ let(:authenticated_admin) { create(:user, :admin) }
16
+
17
+ before do
18
+ sign_in(authenticated_admin)
19
+ end
20
+
21
+ it "renders a successful response" do
22
+ <%%= file_name %> = create(:<%%= file_name %>)
23
+ get <%%= index_helper %>_url
24
+ expect(response).to be_successful
25
+ expect(response.body).to have_link(href: <%%= show_helper.tr('@', '').sub(/_url/, '_path') %>)
26
+ end
27
+ end
28
+
29
+ context "with an authenticated user" do
30
+ let(:authenticated_user) { create(:user) }
31
+
32
+ before do
33
+ sign_in(authenticated_user)
34
+ end
35
+
36
+ it "renders a successful response" do
37
+ create(:<%%= file_name %>)
38
+ get <%%= index_helper %>_url
39
+ expect(response).to be_successful
40
+ end
41
+ end
42
+
43
+ context "with an unauthorized user" do
44
+ let(:unauthorized_user) do
45
+ skip("Provide a user where <%%= class_name %>Policy.index? is not granted")
46
+ end
47
+
48
+ before do
49
+ sign_in(unauthorized_user)
50
+ end
51
+
52
+ it "forbids access" do
53
+ create(:<%%= file_name %>)
54
+ get <%%= index_helper %>_url
55
+ expect(response).to redirect_to(url_for_user_dashboard)
56
+
57
+ follow_redirect!
58
+ expect(response.body).to have_selector(".alert-error", text: t("pundit.example_policy.index?", default: t("pundit.default")))
59
+ end
60
+ end
61
+
62
+ it "does not allow access to guests" do
63
+ create(:<%%= file_name %>)
64
+ get <%%= index_helper %>_url
65
+ expect(response).to redirect_to(url_for_authentication)
66
+ end
67
+ end
68
+
69
+ describe "GET /<%%= resource_path %>/page/:page" do
70
+ context "with an authenticated admin" do
71
+ let(:authenticated_admin) { create(:user, :admin) }
72
+
73
+ before do
74
+ sign_in(authenticated_admin)
75
+ end
76
+
77
+ it "renders a successful response", :aggregate_failures do
78
+ <%%= file_name %> = create(:<%%= file_name %>)
79
+ get <%%= index_helper %>_url(page: 1)
80
+ expect(response).to be_successful
81
+ expect(response.body).to have_link(href: <%%= show_helper.tr('@', '').sub(/_url/, '_path') %>)
82
+
83
+ # Second Page
84
+ get <%%= index_helper %>_url(page: 2)
85
+ expect(response).to be_successful
86
+ expect(response.body).not_to have_link(href: <%%= show_helper.tr('@', '').sub(/_url/, '_path') %>)
87
+ end
88
+ end
89
+ end
90
+ <%% end -%>
91
+
92
+ describe "GET /<%%= resource_path %>/:id" do
93
+ context "with an authenticated admin" do
94
+ let(:authenticated_admin) { create(:user, :admin) }
95
+
96
+ before do
97
+ sign_in(authenticated_admin)
98
+ end
99
+
100
+ it "renders a successful response" do
101
+ <%%= file_name %> = create(:<%%= file_name %>)
102
+ get <%%= show_helper.tr('@', '') %>
103
+ expect(response).to be_successful
104
+ end
105
+ end
106
+
107
+ context "with an authenticated user" do
108
+ let(:authenticated_user) { create(:user) }
109
+
110
+ before do
111
+ sign_in(authenticated_user)
112
+ end
113
+
114
+ it "renders a successful response" do
115
+ <%%= file_name %> = create(:<%%= file_name %>)
116
+ get <%%= show_helper.tr('@', '') %>
117
+ expect(response).to be_successful
118
+ end
119
+ end
120
+
121
+ context "with an unauthorized user" do
122
+ let(:unauthorized_user) do
123
+ skip("Provide a user where <%%= class_name %>Policy.show? is not granted")
124
+ end
125
+
126
+ before do
127
+ sign_in(unauthorized_user)
128
+ end
129
+
130
+ it "forbids access" do
131
+ <%%= file_name %> = create(:<%%= file_name %>)
132
+ get <%%= show_helper.tr('@', '') %>
133
+ expect(response).to redirect_to(<%%= index_helper %>_url)
134
+
135
+ follow_redirect!
136
+ expect(response.body).to have_selector(".alert-error", text: t("pundit.example_policy.show?", default: t("pundit.default")))
137
+ end
138
+ end
139
+
140
+ it "does not allow access to guests" do
141
+ <%%= file_name %> = create(:<%%= file_name %>)
142
+ get <%%= show_helper.tr('@', '') %>
143
+ expect(response).to redirect_to(url_for_authentication)
144
+ end
145
+ end
146
+
147
+ describe "GET /<%%= resource_path %>/new" do
148
+ context "with an authenticated admin" do
149
+ let(:authenticated_admin) { create(:user, :admin) }
150
+
151
+ before do
152
+ sign_in(authenticated_admin)
153
+ end
154
+
155
+ it "renders a successful response" do
156
+ get <%%= new_helper %>
157
+ expect(response).to be_successful
158
+ end
159
+ end
160
+
161
+ context "with an authenticated user" do
162
+ let(:authenticated_user) { create(:user) }
163
+
164
+ before do
165
+ sign_in(authenticated_user)
166
+ end
167
+
168
+ it "forbids access" do
169
+ get <%%= new_helper %>
170
+ expect(response).to redirect_to(<%%= index_helper %>_url)
171
+
172
+ follow_redirect!
173
+ expect(response.body).to have_selector(".alert-error", text: t("pundit.example_policy.new?", default: t("pundit.default")))
174
+ end
175
+ end
176
+
177
+ it "does not allow access to guests" do
178
+ get <%%= new_helper %>
179
+ expect(response).to redirect_to(url_for_authentication)
180
+ end
181
+ end
182
+
183
+ describe "GET /<%%= resource_path %>/:id/edit" do
184
+ context "with an authenticated admin" do
185
+ let(:authenticated_admin) { create(:user, :admin) }
186
+
187
+ before do
188
+ sign_in(authenticated_admin)
189
+ end
190
+
191
+ it "render a successful response" do
192
+ <%%= file_name %> = create(:<%%= file_name %>)
193
+ get <%%= edit_helper.tr('@','') %>
194
+ expect(response).to be_successful
195
+ end
196
+ end
197
+
198
+ context "with an authenticated user" do
199
+ let(:authenticated_user) { create(:user) }
200
+
201
+ before do
202
+ sign_in(authenticated_user)
203
+ end
204
+
205
+ it "forbids access" do
206
+ <%%= file_name %> = create(:<%%= file_name %>)
207
+ get <%%= edit_helper.tr('@','') %>
208
+ expect(response).to redirect_to(<%%= show_helper.tr('@', '') %>)
209
+
210
+ follow_redirect!
211
+ expect(response.body).to have_selector(".alert-error", text: t("pundit.example_policy.edit?", default: t("pundit.default")))
212
+ end
213
+ end
214
+
215
+ it "does not allow access to guests" do
216
+ <%%= file_name %> = create(:<%%= file_name %>)
217
+ get <%%= edit_helper.tr('@','') %>
218
+ expect(response).to redirect_to(url_for_authentication)
219
+ end
220
+ end
221
+
222
+ describe "POST /<%%= resource_path %>" do
223
+ context "with valid parameters" do
224
+ let(:valid_attributes) do
225
+ <%%- if permitted_attributes.any? -%>
226
+ attributes_for(:<%%= ns_file_name %>).slice(<%%= permitted_params %>)
227
+ <%%- else -%>
228
+ skip("Add a hash of attributes valid for your model")
229
+ <%%- end -%>
230
+ end
231
+
232
+ context "with an authenticated admin" do
233
+ let(:authenticated_admin) { create(:user, :admin) }
234
+
235
+ before do
236
+ sign_in(authenticated_admin)
237
+ end
238
+
239
+ it "creates a new <%%= class_name %>" do
240
+ expect do
241
+ post <%%= index_helper %>_url, params: { <%%= ns_file_name %>: valid_attributes }
242
+ end.to change(<%%= class_name %>, :count).by(1)
243
+
244
+ <%%= file_name %> = <%%= class_name %>.last
245
+ <%%- if permitted_attributes.any? -%>
246
+ <%%- permitted_attributes.each do |attribute| -%>
247
+ expect(<%%= file_name %>.<%%= attribute.name %>).to eq(valid_attributes[:<%%= attribute.name %>])
248
+ <%%- end -%>
249
+ <%%- else -%>
250
+ skip("Add assertions for created state")
251
+ <%%- end -%>
252
+ end
253
+
254
+ it "audits the change", :aggregate_failures do
255
+ expect do
256
+ post <%%= index_helper %>_url, params: { <%%= ns_file_name %>: valid_attributes }
257
+ end.to change(Audit, :count).by(1)
258
+
259
+ <%%= file_name %> = <%%= class_name %>.last!
260
+
261
+ audit = <%%= file_name %>.audits.last
262
+ expect(audit.action).to eq "create"
263
+ expect(audit.associated).to be_nil
264
+ <% if auth0? -%>
265
+ expect(audit.user_uid).to eq authenticated_admin.id
266
+ <% else -%>
267
+ expect(audit.user).to eq authenticated_admin
268
+ <% end -%>
269
+ expect(audit.remote_address).not_to eq request.remote_ip # Anonymized
270
+ expect(audit.request_uuid).to eq request.request_id
271
+ end
272
+
273
+ it "redirects to the created <%%= ns_file_name %>" do
274
+ post <%%= index_helper %>_url, params: { <%%= ns_file_name %>: valid_attributes }
275
+ expect(response).to redirect_to(<%%= show_helper.gsub("\@#{file_name}", class_name+".last") %>)
276
+ end
277
+ end
278
+
279
+ context "with an authenticated user" do
280
+ let(:authenticated_user) { create(:user) }
281
+
282
+ before do
283
+ sign_in(authenticated_user)
284
+ end
285
+
286
+ it "forbids access" do
287
+ post <%%= index_helper %>_url, params: { <%%= ns_file_name %>: valid_attributes }
288
+ expect(response).to redirect_to(<%%= index_helper %>_url)
289
+
290
+ follow_redirect!
291
+ expect(response.body).to have_selector(".alert-error", text: t("pundit.example_policy.create?", default: t("pundit.default")))
292
+ end
293
+ end
294
+
295
+ it "does not allow access to guests" do
296
+ post <%%= index_helper %>_url, params: { <%%= ns_file_name %>: valid_attributes }
297
+ expect(response).to redirect_to(url_for_authentication)
298
+ end
299
+ end
300
+
301
+ context "with invalid parameters" do
302
+ let(:authenticated_admin) { create(:user, :admin) }
303
+
304
+ let(:invalid_attributes) do
305
+ skip("Add a hash of attributes invalid for your model")
306
+ end
307
+
308
+ before do
309
+ sign_in(authenticated_admin)
310
+ end
311
+
312
+ it "does not create a new <%%= class_name %>" do
313
+ expect do
314
+ post <%%= index_helper %>_url, params: { <%%= ns_file_name %>: invalid_attributes }
315
+ end.to change(<%%= class_name %>, :count).by(0)
316
+ end
317
+
318
+ it "renders a successful response (i.e. to display the 'new' template)" do
319
+ post <%%= index_helper %>_url, params: { <%%= ns_file_name %>: invalid_attributes }
320
+ expect(response).to be_successful
321
+ end
322
+ end
323
+ end
324
+
325
+ describe "PATCH /<%%= resource_path %>/:id" do
326
+ context "with valid parameters" do
327
+ let(:new_attributes) do
328
+ <%%- if permitted_attributes.any? -%>
329
+ attributes_for(:<%%= ns_file_name %>).slice(<%%= permitted_params %>)
330
+ <%%- else -%>
331
+ skip("Add a hash of attributes valid for your model")
332
+ <%%- end -%>
333
+ end
334
+
335
+ context "with an authenticated admin" do
336
+ let(:authenticated_admin) { create(:user, :admin) }
337
+
338
+ before do
339
+ sign_in(authenticated_admin)
340
+ end
341
+
342
+ it "updates the requested <%%= ns_file_name %>" do
343
+ <%%= file_name %> = create(:<%%= file_name %>)
344
+ patch <%%= show_helper.tr('@', '') %>, params: { <%%= singular_table_name %>: new_attributes }
345
+
346
+ <%%= file_name %>.reload
347
+ <%%- if permitted_attributes.any? -%>
348
+ <%%- permitted_attributes.each do |attribute| -%>
349
+ expect(<%%= file_name %>.<%%= attribute.name %>).to eq(new_attributes[:<%%= attribute.name %>])
350
+ <%%- end -%>
351
+ <%%- else -%>
352
+ skip("Add assertions for updated state")
353
+ <%%- end -%>
354
+ end
355
+
356
+ it "audits the change", :aggregate_failures do
357
+ <%%= file_name %> = create(:<%%= file_name %>)
358
+
359
+ expect do
360
+ patch <%%= show_helper.tr('@', '') %>, params: { <%%= singular_table_name %>: new_attributes }
361
+ end.to change(Audit, :count).by(1)
362
+
363
+ audit = <%%= file_name %>.audits.last!
364
+ expect(audit.action).to eq "update"
365
+ expect(audit.associated).to be_nil
366
+ <% if auth0? -%>
367
+ expect(audit.user_uid).to eq authenticated_admin.id
368
+ <% else -%>
369
+ expect(audit.user).to eq authenticated_admin
370
+ <% end -%>
371
+ expect(audit.remote_address).not_to eq request.remote_ip # Anonymized
372
+ expect(audit.request_uuid).to eq request.request_id
373
+ end
374
+
375
+ it "redirects to the <%%= ns_file_name %>" do
376
+ <%%= file_name %> = create(:<%%= file_name %>)
377
+ patch <%%= show_helper.tr('@', '') %>, params: { <%%= singular_table_name %>: new_attributes }
378
+ <%%= file_name %>.reload
379
+ expect(response).to redirect_to(<%%= singular_table_name %>_url(<%%= file_name %>))
380
+ end
381
+ end
382
+
383
+ context "with an authenticated user" do
384
+ let(:authenticated_user) { create(:user) }
385
+
386
+ before do
387
+ sign_in(authenticated_user)
388
+ end
389
+
390
+ it "forbids access" do
391
+ <%%= file_name %> = create(:<%%= file_name %>)
392
+ patch <%%= show_helper.tr('@', '') %>, params: { <%%= singular_table_name %>: new_attributes }
393
+ expect(response).to redirect_to(<%%= show_helper.tr('@', '') %>)
394
+
395
+ follow_redirect!
396
+ expect(response.body).to have_selector(".alert-error", text: t("pundit.example_policy.update?", default: t("pundit.default")))
397
+ end
398
+ end
399
+
400
+ it "does not allow access to guests" do
401
+ <%%= file_name %> = create(:<%%= file_name %>)
402
+ patch <%%= show_helper.tr('@', '') %>, params: { <%%= singular_table_name %>: new_attributes }
403
+ expect(response).to redirect_to(url_for_authentication)
404
+ end
405
+ end
406
+
407
+ context "with invalid parameters" do
408
+ let(:authenticated_admin) { create(:user, :admin) }
409
+
410
+ let(:invalid_attributes) do
411
+ skip("Add a hash of attributes invalid for your model")
412
+ end
413
+
414
+ before do
415
+ sign_in(authenticated_admin)
416
+ end
417
+
418
+ it "renders a successful response (i.e. to display the 'edit' template)" do
419
+ <%%= file_name %> = create(:<%%= file_name %>)
420
+ patch <%%= show_helper.tr('@', '') %>, params: { <%%= singular_table_name %>: invalid_attributes }
421
+ expect(response).to be_successful
422
+ end
423
+ end
424
+ end
425
+
426
+ describe "DELETE /<%%= resource_path %>/:id" do
427
+ context "with an authenticated admin" do
428
+ let(:authenticated_admin) { create(:user, :admin) }
429
+
430
+ before do
431
+ sign_in(authenticated_admin)
432
+ end
433
+
434
+ it "destroys the requested <%%= ns_file_name %>" do
435
+ <%%= file_name %> = create(:<%%= file_name %>)
436
+ expect do
437
+ delete <%%= show_helper.tr('@', '') %>
438
+ end.to change(<%%= class_name %>, :count).by(-1)
439
+ end
440
+
441
+ it "audits the change", :aggregate_failures do
442
+ <%%= file_name %> = create(:<%%= file_name %>)
443
+
444
+ expect do
445
+ delete <%%= show_helper.tr('@', '') %>
446
+ end.to change(Audit, :count).by(1)
447
+
448
+ audit = Audit.last!
449
+ expect(audit.action).to eq "destroy"
450
+ expect(audit.auditable_id).to eq <%%= file_name %>.id
451
+ expect(audit.associated).to be_nil
452
+ <% if auth0? -%>
453
+ expect(audit.user_uid).to eq authenticated_admin.id
454
+ <% else -%>
455
+ expect(audit.user).to eq authenticated_admin
456
+ <% end -%>
457
+ expect(audit.remote_address).not_to eq request.remote_ip # Anonymized
458
+ expect(audit.request_uuid).to eq request.request_id
459
+ end
460
+
461
+ it "redirects to the <%%= table_name %> list" do
462
+ <%%= file_name %> = create(:<%%= file_name %>)
463
+ delete <%%= show_helper.tr('@', '') %>
464
+ expect(response).to redirect_to(<%%= index_helper %>_url)
465
+ end
466
+ end
467
+
468
+ context "with an authenticated user" do
469
+ let(:authenticated_user) { create(:user) }
470
+
471
+ before do
472
+ sign_in(authenticated_user)
473
+ end
474
+
475
+ it "forbids access" do
476
+ <%%= file_name %> = create(:<%%= file_name %>)
477
+ delete <%%= show_helper.tr('@', '') %>
478
+ expect(response).to redirect_to(<%%= show_helper.tr('@', '') %>)
479
+
480
+ follow_redirect!
481
+ expect(response.body).to have_selector(".alert-error", text: t("pundit.example_policy.destroy?", default: t("pundit.default")))
482
+ end
483
+ end
484
+
485
+ it "does not allow access to guests" do
486
+ <%%= file_name %> = create(:<%%= file_name %>)
487
+ delete <%%= show_helper.tr('@', '') %>
488
+ expect(response).to redirect_to(url_for_authentication)
489
+ end
490
+ end
491
+ end
492
+ <%% end -%>