From 519cbade38bb5b1dde33af4521fee4d648c42d69 Mon Sep 17 00:00:00 2001 From: Adrien Di Pasquale Date: Sun, 3 Nov 2024 17:45:37 +0100 Subject: [PATCH] =?UTF-8?q?ajout=20de=20specs=20pour=20les=20formulaires?= =?UTF-8?q?=20utilisant=20la=20validation=20des=20num=C3=A9ros=20ANTS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- spec/form_models/admin/user_form_spec.rb | 88 +++++++++ spec/form_models/beneficiaire_form_spec.rb | 125 ++++++++++++- spec/form_models/user_rdv_wizard_spec.rb | 196 +++++++++++++++++++++ 3 files changed, 404 insertions(+), 5 deletions(-) diff --git a/spec/form_models/admin/user_form_spec.rb b/spec/form_models/admin/user_form_spec.rb index 49e2ae9f9b..6bb0dea8f8 100644 --- a/spec/form_models/admin/user_form_spec.rb +++ b/spec/form_models/admin/user_form_spec.rb @@ -133,4 +133,92 @@ subject.save end end + + describe "validations numéro ANTS" do + let(:duplicate_users_mock) { [] } + + include_context "rdv_mairie_api_authentication" + + context "numéro de pré-demande ANTS mal formatté" do + let(:user) { build(:user, ants_pre_demande_number: "undeux") } + + specify do + expect(subject.valid?).to be false + expect(subject.errors.first.full_message).to eq("Numéro de pré-demande ANTS doit comporter 10 chiffres et lettres") + end + end + + context "numéro de pré-demande ANTS valide" do + before { stub_ants_status("VALID12345", status: "validated", appointments: []) } + + let(:user) { build(:user, ants_pre_demande_number: "VALID12345") } + + specify do + expect(subject).to be_valid + end + end + + context "numéro de pré-demande ANTS non-reconnu (unknown)" do + before { stub_ants_status("VALID12345", status: "unknown", appointments: []) } + + let(:user) { build(:user, ants_pre_demande_number: "VALID12345") } + + specify do + expect(subject.valid?).to be false + expect(subject.errors.first.full_message).to eq("Numéro de pré-demande ANTS n'est pas reconnu par l'ANTS") + end + end + + context "numéro de pré-demande ANTS a déjà un appointment" do + before do + stub_ants_status( + "VALID12345", + status: "validated", + appointments: [{ "meeting_point" => "Mairie de Montrouge", "management_url" => "http://rdvsympa.fr/123" }] + ) + end + + let(:user) { build(:user, ants_pre_demande_number: "VALID12345") } + + specify do + expect(subject.valid?).to be false + expect(subject.errors.first.attribute).to eq(:_benign) + expect(subject.errors.first.message).to eq( + <<-TXT.squish + Ce numéro de pré-demande ANTS est déjà utilisé pour un RDV auprès de Mairie de Montrouge. + Veuillez annuler ce RDV avant d'en prendre un nouveau. + TXT + ) + end + end + + context "numéro de pré-demande ANTS a déjà un appointment mais les avertissements sont ignorés" do + subject { described_class.new(user, ignore_benign_errors: true, view_locals: { current_organisation: organisation }) } + + before do + stub_ants_status( + "VALID12345", + status: "validated", + appointments: [{ "meeting_point" => "Mairie de Montrouge", "management_url" => "http://rdvsympa.fr/123" }] + ) + end + + let(:user) { build(:user, ants_pre_demande_number: "VALID12345") } + + specify do + expect(subject.valid?).to be true + end + end + + context "l’API ANTS timeoute" do + before { allow(AntsApi).to receive(:status).and_raise(Typhoeus::Errors::TimeoutError) } + + let(:user) { build(:user, ants_pre_demande_number: "VALID12345") } + + specify do + expect(subject.valid?).to be false + expect(subject.errors.first.full_message).to eq("Numéro de pré-demande ANTS n'a pas pu être validé à cause d'une erreur inattendue. Merci de réessayer dans 30 secondes.") + end + end + end end diff --git a/spec/form_models/beneficiaire_form_spec.rb b/spec/form_models/beneficiaire_form_spec.rb index 30f41d800d..304602e929 100644 --- a/spec/form_models/beneficiaire_form_spec.rb +++ b/spec/form_models/beneficiaire_form_spec.rb @@ -22,7 +22,7 @@ } end - it do + specify do expect(form).to be_invalid expect(form.errors.first.full_message).to eq("Prénom doit être rempli(e)") end @@ -37,7 +37,7 @@ } end - it do + specify do expect(form).to be_invalid expect(form.errors.first.full_message).to eq("Nom d’usage doit être rempli(e)") end @@ -52,7 +52,7 @@ } end - it do + specify do expect(form).to be_invalid expect(form.benign_errors.first).to eq("Sans numéro de téléphone, aucune notification ne sera envoyée au bénéficiaire") end @@ -67,7 +67,7 @@ } end - it do + specify do expect(form).to be_invalid expect(form.errors.first.full_message).to eq("Téléphone n'est pas valide") end @@ -82,9 +82,124 @@ } end - it do + specify do expect(form).to be_invalid expect(form.errors.first.full_message).to eq("Téléphone ne permet pas de recevoir des SMS") end end + + context "pour un motif demandant un numéro de pré-demande ANTS" do + include_context "rdv_mairie_api_authentication" + let!(:territory) { create(:territory, :mairies) } + let!(:organisation) { create(:organisation, territory:, name: "Mairie de Wavignies") } + let!(:motif_category) { create(:motif_category, :passeport) } + let!(:motif) { create(:motif, organisation:, motif_category:) } + let(:params) do + { + motif_id: motif.id, + first_name: "Steve", + last_name: "Rogne", + phone_number: "0611223344", + ants_pre_demande_number:, + } + end + + context "numéro de pré-demande ANTS vide" do + let(:ants_pre_demande_number) { "" } + + specify do + expect(form).to be_invalid + expect(form.errors.first.full_message).to eq("Numéro de pré-demande ANTS doit comporter 10 chiffres et lettres") + end + end + + context "numéro de pré-demande ANTS mal formatté" do + let(:ants_pre_demande_number) { "ACSoup" } + + specify do + expect(form).to be_invalid + expect(form.errors.first.full_message).to eq("Numéro de pré-demande ANTS doit comporter 10 chiffres et lettres") + end + end + + context "numéro de pré-demande ANTS valide" do + before { stub_ants_status("VALID12345", status: "validated", appointments: []) } + + let(:ants_pre_demande_number) { "VALID12345" } + + specify do + expect(form).to be_valid + end + end + + context "numéro de pré-demande ANTS non-reconnu (status unknown)" do + before { stub_ants_status("VALID12345", status: "unknown", appointments: []) } + + let(:ants_pre_demande_number) { "VALID12345" } + + specify do + expect(form).to be_invalid + expect(form.errors.first.full_message).to eq("Numéro de pré-demande ANTS n'est pas reconnu par l'ANTS") + end + end + + context "numéro de pré-demande ANTS a déjà un appointment" do + before do + stub_ants_status( + "VALID12345", + status: "validated", + appointments: [{ "meeting_point" => "Mairie de Montrouge", "management_url" => "http://rdvsympa.fr/123" }] + ) + end + + let(:ants_pre_demande_number) { "VALID12345" } + + specify do + expect(form).to be_invalid + expect(form.errors.first.attribute).to eq(:_benign) + expect(form.errors.first.message).to eq( + <<-TXT.squish + Ce numéro de pré-demande ANTS est déjà utilisé pour un RDV auprès de Mairie de Montrouge. + Veuillez annuler ce RDV avant d'en prendre un nouveau. + TXT + ) + end + end + + context "numéro de pré-demande ANTS a déjà un appointment mais les avertissements sont ignorés" do + before do + stub_ants_status( + "VALID12345", + status: "validated", + appointments: [{ "meeting_point" => "Mairie de Montrouge", "management_url" => "http://rdvsympa.fr/123" }] + ) + end + + let(:params) do + { + motif_id: motif.id, + first_name: "Steve", + last_name: "Rogne", + phone_number: "0611223344", + ants_pre_demande_number: "VALID12345", + ignore_benign_errors: "true", + } + end + + specify do + expect(form).to be_valid + end + end + + context "l’API ANTS timeoute" do + before { allow(AntsApi).to receive(:status).and_raise(Typhoeus::Errors::TimeoutError) } + + let(:ants_pre_demande_number) { "VALID12345" } + + specify do + expect(form).to be_invalid + expect(form.errors.first.full_message).to eq("Numéro de pré-demande ANTS n'a pas pu être validé à cause d'une erreur inattendue. Merci de réessayer dans 30 secondes.") + end + end + end end diff --git a/spec/form_models/user_rdv_wizard_spec.rb b/spec/form_models/user_rdv_wizard_spec.rb index ada174ec29..147b40ffd2 100644 --- a/spec/form_models/user_rdv_wizard_spec.rb +++ b/spec/form_models/user_rdv_wizard_spec.rb @@ -61,6 +61,202 @@ it { expect(UserRdvWizard::Step1.new(user, attributes).save).to be true } end + context "pour un RDV de passeport ANTS Mairie" do + include_context "rdv_mairie_api_authentication" + let!(:territory) { create(:territory, :mairies) } + let!(:organisation) { create(:organisation, territory:, name: "Mairie de Wavignies") } + let!(:motif_category) { create(:motif_category, :passeport) } + let!(:motif) { create(:motif, organisation:, motif_category:) } + + context "l’usager fournit un numéro de pré-demande valide" do + before { stub_ants_status("VALID12345", status: "validated", appointments: []) } + + let(:attributes) do + { + starts_at: creneau.starts_at, + motif_id: motif.id, + lieu_id: lieu.id, + user_ids: [user_for_rdv.id], + user: { + first_name: "Léa", + last_name: "Boubakar", + phone_number: "0612345678", + ants_pre_demande_number: "VALID12345", + }, + departement: "62", + city_code: "62100", + } + end + + it { expect(UserRdvWizard::Step1.new(user, attributes).save).to be true } + end + + context "l’usager fournit un numéro de pré-demande vide" do + let(:attributes) do + { + starts_at: creneau.starts_at, + motif_id: motif.id, + lieu_id: nil, + user_ids: [user_for_rdv.id], + user: { + first_name: "Léa", + last_name: "Boubakar", + phone_number: "0612345678", + ants_pre_demande_number: "", + }, + departement: "62", + city_code: "62100", + } + end + + it "empêche la création" do + form = UserRdvWizard::Step1.new(user, attributes) + res = form.save + expect(res).to be false + expect(form.errors.count).to eq(1) + expect(form.errors.first.attribute).to eq(:ants_pre_demande_number) + expect(form.errors.first.message).to eq("doit comporter 10 chiffres et lettres") + # le message affiché est en fait celui sur le user + expect(form.user.errors.first.full_message).to eq("Numéro de pré-demande ANTS doit comporter 10 chiffres et lettres") + end + end + + context "l’usager fournit un numéro de pré-demande ANTS non reconnu" do + before { stub_ants_status("VALID12345", status: "unknown", appointments: []) } + + let(:attributes) do + { + starts_at: creneau.starts_at, + motif_id: motif.id, + lieu_id: nil, + user_ids: [user_for_rdv.id], + user: { + first_name: "Léa", + last_name: "Boubakar", + phone_number: "0612345678", + ants_pre_demande_number: "VALID12345", + }, + departement: "62", + city_code: "62100", + } + end + + it "empêche la création" do + form = UserRdvWizard::Step1.new(user, attributes) + res = form.save + expect(res).to be false + expect(form.errors.count).to eq(1) + expect(form.errors.first.attribute).to eq(:ants_pre_demande_number) + expect(form.user.errors.first.full_message).to eq("Numéro de pré-demande ANTS n'est pas reconnu par l'ANTS") + end + end + + context "l’usager fournit un numéro de pré-demande ANTS qui a déjà un appointment" do + before do + stub_ants_status( + "VALID12345", + status: "validated", + appointments: [{ "meeting_point" => "Mairie de Montrouge", "management_url" => "http://rdvsympa.fr/123" }] + ) + end + + let(:attributes) do + { + starts_at: creneau.starts_at, + motif_id: motif.id, + lieu_id: nil, + user_ids: [user_for_rdv.id], + user: { + first_name: "Léa", + last_name: "Boubakar", + phone_number: "0612345678", + ants_pre_demande_number: "VALID12345", + }, + departement: "62", + city_code: "62100", + } + end + + it "empêche la création" do + form = UserRdvWizard::Step1.new(user, attributes) + res = form.save + expect(res).to be false + expect(form.errors.count).to eq(1) + expect(form.errors.first.attribute).to eq(:_benign) + expect(form.errors.first.message).to eq( + <<-TXT.squish + Ce numéro de pré-demande ANTS est déjà utilisé pour un RDV auprès de Mairie de Montrouge. + Veuillez annuler ce RDV avant d'en prendre un nouveau. + TXT + ) + end + end + + context "l’usager fournit un numéro de pré-demande ANTS qui a déjà un appointment mais ignore les avertissements" do + before do + stub_ants_status( + "VALID12345", + status: "validated", + appointments: [{ "meeting_point" => "Mairie de Montrouge", "management_url" => "http://rdvsympa.fr/123" }] + ) + end + + let(:attributes) do + { + starts_at: creneau.starts_at, + motif_id: motif.id, + lieu_id: nil, + user_ids: [user_for_rdv.id], + user: { + first_name: "Léa", + last_name: "Boubakar", + phone_number: "0612345678", + ants_pre_demande_number: "VALID12345", + ignore_benign_errors: "true", + }, + departement: "62", + city_code: "62100", + } + end + + it "n’empêche pas la création" do + form = UserRdvWizard::Step1.new(user, attributes) + res = form.save + expect(res).to be true + end + end + + context "l’usager fournit un numéro de pré-demande ANTS valide mais l’API ANTS timeout" do + before { allow(AntsApi).to receive(:status).and_raise(Typhoeus::Errors::TimeoutError) } + + let(:attributes) do + { + starts_at: creneau.starts_at, + motif_id: motif.id, + lieu_id: nil, + user_ids: [user_for_rdv.id], + user: { + first_name: "Léa", + last_name: "Boubakar", + phone_number: "0612345678", + ants_pre_demande_number: "VALID12345", + }, + departement: "62", + city_code: "62100", + } + end + + it "empêche la création" do + form = UserRdvWizard::Step1.new(user, attributes) + res = form.save + expect(res).to be false + expect(form.errors.count).to eq(1) + expect(form.errors.first.attribute).to eq(:ants_pre_demande_number) + expect(form.user.errors.first.full_message).to eq("Numéro de pré-demande ANTS n'a pas pu être validé à cause d'une erreur inattendue. Merci de réessayer dans 30 secondes.") + end + end + end + context "when the motif is by phone" do let(:motif) { create(:motif, :by_phone, organisation: organisation) }