From 55d6b787c82ca1c2a153b9919704c34887e04076 Mon Sep 17 00:00:00 2001 From: Paul Chavard Date: Wed, 20 Apr 2022 14:17:40 +0200 Subject: [PATCH 1/6] feat(js): add turbo --- Gemfile | 1 + Gemfile.lock | 3 +++ app/javascript/packs/application.js | 2 ++ package.json | 1 + yarn.lock | 18 ++++++++++++++++++ 5 files changed, 25 insertions(+) diff --git a/Gemfile b/Gemfile index 4d6db2cab..417367210 100644 --- a/Gemfile +++ b/Gemfile @@ -84,6 +84,7 @@ gem 'sib-api-v3-sdk' gem 'skylight' gem 'spreadsheet_architect' gem 'strong_migrations' # lint database migrations +gem 'turbo-rails' gem 'typhoeus' gem 'warden' gem 'webpacker' diff --git a/Gemfile.lock b/Gemfile.lock index ae2bd915b..b3fb8c66d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -723,6 +723,8 @@ GEM timecop (0.9.4) timeout (0.1.1) ttfunk (1.7.0) + turbo-rails (0.8.3) + rails (>= 6.0.0) typhoeus (1.4.0) ethon (>= 0.9.0) tzinfo (2.0.4) @@ -899,6 +901,7 @@ DEPENDENCIES spring-commands-rspec strong_migrations timecop + turbo-rails typhoeus vcr warden diff --git a/app/javascript/packs/application.js b/app/javascript/packs/application.js index 89b5c3e7a..cedb6d332 100644 --- a/app/javascript/packs/application.js +++ b/app/javascript/packs/application.js @@ -3,6 +3,7 @@ import Rails from '@rails/ujs'; import * as ActiveStorage from '@rails/activestorage'; import 'whatwg-fetch'; // window.fetch polyfill import { Application } from '@hotwired/stimulus'; +import { Turbo } from '@hotwired/turbo-rails'; import '../shared/page-update-event'; import '../shared/activestorage/ujs'; @@ -89,6 +90,7 @@ const DS = { // Start Rails helpers Rails.start(); ActiveStorage.start(); +Turbo.session.drive = false; const Stimulus = Application.start(); Stimulus.register('react', ReactController); diff --git a/package.json b/package.json index 1b064f9d4..8d68f6920 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,7 @@ "@headlessui/react": "^1.5.0", "@heroicons/react": "^1.0.6", "@hotwired/stimulus": "^3.0.1", + "@hotwired/turbo-rails": "^7.1.1", "@mapbox/mapbox-gl-draw": "^1.3.0", "@popperjs/core": "^2.11.4", "@rails/actiontext": "^6.1.4-1", diff --git a/yarn.lock b/yarn.lock index f47219e4c..bec7b1041 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1274,6 +1274,19 @@ resolved "https://registry.yarnpkg.com/@hotwired/stimulus/-/stimulus-3.0.1.tgz#141f15645acaa3b133b7c247cad58ae252ffae85" integrity sha512-oHsJhgY2cip+K2ED7vKUNd2P+BEswVhrCYcJ802DSsblJFv7mPFVk3cQKvm2vHgHeDVdnj7oOKrBbzp1u8D+KA== +"@hotwired/turbo-rails@^7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@hotwired/turbo-rails/-/turbo-rails-7.1.1.tgz#35c03b92b5c86f0137ed08bef843d955ec9bbe83" + integrity sha512-ZXpxUjCfkdbuXfoGrsFK80qsVzACs8xCfie9rt2jMTSN6o1olXVA0Nrk8u02yNEwSiVJm/4QSOa8cUcMj6VQjg== + dependencies: + "@hotwired/turbo" "^7.1.0" + "@rails/actioncable" "^7.0" + +"@hotwired/turbo@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@hotwired/turbo/-/turbo-7.1.0.tgz#27e44e0e3dc5bd1d4bda0766d579cf5a14091cd7" + integrity sha512-Q8kGjqwPqER+CtpQudbH+3Zgs2X4zb6pBAlr6NsKTXadg45pAOvxI9i4QpuHbwSzR2+x87HUm+rot9F/Pe8rxA== + "@humanwhocodes/config-array@^0.5.0": version "0.5.0" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" @@ -1949,6 +1962,11 @@ resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.4.tgz#d8c7b8db9226d2d7664553a0741ad7d0397ee503" integrity sha512-q/ytXxO5NKvyT37pmisQAItCFqA7FD/vNb8dgaJy3/630Fsc+Mz9/9f2SziBoIZ30TJooXyTwZmhi1zjXmObYg== +"@rails/actioncable@^7.0": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@rails/actioncable/-/actioncable-7.0.2.tgz#69a6d999f4087e0537dd38fe0963db1f4305d650" + integrity sha512-G26maXW1Kx0LxQdmNNuNjQlRO/QlXNr3QfuwKiOKb5FZQGYe2OwtHTGXBAjSoiu4dW36XYMT/+L1Wo1Yov4ZXA== + "@rails/actiontext@^6.1.4-1": version "6.1.4" resolved "https://registry.yarnpkg.com/@rails/actiontext/-/actiontext-6.1.4.tgz#ed8c7d2b68d66205301f4538ce65d04c48031f6b" From 4624fa141fd32645dfab1293fea3076744a4ce95 Mon Sep 17 00:00:00 2001 From: Paul Chavard Date: Tue, 19 Apr 2022 09:39:24 +0200 Subject: [PATCH 2/6] fix(turbo): use a safer render method --- app/models/concerns/mail_template_concern.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/concerns/mail_template_concern.rb b/app/models/concerns/mail_template_concern.rb index d4368957e..d1e1f2d10 100644 --- a/app/models/concerns/mail_template_concern.rb +++ b/app/models/concerns/mail_template_concern.rb @@ -33,7 +33,7 @@ module MailTemplateConcern module ClassMethods def default_for_procedure(procedure) template_name = default_template_name_for_procedure(procedure) - rich_body = ActionController::Base.new.render_to_string(template: template_name) + rich_body = ActionController::Base.render template: template_name trix_rich_body = rich_body.gsub(/(?)\n/, '') new(subject: const_get(:DEFAULT_SUBJECT), rich_body: trix_rich_body, procedure: procedure) end From 69d5713c1913889a80e97f22eacf36a794a57d49 Mon Sep 17 00:00:00 2001 From: Paul Chavard Date: Tue, 19 Apr 2022 18:51:03 +0200 Subject: [PATCH 3/6] fix(turbo): fix anonymous controller RSpec test https://github.com/hotwired/hotwire-rails/issues/42 --- spec/controllers/concerns/devise_populated_resource_spec.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/spec/controllers/concerns/devise_populated_resource_spec.rb b/spec/controllers/concerns/devise_populated_resource_spec.rb index 32c01f8ac..3050f8324 100644 --- a/spec/controllers/concerns/devise_populated_resource_spec.rb +++ b/spec/controllers/concerns/devise_populated_resource_spec.rb @@ -1,6 +1,7 @@ describe DevisePopulatedResource, type: :controller do controller(Devise::PasswordsController) do include DevisePopulatedResource + layout false end let(:user) { create(:user) } From 0bd71ad51a35f8f8c26282acd659d5df1269bf21 Mon Sep 17 00:00:00 2001 From: Paul Chavard Date: Thu, 14 Apr 2022 20:46:28 +0200 Subject: [PATCH 4/6] feat(turbo): add turbo event helpers --- app/assets/stylesheets/custom_reset.scss | 4 + app/helpers/turbo_stream_helper.rb | 35 +++++++ .../controllers/turbo_event_controller.ts | 91 +++++++++++++++++++ app/javascript/packs/application.js | 2 + app/views/layouts/_turbo_event.html.haml | 5 + app/views/layouts/application.html.haml | 2 + .../layouts/application.turbo_stream.haml | 6 ++ package.json | 3 +- yarn.lock | 5 + 9 files changed, 152 insertions(+), 1 deletion(-) create mode 100644 app/helpers/turbo_stream_helper.rb create mode 100644 app/javascript/controllers/turbo_event_controller.ts create mode 100644 app/views/layouts/_turbo_event.html.haml create mode 100644 app/views/layouts/application.turbo_stream.haml diff --git a/app/assets/stylesheets/custom_reset.scss b/app/assets/stylesheets/custom_reset.scss index b59355b03..e3486d5c1 100644 --- a/app/assets/stylesheets/custom_reset.scss +++ b/app/assets/stylesheets/custom_reset.scss @@ -22,3 +22,7 @@ a { text-decoration: none; } + +turbo-events { + display: none; +} diff --git a/app/helpers/turbo_stream_helper.rb b/app/helpers/turbo_stream_helper.rb new file mode 100644 index 000000000..40699c66e --- /dev/null +++ b/app/helpers/turbo_stream_helper.rb @@ -0,0 +1,35 @@ +module TurboStreamHelper + def turbo_stream + TagBuilder.new(self) + end + + class TagBuilder < Turbo::Streams::TagBuilder + def dispatch(type, detail) + append_all('turbo-events', partial: 'layouts/turbo_event', locals: { type: type, detail: detail }) + end + + def show(target, delay: nil) + dispatch('dom:mutation', { action: :show, target: target, delay: delay }.compact) + end + + def show_all(targets, delay: nil) + dispatch('dom:mutation', { action: :show, targets: targets, delay: delay }.compact) + end + + def hide(target, delay: nil) + dispatch('dom:mutation', { action: :hide, target: target, delay: delay }.compact) + end + + def hide_all(targets, delay: nil) + dispatch('dom:mutation', { action: :hide, targets: targets, delay: delay }.compact) + end + + def focus(target) + dispatch('dom:mutation', { action: :focus, target: target }) + end + + def focus_all(targets) + dispatch('dom:mutation', { action: :focus, targets: targets }) + end + end +end diff --git a/app/javascript/controllers/turbo_event_controller.ts b/app/javascript/controllers/turbo_event_controller.ts new file mode 100644 index 000000000..8f959e5a7 --- /dev/null +++ b/app/javascript/controllers/turbo_event_controller.ts @@ -0,0 +1,91 @@ +import { Controller } from '@hotwired/stimulus'; +import invariant from 'tiny-invariant'; +import { z } from 'zod'; + +type Detail = Record; + +export class TurboEventController extends Controller { + static values = { + type: String, + detail: Object + }; + + declare readonly typeValue: string; + declare readonly detailValue: Detail; + + connect(): void { + this.globalDispatch(this.typeValue, this.detailValue); + this.element.remove(); + } + + private globalDispatch(type: string, detail: Detail): void { + this.dispatch(type, { + detail, + prefix: '', + target: document.documentElement + }); + } +} + +const MutationAction = z.enum(['show', 'hide', 'focus']); +type MutationAction = z.infer; +const Mutation = z.union([ + z.object({ + action: MutationAction, + delay: z.number().optional(), + target: z.string() + }), + z.object({ + action: MutationAction, + delay: z.number().optional(), + targets: z.string() + }) +]); +type Mutation = z.infer; + +addEventListener('dom:mutation', (event) => { + const detail = (event as CustomEvent).detail; + const mutation = Mutation.parse(detail); + mutate(mutation); +}); + +const Mutations: Record void> = { + hide: (mutation) => { + for (const element of findElements(mutation)) { + element.classList.add('hidden'); + } + }, + show: (mutation) => { + for (const element of findElements(mutation)) { + element.classList.remove('hidden'); + } + }, + focus: (mutation) => { + for (const element of findElements(mutation)) { + element.focus(); + } + } +}; + +function mutate(mutation: Mutation) { + const fn = Mutations[mutation.action]; + invariant(fn, `Could not find mutation ${mutation.action}`); + if (mutation.delay) { + setTimeout(() => fn(mutation), mutation.delay); + } else { + fn(mutation); + } +} + +function findElements( + mutation: Mutation +): Element[] { + if ('target' in mutation) { + const element = document.querySelector(`#${mutation.target}`); + invariant(element, `Could not find element with id ${mutation.target}`); + return [element]; + } else if ('targets' in mutation) { + return [...document.querySelectorAll(mutation.targets)]; + } + invariant(false, 'Could not find element'); +} diff --git a/app/javascript/packs/application.js b/app/javascript/packs/application.js index cedb6d332..79a11009e 100644 --- a/app/javascript/packs/application.js +++ b/app/javascript/packs/application.js @@ -18,6 +18,7 @@ import { ReactController, registerComponents } from '../controllers/react_controller'; +import { TurboEventController } from '../controllers/turbo_event_controller'; import '../new_design/dropdown'; import '../new_design/form-validation'; @@ -94,6 +95,7 @@ Turbo.session.drive = false; const Stimulus = Application.start(); Stimulus.register('react', ReactController); +Stimulus.register('turbo-event', TurboEventController); // Expose globals window.DS = window.DS || DS; diff --git a/app/views/layouts/_turbo_event.html.haml b/app/views/layouts/_turbo_event.html.haml new file mode 100644 index 000000000..e7ddff930 --- /dev/null +++ b/app/views/layouts/_turbo_event.html.haml @@ -0,0 +1,5 @@ +%turbo-event{ data: { + controller: 'turbo-event', + turbo_event_type_value: type, + turbo_event_detail_value: detail.to_json +} } diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index 52f4934b4..ed9d71b76 100644 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -41,3 +41,5 @@ = content_for(:footer) = yield :charts_js + + %turbo-events diff --git a/app/views/layouts/application.turbo_stream.haml b/app/views/layouts/application.turbo_stream.haml new file mode 100644 index 000000000..343964e1f --- /dev/null +++ b/app/views/layouts/application.turbo_stream.haml @@ -0,0 +1,6 @@ +- if flash.any? + = turbo_stream.replace 'flash_messages', partial: 'layouts/flash_messages' + = turbo_stream.hide 'flash_messages', delay: 10000 + - flash.clear + += yield diff --git a/package.json b/package.json index 8d68f6920..7bef976e0 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,8 @@ "use-debounce": "^5.2.0", "webpack": "^4.46.0", "webpack-cli": "^3.3.12", - "whatwg-fetch": "^3.0.0" + "whatwg-fetch": "^3.0.0", + "zod": "^3.14.4" }, "devDependencies": { "@2fd/graphdoc": "^2.4.0", diff --git a/yarn.lock b/yarn.lock index bec7b1041..adbc387fe 100644 --- a/yarn.lock +++ b/yarn.lock @@ -14032,3 +14032,8 @@ zip-stream@^4.1.0: archiver-utils "^2.1.0" compress-commons "^4.1.0" readable-stream "^3.6.0" + +zod@^3.14.4: + version "3.14.4" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.14.4.tgz#e678fe9e5469f4663165a5c35c8f3dc66334a5d6" + integrity sha512-U9BFLb2GO34Sfo9IUYp0w3wJLlmcyGoMd75qU9yf+DrdGA4kEx6e+l9KOkAlyUO0PSQzZCa3TR4qVlcmwqSDuw== From 8d0383c6f89353feeac174e05659780559547e6e Mon Sep 17 00:00:00 2001 From: Paul Chavard Date: Tue, 19 Apr 2022 12:27:38 +0200 Subject: [PATCH 5/6] refactor(turbo): use turbo in root controller --- app/controllers/root_controller.rb | 2 +- app/views/layouts/_outdated_browser_banner.html.haml | 2 +- app/views/root/dismiss_outdated_browser.turbo_stream.haml | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 app/views/root/dismiss_outdated_browser.turbo_stream.haml diff --git a/app/controllers/root_controller.rb b/app/controllers/root_controller.rb index 8a35c774c..0e1335ef3 100644 --- a/app/controllers/root_controller.rb +++ b/app/controllers/root_controller.rb @@ -84,7 +84,7 @@ class RootController < ApplicationController respond_to do |format| format.html { redirect_back(fallback_location: root_path) } - format.js { render js: helpers.remove_element('#outdated-browser-banner') } + format.turbo_stream end end diff --git a/app/views/layouts/_outdated_browser_banner.html.haml b/app/views/layouts/_outdated_browser_banner.html.haml index 5efc631c2..e1ad0350a 100644 --- a/app/views/layouts/_outdated_browser_banner.html.haml +++ b/app/views/layouts/_outdated_browser_banner.html.haml @@ -16,6 +16,6 @@ %br Certaines parties du site ne fonctionneront pas correctement. .site-banner-actions - = button_to 'Ignorer', dismiss_outdated_browser_path, method: :post, remote: true, class: 'button btn', title: 'Ne plus afficher cet avertissement pendant une semaine' + = button_to 'Ignorer', dismiss_outdated_browser_path, method: :post, form: { data: { turbo: true } }, class: 'button btn', title: 'Ne plus afficher cet avertissement pendant une semaine' %a.btn.button.primary{ href: "https://browser-update.org/fr/update.html", target: "_blank", rel: "noopener" } Mettre à jour mon navigateur diff --git a/app/views/root/dismiss_outdated_browser.turbo_stream.haml b/app/views/root/dismiss_outdated_browser.turbo_stream.haml new file mode 100644 index 000000000..e95546cc5 --- /dev/null +++ b/app/views/root/dismiss_outdated_browser.turbo_stream.haml @@ -0,0 +1 @@ += turbo_stream.remove('outdated-browser-banner') From cad63391dbb27b988f40dd6d2fe42012098facde Mon Sep 17 00:00:00 2001 From: Paul Chavard Date: Tue, 19 Apr 2022 12:28:29 +0200 Subject: [PATCH 6/6] refactor(turbo): use turbo in procedure administrateurs controller --- .../_add_admin_form.html.haml | 4 ++-- .../_administrateur.html.haml | 10 +++++----- .../procedure_administrateurs/create.js.haml | 9 --------- .../create.turbo_stream.haml | 3 +++ .../procedure_administrateurs/destroy.js.haml | 4 ---- .../destroy.turbo_stream.haml | 2 ++ .../procedure_administrateurs/index.html.haml | 4 ++-- .../procedure_administrateurs_controller_spec.rb | 11 ++++++----- 8 files changed, 20 insertions(+), 27 deletions(-) delete mode 100644 app/views/administrateurs/procedure_administrateurs/create.js.haml create mode 100644 app/views/administrateurs/procedure_administrateurs/create.turbo_stream.haml delete mode 100644 app/views/administrateurs/procedure_administrateurs/destroy.js.haml create mode 100644 app/views/administrateurs/procedure_administrateurs/destroy.turbo_stream.haml diff --git a/app/views/administrateurs/procedure_administrateurs/_add_admin_form.html.haml b/app/views/administrateurs/procedure_administrateurs/_add_admin_form.html.haml index c59f2f75d..3f744264a 100644 --- a/app/views/administrateurs/procedure_administrateurs/_add_admin_form.html.haml +++ b/app/views/administrateurs/procedure_administrateurs/_add_admin_form.html.haml @@ -1,7 +1,7 @@ = form_for procedure.administrateurs.new(user: User.new), url: { controller: 'procedure_administrateurs' }, - html: { class: 'form', id: "procedure-#{procedure.id}-new_administrateur" } , - remote: true do |f| + html: { class: 'form', id: "new_administrateur" }, + data: { turbo: true } do |f| = f.label :email do Ajouter un administrateur %p.notice Renseignez l’email d’un administrateur déjà enregistré sur #{APPLICATION_NAME} pour lui permettre de modifier « #{procedure.libelle} ». diff --git a/app/views/administrateurs/procedure_administrateurs/_administrateur.html.haml b/app/views/administrateurs/procedure_administrateurs/_administrateur.html.haml index ca8fb3310..dce0a1a83 100644 --- a/app/views/administrateurs/procedure_administrateurs/_administrateur.html.haml +++ b/app/views/administrateurs/procedure_administrateurs/_administrateur.html.haml @@ -1,4 +1,4 @@ -%tr{ id: "procedure-#{@procedure.id}-administrateur-#{administrateur.id}" } +%tr{ id: dom_id(administrateur) } %td= administrateur.email %td= try_format_datetime(administrateur.created_at) %td= administrateur.registration_state @@ -6,8 +6,8 @@ - if administrateur == current_administrateur C’est vous ! - else - = link_to 'Retirer', - admin_procedure_administrateur_path(@procedure, administrateur), + = button_to 'Retirer', + admin_procedure_administrateur_path(procedure, administrateur), method: :delete, - 'data-confirm': "Retirer « #{administrateur.email} » des administrateurs de « #{@procedure.libelle} » ?", - remote: true + class: 'button', + form: { data: { turbo: true, turbo_confirm: "Retirer « #{administrateur.email} » des administrateurs de « #{procedure.libelle} » ?" } } diff --git a/app/views/administrateurs/procedure_administrateurs/create.js.haml b/app/views/administrateurs/procedure_administrateurs/create.js.haml deleted file mode 100644 index 610fbd95b..000000000 --- a/app/views/administrateurs/procedure_administrateurs/create.js.haml +++ /dev/null @@ -1,9 +0,0 @@ -= render_flash(sticky: true) -- if @administrateur - = append_to_element("#procedure-#{@procedure.id}-administrateurs", - partial: 'administrateur', - locals: { administrateur: @administrateur }) - = render_to_element("#procedure-#{@procedure.id}-new_administrateur", - partial: 'add_admin_form', - outer: true, - locals: { procedure: @procedure }) diff --git a/app/views/administrateurs/procedure_administrateurs/create.turbo_stream.haml b/app/views/administrateurs/procedure_administrateurs/create.turbo_stream.haml new file mode 100644 index 000000000..b8af77c66 --- /dev/null +++ b/app/views/administrateurs/procedure_administrateurs/create.turbo_stream.haml @@ -0,0 +1,3 @@ +- if @administrateur.present? + = turbo_stream.append "administrateurs", partial: 'administrateur', locals: { procedure: @procedure, administrateur: @administrateur } + = turbo_stream.replace "new_administrateur", partial: 'add_admin_form', locals: { procedure: @procedure } diff --git a/app/views/administrateurs/procedure_administrateurs/destroy.js.haml b/app/views/administrateurs/procedure_administrateurs/destroy.js.haml deleted file mode 100644 index b56486490..000000000 --- a/app/views/administrateurs/procedure_administrateurs/destroy.js.haml +++ /dev/null @@ -1,4 +0,0 @@ -= render_flash(sticky: true) -- if @administrateur - = remove_element("#procedure-#{@procedure.id}-administrateur-#{@administrateur.id}") - diff --git a/app/views/administrateurs/procedure_administrateurs/destroy.turbo_stream.haml b/app/views/administrateurs/procedure_administrateurs/destroy.turbo_stream.haml new file mode 100644 index 000000000..4b4645f2d --- /dev/null +++ b/app/views/administrateurs/procedure_administrateurs/destroy.turbo_stream.haml @@ -0,0 +1,2 @@ +- if @administrateur.present? + = turbo_stream.remove(@administrateur) diff --git a/app/views/administrateurs/procedure_administrateurs/index.html.haml b/app/views/administrateurs/procedure_administrateurs/index.html.haml index d3545a511..9fbccb6bd 100644 --- a/app/views/administrateurs/procedure_administrateurs/index.html.haml +++ b/app/views/administrateurs/procedure_administrateurs/index.html.haml @@ -10,8 +10,8 @@ %th= 'Adresse email' %th= 'Enregistré le' %th= 'État' - %tbody{ id: "procedure-#{@procedure.id}-administrateurs" } - = render partial: 'administrateur', collection: @procedure.administrateurs.order('users.email') + %tbody#administrateurs + = render partial: 'administrateur', collection: @procedure.administrateurs.order('users.email'), locals: { procedure: @procedure } %tfoot %tr %th{ colspan: 4 } diff --git a/spec/controllers/administrateurs/procedure_administrateurs_controller_spec.rb b/spec/controllers/administrateurs/procedure_administrateurs_controller_spec.rb index 2094a8d54..15122c393 100644 --- a/spec/controllers/administrateurs/procedure_administrateurs_controller_spec.rb +++ b/spec/controllers/administrateurs/procedure_administrateurs_controller_spec.rb @@ -2,6 +2,7 @@ describe Administrateurs::ProcedureAdministrateursController, type: :controller let(:signed_in_admin) { create(:administrateur) } let(:other_admin) { create(:administrateur) } let(:procedure) { create(:procedure, administrateurs: [signed_in_admin, other_admin]) } + render_views before do sign_in(signed_in_admin.user) @@ -9,7 +10,7 @@ describe Administrateurs::ProcedureAdministrateursController, type: :controller describe '#destroy' do subject do - delete :destroy, params: { procedure_id: procedure.id, id: admin_to_remove.id }, format: :js, xhr: true + delete :destroy, params: { procedure_id: procedure.id, id: admin_to_remove.id }, format: :turbo_stream end context 'when removing another admin' do @@ -17,8 +18,8 @@ describe Administrateurs::ProcedureAdministrateursController, type: :controller it 'removes the admin from the procedure' do subject - expect(response.status).to eq(200) - expect(flash[:notice]).to be_present + expect(response).to have_http_status(:ok) + expect(subject.body).to include('alert-success') expect(admin_to_remove.procedures.reload).not_to include(procedure) end end @@ -28,8 +29,8 @@ describe Administrateurs::ProcedureAdministrateursController, type: :controller it 'denies the right for an admin to remove itself' do subject - expect(response.status).to eq(200) - expect(flash[:alert]).to be_present + expect(response).to have_http_status(:ok) + expect(subject.body).to include('alert-danger') expect(admin_to_remove.procedures.reload).to include(procedure) end end