Merge pull request #4620 from betagouv/dev

2019-12-04-03
This commit is contained in:
Pierre de La Morinerie 2019-12-04 17:55:18 +01:00 committed by GitHub
commit 798b014f8b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
23 changed files with 231 additions and 125 deletions

View file

@ -52,7 +52,7 @@ class Admin::ProceduresController < AdminController
def destroy def destroy
procedure = current_administrateur.procedures.find(params[:id]) procedure = current_administrateur.procedures.find(params[:id])
if procedure.publiee_ou_close? if procedure.locked?
return render json: {}, status: 401 return render json: {}, status: 401
end end

View file

@ -10,7 +10,7 @@ module Instructeurs
.procedures .procedures
.with_attached_logo .with_attached_logo
.includes(:defaut_groupe_instructeur) .includes(:defaut_groupe_instructeur)
.order(closed_at: :desc, archived_at: :desc, published_at: :desc, created_at: :desc) .order(closed_at: :desc, archived_at: :desc, unpublished_at: :desc, published_at: :desc, created_at: :desc)
dossiers = current_instructeur.dossiers.joins(:groupe_instructeur) dossiers = current_instructeur.dossiers.joins(:groupe_instructeur)
@dossiers_count_per_procedure = dossiers.all_state.group('groupe_instructeurs.procedure_id').reorder(nil).count @dossiers_count_per_procedure = dossiers.all_state.group('groupe_instructeurs.procedure_id').reorder(nil).count

View file

@ -25,6 +25,7 @@ class ProcedureDashboard < Administrate::BaseDashboard
for_individual: Field::Boolean, for_individual: Field::Boolean,
auto_archive_on: Field::DateTime, auto_archive_on: Field::DateTime,
published_at: Field::DateTime, published_at: Field::DateTime,
unpublished_at: Field::DateTime,
hidden_at: Field::DateTime, hidden_at: Field::DateTime,
closed_at: Field::DateTime, closed_at: Field::DateTime,
whitelisted_at: Field::DateTime, whitelisted_at: Field::DateTime,
@ -48,7 +49,8 @@ class ProcedureDashboard < Administrate::BaseDashboard
:libelle, :libelle,
:service, :service,
:dossiers, :dossiers,
:published_at :published_at,
:unpublished_at
].freeze ].freeze
# SHOW_PAGE_ATTRIBUTES # SHOW_PAGE_ATTRIBUTES

View file

@ -209,6 +209,11 @@ type Demarche {
""" """
dateCreation: ISO8601DateTime! dateCreation: ISO8601DateTime!
"""
Date de la dépublication.
"""
dateDepublication: ISO8601DateTime
""" """
Date de la dernière modification. Date de la dernière modification.
""" """
@ -309,6 +314,11 @@ enum DemarcheState {
""" """
close close
"""
Depubliee
"""
depubliee
""" """
Publiée Publiée
""" """

View file

@ -26,6 +26,7 @@ module Types
field :date_creation, GraphQL::Types::ISO8601DateTime, "Date de la création.", null: false, method: :created_at field :date_creation, GraphQL::Types::ISO8601DateTime, "Date de la création.", null: false, method: :created_at
field :date_publication, GraphQL::Types::ISO8601DateTime, "Date de la publication.", null: false, method: :published_at field :date_publication, GraphQL::Types::ISO8601DateTime, "Date de la publication.", null: false, method: :published_at
field :date_derniere_modification, GraphQL::Types::ISO8601DateTime, "Date de la dernière modification.", null: false, method: :updated_at field :date_derniere_modification, GraphQL::Types::ISO8601DateTime, "Date de la dernière modification.", null: false, method: :updated_at
field :date_depublication, GraphQL::Types::ISO8601DateTime, "Date de la dépublication.", null: true, method: :unpublished_at
field :date_fermeture, GraphQL::Types::ISO8601DateTime, "Date de la fermeture.", null: true, method: :closed_at field :date_fermeture, GraphQL::Types::ISO8601DateTime, "Date de la fermeture.", null: true, method: :closed_at
field :groupe_instructeurs, [Types::GroupeInstructeurType], null: false field :groupe_instructeurs, [Types::GroupeInstructeurType], null: false

View file

@ -14,7 +14,7 @@ class Administrateur < ApplicationRecord
before_validation -> { sanitize_email(:email) } before_validation -> { sanitize_email(:email) }
scope :inactive, -> { joins(:user).where(users: { last_sign_in_at: nil }) } scope :inactive, -> { joins(:user).where(users: { last_sign_in_at: nil }) }
scope :with_publiees_ou_closes, -> { joins(:procedures).where(procedures: { aasm_state: [:publiee, :archivee, :close] }) } scope :with_publiees_ou_closes, -> { joins(:procedures).where(procedures: { aasm_state: [:publiee, :archivee, :close, :depubliee] }) }
# validate :password_complexity, if: Proc.new { |a| Devise.password_length.include?(a.password.try(:size)) } # validate :password_complexity, if: Proc.new { |a| Devise.password_length.include?(a.password.try(:size)) }

View file

@ -267,7 +267,7 @@ class Dossier < ApplicationRecord
end end
def can_transition_to_en_construction? def can_transition_to_en_construction?
!procedure.close? && brouillon? brouillon? && procedure.dossier_can_transition_to_en_construction?
end end
def can_be_updated_by_user? def can_be_updated_by_user?

View file

@ -46,8 +46,8 @@ class Procedure < ApplicationRecord
default_scope { where(hidden_at: nil) } default_scope { where(hidden_at: nil) }
scope :brouillons, -> { where(aasm_state: :brouillon) } scope :brouillons, -> { where(aasm_state: :brouillon) }
scope :publiees, -> { where(aasm_state: :publiee) } scope :publiees, -> { where(aasm_state: :publiee) }
scope :closes, -> { where(aasm_state: [:archivee, :close]) } scope :closes, -> { where(aasm_state: [:archivee, :close, :depubliee]) }
scope :publiees_ou_closes, -> { where(aasm_state: [:publiee, :close, :archivee]) } scope :publiees_ou_closes, -> { where(aasm_state: [:publiee, :close, :archivee, :depubliee]) }
scope :by_libelle, -> { order(libelle: :asc) } scope :by_libelle, -> { order(libelle: :asc) }
scope :created_during, -> (range) { where(created_at: range) } scope :created_during, -> (range) { where(created_at: range) }
scope :cloned_from_library, -> { where(cloned_from_library: true) } scope :cloned_from_library, -> { where(cloned_from_library: true) }
@ -77,7 +77,7 @@ class Procedure < ApplicationRecord
validates :lien_site_web, presence: true, if: :publiee? validates :lien_site_web, presence: true, if: :publiee?
validate :validate_for_publication, on: :publication validate :validate_for_publication, on: :publication
validate :check_juridique validate :check_juridique
validates :path, presence: true, format: { with: /\A[a-z0-9_\-]{3,50}\z/ }, uniqueness: { scope: [:path, :closed_at, :archived_at, :hidden_at], case_sensitive: false } validates :path, presence: true, format: { with: /\A[a-z0-9_\-]{3,50}\z/ }, uniqueness: { scope: [:path, :closed_at, :hidden_at, :unpublished_at], case_sensitive: false }
# FIXME: remove duree_conservation_required flag once all procedures are converted to the new style # FIXME: remove duree_conservation_required flag once all procedures are converted to the new style
validates :duree_conservation_dossiers_dans_ds, allow_nil: false, numericality: { only_integer: true, greater_than_or_equal_to: 1, less_than_or_equal_to: MAX_DUREE_CONSERVATION }, if: :durees_conservation_required validates :duree_conservation_dossiers_dans_ds, allow_nil: false, numericality: { only_integer: true, greater_than_or_equal_to: 1, less_than_or_equal_to: MAX_DUREE_CONSERVATION }, if: :durees_conservation_required
validates :duree_conservation_dossiers_hors_ds, allow_nil: false, numericality: { only_integer: true, greater_than_or_equal_to: 0 }, if: :durees_conservation_required validates :duree_conservation_dossiers_hors_ds, allow_nil: false, numericality: { only_integer: true, greater_than_or_equal_to: 0 }, if: :durees_conservation_required
@ -97,10 +97,12 @@ class Procedure < ApplicationRecord
state :publiee state :publiee
state :close state :close
state :hidden state :hidden
state :depubliee
event :publish, before: :before_publish, after: :after_publish do event :publish, before: :before_publish, after: :after_publish do
transitions from: :brouillon, to: :publiee transitions from: :brouillon, to: :publiee
transitions from: :close, to: :publiee transitions from: :close, to: :publiee
transitions from: :depubliee, to: :publiee
end end
event :close, after: :after_close do event :close, after: :after_close do
@ -112,6 +114,10 @@ class Procedure < ApplicationRecord
transitions from: :publiee, to: :hidden transitions from: :publiee, to: :hidden
transitions from: :close, to: :hidden transitions from: :close, to: :hidden
end end
event :unpublish, after: :after_unpublish do
transitions from: :publiee, to: :depubliee
end
end end
def publish_or_reopen!(administrateur) def publish_or_reopen!(administrateur)
@ -122,7 +128,7 @@ class Procedure < ApplicationRecord
other_procedure = other_procedure_with_path(path) other_procedure = other_procedure_with_path(path)
if other_procedure.present? && administrateur.owns?(other_procedure) if other_procedure.present? && administrateur.owns?(other_procedure)
other_procedure.close! other_procedure.unpublish!
end end
publish! publish!
@ -282,15 +288,15 @@ class Procedure < ApplicationRecord
end end
def locked? def locked?
publiee_ou_close? publiee? || close? || depubliee?
end end
def accepts_new_dossiers? def accepts_new_dossiers?
!close? publiee? || brouillon?
end end
def publiee_ou_close? def dossier_can_transition_to_en_construction?
publiee? || close? accepts_new_dossiers? || depubliee?
end end
def expose_legacy_carto_api? def expose_legacy_carto_api?
@ -379,6 +385,7 @@ class Procedure < ApplicationRecord
procedure.aasm_state = :brouillon procedure.aasm_state = :brouillon
procedure.archived_at = nil procedure.archived_at = nil
procedure.closed_at = nil procedure.closed_at = nil
procedure.unpublished_at = nil
procedure.published_at = nil procedure.published_at = nil
procedure.lien_notice = nil procedure.lien_notice = nil
@ -615,7 +622,7 @@ class Procedure < ApplicationRecord
end end
def before_publish def before_publish
update!(archived_at: nil, closed_at: nil) update!(archived_at: nil, closed_at: nil, unpublished_at: nil)
end end
def after_publish def after_publish
@ -635,6 +642,10 @@ class Procedure < ApplicationRecord
purge_export_files purge_export_files
end end
def after_unpublish
update!(unpublished_at: Time.zone.now)
end
def update_juridique_required def update_juridique_required
self.juridique_required ||= (cadre_juridique.present? || deliberation.attached?) self.juridique_required ||= (cadre_juridique.present? || deliberation.attached?)
true true

View file

@ -19,13 +19,13 @@
%td.col-xs-6= link_to(procedure.libelle, admin_procedure_href) %td.col-xs-6= link_to(procedure.libelle, admin_procedure_href)
- if procedure.publiee? - if procedure.publiee?
%td.procedure-lien= link_to(procedure_lien(procedure), procedure_lien(procedure)) %td.procedure-lien= link_to(procedure_lien(procedure), procedure_lien(procedure))
- if procedure.publiee_ou_close? - if procedure.locked?
%td= link_to(procedure.published_at.present? ? try_format_datetime(procedure.published_at) : "", admin_procedure_href) %td= link_to(procedure.published_at.present? ? try_format_datetime(procedure.published_at) : "", admin_procedure_href)
- else - else
%td= link_to(try_format_datetime(procedure.created_at), admin_procedure_href) %td= link_to(try_format_datetime(procedure.created_at), admin_procedure_href)
%td %td
= link_to('Cloner', admin_procedure_clone_path(procedure.id), data: { method: :put }, class: 'btn-sm btn-primary clone-btn') = link_to('Cloner', admin_procedure_clone_path(procedure.id), data: { method: :put }, class: 'btn-sm btn-primary clone-btn')
- if !procedure.publiee_ou_close? - if !procedure.locked?
= link_to('X', url_for(controller: 'admin/procedures', action: :destroy, id: procedure.id), data: { method: :delete, confirm: "Confirmez-vous la suppression de la démarche ? \n\n Attention : toute suppression est définitive et sappliquera aux éventuels autres administrateurs de cette démarche !" }, class: 'btn-sm btn-danger') = link_to('X', url_for(controller: 'admin/procedures', action: :destroy, id: procedure.id), data: { method: :delete, confirm: "Confirmez-vous la suppression de la démarche ? \n\n Attention : toute suppression est définitive et sappliquera aux éventuels autres administrateurs de cette démarche !" }, class: 'btn-sm btn-danger')
= smart_listing.paginate = smart_listing.paginate

View file

@ -0,0 +1,63 @@
%ul.procedure-list
- procedures.each do |p|
%li.procedure-item.flex.align-start
= link_to(instructeur_procedure_path(p)) do
.flex
.procedure-logo{ style: "background-image: url(#{p.logo_url})" }
.procedure-details
%p.procedure-title
= procedure_libelle p
%ul.procedure-stats.flex
%li
%object
= link_to(instructeur_procedure_path(p, statut: 'a-suivre')) do
- a_suivre_count = dossiers_a_suivre_count_per_procedure[p.id] || 0
.stats-number
= a_suivre_count
.stats-legend
à suivre
%li
%object
= link_to(instructeur_procedure_path(p, statut: 'suivis')) do
- if current_instructeur.procedures_with_notifications(:en_cours).include?(p)
%span.notifications{ 'aria-label': "notifications" }
- followed_count = followed_dossiers_count_per_procedure[p.id] || 0
.stats-number
= followed_count
.stats-legend
= t('pluralize.followed', count: followed_count)
%li
%object
= link_to(instructeur_procedure_path(p, statut: 'traites')) do
- if current_instructeur.procedures_with_notifications(:termine).include?(p)
%span.notifications{ 'aria-label': "notifications" }
- termines_count = dossiers_termines_count_per_procedure[p.id] || 0
.stats-number
= termines_count
.stats-legend
= t('pluralize.processed', count: termines_count)
%li
%object
= link_to(instructeur_procedure_path(p, statut: 'tous')) do
- dossier_count = dossiers_count_per_procedure[p.id] || 0
.stats-number
= dossier_count
.stats-legend
= t('pluralize.case', count: dossier_count)
%li
%object
= link_to(instructeur_procedure_path(p, statut: 'archives')) do
- archived_count = dossiers_archived_count_per_procedure[p.id] || 0
.stats-number
= archived_count
.stats-legend
= t('pluralize.archived', count: archived_count)
- if p.close?
.procedure-status
%span.label Close
- elsif p.depubliee?
.procedure-status
%span.label Dépubliée

View file

@ -3,64 +3,9 @@
.container .container
%h1.page-title Démarches %h1.page-title Démarches
%ul.procedure-list = render partial: 'instructeurs/procedures/list', locals: { procedures: @procedures,
- @procedures.each do |p| dossiers_count_per_procedure: @dossiers_count_per_procedure,
%li.procedure-item.flex.align-start dossiers_a_suivre_count_per_procedure: @dossiers_a_suivre_count_per_procedure,
= link_to(instructeur_procedure_path(p)) do dossiers_archived_count_per_procedure: @dossiers_archived_count_per_procedure,
.flex dossiers_termines_count_per_procedure: @dossiers_termines_count_per_procedure,
followed_dossiers_count_per_procedure: @followed_dossiers_count_per_procedure }
.procedure-logo{ style: "background-image: url(#{p.logo_url})" }
.procedure-details
%p.procedure-title
= procedure_libelle p
%ul.procedure-stats.flex
%li
%object
= link_to(instructeur_procedure_path(p, statut: 'a-suivre')) do
- a_suivre_count = @dossiers_a_suivre_count_per_procedure[p.id] || 0
.stats-number
= a_suivre_count
.stats-legend
à suivre
%li
%object
= link_to(instructeur_procedure_path(p, statut: 'suivis')) do
- if current_instructeur.procedures_with_notifications(:en_cours).include?(p)
%span.notifications{ 'aria-label': "notifications" }
- followed_count = @followed_dossiers_count_per_procedure[p.id] || 0
.stats-number
= followed_count
.stats-legend
= t('pluralize.followed', count: followed_count)
%li
%object
= link_to(instructeur_procedure_path(p, statut: 'traites')) do
- if current_instructeur.procedures_with_notifications(:termine).include?(p)
%span.notifications{ 'aria-label': "notifications" }
- termines_count = @dossiers_termines_count_per_procedure[p.id] || 0
.stats-number
= termines_count
.stats-legend
= t('pluralize.processed', count: termines_count)
%li
%object
= link_to(instructeur_procedure_path(p, statut: 'tous')) do
- dossier_count = @dossiers_count_per_procedure[p.id] || 0
.stats-number
= dossier_count
.stats-legend
= t('pluralize.case', count: dossier_count)
%li
%object
= link_to(instructeur_procedure_path(p, statut: 'archives')) do
- archived_count = @dossiers_archived_count_per_procedure[p.id] || 0
.stats-number
= archived_count
.stats-legend
= t('pluralize.archived', count: archived_count)
- if p.close?
.procedure-status
%span.label Close

View file

@ -1,5 +1,6 @@
#main-container{ class: "col-xs-#{main_container_size}" } #main-container{ class: "col-xs-#{main_container_size}" }
.row .row
= render partial: 'layouts/strike_banner'
= render partial: 'layouts/outdated_browser_banner' = render partial: 'layouts/outdated_browser_banner'
= render partial: 'layouts/pre_maintenance' = render partial: 'layouts/pre_maintenance'
.row .row

View file

@ -0,0 +1,8 @@
#strike-banner.site-banner
.container
.site-banner-icon ⚠️
.site-banner-text
%strong
En raison dune grève nationale interprofessionnelle, une partie des personnels ne travaille pas.
%br
Les délais de réponse aux questions techniques pourront être perturbés pendant les prochains jours.

View file

@ -26,8 +26,10 @@
%body{ id: content_for(:page_id), class: browser.platform.ios? ? 'ios' : nil } %body{ id: content_for(:page_id), class: browser.platform.ios? ? 'ios' : nil }
.page-wrapper .page-wrapper
= render partial: 'layouts/strike_banner'
= render partial: "layouts/outdated_browser_banner" = render partial: "layouts/outdated_browser_banner"
= render partial: 'layouts/pre_maintenance' = render partial: 'layouts/pre_maintenance'
- if staging? - if staging?
#beta #beta
Env Test Env Test

View file

@ -2,6 +2,7 @@
Browser.modern_rules.clear Browser.modern_rules.clear
Browser.modern_rules << -> b { b.chrome? && b.version.to_i >= 50 && !b.platform.ios? } Browser.modern_rules << -> b { b.chrome? && b.version.to_i >= 50 && !b.platform.ios? }
Browser.modern_rules << -> b { b.edge? && b.version.to_i >= 14 && !b.compatibility_view? } Browser.modern_rules << -> b { b.edge? && b.version.to_i >= 14 && !b.compatibility_view? }
Browser.modern_rules << -> b { b.ie? && b.version.to_i >= 11 && !b.compatibility_view? }
Browser.modern_rules << -> b { b.firefox? && b.version.to_i >= 50 && !b.platform.ios? } Browser.modern_rules << -> b { b.firefox? && b.version.to_i >= 50 && !b.platform.ios? }
Browser.modern_rules << -> b { b.opera? && b.version.to_i >= 40 } Browser.modern_rules << -> b { b.opera? && b.version.to_i >= 40 }
Browser.modern_rules << -> b { b.safari? && b.version.to_i >= 8 } Browser.modern_rules << -> b { b.safari? && b.version.to_i >= 8 }

View file

@ -164,7 +164,7 @@ fr:
attributes: attributes:
path: path:
taken: est déjà utilisé par une démarche. Vous ne pouvez pas lutiliser car il appartient à un autre administrateur. taken: est déjà utilisé par une démarche. Vous ne pouvez pas lutiliser car il appartient à un autre administrateur.
taken_can_be_claimed: est identique à celui dune autre de vos démarches publiées. Si vous publiez cette démarche, lancienne sera archivée et ne sera plus accessible au public. taken_can_be_claimed: est identique à celui dune autre de vos démarches publiées. Si vous publiez cette démarche, lancienne sera dépubliée et ne sera plus accessible au public. Les utilisateurs qui ont commencé un brouillon vont pouvoir le déposer.
invalid: n'est pas valide. Il doit comporter au moins 3 caractères, au plus 50 caractères et seuls les caractères a-z, 0-9, '_' et '-' sont autorisés. invalid: n'est pas valide. Il doit comporter au moins 3 caractères, au plus 50 caractères et seuls les caractères a-z, 0-9, '_' et '-' sont autorisés.
errors: errors:

View file

@ -0,0 +1,5 @@
class AddUnpublishedAtToProcedures < ActiveRecord::Migration[5.2]
def change
add_column :procedures, :unpublished_at, :datetime
end
end

View file

@ -490,6 +490,7 @@ ActiveRecord::Schema.define(version: 2019_11_28_081324) do
t.boolean "xlsx_export_queued" t.boolean "xlsx_export_queued"
t.boolean "ods_export_queued" t.boolean "ods_export_queued"
t.datetime "closed_at" t.datetime "closed_at"
t.datetime "unpublished_at"
t.index ["declarative_with_state"], name: "index_procedures_on_declarative_with_state" t.index ["declarative_with_state"], name: "index_procedures_on_declarative_with_state"
t.index ["hidden_at"], name: "index_procedures_on_hidden_at" t.index ["hidden_at"], name: "index_procedures_on_hidden_at"
t.index ["parent_procedure_id"], name: "index_procedures_on_parent_procedure_id" t.index ["parent_procedure_id"], name: "index_procedures_on_parent_procedure_id"

View file

@ -184,8 +184,8 @@ describe Admin::ProceduresController, type: :controller do
expect(flash[:notice]).to have_content 'Démarche publiée' expect(flash[:notice]).to have_content 'Démarche publiée'
end end
it 'archive previous procedure' do it 'depubliee previous procedure' do
expect(procedure2.close?).to be_truthy expect(procedure2.depubliee?).to be_truthy
end end
end end

View file

@ -168,6 +168,14 @@ FactoryBot.define do
end end
end end
trait :unpublished do
after(:build) do |procedure, _evaluator|
procedure.path = generate(:published_path)
procedure.publish!
procedure.unpublish!
end
end
trait :hidden do trait :hidden do
after(:build) do |procedure, _evaluator| after(:build) do |procedure, _evaluator|
procedure.path = generate(:published_path) procedure.path = generate(:published_path)

View file

@ -29,7 +29,7 @@ feature 'As an administrateur I wanna clone a procedure', js: true do
within '#publish-modal' do within '#publish-modal' do
expect(find_field('procedure_path').value).to eq 'libelle-de-la-procedure' expect(find_field('procedure_path').value).to eq 'libelle-de-la-procedure'
expect(page).to have_text('ancienne sera archivée') expect(page).to have_text('ancienne sera dépubliée')
fill_in 'lien_site_web', with: 'http://some.website' fill_in 'lien_site_web', with: 'http://some.website'
click_on 'publish' click_on 'publish'
end end

View file

@ -3,29 +3,29 @@ require 'spec_helper'
feature 'Outdated browsers support:' do feature 'Outdated browsers support:' do
context 'when the user browser is outdated' do context 'when the user browser is outdated' do
before(:each) do before(:each) do
ie_11_user_agent = 'Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko' ie_10_user_agent = 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)'
Capybara.page.driver.header('user-agent', ie_11_user_agent) Capybara.page.driver.header('user-agent', ie_10_user_agent)
end end
scenario 'a banner is displayed' do scenario 'a banner is displayed' do
visit new_user_session_path visit new_user_session_path
expect(page).to have_content('Internet Explorer 11 est trop ancien') expect(page).to have_content('Internet Explorer 10 est trop ancien')
end end
scenario 'the banner can be dismissed' do scenario 'the banner can be dismissed' do
visit new_user_session_path visit new_user_session_path
expect(page).to have_content('Internet Explorer 11 est trop ancien') expect(page).to have_content('Internet Explorer 10 est trop ancien')
# The banner is hidden immediately # The banner is hidden immediately
within '#outdated-browser-banner' do within '#outdated-browser-banner' do
click_on 'Ignorer' click_on 'Ignorer'
end end
expect(page).not_to have_content('Internet Explorer 11 est trop ancien') expect(page).not_to have_content('Internet Explorer 10 est trop ancien')
expect(page).to have_current_path(new_user_session_path) expect(page).to have_current_path(new_user_session_path)
# The banner is hidden after a refresh # The banner is hidden after a refresh
page.refresh page.refresh
expect(page).not_to have_content('Internet Explorer 11 est trop ancien') expect(page).not_to have_content('Internet Explorer 10 est trop ancien')
end end
end end
end end

View file

@ -336,22 +336,6 @@ describe Procedure do
end end
end end
describe 'locked?' do
let(:procedure) { create(:procedure, aasm_state: aasm_state) }
subject { procedure.locked? }
context 'when procedure is in brouillon status' do
let(:aasm_state) { :brouillon }
it { is_expected.to be_falsey }
end
context 'when procedure is in publiee status' do
let(:aasm_state) { :publiee }
it { is_expected.to be_truthy }
end
end
describe 'active' do describe 'active' do
let(:procedure) { create(:procedure) } let(:procedure) { create(:procedure) }
subject { Procedure.active(procedure.id) } subject { Procedure.active(procedure.id) }
@ -514,6 +498,7 @@ describe Procedure do
it 'Not published nor closed' do it 'Not published nor closed' do
expect(subject.closed_at).to be_nil expect(subject.closed_at).to be_nil
expect(subject.published_at).to be_nil expect(subject.published_at).to be_nil
expect(subject.unpublished_at).to be_nil
expect(subject.aasm_state).to eq "brouillon" expect(subject.aasm_state).to eq "brouillon"
expect(subject.path).not_to be_nil expect(subject.path).not_to be_nil
end end
@ -549,59 +534,122 @@ describe Procedure do
let(:procedure) { create(:procedure, path: 'example-path') } let(:procedure) { create(:procedure, path: 'example-path') }
let(:now) { Time.zone.now.beginning_of_minute } let(:now) { Time.zone.now.beginning_of_minute }
after { Timecop.return }
context "without parent procedure" do
before do before do
Timecop.freeze(now) Timecop.freeze(now)
procedure.publish! procedure.publish!
end end
it do
expect(procedure.closed_at).to be_nil
expect(procedure.published_at).to eq(now)
expect(Procedure.find_by(path: "example-path")).to eq(procedure)
expect(Procedure.find_by(path: "example-path").administrateurs).to eq(procedure.administrateurs)
end
end
end
describe "#publish_or_reopen!" do
let(:published_procedure) { create(:procedure, :published) }
let(:administrateur) { published_procedure.administrateurs.first }
let(:procedure) { create(:procedure, administrateurs: [administrateur]) }
let(:now) { Time.zone.now.beginning_of_minute }
context "without parent procedure" do
before do
Timecop.freeze(now)
procedure.path = published_procedure.path
procedure.publish_or_reopen!(administrateur)
end
it do
expect(procedure.closed_at).to be_nil
expect(procedure.published_at).to eq(now)
end
end
end
describe "#unpublish!" do
let(:procedure) { create(:procedure, :published) }
let(:now) { Time.zone.now.beginning_of_minute }
before do
Timecop.freeze(now)
procedure.unpublish!
end
after { Timecop.return } after { Timecop.return }
it { expect(procedure.closed_at).to eq(nil) } it {
it { expect(procedure.published_at).to eq(now) } expect(procedure.closed_at).to eq(nil)
it { expect(Procedure.find_by(path: "example-path")).to eq(procedure) } expect(procedure.published_at).not_to be_nil
it { expect(Procedure.find_by(path: "example-path").administrateurs).to eq(procedure.administrateurs) } expect(procedure.unpublished_at).to eq(now)
}
end end
describe "#brouillon?" do describe "#brouillon?" do
let(:procedure_brouillon) { Procedure.new() } let(:procedure_brouillon) { build(:procedure) }
let(:procedure_publiee) { Procedure.new(aasm_state: :publiee, published_at: Time.zone.now) } let(:procedure_publiee) { build(:procedure, :published) }
let(:procedure_close) { Procedure.new(aasm_state: :close, published_at: Time.zone.now, closed_at: Time.zone.now) } let(:procedure_close) { build(:procedure, :closed) }
let(:procedure_depubliee) { build(:procedure, :unpublished) }
it { expect(procedure_brouillon.brouillon?).to be_truthy } it { expect(procedure_brouillon.brouillon?).to be_truthy }
it { expect(procedure_publiee.brouillon?).to be_falsey } it { expect(procedure_publiee.brouillon?).to be_falsey }
it { expect(procedure_close.brouillon?).to be_falsey } it { expect(procedure_close.brouillon?).to be_falsey }
it { expect(procedure_depubliee.brouillon?).to be_falsey }
end end
describe "#publiee?" do describe "#publiee?" do
let(:procedure_brouillon) { Procedure.new() } let(:procedure_brouillon) { build(:procedure) }
let(:procedure_publiee) { Procedure.new(aasm_state: :publiee, published_at: Time.zone.now) } let(:procedure_publiee) { build(:procedure, :published) }
let(:procedure_close) { Procedure.new(aasm_state: :close, published_at: Time.zone.now, closed_at: Time.zone.now) } let(:procedure_close) { build(:procedure, :closed) }
let(:procedure_depubliee) { build(:procedure, :unpublished) }
it { expect(procedure_brouillon.publiee?).to be_falsey } it { expect(procedure_brouillon.publiee?).to be_falsey }
it { expect(procedure_publiee.publiee?).to be_truthy } it { expect(procedure_publiee.publiee?).to be_truthy }
it { expect(procedure_close.publiee?).to be_falsey } it { expect(procedure_close.publiee?).to be_falsey }
it { expect(procedure_depubliee.publiee?).to be_falsey }
end end
describe "#close?" do describe "#close?" do
let(:procedure_brouillon) { Procedure.new() } let(:procedure_brouillon) { build(:procedure) }
let(:procedure_publiee) { Procedure.new(aasm_state: :publiee, published_at: Time.zone.now) } let(:procedure_publiee) { build(:procedure, :published) }
let(:procedure_close) { Procedure.new(aasm_state: :close, published_at: Time.zone.now, closed_at: Time.zone.now) } let(:procedure_close) { build(:procedure, :closed) }
let(:procedure_depubliee) { build(:procedure, :unpublished) }
it { expect(procedure_brouillon.close?).to be_falsey } it { expect(procedure_brouillon.close?).to be_falsey }
it { expect(procedure_publiee.close?).to be_falsey } it { expect(procedure_publiee.close?).to be_falsey }
it { expect(procedure_close.close?).to be_truthy } it { expect(procedure_close.close?).to be_truthy }
it { expect(procedure_depubliee.close?).to be_falsey }
end end
describe "#publiee_ou_close?" do describe "#depubliee?" do
let(:procedure_brouillon) { Procedure.new() } let(:procedure_brouillon) { build(:procedure) }
let(:procedure_publiee) { Procedure.new(aasm_state: :publiee, published_at: Time.zone.now) } let(:procedure_publiee) { build(:procedure, :published) }
let(:procedure_close) { Procedure.new(aasm_state: :close, published_at: Time.zone.now, closed_at: Time.zone.now) } let(:procedure_close) { build(:procedure, :closed) }
let(:procedure_depubliee) { build(:procedure, :unpublished) }
it { expect(procedure_brouillon.publiee_ou_close?).to be_falsey } it { expect(procedure_brouillon.depubliee?).to be_falsey }
it { expect(procedure_publiee.publiee_ou_close?).to be_truthy } it { expect(procedure_publiee.depubliee?).to be_falsey }
it { expect(procedure_close.publiee_ou_close?).to be_truthy } it { expect(procedure_close.depubliee?).to be_falsey }
it { expect(procedure_depubliee.depubliee?).to be_truthy }
end end
describe 'archive' do describe "#locked?" do
let(:procedure_brouillon) { build(:procedure) }
let(:procedure_publiee) { build(:procedure, :published) }
let(:procedure_close) { build(:procedure, :closed) }
let(:procedure_depubliee) { build(:procedure, :unpublished) }
it { expect(procedure_brouillon.locked?).to be_falsey }
it { expect(procedure_publiee.locked?).to be_truthy }
it { expect(procedure_close.locked?).to be_truthy }
it { expect(procedure_depubliee.locked?).to be_truthy }
end
describe 'close' do
let(:procedure) { create(:procedure, :published) } let(:procedure) { create(:procedure, :published) }
let(:now) { Time.zone.now.beginning_of_minute } let(:now) { Time.zone.now.beginning_of_minute }
before do before do