Skip to content

Commit

Permalink
clean(linters): cleanup code, enhance wording and test coverage
Browse files Browse the repository at this point in the history
  • Loading branch information
mfo committed Jun 7, 2024
1 parent 18549b2 commit 7e469be
Show file tree
Hide file tree
Showing 16 changed files with 128 additions and 62 deletions.
9 changes: 9 additions & 0 deletions app/assets/stylesheets/conditions_component.scss
Original file line number Diff line number Diff line change
Expand Up @@ -57,5 +57,14 @@ form.form > .conditionnel {
select.alert {
border-color: $dark-red;
}

&:first-child {
padding-left: 0;
}

&:last-child {
text-align: right;
padding-right: 0;
}
}
}
Original file line number Diff line number Diff line change
@@ -1,21 +1,30 @@
%div{ id: dom_id(@draft_revision, :ineligibilite_rules) }
= render Procedure::PendingRepublishComponent.new(procedure: @draft_revision.procedure, render_if: pending_changes?)
= render Conditions::ConditionsErrorsComponent.new(conditions: condition_per_row, source_tdcs: @source_tdcs)
%fieldset.fr-fieldset
%legend.fr-mx-1w.fr-label.fr-py-0.fr-mb-1w.fr-mt-2w
Règles d’inéligibilité
%span.fr-hint-text Vous pouvez utiliser 1 ou plusieurs critère pour bloquer le dépot
.fr-fieldset
= form_for(@draft_revision, url: change_admin_procedure_ineligibilite_rules_path(@draft_revision.procedure_id), html: { id: 'ineligibilite_form', class: 'width-100' }) do |f|
.fr-fieldset__element
.fr-toggle.fr-toggle--label-left
= f.check_box :ineligibilite_enabled, class: 'fr-toggle__input', data: @opt
= f.label :ineligibilite_enabled, "Bloquer le dépôt des dossiers répondant à des conditions d’inéligibilité", data: { 'fr-checked-label': "Activé", 'fr-unchecked-label': "Désactivé" }, class: 'fr-toggle__label'

.fr-fieldset__element= render Dsfr::InputComponent.new(form: f, attribute: :ineligibilite_message, input_type: :text_area, opts: {rows: 5})

.fr-mx-1w.fr-label.fr-py-0.fr-mb-1w.fr-mt-2w
Conditions d’inéligibilité
%span.fr-hint-text Vous pouvez utiliser une ou plusieurs condtions pour bloquer le dépot.
.fr-fieldset__element
= form_tag admin_procedure_ineligibilite_rules_path(@draft_revision.procedure_id), method: :patch, data: { turbo: true, controller: 'autosave' }, class: 'form width-100' do
.conditionnel.width-100
%table.condition-table
%thead
%tr
%th.fr-pt-0.far-left
%th.fr-pt-0.target Champ Cible
%th.fr-pt-0.operator Opérateur
%th.fr-pt-0.value Valeur
%th.fr-pt-0.delete-column
- if rows.size > 0
%thead
%tr
%th.fr-pt-0.far-left
%th.fr-pt-0.target Champ Cible
%th.fr-pt-0.operator Opérateur
%th.fr-pt-0.value Valeur
%th.fr-pt-0.delete-column
%tbody
- rows.each.with_index do |(targeted_champ, operator_name, value), row_index|
%tr
Expand All @@ -28,15 +37,13 @@
%tr
%td.text-right{ colspan: 5 }= add_condition_tag



= form_for(@draft_revision, url: change_admin_procedure_ineligibilite_rules_path(@draft_revision.procedure_id)) do |f|
.fr-fieldset__element= render Dsfr::InputComponent.new(form: f, attribute: :ineligibilite_message, input_type: :text_area, opts: {rows: 5})
.fr-fieldset__element
.fr-toggle
= f.check_box :ineligibilite_enabled, class: 'fr-toggle__input', data: @opt
= f.label :ineligibilite_enabled, "Inéligibilité des dossiers", data: { 'fr-checked-label': "Actif", 'fr-unchecked-label': "Inactif" }, class: 'fr-toggle__label'
%p.fr-hint-text Passer l’intérrupteur sur activé pour que les critères d’inéligibilité configurés s'appliquent


= render Procedure::FixedFooterComponent.new(procedure: @draft_revision.procedure, form: f, extra_class_names: 'fr-col-offset-md-2 fr-col-md-8')
.padded-fixed-footer
.fixed-footer
.fr-container
.fr-grid-row.fr-col-offset-md-2.fr-col-md-8
.fr-col-12
%ul.fr-btns-group.fr-btns-group--inline-md
%li
= link_to "Annuler et revenir à l'écran de gestion", admin_procedure_path(id: @draft_revision.procedure), class: 'fr-btn fr-btn--secondary', data: { confirm: 'Si vous avez fait des modifications elles ne seront pas sauvegardées.'}
%li
= button_tag "Enregistrer", class: "fr-btn", form: 'ineligibilite_form'
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ def initialize(procedure:)
def ready?
@procedure.draft_revision
.conditionable_types_de_champ
.present?
.present? && @procedure.draft_revision.ineligibilite_enabled
end

def error?
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
fr:
title: Inéligibilité des dossiers
state:
pending: Champs à configurer
pending: Désactivé
ready: À configurer
completed: Activé
subtitle: Gérez vos critères d’inéligibilité en fonction des champs du formulaire
subtitle: Gérez vos conditions d’inéligibilité en fonction des champs du formulaire
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,9 @@
= link_to edit_admin_procedure_ineligibilite_rules_path(@procedure), class: 'fr-tile fr-enlarge-link' do
.fr-tile__body.flex.column.align-center.justify-between
- if !ready?
%p.fr-badge.fr-badge--warning= t('.state.pending')
%p.fr-badge.fr-badge= t('.state.pending')
- elsif error?
%p.fr-badge.fr-badge--error À modifier
- elsif !completed?
%p.fr-badge.fr-badge--info= t('.state.ready')
- else
%p.fr-badge.fr-badge--success= t('.state.completed')
%div
Expand Down
3 changes: 2 additions & 1 deletion app/models/dossier.rb
Original file line number Diff line number Diff line change
Expand Up @@ -940,8 +940,9 @@ def check_mandatory_and_visible_champs
.filter(&:visible?)
.filter(&:mandatory_blank?)
.map do |champ|
errors.import(champ.errors.add(:value, :missing))
champ.errors.add(:value, :missing)
end
.each { errors.import(_1) }
end

def ineligibilite_rules_computable?
Expand Down
1 change: 0 additions & 1 deletion app/models/logic/or.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ def compute(champs = [])
@operands.map { |operand| operand.compute(champs) }.any?
end


def computable?(champs = [])
return true if sources.blank?

Expand Down
7 changes: 0 additions & 7 deletions app/models/procedure_revision.rb
Original file line number Diff line number Diff line change
Expand Up @@ -496,13 +496,6 @@ def ineligibilite_rules_are_valid?
end
end

def ineligibilite_rules_are_valid?
if ineligibilite_rules
ineligibilite_rules.errors(types_de_champ_for(scope: :public).to_a)
.each { errors.add(:ineligibilite_rules, :invalid) }
end
end

def replace_type_de_champ_by_clone(coordinate)
cloned_type_de_champ = coordinate.type_de_champ.deep_clone do |original, kopy|
ClonePiecesJustificativesService.clone_attachments(original, kopy)
Expand Down
6 changes: 3 additions & 3 deletions app/views/administrateurs/ineligibilite_rules/edit.html.haml
Original file line number Diff line number Diff line change
Expand Up @@ -12,17 +12,17 @@
= render Dsfr::AlertComponent.new(title: nil, size: :sm, state: :info, heading_level: 'h2', extra_class_names: 'fr-my-2w') do |c|
- c.with_body do
%p
Les dossiers répondant à vos critères d’inéligibilité ne pourront pas être déposés. Plus d’informations sur l’inéligibilité des dossiers dans la
Les dossiers répondant à vos conditions d’inéligibilité ne pourront pas être déposés. Plus d’informations sur l’inéligibilité des dossiers dans la
= link_to('doc', ELIGIBILITE_URL, title: "Document sur l’inéligibilité des dossiers", **external_link_attributes)

- if [email protected]_revision.conditionable_types_de_champ.present?
%p.fr-mt-2w.fr-mb-2w
Pour configurer l’inéligibilité des dossiers, votre formulaire doit comporter au moins un champ supportant les critères d’inéligibilité. Il vous faut donc ajouter au moins un des champs suivant à votre formulaire :
Pour configurer l’inéligibilité des dossiers, votre formulaire doit comporter au moins un champ supportant les conditions d’inéligibilité. Il vous faut donc ajouter au moins un des champs suivant à votre formulaire :
%ul
- Logic::ChampValue::MANAGED_TYPE_DE_CHAMP.values.each do
%li= "« #{t(_1, scope: [:activerecord, :attributes, :type_de_champ, :type_champs])} »"
%p.fr-mt-2w
= link_to 'Ajouter un champ supportant les critères d’inéligibilité', champs_admin_procedure_path(@procedure), class: 'fr-link fr-icon-arrow-right-line fr-link--icon-right'
= link_to 'Ajouter un champ supportant les conditions d’inéligibilité', champs_admin_procedure_path(@procedure), class: 'fr-link fr-icon-arrow-right-line fr-link--icon-right'
= render Procedure::FixedFooterComponent.new(procedure: @procedure)
- else
= render Conditions::IneligibiliteRulesComponent.new(draft_revision: @procedure.draft_revision)
2 changes: 1 addition & 1 deletion config/locales/fr.yml
Original file line number Diff line number Diff line change
Expand Up @@ -609,7 +609,7 @@ fr:
otp_attempt: 'Code OTP (uniquement si vous avez déjà activé 2FA)'
procedure:
zone: La démarche est mise en œuvre par
ineligibilite_rules: "Les règles d’Inéligibilité"
ineligibilite_rules: "Les règles d’inéligibilité"
champs:
value: Valeur du champ
default_mail_attributes: &default_mail_attributes
Expand Down
2 changes: 1 addition & 1 deletion config/locales/models/procedure/fr.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ fr:
procedure:
hints:
description: Décrivez en quelques lignes le contexte, la finalité, etc.
description_target_audience: Décrivez en quelques lignes les destinataires finaux de la démarche, les critères d’éligibilité s’il y en a, les pré-requis, etc.
description_target_audience: Décrivez en quelques lignes les destinataires finaux de la démarche, les conditions d’éligibilité s’il y en a, les pré-requis, etc.
description_pj: Décrivez la liste des pièces jointes à fournir s’il y en a
lien_site_web: "Il s'agit de la page de votre site web où le lien sera diffusé. Ex: https://exemple.gouv.fr/page_informant_sur_ma_demarche"
cadre_juridique: "Exemple: 'https://www.legifrance.gouv.fr/'"
Expand Down
7 changes: 7 additions & 0 deletions config/locales/models/procedure_revision/fr.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
fr:
activerecord:
attributes:
procedure_revision:
ineligibilite_message: Message d’inéligibilité
hints:
ineligibilite_message: "Ce message sera affiché à l’usager si son dossier est bloqué et lui expliquera la raison de son inéligibilité."
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
context 'types_de_champ_private' do
let(:is_annotation) { true }
it 'does not render public champs errors' do
expect(subject).to have_selector("a", "private")
expect(subject).to have_selector("a", text: "private")
expect(subject).to have_text("doit comporter au moins un choix sélectionnable")
expect(subject).not_to have_text("public")
end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -197,14 +197,14 @@
let(:types_de_champ_public) { [] }
render_views

it { expect(response.body).to have_link("Ajouter un champ supportant les critères d’inéligibilité") }
it { expect(response.body).to have_link("Ajouter un champ supportant les conditions d’inéligibilité") }
end

context 'rendered with tdc' do
let(:types_de_champ_public) { [{ type: :yes_no }] }
render_views

it { expect(response.body).not_to have_link("Ajouter un champ supportant les critères d’inéligibilité") }
it { expect(response.body).not_to have_link("Ajouter un champ supportant les conditions d’inéligibilité") }
end
end
end
Expand Down
8 changes: 4 additions & 4 deletions spec/system/administrateurs/procedure_ineligibilite_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,13 @@
scenario 'setup eligibilite' do
# explain no champ compatible
visit admin_procedure_path(procedure)
expect(page).to have_content("Champs à configurer")
expect(page).to have_content("Désactivé")

# explain which champs are compatible
visit edit_admin_procedure_ineligibilite_rules_path(procedure)
expect(page).to have_content("Inéligibilité des dossiers")
expect(page).to have_content("Pour configurer l’inéligibilité des dossiers, votre formulaire doit comporter au moins un champ supportant les critères d’inéligibilité. Il vous faut donc ajouter au moins un des champs suivant à votre formulaire : ")
click_on "Ajouter un champ supportant les critères d’inéligibilité"
expect(page).to have_content("Pour configurer l’inéligibilité des dossiers, votre formulaire doit comporter au moins un champ supportant les conditions d’inéligibilité. Il vous faut donc ajouter au moins un des champs suivant à votre formulaire : ")
click_on "Ajouter un champ supportant les conditions d’inéligibilité"

# setup a compatible champ
expect(page).to have_content('Champs du formulaire')
Expand All @@ -32,7 +32,7 @@
# setup rules and stuffs
expect(page).to have_content("Inéligibilité des dossiers")
fill_in "Message d’inéligibilité", with: "vous n'etes pas eligible"
find('label', text: 'Inéligibilité des dossiers').click
find('label', text: 'Bloquer le dépôt des dossiers répondant à des conditions d’inéligibilité').click
click_on "Ajouter une règle d’inéligibilité"
all('select').first.select 'Un champ oui non'
click_on 'Enregistrer'
Expand Down
76 changes: 64 additions & 12 deletions spec/system/users/dossier_ineligibilite_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

let(:published_revision) { procedure.published_revision }
let(:first_tdc) { published_revision.types_de_champ.first }
let(:second_tdc) { published_revision.types_de_champ.last }
let(:second_tdc) { published_revision.types_de_champ.second }
let(:ineligibilite_message) { 'sry vous pouvez aps soumettre votre dossier' }
let(:eligibilite_params) { { ineligibilite_enabled: true, ineligibilite_message: } }

Expand All @@ -18,7 +18,7 @@
login_as user, scope: :user
end

context 'single condition' do
describe 'ineligibilite_rules with a single BinaryOperator' do
let(:types_de_champ_public) { [{ type: :yes_no }] }
let(:ineligibilite_rules) { ds_eq(champ_value(first_tdc.stable_id), constant(true)) }

Expand All @@ -28,24 +28,31 @@
expect(page).to have_selector(:button, text: "Déposer le dossier", disabled: false)
expect(page).not_to have_content("Vous ne pouvez pas déposer votre dossier")

# does raise error when dossier is filled with valid condition
find("label", text: "Non").click
# does raise error when dossier is filled with condition that does not match
within "#champ-#{first_tdc.stable_id}" do
find("label", text: "Non").click
end
expect(page).to have_selector(:button, text: "Déposer le dossier", disabled: false)
expect(page).not_to have_content("Vous ne pouvez pas déposer votre dossier")

# raise error when dossier is filled with invalid condition
find("label", text: "Oui").click
# raise error when dossier is filled with condition that matches
within "#champ-#{first_tdc.stable_id}" do
find("label", text: "Oui").click
end
expect(page).to have_selector(:button, text: "Déposer le dossier", disabled: true)
expect(page).to have_content("Vous ne pouvez pas déposer votre dossier")

# reload page and see error because it was filled
# reload page and see error
visit brouillon_dossier_path(dossier)
expect(page).to have_selector(:button, text: "Déposer le dossier", disabled: true)
expect(page).to have_content("Vous ne pouvez pas déposer votre dossier")

# modal is closable, and we can change our dossier response to be eligible
within("#modal-eligibilite-rules-dialog") { click_on "Fermer" }
find("label", text: "Non").click
expect(page).to have_selector("#modal-eligibilite-rules-dialog", visible: false)
within "#champ-#{first_tdc.stable_id}" do
find("label", text: "Non").click
end
expect(page).to have_selector(:button, text: "Déposer le dossier", disabled: false)

# it works, yay
Expand All @@ -54,7 +61,7 @@
end
end

context 'or condition' do
describe 'ineligibilite_rules with a Or' do
let(:types_de_champ_public) { [{ type: :yes_no, libelle: 'l1' }, { type: :drop_down_list, libelle: 'l2', options: ['Paris', 'Marseille'] }] }
let(:ineligibilite_rules) do
ds_or([
Expand All @@ -69,15 +76,15 @@
expect(page).to have_selector(:button, text: "Déposer le dossier", disabled: false)
expect(page).not_to have_content("Vous ne pouvez pas déposer votre dossier")

# only one condition is matches, cannot submit dossier and error message is clear
# first condition matches (so ineligible), cannot submit dossier and error message is clear
within "#champ-#{first_tdc.stable_id}" do
find("label", text: "Oui").click
end
expect(page).to have_selector(:button, text: "Déposer le dossier", disabled: true)
expect(page).to have_content("Vous ne pouvez pas déposer votre dossier")
within("#modal-eligibilite-rules-dialog") { click_on "Fermer" }

# only one condition does not matches, I can conitnue
# first condition does not matches, I can conitnue
within "#champ-#{first_tdc.stable_id}" do
find("label", text: "Non").click
end
Expand All @@ -88,7 +95,7 @@
click_on "Accéder à votre dossier"
click_on "Modifier le dossier"

# one condition matches, means i'm blocked to send my file.
# first matches, means i'm blocked to send my file.
within "#champ-#{first_tdc.stable_id}" do
find("label", text: "Oui").click
end
Expand Down Expand Up @@ -116,4 +123,49 @@
wait_until { dossier.reload.en_construction? == true }
end
end

describe 'ineligibilite_rules with a And and all visible champs' do
let(:types_de_champ_public) { [{ type: :yes_no, libelle: 'l1' }, { type: :drop_down_list, libelle: 'l2', options: ['Paris', 'Marseille'] }] }
let(:ineligibilite_rules) do
ds_and([
ds_eq(champ_value(first_tdc.stable_id), constant(true)),
ds_eq(champ_value(second_tdc.stable_id), constant('Paris'))
])
end

scenario 'can submit, can not submit, can edit, etc...' do
visit brouillon_dossier_path(dossier)
# no error while dossier is empty
expect(page).to have_selector(:button, text: "Déposer le dossier", disabled: false)
expect(page).not_to have_content("Vous ne pouvez pas déposer votre dossier")

# only one condition is matches, can submit dossier
within "#champ-#{first_tdc.stable_id}" do
find("label", text: "Oui").click
end
expect(page).to have_selector(:button, text: "Déposer le dossier", disabled: false)
expect(page).not_to have_content("Vous ne pouvez pas déposer votre dossier")

# Now test dossier modification
click_on "Déposer le dossier"
click_on "Accéder à votre dossier"
click_on "Modifier le dossier"

# second condition matches, means i'm blocked to send my file
within "#champ-#{second_tdc.stable_id}" do
find("label", text: 'Paris').click
end
expect(page).to have_selector(:button, text: "Déposer les modifications", disabled: true)
within("#modal-eligibilite-rules-dialog") { click_on "Fermer" }

# none of conditions matches, i can submit
within "#champ-#{second_tdc.stable_id}" do
find("label", text: 'Marseille').click
end

# it works, yay
click_on "Déposer les modifications"
wait_until { dossier.reload.en_construction? == true }
end
end
end

0 comments on commit 7e469be

Please sign in to comment.