an admin can save it's api particulier token
Co-authored-by: François VANTOMME <akarzim@gmail.com>
This commit is contained in:
parent
4c0dd43055
commit
ee6d19e3ee
4 changed files with 111 additions and 1 deletions
|
@ -4,5 +4,38 @@ module NewAdministrateur
|
|||
|
||||
def api_particulier
|
||||
end
|
||||
|
||||
def show
|
||||
end
|
||||
|
||||
def update
|
||||
@procedure.api_particulier_token = token
|
||||
|
||||
if @procedure.valid? && fetch_scopes(token).any?
|
||||
@procedure.save
|
||||
|
||||
redirect_to admin_procedure_api_particulier_jeton_path(procedure_id: @procedure.id),
|
||||
notice: "Le jeton a bien été mis à jour"
|
||||
else
|
||||
flash.now.alert = "Mise à jour impossible : le jeton n'est pas valide<br /><br />Vérifier le auprès de <a href='https://datapass.api.gouv.fr/'>https://datapass.api.gouv.fr/</a>"
|
||||
render :show
|
||||
end
|
||||
rescue APIParticulier::Error::Unauthorized
|
||||
flash.now.alert = "Mise à jour impossible : le jeton n'a pas été trouvé ou n'est pas actif<br /><br />Vérifier le auprès de <a href='https://datapass.api.gouv.fr/'>https://datapass.api.gouv.fr/</a>"
|
||||
render :show
|
||||
rescue APIParticulier::Error::HttpError
|
||||
flash.now.alert = "Mise à jour impossible : une erreur réseau est survenue"
|
||||
render :show
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def fetch_scopes(token)
|
||||
@scopes ||= APIParticulier::API.new(token).scopes
|
||||
end
|
||||
|
||||
def token
|
||||
params[:procedure][:api_particulier_token]
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -0,0 +1,28 @@
|
|||
= render partial: 'new_administrateur/breadcrumbs',
|
||||
locals: { steps: [link_to('Démarches', admin_procedures_path),
|
||||
link_to(@procedure.libelle, admin_procedure_path(@procedure)),
|
||||
link_to('Jeton Particulier', admin_procedure_api_particulier_path(@procedure)),
|
||||
'Jeton'] }
|
||||
|
||||
.container
|
||||
%h1.page-title
|
||||
Configurer le jeton API Particulier
|
||||
|
||||
.container
|
||||
%h1
|
||||
= form_with model: @procedure, url: admin_procedure_api_particulier_jeton_path, local: true, html: { class: 'form' } do |f|
|
||||
%p.explication
|
||||
Démarches Simplifiées utilise
|
||||
= link_to 'API Particulier', "https://api.gouv.fr/les-api/api-particulier"
|
||||
qui permet de récupérer les données familiales (CAF).
|
||||
Si votre démarche nécessite des autorisations spécifiques que Démarches
|
||||
Simplifiées n'a pas par défaut, merci de renseigner ici le jeton
|
||||
= link_to 'API Particulier', "https://api.gouv.fr/les-api/api-particulier/demande-acces"
|
||||
propre à votre démarche.
|
||||
|
||||
= f.label :api_particulier_token, "Jeton"
|
||||
.desc.mb-2
|
||||
%p Il doit contenir au minimum 15 caractères.
|
||||
= f.password_field :api_particulier_token, class: 'form-control', required: :required
|
||||
.text-right
|
||||
= f.button 'Enregistrer', class: 'button primary send'
|
|
@ -400,7 +400,7 @@ Rails.application.routes.draw do
|
|||
get :api_particulier, controller: 'jeton_particulier'
|
||||
|
||||
resource 'api_particulier', only: [] do
|
||||
resource 'jeton', only: [:show]
|
||||
resource 'jeton', only: [:show, :update], controller: 'jeton_particulier'
|
||||
end
|
||||
|
||||
put 'clone'
|
||||
|
|
|
@ -3,6 +3,8 @@ describe NewAdministrateur::JetonParticulierController, type: :controller do
|
|||
let(:procedure) { create(:procedure, administrateur: admin) }
|
||||
|
||||
before do
|
||||
stub_const("API_PARTICULIER_URL", "https://particulier.api.gouv.fr/api")
|
||||
|
||||
sign_in(admin.user)
|
||||
end
|
||||
|
||||
|
@ -16,4 +18,51 @@ describe NewAdministrateur::JetonParticulierController, type: :controller do
|
|||
it { is_expected.to have_http_status(:success) }
|
||||
it { expect(subject.body).to have_content('Jeton API particulier') }
|
||||
end
|
||||
|
||||
describe "GET #show" do
|
||||
subject { get :show, params: { procedure_id: procedure.id } }
|
||||
|
||||
it { is_expected.to have_http_status(:success) }
|
||||
end
|
||||
|
||||
describe "PATCH #update" do
|
||||
let(:params) { { procedure_id: procedure.id, procedure: { api_particulier_token: token } } }
|
||||
|
||||
subject { patch :update, params: params }
|
||||
|
||||
context "when jeton has a valid shape" do
|
||||
let(:token) { "d7e9c9f4c3ca00caadde31f50fd4521a" }
|
||||
before do
|
||||
VCR.use_cassette(cassette) do
|
||||
subject
|
||||
end
|
||||
end
|
||||
|
||||
context "and the api response is a success" do
|
||||
let(:cassette) { "api_particulier/success/introspect" }
|
||||
|
||||
it { expect(flash.alert).to be_nil }
|
||||
it { expect(flash.notice).to eq("Le jeton a bien été mis à jour") }
|
||||
it { expect(procedure.reload.api_particulier_token).to eql(token) }
|
||||
end
|
||||
|
||||
context "and the api response is not unauthorized" do
|
||||
let(:cassette) { "api_particulier/unauthorized/introspect" }
|
||||
|
||||
it { expect(flash.alert).to include("Mise à jour impossible : le jeton n'a pas été trouvé ou n'est pas actif") }
|
||||
it { expect(flash.notice).to be_nil }
|
||||
it { expect(procedure.reload.api_particulier_token).not_to eql(token) }
|
||||
end
|
||||
end
|
||||
|
||||
context "when jeton is invalid and no call is made" do
|
||||
let(:token) { "jet0n 1nvalide" }
|
||||
|
||||
before { subject }
|
||||
|
||||
it { expect(flash.alert).to include("Mise à jour impossible : le jeton n'est pas valide") }
|
||||
it { expect(flash.notice).to be_nil }
|
||||
it { expect(procedure.reload.api_particulier_token).not_to eql(token) }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue