diff --git a/app/controllers/admin/procedures_controller.rb b/app/controllers/admin/procedures_controller.rb index e3e834d55..a159762b0 100644 --- a/app/controllers/admin/procedures_controller.rb +++ b/app/controllers/admin/procedures_controller.rb @@ -250,7 +250,7 @@ class Admin::ProceduresController < AdminController private def procedure_params - editable_params = [:libelle, :description, :organisation, :direction, :lien_site_web, :lien_notice, :euro_flag, :logo, :auto_archive_on] + editable_params = [:libelle, :description, :organisation, :direction, :lien_site_web, :lien_notice, :web_hook_url, :euro_flag, :logo, :auto_archive_on] if @procedure.try(:locked?) params.require(:procedure).permit(*editable_params) else diff --git a/app/controllers/manager/demandes_controller.rb b/app/controllers/manager/demandes_controller.rb index f3367f70b..09690f077 100644 --- a/app/controllers/manager/demandes_controller.rb +++ b/app/controllers/manager/demandes_controller.rb @@ -10,7 +10,7 @@ module Manager if administrateur.errors.empty? PipedriveAcceptsDealsJob.perform_later( create_administrateur_params[:person_id], - PipedriveService::PIPEDRIVE_CAMILLE_ID, + Pipedrive::DealAdapter::PIPEDRIVE_CAMILLE_ID, create_administrateur_params[:stage_id] ) @@ -26,7 +26,7 @@ module Manager def refuse_administrateur PipedriveRefusesDealsJob.perform_later( refuse_administrateur_params[:person_id], - PipedriveService::PIPEDRIVE_CAMILLE_ID + Pipedrive::DealAdapter::PIPEDRIVE_CAMILLE_ID ) AdministrationMailer @@ -56,7 +56,7 @@ module Manager end def demandes - @demandes ||= PipedriveService.fetch_people_demandes + @demandes ||= PipedriveService.get_demandes end end end diff --git a/app/jobs/administrateurs/activate_before_expiration_job.rb b/app/jobs/administrateurs/activate_before_expiration_job.rb new file mode 100644 index 000000000..d8fd8c27a --- /dev/null +++ b/app/jobs/administrateurs/activate_before_expiration_job.rb @@ -0,0 +1,9 @@ +class Administrateurs::ActivateBeforeExpirationJob < ApplicationJob + queue_as :cron + + def perform(*args) + Administrateur.inactive.where(created_at: 2.days.ago.all_day).each do |a| + AdministrateurMailer.activate_before_expiration(a).deliver_later + end + end +end diff --git a/app/jobs/pipedrive_accepts_deals_job.rb b/app/jobs/pipedrive_accepts_deals_job.rb index 4df5a0406..84a4e96d5 100644 --- a/app/jobs/pipedrive_accepts_deals_job.rb +++ b/app/jobs/pipedrive_accepts_deals_job.rb @@ -1,5 +1,5 @@ class PipedriveAcceptsDealsJob < ApplicationJob def perform(person_id, owner_id, stage_id) - PipedriveService.accept_deals_from_person(person_id, owner_id, stage_id) + PipedriveService.accept_demande_from_person(person_id, owner_id, stage_id) end end diff --git a/app/jobs/pipedrive_refuses_deals_job.rb b/app/jobs/pipedrive_refuses_deals_job.rb index 14f0a3ca9..61c157efb 100644 --- a/app/jobs/pipedrive_refuses_deals_job.rb +++ b/app/jobs/pipedrive_refuses_deals_job.rb @@ -1,5 +1,5 @@ class PipedriveRefusesDealsJob < ApplicationJob def perform(person_id, owner_id) - PipedriveService.refuse_deals_from_person(person_id, owner_id) + PipedriveService.refuse_demande_from_person(person_id, owner_id) end end diff --git a/app/jobs/web_hook_job.rb b/app/jobs/web_hook_job.rb new file mode 100644 index 000000000..836ea29d9 --- /dev/null +++ b/app/jobs/web_hook_job.rb @@ -0,0 +1,16 @@ +class WebHookJob < ApplicationJob + queue_as :default + + TIMEOUT = 10 + + def perform(procedure, dossier) + body = { + procedure_id: procedure.id, + dossier_id: dossier.id, + state: dossier.state, + updated_at: dossier.updated_at + } + + Typhoeus.post(procedure.web_hook_url, body: body, timeout: TIMEOUT) + end +end diff --git a/app/lib/pipedrive/api.rb b/app/lib/pipedrive/api.rb new file mode 100644 index 000000000..0ce970635 --- /dev/null +++ b/app/lib/pipedrive/api.rb @@ -0,0 +1,50 @@ +class Pipedrive::API + PIPEDRIVE_ALL_NOT_DELETED_DEALS = 'all_not_deleted' + PIPEDRIVE_DEALS_URL = [PIPEDRIVE_API_URL, 'deals'].join("/") + PIPEDRIVE_PEOPLE_URL = [PIPEDRIVE_API_URL, 'persons'].join("/") + + def self.get_persons_owned_by_user(user_id) + url = PIPEDRIVE_PEOPLE_URL + params = { user_id: user_id } + + self.get(url, params) + end + + def self.get_deals_for_person(person_id) + url = [PIPEDRIVE_PEOPLE_URL, person_id, "deals"].join('/') + params = { status: PIPEDRIVE_ALL_NOT_DELETED_DEALS } + + self.get(url, params) + end + + def self.put_deal(deal_id, params) + url = [PIPEDRIVE_DEALS_URL, deal_id].join("/") + + self.put(url, params) + end + + def self.put_person(person_id, params) + url = [PIPEDRIVE_PEOPLE_URL, person_id].join("/") + + self.put(url, params) + end + + private + + def self.get(url, params) + params.merge!({ + start: 0, + limit: 500, + api_token: PIPEDRIVE_TOKEN + }) + + response = RestClient.get(url, params: params) + JSON.parse(response.body)['data'] + end + + def self.put(url, params) + url = "#{url}?api_token=#{PIPEDRIVE_TOKEN}" + + RestClient.put(url, params.to_json, { content_type: :json }) + end +end diff --git a/app/lib/pipedrive/deal_adapter.rb b/app/lib/pipedrive/deal_adapter.rb new file mode 100644 index 000000000..a8c4ad826 --- /dev/null +++ b/app/lib/pipedrive/deal_adapter.rb @@ -0,0 +1,36 @@ +class Pipedrive::DealAdapter + PIPEDRIVE_ADMIN_CENTRAL_STOCK_STAGE_ID = 35 + PIPEDRIVE_REGIONS_STOCK_STAGE_ID = 24 + PIPEDRIVE_PREFECTURES_STOCK_STAGE_ID = 20 + PIPEDRIVE_DEPARTEMENTS_STOCK_STAGE_ID = 30 + PIPEDRIVE_COMMUNES_STOCK_STAGE_ID = 40 + PIPEDRIVE_ORGANISMES_STOCK_STAGE_ID = 1 + PIPEDRIVE_ORGANISMES_REFUSES_STOCK_STAGE_ID = 45 + + PIPEDRIVE_LOST_STATUS = "lost" + PIPEDRIVE_LOST_REASON = "refusé depuis DS" + + PIPEDRIVE_CAMILLE_ID = '3189424' + + def self.refuse_deal(deal_id, owner_id) + params = { + user_id: owner_id, + stage_id: PIPEDRIVE_ORGANISMES_REFUSES_STOCK_STAGE_ID, + status: PIPEDRIVE_LOST_STATUS, + lost_reason: PIPEDRIVE_LOST_REASON + } + + Pipedrive::API.put_deal(deal_id, params) + end + + def self.get_deals_ids_for_person(person_id) + Pipedrive::API.get_deals_for_person(person_id) + .map { |datum| datum['id'] } + end + + def self.update_deal_owner_and_stage(deal_id, owner_id, stage_id) + params = { user_id: owner_id, stage_id: stage_id } + + Pipedrive::API.put_deal(deal_id, params) + end +end diff --git a/app/lib/pipedrive/person_adapter.rb b/app/lib/pipedrive/person_adapter.rb new file mode 100644 index 000000000..f395bbea9 --- /dev/null +++ b/app/lib/pipedrive/person_adapter.rb @@ -0,0 +1,22 @@ +class Pipedrive::PersonAdapter + PIPEDRIVE_POSTE_ATTRIBUTE_ID = '33a790746f1713d712fe97bcce9ac1ca6374a4d6' + PIPEDRIVE_ROBOT_ID = '2748449' + + def self.get_demandes_from_persons_owned_by_robot + Pipedrive::API.get_persons_owned_by_user(PIPEDRIVE_ROBOT_ID).map do |datum| + { + person_id: datum['id'], + nom: datum['name'], + poste: datum[PIPEDRIVE_POSTE_ATTRIBUTE_ID], + email: datum.dig('email', 0, 'value'), + organisation: datum['org_name'] + } + end + end + + def self.update_person_owner(person_id, owner_id) + params = { owner_id: owner_id } + + Pipedrive::API.put_person(person_id, params) + end +end diff --git a/app/mailers/administrateur_mailer.rb b/app/mailers/administrateur_mailer.rb new file mode 100644 index 000000000..351206064 --- /dev/null +++ b/app/mailers/administrateur_mailer.rb @@ -0,0 +1,11 @@ +class AdministrateurMailer < ApplicationMailer + layout 'mailers/layout' + + def activate_before_expiration(administrateur) + @administrateur = administrateur + @expiration_date = administrateur.reset_password_sent_at + Devise.reset_password_within + mail(to: administrateur.email, + subject: "demarches-simplifiees.fr - N'oubliez pas d'activer votre compte administrateur", + reply_to: "contact@demarches-simplifiees.fr") + end +end diff --git a/app/models/dossier.rb b/app/models/dossier.rb index 2ba5fddc7..6c925cf1b 100644 --- a/app/models/dossier.rb +++ b/app/models/dossier.rb @@ -75,6 +75,7 @@ class Dossier < ApplicationRecord after_save :build_default_champs, if: Proc.new { saved_change_to_procedure_id? } after_save :build_default_individual, if: Proc.new { procedure.for_individual? } after_save :send_dossier_received + after_save :send_web_hook after_create :send_draft_notification_email validates :user, presence: true @@ -326,4 +327,13 @@ class Dossier < ApplicationRecord NotificationMailer.send_draft_notification(self).deliver_now! end end + + def send_web_hook + if saved_change_to_state? && !brouillon? && procedure.web_hook_url + WebHookJob.perform_later( + procedure, + self + ) + end + end end diff --git a/app/services/pipedrive_service.rb b/app/services/pipedrive_service.rb index e6e920cf2..09fc32779 100644 --- a/app/services/pipedrive_service.rb +++ b/app/services/pipedrive_service.rb @@ -1,102 +1,17 @@ class PipedriveService - PIPEDRIVE_POSTE_ATTRIBUTE_ID = '33a790746f1713d712fe97bcce9ac1ca6374a4d6' + def self.accept_demande_from_person(person_id, owner_id, stage_id) + person_deals_ids = Pipedrive::DealAdapter.get_deals_ids_for_person(person_id) + person_deals_ids.each { |deal_id| Pipedrive::DealAdapter.update_deal_owner_and_stage(deal_id, owner_id, stage_id) } + Pipedrive::PersonAdapter.update_person_owner(person_id, owner_id) + end - PIPEDRIVE_ROBOT_ID = '2748449' - PIPEDRIVE_CAMILLE_ID = '3189424' + def self.refuse_demande_from_person(person_id, owner_id) + person_deals_ids = Pipedrive::DealAdapter.get_deals_ids_for_person(person_id) + person_deals_ids.each { |deal_id| Pipedrive::DealAdapter.refuse_deal(deal_id, owner_id) } + Pipedrive::PersonAdapter.update_person_owner(person_id, owner_id) + end - PIPEDRIVE_ALL_NOT_DELETED_DEALS = 'all_not_deleted' - - PIPEDRIVE_LOST_STATUS = "lost" - PIPEDRIVE_LOST_REASON = "refusé depuis DS" - - PIPEDRIVE_ADMIN_CENTRAL_STOCK_STAGE_ID = 35 - PIPEDRIVE_REGIONS_STOCK_STAGE_ID = 24 - PIPEDRIVE_PREFECTURES_STOCK_STAGE_ID = 20 - PIPEDRIVE_DEPARTEMENTS_STOCK_STAGE_ID = 30 - PIPEDRIVE_COMMUNES_STOCK_STAGE_ID = 40 - PIPEDRIVE_ORGANISMES_STOCK_STAGE_ID = 1 - PIPEDRIVE_ORGANISMES_REFUSES_STOCK_STAGE_ID = 45 - - class << self - def accept_deals_from_person(person_id, owner_id, stage_id) - waiting_deal_ids = fetch_waiting_deal_ids(person_id) - waiting_deal_ids.each { |deal_id| update_deal_owner_and_stage(deal_id, owner_id, stage_id) } - update_person_owner(person_id, owner_id) - end - - def refuse_deals_from_person(person_id, owner_id) - waiting_deal_ids = fetch_waiting_deal_ids(person_id) - waiting_deal_ids.each { |deal_id| refuse_deal(deal_id, owner_id) } - update_person_owner(person_id, owner_id) - end - - def fetch_people_demandes - params = { - start: 0, - limit: 500, - user_id: PIPEDRIVE_ROBOT_ID, - api_token: PIPEDRIVE_TOKEN - } - - response = RestClient.get(PIPEDRIVE_PEOPLE_URL, { params: params }) - json = JSON.parse(response.body) - - json['data'].map do |datum| - { - person_id: datum['id'], - nom: datum['name'], - poste: datum[PIPEDRIVE_POSTE_ATTRIBUTE_ID], - email: datum.dig('email', 0, 'value'), - organisation: datum['org_name'] - } - end - end - - private - - def refuse_deal(deal_id, owner_id) - url = PIPEDRIVE_DEALS_URL + "/#{deal_id}?api_token=#{PIPEDRIVE_TOKEN}" - - params = { - user_id: owner_id, - stage_id: PIPEDRIVE_ORGANISMES_REFUSES_STOCK_STAGE_ID, - status: PIPEDRIVE_LOST_STATUS, - lost_reason: PIPEDRIVE_LOST_REASON - } - - RestClient.put(url, params.to_json, { content_type: :json }) - end - - def fetch_waiting_deal_ids(person_id) - url = [PIPEDRIVE_PEOPLE_URL, person_id, "deals"].join('/') - - params = { - start: 0, - limit: 500, - status: PIPEDRIVE_ALL_NOT_DELETED_DEALS, - api_token: PIPEDRIVE_TOKEN - } - - response = RestClient.get(url, params: params) - json = JSON.parse(response.body) - - json['data'].map { |datum| datum['id'] } - end - - def update_deal_owner_and_stage(deal_id, owner_id, stage_id) - url = PIPEDRIVE_DEALS_URL + "/#{deal_id}?api_token=#{PIPEDRIVE_TOKEN}" - - params = { user_id: owner_id, stage_id: stage_id } - - RestClient.put(url, params.to_json, { content_type: :json }) - end - - def update_person_owner(person_id, owner_id) - url = PIPEDRIVE_PEOPLE_URL + "/#{person_id}?api_token=#{PIPEDRIVE_TOKEN}" - - params = { owner_id: owner_id } - - RestClient.put(url, params.to_json, { content_type: :json }) - end + def self.get_demandes + Pipedrive::PersonAdapter.get_demandes_from_persons_owned_by_robot end end diff --git a/app/views/admin/procedures/_informations.html.haml b/app/views/admin/procedures/_informations.html.haml index 76f5568c8..ba6ccefde 100644 --- a/app/views/admin/procedures/_informations.html.haml +++ b/app/views/admin/procedures/_informations.html.haml @@ -2,15 +2,19 @@ .alert.alert-info Cette procédure est publiée, certains éléments de la description ne sont plus modifiables -- { libelle: 'Libellé*', description: 'Description*', organisation: 'Organisme*', direction: 'Direction', lien_site_web: 'Lien site internet', lien_notice: 'Lien notice' }.each do |key, value| - .form-group - %h4 - = value - - if key == :description - = f.text_area key, rows: '6', placeholder: 'Description du projet', class: 'form-control' +- { libelle: 'Libellé*', description: 'Description*', organisation: 'Organisme*', direction: 'Direction', lien_site_web: 'Lien site internet', lien_notice: 'Lien notice', web_hook_url: 'Lien de rappel HTTP' }.each do |key, value| + - if key != :web_hook_url || current_administrateur&.feature_enabled?(:web_hook_allowed) + .form-group + %h4 + = value + - if key == :web_hook_url + %p + Un lien de rappel HTTP (aussi appelé webhook) est utilisé pour notifier un service tiers du changement de l'état d’un dossier sur demarches-simplifiees.fr. À chaque changement d’état d'un dossier, notre site va effectuer une requête sur le lien renseigné avec en paramètres : le nouvel état du dossier, l’identifiant de la procédure, l'identifiant dossier et la date du changement. Vous pourrez alors utiliser notre API pour récupérer les nouvelles informations du dossier concerné. + - if key == :description + = f.text_area key, rows: '6', placeholder: 'Description du projet', class: 'form-control' - - else - = f.text_field key, class: 'form-control', placeholder: value + - else + = f.text_field key, class: 'form-control', placeholder: value .row .col-md-6 diff --git a/app/views/administrateur_mailer/activate_before_expiration.haml b/app/views/administrateur_mailer/activate_before_expiration.haml new file mode 100644 index 000000000..0fa678348 --- /dev/null +++ b/app/views/administrateur_mailer/activate_before_expiration.haml @@ -0,0 +1,17 @@ +- content_for(:title, "N'oubliez pas d'activer votre compte") + +Bonjour, +%br +%br +Vous avez fait la demande d’un compte administrateur sur demarches-simplifiees.fr. +Votre compte a été créé mais reste inactif, il arrivera à expiration le #{@expiration_date.strftime("%d/%m/%Y")} +%br +%br +Afin d’activer votre compte, veuillez cliquer sur le lien ci-dessous : += link_to(admin_activate_url(token: @administrateur.reset_password_token), admin_activate_url(token: @administrateur.reset_password_token)) +%br +%br +Nous restons à votre disposition si vous avez besoin d’accompagnement. +%br +%br += render partial: "layouts/mailers/bizdev_signature" diff --git a/app/views/administration_mailer/invite_admin.html.haml b/app/views/administration_mailer/invite_admin.html.haml index 1c2c5f66d..dfbf0cb3c 100644 --- a/app/views/administration_mailer/invite_admin.html.haml +++ b/app/views/administration_mailer/invite_admin.html.haml @@ -19,16 +19,4 @@ Je vous invite également à consulter notre site de documentation qui regroupe = link_to('https://demarches-simplifiees.gitbook.io/demarches-simplifiees/', 'https://demarches-simplifiees.gitbook.io/demarches-simplifiees/') %br %br -Cordialement, -%br -%br -Camille Garrigue -%br -%br -Équipe demarches-simplifiees.fr -%br -Téléphone (standard) : 01 76 42 02 87​ -%br -Incubateur de Services Numériques / beta.gouv.fr -%br -Services du Premier Ministre, 20 avenue de Ségur, 75007 Paris += render partial: "layouts/mailers/bizdev_signature" diff --git a/app/views/layouts/mailers/_bizdev_signature.html.haml b/app/views/layouts/mailers/_bizdev_signature.html.haml new file mode 100644 index 000000000..d9f078730 --- /dev/null +++ b/app/views/layouts/mailers/_bizdev_signature.html.haml @@ -0,0 +1,13 @@ +Cordialement, +%br +%br +Camille Garrigue +%br +%br +Équipe demarches-simplifiees.fr +%br +Téléphone (standard) : 01 76 42 02 87 +%br +Incubateur de Services Numériques / beta.gouv.fr +%br +Services du Premier Ministre, 20 avenue de Ségur, 75007 Paris diff --git a/app/views/manager/demandes/index.html.erb b/app/views/manager/demandes/index.html.erb index 2249e5285..f662a32a1 100644 --- a/app/views/manager/demandes/index.html.erb +++ b/app/views/manager/demandes/index.html.erb @@ -33,12 +33,12 @@ <%= form_tag(manager_demandes_create_administrateur_path) do -%> <%= select_tag "stage_id", options_for_select({ - "administration centrale" => PipedriveService::PIPEDRIVE_ADMIN_CENTRAL_STOCK_STAGE_ID, - "région" => PipedriveService::PIPEDRIVE_REGIONS_STOCK_STAGE_ID, - "préfecture" => PipedriveService::PIPEDRIVE_PREFECTURES_STOCK_STAGE_ID, - "département" =>PipedriveService::PIPEDRIVE_DEPARTEMENTS_STOCK_STAGE_ID, - "commune" => PipedriveService::PIPEDRIVE_COMMUNES_STOCK_STAGE_ID, - "organisme" => PipedriveService::PIPEDRIVE_ORGANISMES_STOCK_STAGE_ID + "administration centrale" => Pipedrive::DealAdapter::PIPEDRIVE_ADMIN_CENTRAL_STOCK_STAGE_ID, + "région" => Pipedrive::DealAdapter::PIPEDRIVE_REGIONS_STOCK_STAGE_ID, + "préfecture" => Pipedrive::DealAdapter::PIPEDRIVE_PREFECTURES_STOCK_STAGE_ID, + "département" =>Pipedrive::DealAdapter::PIPEDRIVE_DEPARTEMENTS_STOCK_STAGE_ID, + "commune" => Pipedrive::DealAdapter::PIPEDRIVE_COMMUNES_STOCK_STAGE_ID, + "organisme" => Pipedrive::DealAdapter::PIPEDRIVE_ORGANISMES_STOCK_STAGE_ID }), style: 'margin-bottom: 20px; width: inherit;' %> diff --git a/config/environments/test.rb b/config/environments/test.rb index 54fe2f2a8..9de8d2433 100644 --- a/config/environments/test.rb +++ b/config/environments/test.rb @@ -44,6 +44,8 @@ Rails.application.configure do protocol: :http } + config.active_job.queue_adapter = :test + # Raises error for missing translations # config.action_view.raise_on_missing_translations = true end diff --git a/config/initializers/features.yml b/config/initializers/features.yml index a7b150256..71aea0c20 100644 --- a/config/initializers/features.yml +++ b/config/initializers/features.yml @@ -4,3 +4,5 @@ champ_pj_allowed_for_admin_ids: - 0 champ_siret_allowed_for_admin_ids: - 0 +web_hook_allowed_for_admin_ids: + - 0 diff --git a/config/initializers/urls.rb b/config/initializers/urls.rb index 17bccab1a..510cd60ea 100644 --- a/config/initializers/urls.rb +++ b/config/initializers/urls.rb @@ -4,6 +4,4 @@ else API_ENTREPRISE_URL = 'https://staging.entreprise.api.gouv.fr/v2' end -PIPEDRIVE_API_URL = 'https://api.pipedrive.com/v1/' -PIPEDRIVE_PEOPLE_URL = URI.join(PIPEDRIVE_API_URL, 'persons').to_s -PIPEDRIVE_DEALS_URL = URI.join(PIPEDRIVE_API_URL, 'deals').to_s +PIPEDRIVE_API_URL = 'https://api.pipedrive.com/v1' diff --git a/db/migrate/20180301123826_add_webhook_to_procedures.rb b/db/migrate/20180301123826_add_webhook_to_procedures.rb new file mode 100644 index 000000000..9aba4a9c8 --- /dev/null +++ b/db/migrate/20180301123826_add_webhook_to_procedures.rb @@ -0,0 +1,5 @@ +class AddWebhookToProcedures < ActiveRecord::Migration[5.2] + def change + add_column :procedures, :web_hook_url, :string + end +end diff --git a/db/schema.rb b/db/schema.rb index 51e42562f..aaa50a105 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -453,6 +453,7 @@ ActiveRecord::Schema.define(version: 2018_04_04_113409) do t.datetime "archived_at" t.datetime "whitelisted_at" t.boolean "ask_birthday", default: false, null: false + t.string "web_hook_url" t.index ["hidden_at"], name: "index_procedures_on_hidden_at" end diff --git a/spec/jobs/administrateurs/activate_before_expiration_job_spec.rb b/spec/jobs/administrateurs/activate_before_expiration_job_spec.rb new file mode 100644 index 000000000..1a92e38bf --- /dev/null +++ b/spec/jobs/administrateurs/activate_before_expiration_job_spec.rb @@ -0,0 +1,72 @@ +require 'rails_helper' + +RSpec.describe Administrateurs::ActivateBeforeExpirationJob, type: :job do + describe 'perform' do + let(:administrateur) { create(:administrateur, active: active) } + let(:mailer_double) { double('mailer', deliver_later: true) } + + subject { Administrateurs::ActivateBeforeExpirationJob.perform_now } + + before do + Timecop.freeze(DateTime.new(2018, 03, 20)) + administrateur.reload + allow(AdministrateurMailer).to receive(:activate_before_expiration).and_return(mailer_double) + end + + after { Timecop.return } + + context "with an inactive administrateur" do + let(:active) { false } + + context "created now" do + before { subject } + it { expect(AdministrateurMailer).not_to have_received(:activate_before_expiration) } + end + + context "created a long time ago" do + before do + administrateur.update_columns(created_at: DateTime.new(2018, 03, 10)) + subject + end + + it { expect(AdministrateurMailer).not_to have_received(:activate_before_expiration) } + end + + context "created 2 days ago" do + before do + administrateur.update_columns(created_at: DateTime.new(2018, 03, 18, 20, 00)) + subject + end + + it { expect(AdministrateurMailer).to have_received(:activate_before_expiration).with(administrateur) } + end + end + + context "with an active administrateur" do + let(:active) { true } + + context "created now" do + before { subject } + it { expect(AdministrateurMailer).not_to have_received(:activate_before_expiration) } + end + + context "created a long time ago" do + before do + administrateur.update_columns(created_at: DateTime.new(2018, 03, 10)) + subject + end + + it { expect(AdministrateurMailer).not_to have_received(:activate_before_expiration) } + end + + context "created 2 days ago" do + before do + administrateur.update_columns(created_at: DateTime.new(2018, 03, 18, 20, 00)) + subject + end + + it { expect(AdministrateurMailer).not_to have_received(:activate_before_expiration) } + end + end + end +end diff --git a/spec/mailers/previews/administrateur_mailer_preview.rb b/spec/mailers/previews/administrateur_mailer_preview.rb new file mode 100644 index 000000000..67e6a54b9 --- /dev/null +++ b/spec/mailers/previews/administrateur_mailer_preview.rb @@ -0,0 +1,5 @@ +class AdministrateurMailerPreview < ActionMailer::Preview + def activate_before_expiration + AdministrateurMailer.activate_before_expiration(Administrateur.inactive.where.not(reset_password_token: nil).last) + end +end diff --git a/spec/models/dossier_spec.rb b/spec/models/dossier_spec.rb index 68a9b50c7..27b2cede1 100644 --- a/spec/models/dossier_spec.rb +++ b/spec/models/dossier_spec.rb @@ -896,4 +896,34 @@ describe Dossier do it { is_expected.to eq(expected) } end end + + describe 'webhook' do + let(:dossier) { create(:dossier) } + + it 'should not call webhook' do + expect { + dossier.accepte! + }.to_not have_enqueued_job(WebHookJob) + end + + it 'should call webhook' do + dossier.procedure.update_column(:web_hook_url, '/webhook.json') + + expect { + dossier.update_column(:motivation, 'bonjour') + }.to_not have_enqueued_job(WebHookJob) + + expect { + dossier.en_construction! + }.to have_enqueued_job(WebHookJob) + + expect { + dossier.update_column(:motivation, 'bonjour2') + }.to_not have_enqueued_job(WebHookJob) + + expect { + dossier.en_instruction! + }.to have_enqueued_job(WebHookJob) + end + end end