Skip to content

Commit

Permalink
Détecte l'erreur de "code campagne inconnu" proprement
Browse files Browse the repository at this point in the history
Le code précédent détournait "astucieusement" le message d'erreur du
validateur de la présence de la campagne quand le code campagne n'était pas connu.

Ceci posait un problème pour l'édition d'un évaluation qui indiquait
"code campagne inconnu" quand on ne renseignait pas de campagne.

On s'est pris les pied dans le tapis et nous retournions "doit être
rempli" aux évalué·es quand il ou elle remplissaint un code campagne
inconnu.

De plus, cette astuce nous a fait perdre un temps fou pour retrouver le
problème.
  • Loading branch information
etienneCharignon authored and shanser committed Feb 10, 2021
1 parent 7a3ec01 commit 1ef3eb1
Show file tree
Hide file tree
Showing 7 changed files with 70 additions and 36 deletions.
14 changes: 11 additions & 3 deletions app/controllers/api/evaluations_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,16 +9,20 @@ class EvaluationsController < ActionController::API
end

def create
evaluation = Evaluation.new(EvaluationParams.from(params))
evaluation = Evaluation.new(generateur_params_eval.params)
if evaluation.save
render json: evaluation, status: :created
else
render json: evaluation.errors, status: :unprocessable_entity
erreurs = evaluation.errors.messages
if generateur_params_eval.code_campagne_inconnu
erreurs['campagne'] = [I18n.t('admin.evaluations.code_campagne_inconnu')]
end
render json: erreurs, status: :unprocessable_entity
end
end

def update
if @evaluation.update EvaluationParams.from(params)
if @evaluation.update generateur_params_eval.params
render json: @evaluation
else
render json: @evaluation.errors, status: :unprocessable_entity
Expand All @@ -39,6 +43,10 @@ def show

private

def generateur_params_eval
@generateur_params_eval ||= GenerateurParamsEvaluation.new(params)
end

def trouve_evaluation
@evaluation = Evaluation.find(params[:id])
end
Expand Down
26 changes: 0 additions & 26 deletions app/params/evaluation_params.rb

This file was deleted.

26 changes: 26 additions & 0 deletions app/params/generateur_params_evaluation.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# frozen_string_literal: true

class GenerateurParamsEvaluation
attr_reader :code_campagne_inconnu, :params

def initialize(params)
@params = params.permit(
:nom,
:code_campagne,
:email,
:telephone
)
relie_campagne
end

private

def relie_campagne
code_campagne = @params.delete('code_campagne')
return if code_campagne.blank?

campagne = Campagne.find_by code: code_campagne
@code_campagne_inconnu = campagne.nil?
@params['campagne'] = campagne
end
end
2 changes: 1 addition & 1 deletion config/locales/models/evaluation.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ fr:
nom:
blank: doit être rempli
campagne:
required: code inexistant
required: doit être rempli
models:
evaluation:
one: Évaluation
Expand Down
1 change: 1 addition & 0 deletions config/locales/views/evaluations.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
fr:
admin:
evaluations:
code_campagne_inconnu: code inconnu
commun: &commun
efficience: Efficience
nombre_erreurs: "Nombre d'erreurs"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,20 @@

require 'rails_helper'

describe EvaluationParams do
describe GenerateurParamsEvaluation do
describe '#from' do
it 'filtre les parametres' do
params = ActionController::Parameters.new(
nom: 'mon nom',
autre_param: 'autre paramètre',
code_campagne: 'une campagne'
code_campagne: 'code campagne inexistant'
)

evaluation_params = described_class.from(params)
expect(evaluation_params.keys.sort).to eql(
evaluation_params = described_class.new(params)
expect(evaluation_params.params.keys.sort).to eql(
%w[campagne nom]
)
expect(evaluation_params.code_campagne_inconnu).to eql(true)
end
end
end
28 changes: 26 additions & 2 deletions spec/requests/evaluations_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,38 @@
end
end

context 'Quand une requête est invalide' do
context 'Quand le code campagne est inconnu' do
let(:payload_invalide) { { nom: '', code_campagne: 'ETE190' } }
before { post '/api/evaluations', params: payload_invalide }

it 'retourne une 422' do
json = JSON.parse(response.body)
expect(json.keys).to eq %w[nom campagne]
expect(json.values).to eq [['doit être rempli'], ['code inexistant']]
expect(json.values).to eq [['doit être rempli'], ['code inconnu']]
expect(response).to have_http_status(422)
end
end

context 'Quand une requête est invalide' do
let(:payload_invalide) { { nom: '', code_campagne: '' } }
before { post '/api/evaluations', params: payload_invalide }

it 'retourne une 422' do
json = JSON.parse(response.body)
expect(json.keys).to eq %w[nom campagne]
expect(json.values).to eq [['doit être rempli'], ['doit être rempli']]
expect(response).to have_http_status(422)
end
end

context 'Quand une requête est vide' do
let(:payload_invalide) { {} }
before { post '/api/evaluations', params: payload_invalide }

it 'retourne une 422' do
json = JSON.parse(response.body)
expect(json.keys).to eq %w[nom campagne]
expect(json.values).to eq [['doit être rempli'], ['doit être rempli']]
expect(response).to have_http_status(422)
end
end
Expand Down

0 comments on commit 1ef3eb1

Please sign in to comment.