diff --git a/app/assets/stylesheets/forms.scss b/app/assets/stylesheets/forms.scss index 10b08720c..2974a2fae 100644 --- a/app/assets/stylesheets/forms.scss +++ b/app/assets/stylesheets/forms.scss @@ -81,6 +81,12 @@ } // Move checkbox to the top-left side of the label + &.editable-champ-checkbox { + label.admin-default-zone { + font-weight: bold; + } + } + &.editable-champ-checkbox { p, label { diff --git a/app/jobs/admin_update_default_zones_job.rb b/app/jobs/admin_update_default_zones_job.rb new file mode 100644 index 000000000..421526cb4 --- /dev/null +++ b/app/jobs/admin_update_default_zones_job.rb @@ -0,0 +1,6 @@ +class AdminUpdateDefaultZonesJob < ApplicationJob + def perform(admin) + tchap_hs = APITchap::HsAdapter.new(admin.email).to_hs + admin.default_zones << Zone.default_for(tchap_hs) + end +end diff --git a/app/lib/api_tchap/api.rb b/app/lib/api_tchap/api.rb new file mode 100644 index 000000000..0dec71d53 --- /dev/null +++ b/app/lib/api_tchap/api.rb @@ -0,0 +1,22 @@ +class APITchap::API + class ResourceNotFound < StandardError + end + + def self.get_hs(email) + call([API_TCHAP_URL, "info?medium=email&address=#{email}"].join('/')) + end + + private + + def self.call(url) + response = Typhoeus.get(url) + + if response.success? + response.body + else + message = response.code == 0 ? response.return_message : response.code.to_s + Rails.logger.error "[APITchap] Error on #{url}: #{message}" + raise ResourceNotFound + end + end +end diff --git a/app/lib/api_tchap/hs_adapter.rb b/app/lib/api_tchap/hs_adapter.rb new file mode 100644 index 000000000..cdf2aced2 --- /dev/null +++ b/app/lib/api_tchap/hs_adapter.rb @@ -0,0 +1,15 @@ +class APITchap::HsAdapter + def initialize(email) + @email = email + end + + def to_hs + data_source[:hs] + end + + private + + def data_source + @data_source ||= JSON.parse(APITchap::API.get_hs(@email), symbolize_names: true) + end +end diff --git a/app/models/administrateur.rb b/app/models/administrateur.rb index 0b7b81cfe..ece450a1a 100644 --- a/app/models/administrateur.rb +++ b/app/models/administrateur.rb @@ -15,6 +15,7 @@ class Administrateur < ApplicationRecord has_many :procedures, through: :administrateurs_procedures has_many :services has_many :api_tokens, inverse_of: :administrateur, dependent: :destroy + has_and_belongs_to_many :default_zones, class_name: 'Zone', join_table: 'default_zones_administrateurs' belongs_to :user diff --git a/app/models/user.rb b/app/models/user.rb index a4c87de07..ef69a6e74 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -139,6 +139,7 @@ class User < ApplicationRecord if user.valid? && user.administrateur.nil? user.create_administrateur! user.update(france_connect_information: nil) + AdminUpdateDefaultZonesJob.perform_later(user.administrateur) end user diff --git a/app/models/zone.rb b/app/models/zone.rb index e48eab1df..e4f2bce9e 100644 --- a/app/models/zone.rb +++ b/app/models/zone.rb @@ -5,6 +5,7 @@ # id :bigint not null, primary key # acronym :string not null # label :string +# tchap_hs :string default([]), is an Array # created_at :datetime not null # updated_at :datetime not null # @@ -26,10 +27,15 @@ class Zone < ApplicationRecord label_at(date) != 'Non attribué' end - def self.available_at(date) - Zone.all.filter { |zone| zone.available_at?(date) }.sort_by { |zone| zone.label_at(date) } + def self.available_at(date, without_zones = []) + (Zone.all - without_zones).filter { |zone| zone.available_at?(date) }.sort_by { |zone| zone.label_at(date) } .map do |zone| OpenStruct.new(id: zone.id, label: zone.label_at(date)) end end + + def self.default_for(tchap_hs) + sanitized_sql = ActiveRecord::Base.sanitize_sql "'#{tchap_hs}' = ANY (tchap_hs)" + Zone.where(sanitized_sql) + end end diff --git a/app/services/update_zone_to_procedures_service.rb b/app/services/update_zone_to_procedures_service.rb deleted file mode 100644 index 522e7f16a..000000000 --- a/app/services/update_zone_to_procedures_service.rb +++ /dev/null @@ -1,21 +0,0 @@ -class UpdateZoneToProceduresService - def self.call(lines) - errors = [] - lines.each do |line| - zone_label = line["POL_PUB_MINISTERE RATTACHEMENT"] - zone = Zone.find_by(acronym: zone_label) - if zone.nil? - errors << "Zone #{zone_label} introuvable" - else - id = line["id"] - procedure = Procedure.find_by(id: id) - if procedure - procedure.update(zone: zone) - else - errors << "Procedure #{id} introuvable" - end - end - end - errors - end -end diff --git a/app/views/administrateurs/procedures/zones.html.haml b/app/views/administrateurs/procedures/zones.html.haml index def635d72..f1ab2212d 100644 --- a/app/views/administrateurs/procedures/zones.html.haml +++ b/app/views/administrateurs/procedures/zones.html.haml @@ -14,7 +14,11 @@ = f.label :zone do = t('zone', scope: 'activerecord.attributes.procedure') - if Rails.application.config.ds_zonage_enabled - = f.collection_check_boxes :zone_ids, Zone.available_at(@procedure.published_or_created_at), :id, :label do |b| + = f.collection_check_boxes :zone_ids, current_administrateur.default_zones, :id, :current_label do |b| + .editable-champ.editable-champ-checkbox + = b.check_box + = b.label class: "admin-default-zone" + = f.collection_check_boxes :zone_ids, Zone.available_at(@procedure.published_or_created_at, current_administrateur.default_zones), :id, :label do |b| .editable-champ.editable-champ-checkbox = b.check_box = b.label diff --git a/config/initializers/02_urls.rb b/config/initializers/02_urls.rb index cb7400dab..cc69ed22a 100644 --- a/config/initializers/02_urls.rb +++ b/config/initializers/02_urls.rb @@ -5,6 +5,7 @@ API_ENTREPRISE_URL = ENV.fetch("API_ENTREPRISE_URL", "https://entreprise.api.gou API_EDUCATION_URL = ENV.fetch("API_EDUCATION_URL", "https://data.education.gouv.fr/api/records/1.0") API_GEO_URL = ENV.fetch("API_GEO_URL", "https://geo.api.gouv.fr") API_PARTICULIER_URL = ENV.fetch("API_PARTICULIER_URL", "https://particulier.api.gouv.fr/api") +API_TCHAP_URL = ENV.fetch("API_TCHAP_URL", "https://matrix.agent.tchap.gouv.fr/_matrix/identity/api/v1") HELPSCOUT_API_URL = ENV.fetch("HELPSCOUT_API_URL", "https://api.helpscout.net/v2") PIPEDRIVE_API_URL = ENV.fetch("PIPEDRIVE_API_URL", "https://api.pipedrive.com/v1") SENDINBLUE_API_URL = ENV.fetch("SENDINBLUE_API_URL", "https://in-automate.sendinblue.com/api/v2") diff --git a/config/zones.yml b/config/zones.yml index 03bc9f7a2..a89f2a1e4 100644 --- a/config/zones.yml +++ b/config/zones.yml @@ -1,58 +1,121 @@ ministeres: - MAA: - - '2022-05-20': "Ministère de l'Agriculture et de la Souveraineté alimentaire" - - '2020-07-06': "Ministère de l'Agriculture et de l'Alimentation" + labels: + - '2022-05-20': "Ministère de l'Agriculture et de la Souveraineté alimentaire" + - '2020-07-06': "Ministère de l'Agriculture et de l'Alimentation" + tchap_hs: + - agent.agriculture.tchap.gouv.fr - MC: - - '2020-07-06': "Ministère de la Culture" + labels: + - '2020-07-06': "Ministère de la Culture" + tchap_hs: + - agent.culture.tchap.gouv.fr + + - MAS: - - '2022-05-20': "Ministère de la Santé et de la Prévention" - - '2020-07-06': "Ministère des Solidarités et de la Santé" + labels: + - '2022-05-20': "Ministère de la Santé et de la Prévention" + - '2020-07-06': "Ministère des Solidarités et de la Santé" + tchap_hs: + - agent.social.tchap.gouv.fr - MSAPH: - - '2022-05-20': "Ministère des Solidarités, de l'Autonomie et des personnes handicapées" - - '2020-07-06': "Non attribué" + labels: + - '2022-05-20': "Ministère des Solidarités, de l'Autonomie et des personnes handicapées" + - '2020-07-06': "Non attribué" + tchap_hs: + - agent.social.tchap.gouv.fr - MTEI: - - '2022-05-20': "Ministère du Travail, du Plein emploi et de l'Insertion" - - '2020-07-06': "Ministère du Travail" + labels: + - '2022-05-20': "Ministère du Travail, du Plein emploi et de l'Insertion" + - '2020-07-06': "Ministère du Travail" + tchap_hs: + - agent.social.tchap.gouv.fr - MEAE: - - '2020-07-06': "Ministère de l'Europe et des Affaires étrangères" + labels: + - '2020-07-06': "Ministère de l'Europe et des Affaires étrangères" + tchap_hs: + - agent.diplomatie.tchap.gouv.fr - MEF: - - '2022-05-20': "Ministère de l'Économie, des Finances et de la Souveraineté industrielle et numérique" - - '2020-07-06': "Ministère de l'Économie, des Finances et de la Relance" + labels: + - '2022-05-20': "Ministère de l'Économie, des Finances et de la Souveraineté industrielle et numérique" + - '2020-07-06': "Ministère de l'Économie, des Finances et de la Relance" + tchap_hs: + - agent.finances.tchap.gouv.fr - MJS: - - '2022-05-20': "Non attribué" - - '2020-07-06': "Ministère de la Jeunesse et des Sports" + labels: + - '2022-05-20': "Non attribué" + - '2020-07-06': "Ministère de la Jeunesse et des Sports" + tchap_hs: + - agent.social.tchap.gouv.fr - MSJO: - - '2022-05-20': "Ministère des Sports et des Jeux olympiques et paralympiques" - - '2020-07-06': "Non attribué" + labels: + - '2022-05-20': "Ministère des Sports et des Jeux olympiques et paralympiques" + - '2020-07-06': "Non attribué" + tchap_hs: + - agent.social.tchap.gouv.fr - MEN: - - '2022-05-20': "Ministère de l'Éducation nationale et de la Jeunesse" - - '2020-07-06': "Ministère de l'Éducation nationale, de la Jeunesse et des Sports" + labels: + - '2022-05-20': "Ministère de l'Éducation nationale et de la Jeunesse" + - '2020-07-06': "Ministère de l'Éducation nationale, de la Jeunesse et des Sports" + tchap_hs: + - agent.education.tchap.gouv.fr - ESR: - - '2022-05-20': "Ministère de l'Enseignement supérieur et de la Recherche" - - '2020-07-06': "Ministère de l'Enseignement supérieur, de la Recherche et de l'Innovation" + labels: + - '2022-05-20': "Ministère de l'Enseignement supérieur et de la Recherche" + - '2020-07-06': "Ministère de l'Enseignement supérieur, de la Recherche et de l'Innovation" + tchap_hs: + - agent.education.tchap.gouv.fr - MI: - - '2022-05-20': "Ministère de l'Intérieur et des Outre-mer" - - '2020-07-06': "Ministère de l'Intérieur" + labels: + - '2022-05-20': "Ministère de l'Intérieur et des Outre-mer" + - '2020-07-06': "Ministère de l'Intérieur" + tchap_hs: + - agent.interieur.tchap.gouv.fr - MINARM: - - '2020-07-06': "Ministère des Armées" + labels: + - '2020-07-06': "Ministère des Armées" + tchap_hs: + - agent.intradef.tchap.gouv.fr - MJ: - - '2020-07-06': "Ministère de la Justice" + labels: + - '2020-07-06': "Ministère de la Justice" + tchap_hs: + - agent.justice.tchap.gouv.fr - MTES: - - '2022-05-20': "Ministère de la Transition écologique et de la Cohésion des territoires" - - '2020-07-06': "Ministère de la Transition écologique" + labels: + - '2022-05-20': "Ministère de la Transition écologique et de la Cohésion des territoires" + - '2020-07-06': "Ministère de la Transition écologique" + tchap_hs: + - agent.dev-durable.tchap.gouv.fr - MTE: - - '2022-05-20': "Ministère de la Transition énergétique" - - '2020-07-06': "Non attribué" + labels: + - '2022-05-20': "Ministère de la Transition énergétique" + - '2020-07-06': "Non attribué" + tchap_hs: + - agent.dev-durable.tchap.gouv.fr - MCTRCT: - - '2022-05-20': "Non attribué" - - '2020-07-06': "Ministère de la Cohésion des territoires et des Relations avec les collectivités territoriales" + labels: + - '2022-05-20': "Non attribué" + - '2020-07-06': "Ministère de la Cohésion des territoires et des Relations avec les collectivités territoriales" + tchap_hs: + - agent.dev-durable.tchap.gouv.fr - PM: - - '2020-07-06': "Premier ministre" + labels: + - '2020-07-06': "Premier ministre" + tchap_hs: + - agent.pm.tchap.gouv.fr + - agent.dinum.tchap.gouv.fr - MER: - - '2022-05-20': "Non attribué" - - '2020-07-06': "Ministère de la Mer" + labels: + - '2022-05-20': "Non attribué" + - '2020-07-06': "Ministère de la Mer" - MTFP: - - '2020-07-06': "Ministère de la Transformation et de la Fonction publiques" + labels: + - '2020-07-06': "Ministère de la Transformation et de la Fonction publiques" + tchap_hs: + - agent.pm.tchap.gouv.fr + - agent.dinum.tchap.gouv.fr - OM: - - '2022-05-20': "Non attribué" - - '2020-07-06': "Ministère des Outre-mer" + labels: + - '2022-05-20': "Non attribué" + - '2020-07-06': "Ministère des Outre-mer" diff --git a/db/migrate/20230508103932_add_tchap_hs_to_zones.rb b/db/migrate/20230508103932_add_tchap_hs_to_zones.rb new file mode 100644 index 000000000..a784e61f6 --- /dev/null +++ b/db/migrate/20230508103932_add_tchap_hs_to_zones.rb @@ -0,0 +1,5 @@ +class AddTchapHsToZones < ActiveRecord::Migration[6.1] + def change + add_column :zones, :tchap_hs, :string, array: true, default: [] + end +end diff --git a/db/migrate/20230508160551_create_default_zones_administrateurs.rb b/db/migrate/20230508160551_create_default_zones_administrateurs.rb new file mode 100644 index 000000000..319726212 --- /dev/null +++ b/db/migrate/20230508160551_create_default_zones_administrateurs.rb @@ -0,0 +1,8 @@ +class CreateDefaultZonesAdministrateurs < ActiveRecord::Migration[6.1] + def change + create_table :default_zones_administrateurs, id: false do |t| + t.belongs_to :administrateur + t.belongs_to :zone + end + end +end diff --git a/db/schema.rb b/db/schema.rb index bf9aae542..0c7119b4a 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,8 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.0].define(version: 2023_05_02_160046) do +ActiveRecord::Schema[7.0].define(version: 2023_05_08_160551) do + # These are extensions that must be enabled in order to support this database enable_extension "pgcrypto" enable_extension "plpgsql" @@ -268,6 +269,13 @@ ActiveRecord::Schema[7.0].define(version: 2023_05_02_160046) do t.index ["instructeur_id"], name: "index_commentaires_on_instructeur_id" end + create_table "default_zones_administrateurs", id: false, force: :cascade do |t| + t.bigint "administrateur_id" + t.bigint "zone_id" + t.index ["administrateur_id"], name: "index_default_zones_administrateurs_on_administrateur_id" + t.index ["zone_id"], name: "index_default_zones_administrateurs_on_zone_id" + end + create_table "delayed_jobs", id: :serial, force: :cascade do |t| t.integer "attempts", default: 0, null: false t.datetime "created_at", precision: 6 @@ -969,6 +977,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_05_02_160046) do t.string "acronym", null: false t.datetime "created_at", precision: 6, null: false t.string "label" + t.string "tchap_hs", default: [], array: true t.datetime "updated_at", precision: 6, null: false t.index ["acronym"], name: "index_zones_on_acronym", unique: true end diff --git a/lib/tasks/deployment/20230322172910_populate_zones_with_tchap_hs.rake b/lib/tasks/deployment/20230322172910_populate_zones_with_tchap_hs.rake new file mode 100644 index 000000000..b335440f3 --- /dev/null +++ b/lib/tasks/deployment/20230322172910_populate_zones_with_tchap_hs.rake @@ -0,0 +1,25 @@ +namespace :after_party do + desc 'Deployment task: populate_zones_with_tchap_hs' + task populate_zones_with_tchap_hs: :environment do + puts "Running deploy task 'populate_zones_with_tchap_hs'" + collectivite = Zone.find_or_create_by!(acronym: 'COLLECTIVITE') + coll_label = collectivite.labels.find_or_initialize_by(designated_on: Date.parse('1977-07-30')) + coll_label.update(name: 'Collectivité territoriale') + + config = Psych.safe_load(Rails.root.join("config", "zones.yml").read) + config["ministeres"].each do |ministere| + acronym = ministere.keys.first + zone = Zone.find_or_create_by!(acronym: acronym) + labels_a = ministere['labels'] + labels_a.each do |label_h| + designated_on = label_h.keys.first + label = zone.labels.find_or_initialize_by(designated_on: designated_on) + label.update(name: label_h[designated_on]) + end + zone.update(tchap_hs: ministere['tchap_hs']) if ministere['tchap_hs'] + end + + AfterParty::TaskRecord + .create version: AfterParty::TaskRecorder.new(__FILE__).timestamp + end +end diff --git a/lib/tasks/update_zone_to_procedures.rake b/lib/tasks/update_zone_to_procedures.rake deleted file mode 100644 index 77aa9a5c7..000000000 --- a/lib/tasks/update_zone_to_procedures.rake +++ /dev/null @@ -1,23 +0,0 @@ -require Rails.root.join("lib", "tasks", "task_helper") - -namespace :zones do - desc <<~EOD - Update zone to all procedures - rails zones:update_zone_to_procedures\[csv_path\] - EOD - task :update_zone_to_procedures, [:csv] => :environment do |_t, args| - csv = args[:csv] - lines = CSV.readlines(csv, headers: true) - - rake_puts "Mise à jour des procédures en cours..." - - errors = - UpdateZoneToProceduresService.call(lines) - - if errors.present? - errors.each { |error| rake_puts error } - end - - rake_puts "Mise à jour terminée" - end -end diff --git a/spec/factories/zone.rb b/spec/factories/zone.rb index 09e805a47..f6b2d9f2e 100644 --- a/spec/factories/zone.rb +++ b/spec/factories/zone.rb @@ -1,6 +1,7 @@ FactoryBot.define do factory :zone do sequence(:acronym) { |n| "MA#{n}" } + tchap_hs { ['agent.educpop.tchap.gouv.fr'] } transient do labels { [{ designated_on: '1981-05-08', name: "Ministère de l'Education Populaire" }] } end diff --git a/spec/jobs/admin_update_default_zones_job_spec.rb b/spec/jobs/admin_update_default_zones_job_spec.rb new file mode 100644 index 000000000..aeef508db --- /dev/null +++ b/spec/jobs/admin_update_default_zones_job_spec.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe AdminUpdateDefaultZonesJob, type: :job do + let(:email) { 'louise@educ.pop.gouv.fr' } + let(:admin) { create(:administrateur, email: email) } + let(:hs_adapter) { double('hs_adapter', to_hs: 'agent.educpop.tchap.gouv.fr') } + + subject(:perform_job) { described_class.perform_now(admin) } + + before do + allow(APITchap::HsAdapter).to receive(:new).with(email).and_return(hs_adapter) + create(:zone, acronym: 'EP', tchap_hs: ['agent.educpop.tchap.gouv.fr']) + end + + it 'update default zones' do + perform_job + expect(admin.default_zones.map(&:acronym)).to eq ['EP'] + end +end diff --git a/spec/lib/api_tchap/hs_adapter_spec.rb b/spec/lib/api_tchap/hs_adapter_spec.rb new file mode 100644 index 000000000..082435d9c --- /dev/null +++ b/spec/lib/api_tchap/hs_adapter_spec.rb @@ -0,0 +1,19 @@ +describe APITchap::HsAdapter do + let(:adapter) { described_class.new(email) } + let(:email) { "louise@mjc.gouv.fr" } + subject { adapter.to_hs } + + before do + stub_request(:get, /https:\/\/matrix.agent.tchap.gouv.fr\/_matrix\/identity\/api\/v1\/info\?address=#{email}&medium=email/) + .to_return(body: body, status: status) + end + + context 'with normal body' do + let(:body) { "{\"hs\": \"agent.educpop.gouv.fr\" }" } + let(:status) { 200 } + it 'returns hs' do + subject + expect(subject).to eq "agent.educpop.gouv.fr" + end + end +end diff --git a/spec/models/zone_spec.rb b/spec/models/zone_spec.rb index 085c4bb2e..24c11df25 100644 --- a/spec/models/zone_spec.rb +++ b/spec/models/zone_spec.rb @@ -118,4 +118,18 @@ describe Zone do expect(Zone.available_at(start_previous_government + 1.day).map(&:label)).to eq ["Ministère de la Culture", "Ministère des Outre-mer"] end end + + context 'with zones' do + before do + create(:zone, acronym: 'MEN', tchap_hs: ['agent.education.tchap.gouv.fr']) + create(:zone, acronym: 'ESR', tchap_hs: ['agent.education.tchap.gouv.fr']) + end + + describe "#self.default_for" do + it 'returns zone related to tchap hs' do + expect(Zone.default_for('agent.education.tchap.gouv.fr').map(&:acronym)).to eq ['MEN', 'ESR'] + expect(Zone.default_for('agent.tchap.gouv.fr').map(&:acronym)).to eq [] + end + end + end end diff --git a/spec/services/update_zone_to_procedures_service_spec.rb b/spec/services/update_zone_to_procedures_service_spec.rb deleted file mode 100644 index 59cece854..000000000 --- a/spec/services/update_zone_to_procedures_service_spec.rb +++ /dev/null @@ -1,58 +0,0 @@ -describe UpdateZoneToProceduresService do - before(:each) do - Flipper.enable :zonage - Rake::Task['after_party:populate_zones'].invoke - end - - after(:each) do - Rake::Task['after_party:populate_zones'].reenable - end - - describe '#call' do - let(:procedure1) { create(:procedure, zone: nil) } - let(:procedure2) { create(:procedure, zone: nil) } - - subject { described_class.call(lines) } - - context 'nominal case' do - let(:lines) do - [ - { "id" => procedure1.id, "POL_PUB_MINISTERE RATTACHEMENT" => "PM" }, - { "id" => procedure2.id, "POL_PUB_MINISTERE RATTACHEMENT" => "MI" } - ] - end - - it 'updates zone to procedures' do - errors = subject - - expect(errors).to eq [] - expect(procedure1.reload.zone.acronym).to eq("PM") - expect(procedure2.reload.zone.acronym).to eq("MI") - end - end - - context 'with unknown procedure' do - let(:lines) do - [ - { "id" => procedure1.id + procedure2.id, "POL_PUB_MINISTERE RATTACHEMENT" => "PM" } - ] - end - it 'returns errors' do - errors = subject - expect(errors).to eq ["Procedure #{procedure1.id + procedure2.id} introuvable"] - end - end - - context 'with unknown zone' do - let(:lines) do - [ - { "id" => procedure1.id, "POL_PUB_MINISTERE RATTACHEMENT" => "YOUPI" } - ] - end - it 'returns errors' do - errors = subject - expect(errors).to eq ["Zone YOUPI introuvable"] - end - end - end -end diff --git a/spec/system/administrateurs/admin_creation_spec.rb b/spec/system/administrateurs/admin_creation_spec.rb index f3786f7e8..0d96d09de 100644 --- a/spec/system/administrateurs/admin_creation_spec.rb +++ b/spec/system/administrateurs/admin_creation_spec.rb @@ -6,6 +6,10 @@ describe 'As an administrateur', js: true do let(:strong_password) { 'a new, long, and complicated password!' } before do + body = "{\"hs\": \"agent.educpop.gouv.fr\" }" + WebMock.stub_request(:get, /https:\/\/matrix.agent.tchap.gouv.fr\/_matrix\/identity\/api\/v1\/info\?address=(.*)&medium=email/) + .to_return(body: body, status: 200) + perform_enqueued_jobs do super_admin.invite_admin(admin_email) end diff --git a/spec/views/administrateurs/procedures/zones.html.haml_spec.rb b/spec/views/administrateurs/procedures/zones.html.haml_spec.rb index 9354fc2a6..fe98de1ad 100644 --- a/spec/views/administrateurs/procedures/zones.html.haml_spec.rb +++ b/spec/views/administrateurs/procedures/zones.html.haml_spec.rb @@ -1,10 +1,12 @@ describe 'administrateurs/procedures/zones' do + let(:administrateur) { create(:administrateur) } let(:procedure) { create(:procedure) } - let(:populate_zones_task) { Rake::Task['after_party:populate_zones'] } + let(:populate_zones_task) { Rake::Task['after_party:populate_zones_with_tchap_hs'] } before do Rails.application.config.ds_zonage_enabled = true populate_zones_task.invoke + allow(view).to receive(:current_administrateur).and_return(administrateur) end after do