rockstart 0.1.0 → 0.1.1

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