Merge branch 'develop' into staging

This commit is contained in:
Xavier J 2016-07-06 14:14:34 +02:00
commit 97ee6bd6f1
38 changed files with 6587 additions and 96 deletions

View file

@ -0,0 +1,91 @@
$(document).on('page:load', init_path_modal);
$(document).ready(init_path_modal);
function init_path_modal() {
path_modal_action();
path_validation_action();
path_type_init();
path_validation($("input[id='procedure_path']"));
}
function path_modal_action() {
$('#publishModal').on('show.bs.modal', function (event) {
$("#publishModal .modal-body .table .tr_content").hide();
var button = $(event.relatedTarget) // Button that triggered the modal
var modal_title = button.data('modal_title'); // Extract info from data-* attributes
var modal_index = button.data('modal_index'); // Extract info from data-* attributes
var modal = $(this)
modal.find('#publishModal_title').html(modal_title);
$("#publishModal .modal-body .table #"+modal_index).show();
})
}
function path_validation_action() {
$("input[id='procedure_path']").keyup(function (key) {
if (key.keyCode != 13)
path_validation(this);
});
}
function togglePathMessage(valid, mine) {
$('#path_messages .message').hide();
if (valid === true && mine === true) {
$('#path_is_mine').show();
} else if (valid === true && mine === false) {
$('#path_is_not_mine').show();
} else if (valid === false && mine === null) {
$('#path_is_invalid').show();
}
if ((valid && mine === null) || mine === true)
$('#publishModal #publish').removeAttr('disabled')
else
$('#publishModal #publish').attr('disabled', 'disabled')
}
function path_validation(el) {
var valid = validatePath($(el).val());
toggleErrorClass(el, valid);
togglePathMessage(valid, null);
}
function validatePath(path) {
var re = /^[a-z0-9_]{3,30}$/;
return re.test(path);
}
function path_type_init() {
display = 'label';
var bloodhound = new Bloodhound({
datumTokenizer: Bloodhound.tokenizers.obj.whitespace(display),
queryTokenizer: Bloodhound.tokenizers.whitespace,
remote: {
url: '/admin/procedures/path_list?request=%QUERY',
wildcard: '%QUERY'
}
});
bloodhound.initialize();
$("#procedure_path").typeahead({
minLength: 1
}, {
display: display,
source: bloodhound,
templates: {
empty: 'Ce lien est disponible !',
suggestion: Handlebars.compile("<div class='path_mine_{{mine}}'>{{label}}</div>")
},
limit: 5
});
$('#procedure_path').bind('typeahead:select', function(ev, suggestion) {
togglePathMessage(true, suggestion['mine']);
});
}

View file

@ -29,6 +29,7 @@
//= require franceconnect
//= require bootstrap-wysihtml5
//= require bootstrap-wysihtml5/locales/fr-FR
//= require handlebars
//= require typeahead.bundle
$(document).on('page:load', scroll_to);

View file

@ -156,7 +156,7 @@ function add_event_search_address() {
});
$("#search_by_address input[type='address']").keypress(function (e) {
if (e.which == 13)
if (e.keyCode == 13)
get_address_point($(this).val());
});
}

View file

@ -0,0 +1,18 @@
.path_mine_false {
color: red
}
#path_messages {
.message {
display: none
}
}
#publishModal {
.twitter-typeahead {
width: 300px;
}
.tt-menu {
width: 300px;
}
}

View file

@ -132,4 +132,13 @@ table {
.info h4 {
margin: 0 0 5px;
color: #777;
}
}
#search_by_address {
.twitter-typeahead {
width: 555px;
}
.tt-menu {
width: 555px;
}
}

View file

@ -1,5 +1,5 @@
.tt-menu {
width: 555px;
padding: 8px 0;
background-color: #fff;
border: 1px solid #ccc;
@ -18,10 +18,6 @@
line-height: 24px;
}
.twitter-typeahead {
width: 555px;
}
.tt-suggestion:hover {
cursor: pointer;
color: #fff;

View file

@ -87,22 +87,59 @@ class Admin::ProceduresController < AdminController
end
def publish
change_status({published: true})
procedure = current_administrateur.procedures.find(params[:procedure_id])
test_procedure = ProcedurePath.new(
{
path: params[:procedure_path],
procedure: procedure,
administrateur: procedure.administrateur
})
unless test_procedure.validate
flash.alert = 'Lien de la procédure invalide'
return redirect_to admin_procedures_path
end
procedure_path = ProcedurePath.find_by_path(params[:procedure_path])
if (procedure_path)
if (procedure_path.administrateur_id == current_administrateur.id)
procedure_path.procedure.archive
else
@mine = false
return render '/admin/procedures/publish', formats: 'js'
end
end
procedure.publish(params[:procedure_path])
flash.notice = "Procédure publiée"
render js: "window.location = '#{admin_procedures_path}'"
rescue ActiveRecord::RecordNotFound
flash.alert = 'Procédure inéxistante'
redirect_to admin_procedures_path
end
def archive
change_status({archived: params[:archive]})
procedure = current_administrateur.procedures.find(params[:procedure_id])
procedure.archive
flash.notice = "Procédure archivée"
redirect_to admin_procedures_path
rescue ActiveRecord::RecordNotFound
flash.alert = 'Procédure inéxistante'
redirect_to admin_procedures_path
end
def clone
@procedure = current_administrateur.procedures.find(params[:procedure_id])
procedure = current_administrateur.procedures.find(params[:procedure_id])
new_procedure = @procedure.clone
new_procedure = procedure.clone
if new_procedure
flash.notice = 'Procédure clonée'
redirect_to edit_admin_procedure_path(id: new_procedure.id)
else
flash.now.alert = @procedure.errors.full_messages.join('<br />').html_safe
flash.now.alert = procedure.errors.full_messages.join('<br />').html_safe
render 'index'
end
@ -123,6 +160,12 @@ class Admin::ProceduresController < AdminController
@draft_class = 'active'
end
def path_list
render json: ProcedurePath.where("path LIKE '%#{params[:request]}%'").pluck(:path, :administrateur_id).inject([]) {
|acc, value| acc.push({ label: value.first, mine: value.second == current_administrateur.id })
}.to_json
end
private
def create_procedure_params
@ -132,16 +175,4 @@ class Admin::ProceduresController < AdminController
def create_module_api_carto_params
params.require(:procedure).require(:module_api_carto_attributes).permit(:id, :use_api_carto, :quartiers_prioritaires, :cadastre)
end
def change_status(status_options)
@procedure = current_administrateur.procedures.find(params[:procedure_id])
@procedure.update_attributes(status_options)
flash.notice = 'Procédure éditée'
redirect_to admin_procedures_path
rescue ActiveRecord::RecordNotFound
flash.alert = 'Procédure inéxistante'
redirect_to admin_procedures_path
end
end

View file

@ -1,10 +1,12 @@
class PingController < ApplicationController
def index
if (ActiveRecord::Base.connected?)
render nothing: true, status: 200, content_type: "application/json"
else
render nothing: true, status: 500, content_type: "application/json"
Rails.logger.silence do
if (ActiveRecord::Base.connected?)
render nothing: true, status: 200, content_type: "application/json"
else
render nothing: true, status: 500, content_type: "application/json"
end
end
end

View file

@ -2,7 +2,7 @@ class Users::DossiersController < UsersController
include SmartListing::Helper::ControllerExtensions
helper SmartListing::Helper
before_action :authenticate_user!
before_action :authenticate_user!, except: :commencer
before_action :check_siret, only: :siret_informations
before_action only: [:show] do
@ -22,6 +22,16 @@ class Users::DossiersController < UsersController
total_dossiers_per_state
end
def commencer
unless params[:procedure_path].nil?
procedure = ProcedurePath.where(path: params[:procedure_path]).first!.procedure
end
redirect_to new_users_dossier_path(procedure_id: procedure.id)
rescue ActiveRecord::RecordNotFound
error_procedure
end
def new
procedure = Procedure.where(archived: false, published: true).find(params[:procedure_id])
@ -169,4 +179,5 @@ class Users::DossiersController < UsersController
def facade id = params[:id]
DossierFacades.new id, current_user.email
end
end

View file

@ -2,7 +2,7 @@ class ProcedureDecorator < Draper::Decorator
delegate_all
def lien
h.new_users_dossiers_url(procedure_id: id)
h.commencer_url(procedure_path: path) unless path.nil?
end
def created_at_fr
@ -11,7 +11,7 @@ class ProcedureDecorator < Draper::Decorator
def logo_img
return 'logo-tps.png' if logo.blank?
logo
File.join(STORAGE_URL, File.basename(logo.path))
end
def geographic_information
module_api_carto

View file

@ -3,6 +3,8 @@ class Procedure < ActiveRecord::Base
has_many :types_de_champ, dependent: :destroy
has_many :dossiers
has_one :procedure_path, dependent: :destroy
has_one :module_api_carto, dependent: :destroy
belongs_to :administrateur
@ -15,12 +17,21 @@ class Procedure < ActiveRecord::Base
accepts_nested_attributes_for :types_de_champ,:reject_if => proc { |attributes| attributes['libelle'].blank? }, :allow_destroy => true
accepts_nested_attributes_for :types_de_piece_justificative, :reject_if => proc { |attributes| attributes['libelle'].blank? }, :allow_destroy => true
accepts_nested_attributes_for :module_api_carto
accepts_nested_attributes_for :procedure_path
mount_uploader :logo, ProcedureLogoUploader
validates :libelle, presence: true, allow_blank: false, allow_nil: false
validates :description, presence: true, allow_blank: false, allow_nil: false
def path
procedure_path.path unless procedure_path.nil?
end
def default_path
libelle.downcase.gsub(/[^a-z0-9\-_]/,"_").gsub(/_*$/, '').gsub(/_+/, '_')
end
def types_de_champ_ordered
types_de_champ.order(:order_place)
end
@ -65,4 +76,14 @@ class Procedure < ActiveRecord::Base
return procedure if procedure.save
end
def publish(path)
self.update_attributes!({ published: true, archived: false })
ProcedurePath.create!(path: path, procedure: self, administrateur: self.administrateur)
end
def archive
self.procedure_path.destroy! if self.path
self.update_attributes!({ archived: true })
end
end

View file

@ -0,0 +1,8 @@
class ProcedurePath < ActiveRecord::Base
validates :path, procedure_path_format: true, presence: true, allow_blank: false, allow_nil: false
validates :administrateur_id, presence: true, allow_blank: false, allow_nil: false
validates :procedure_id, presence: true, allow_blank: false, allow_nil: false
belongs_to :procedure
belongs_to :administrateur
end

View file

@ -1,11 +1,9 @@
class RemoteDownloader
DEST_URL = "https://storage.apientreprise.fr/" + CarrierWave::Uploader::Base.fog_directory + '/'
def initialize(filename)
@filename = filename
end
def url
@url ||= File.join(DEST_URL, @filename)
@url ||= File.join(STORAGE_URL, @filename)
end
end

View file

@ -0,0 +1,12 @@
class ProcedurePathFormatValidator < ActiveModel::Validator
def path_regex
/^[a-z0-9_]{3,30}$/
end
def validate(record)
return false if record.path.blank?
record.errors[:path] << "Path invalide" unless path_regex.match(record.path)
end
end

View file

@ -1,6 +1,6 @@
%h2.text-info
-unless @procedure.logo.blank?
= image_tag @procedure.logo, style: 'width: 30px'
= image_tag @procedure.decorate.logo_img, style: 'width: 30px'
=@procedure.libelle
%br

View file

@ -15,7 +15,7 @@
.col-md-6.col-lg-6
%h4 Logo de la procédure
- unless @procedure.logo.blank?
= image_tag @procedure.logo, {style: 'height: 40px; display: inline; margin-right: 6px', id: 'preview_procedure_logo'}
= image_tag @procedure.decorate.logo_img, {style: 'height: 40px; display: inline; margin-right: 6px', id: 'preview_procedure_logo'}
= f.file_field(:logo, accept: 'image/png, image/jpg, image/jpeg', style: 'display:inline')
%div{style:'margin-top:5px'}

View file

@ -3,7 +3,7 @@
%thead
%th#ID= smart_listing.sortable 'ID', 'id'
%th#libelle= smart_listing.sortable 'Libellé', 'libelle'
- unless @draft_class
- if @active_class
%th#lien Lien
%th#created_at= smart_listing.sortable 'Date création', 'created_at'
%th#lien Actions
@ -14,7 +14,7 @@
%td.col-md-1.col-lg-1= procedure.id
%td.col-md-6.col-lg-6
= link_to(procedure.libelle, "/admin/procedures/#{procedure.id}")
- unless @draft_class
- if @active_class
%td= link_to procedure.lien, procedure.lien
%td
= procedure.created_at_fr

View file

@ -0,0 +1,48 @@
#publishModal.modal.fade{"aria-labelledby" => "myModalLabel", :role => "dialog", :tabindex => "-1"}
.modal-dialog.modal-lg{:role => "document"}
= form_tag admin_procedure_publish_path(procedure_id: @procedure.id), method: :put, remote: true do
.modal-content
.modal-header
%button.close{"aria-label" => "Close", "data-dismiss" => "modal", :type => "button"}
%span{"aria-hidden" => "true"} ×
%h4#myModalLabel.modal-title
=@procedure.archived?? 'Réactiver' : 'Publier'
la procédure
%span#publishModal_title
.modal-body
Vous vous apprêtez à
=@procedure.archived?? 'republier' : 'publier'
votre procédure au public.
- unless @procedure.archived?
%b
Elle ne pourra plus être modifiée à l'issue de cette publication.
%br
Afin de faciliter l'accès à la procédure, vous êtes invité à personnaliser l'adresse d'accès si vous le souhaitez.
%br
.form-group
%br
%h4 Lien de la procédure
%p.center
="#{root_url}commencer/"
= text_field_tag('procedure_path', @procedure.default_path,
id: 'procedure_path',
placeholder: 'Chemin vers la procédure',
class:'form-control',
maxlength: 30,
style: 'width: 300px; display: inline')
#path_messages
#path_is_mine.text-warning.center.message
Ce lien est déjà utilisé par une de vos procédure.
%br
Si vous voulez l'utiliser, l'ancienne procédure sera archivée (plus accessible du public).
#path_is_not_mine.text-danger.center.message
Ce lien est déjà utilisé par une procédure.
%br
Vous ne pouvez pas l'utiliser car il appartient à un autre administrateur.
#path_is_invalid.text-danger.center.message
Ce lien n'est pas valide. Il doit comporter au moins 3 caractères et seuls les caractères a-z, 0-9 et '_' sont autorisés.
.modal-footer
= submit_tag "#{@procedure.archived?? 'Réactiver' : 'Publier'}", class: %w(btn btn btn-success),
id: 'publish',
disabled: :disabled
= button_tag 'Annuler', class: %w(btn btn btn-default), id: 'cancel', data: { dismiss: 'modal' }

View file

@ -0,0 +1 @@
<%= "togglePathMessage(true, #{@mine})" %>

View file

@ -2,26 +2,23 @@
=render partial: 'head', locals: {active: 'Informations'}
-if ! @facade.procedure.published?
= form_tag admin_procedure_publish_path(procedure_id: @facade.procedure.id, publish: true), method: :put, style:'float: right; margin-top: 10px' do
%button#archive.btn.btn-small.btn-success.text-info{type: :button}
%i.fa.fa-eraser
Publier
#confirm
%button#valid.btn.btn-small.btn-success{type: :submit}
%i.fa.fa-check
Valider
%button#cancel.btn.btn-small.btn-danger{type: :button}
%i.fa.fa-remove
Annuler
%a#publish.btn.btn-success{"data-target" => "#publishModal", "data-toggle" => "modal", :type => "button", style:'float: right; margin-top: 10px'}
%i.fa.fa-eraser
Publier
%br
=render partial: '/admin/procedures/modal_publish'
-else
-if @facade.procedure.archived?
%a#reenable.btn.btn-small.btn-default.text-info{"data-target" => "#publishModal", "data-toggle" => "modal", :type => "button", style:'float: right; margin-top: 10px'}
%i.fa.fa-eraser
Réactiver
%br
=render partial: '/admin/procedures/modal_publish'
-elsif @facade.procedure.published?
= form_tag admin_procedure_archive_path(procedure_id: @facade.procedure.id, archive: !@facade.procedure.archived?), method: :put, style:'float: right; margin-top: 10px' do
%button#archive.btn.btn-small.btn-default.text-info{type: :button}
%i.fa.fa-eraser
- if @facade.procedure.archived
= 'Réactiver'
- else
= 'Archiver'
= 'Archiver'
#confirm
%button#valid.btn.btn-small.btn-success{type: :submit}
%i.fa.fa-check
@ -38,7 +35,10 @@
%div
%h3 Lien procédure
%div{style:'margin-left:3%'}
-if @facade.procedure.published?
-if @facade.procedure.archived?
%b
Cette procédure a été archivée et n'est plus accessible par le public.
-elsif @facade.procedure.published?
= @facade.procedure.lien
-else
%b

View file

@ -17,5 +17,4 @@
-# .etape.etapes_menu.col-md-3.col-lg-3
-# %h3
-# = "#{@facade.procedure.module_api_carto.use_api_carto? ? '4' : '3'} - Mon dossier"
-# .etape.etapes_informations.col-md-9.col-lg-9
-# .etape.etapes_informations.col-md-9.col-lg-9

View file

@ -72,7 +72,8 @@ set :shared_paths, [
"config/unicorn.rb",
"config/initializers/raven.rb",
'config/france_connect.yml',
'config/initializers/mailjet.rb'
'config/initializers/mailjet.rb',
'config/initializers/storage_url.rb'
]

View file

@ -0,0 +1 @@
STORAGE_URL = "https://storage.apientreprise.fr/" + CarrierWave::Uploader::Base.fog_directory + '/'

View file

@ -89,6 +89,7 @@ Rails.application.routes.draw do
get 'sign_in' => '/administrateurs/sessions#new'
get 'procedures/archived' => 'procedures#archived'
get 'procedures/draft' => 'procedures#draft'
get 'procedures/path_list' => 'procedures#path_list'
get 'profile' => 'profile#show', as: :profile
resources :procedures do
@ -161,5 +162,9 @@ Rails.application.routes.draw do
end
end
namespace :commencer do
get '/:procedure_path' => '/users/dossiers#commencer'
end
apipie
end

View file

@ -0,0 +1,18 @@
class AddProcedurePathMappingTable < ActiveRecord::Migration
class ProcedurePath < ActiveRecord::Base
end
def change
create_table :procedure_paths do |t|
t.string :path, limit: 30, null: true, unique: true, index: true
t.integer :procedure_id, unique: true, null: true
t.integer :administrateur_id, unique: true, null: true
end
add_foreign_key :procedure_paths, :procedures
add_foreign_key :procedure_paths, :administrateurs
Procedure.all.each do |procedure|
ProcedurePath.create(path: "#{procedure.id}", procedure_id: procedure.id, administrateur_id: procedure.administrateur.id)
end
end
end

View file

@ -11,7 +11,7 @@
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 20160622081321) do
ActiveRecord::Schema.define(version: 20160622081322) do
# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
@ -226,6 +226,14 @@ ActiveRecord::Schema.define(version: 20160622081321) do
add_index "pieces_justificatives", ["type_de_piece_justificative_id"], name: "index_pieces_justificatives_on_type_de_piece_justificative_id", using: :btree
create_table "procedure_paths", force: :cascade do |t|
t.string "path", limit: 30
t.integer "procedure_id"
t.integer "administrateur_id"
end
add_index "procedure_paths", ["path"], name: "index_procedure_paths_on_path", using: :btree
create_table "procedures", force: :cascade do |t|
t.string "libelle"
t.string "description"
@ -304,4 +312,6 @@ ActiveRecord::Schema.define(version: 20160622081321) do
add_foreign_key "cerfas", "dossiers"
add_foreign_key "commentaires", "dossiers"
add_foreign_key "dossiers", "users"
add_foreign_key "procedure_paths", "administrateurs"
add_foreign_key "procedure_paths", "procedures"
end

View file

@ -263,31 +263,116 @@ describe Admin::ProceduresController, type: :controller do
end
end
describe 'PUT #publish' do
let(:procedure) { create(:procedure, administrateur: admin) }
let(:procedure2) { create(:procedure, :published, administrateur: admin) }
let(:procedure3) { create(:procedure, :published) }
context 'when admin is the owner of the procedure' do
before do
put :publish, procedure_id: procedure.id, procedure_path: procedure_path
procedure.reload
procedure2.reload
end
context 'procedure path does not exist' do
let(:procedure_path) { 'new_path' }
it 'publish the given procedure' do
expect(procedure.published).to be_truthy
expect(procedure.path).to eq(procedure_path)
expect(response.status).to eq 200
expect(flash[:notice]).to have_content 'Procédure publiée'
end
end
context 'procedure path exists and is owned by current administrator' do
let(:procedure_path) { procedure2.path }
it 'publish the given procedure' do
expect(procedure.published).to be_truthy
expect(procedure.path).to eq(procedure_path)
expect(response.status).to eq 200
expect(flash[:notice]).to have_content 'Procédure publiée'
end
it 'archive previous procedure' do
expect(procedure2.published).to be_truthy
expect(procedure2.archived).to be_truthy
expect(procedure2.path).to be_nil
end
end
context 'procedure path exists and is not owned by current administrator' do
let(:procedure_path) { procedure3.path }
it 'does not publish the given procedure' do
expect(procedure.published).to be_falsey
expect(procedure.path).to be_nil
expect(response.status).to eq 200
end
it 'previous procedure remains published' do
expect(procedure2.published).to be_truthy
expect(procedure2.archived).to be_falsey
expect(procedure2.path).to match(/fake_path/)
end
end
context 'procedure path is invalid' do
let(:procedure_path) { 'Invalid Procedure Path' }
it 'does not publish the given procedure' do
expect(procedure.published).to be_falsey
expect(procedure.path).to be_nil
expect(response).to redirect_to :admin_procedures
expect(flash[:alert]).to have_content 'Lien de la procédure invalide'
end
end
end
context 'when admin is not the owner of the procedure' do
let(:admin_2) { create(:administrateur) }
before do
sign_out admin
sign_in admin_2
put :publish, procedure_id: procedure.id, procedure_path: 'fake_path'
procedure.reload
end
it 'fails' do
expect(response).to redirect_to :admin_procedures
expect(flash[:alert]).to have_content 'Procédure inéxistante'
end
end
end
describe 'PUT #archive' do
let(:procedure) { create(:procedure, administrateur: admin) }
context 'when admin is the owner of the procedure' do
before do
put :archive, procedure_id: procedure.id, archive: archive
put :archive, procedure_id: procedure.id
procedure.reload
end
context 'when owner want archive procedure' do
let(:archive) { true }
it { expect(procedure.archived).to be_truthy }
it { expect(response).to redirect_to :admin_procedures }
it { expect(flash[:notice]).to have_content 'Procédure éditée' }
it { expect(flash[:notice]).to have_content 'Procédure archivée' }
end
context 'when owner want reactive procedure' do
let(:archive) { false }
context 'when owner want to re-enable procedure' do
before do
put :publish, procedure_id: procedure.id, procedure_path: 'fake_path'
procedure.reload
end
it { expect(procedure.archived).to be_falsey }
it { expect(response).to redirect_to :admin_procedures }
it { expect(flash[:notice]).to have_content 'Procédure éditée' }
it { expect(response.status).to eq 200 }
it { expect(flash[:notice]).to have_content 'Procédure publiée' }
end
end
@ -337,4 +422,33 @@ describe Admin::ProceduresController, type: :controller do
it { expect(flash[:alert]).to have_content 'Procédure inéxistante' }
end
end
describe 'GET #path_list' do
let!(:procedure) { create(:procedure, :published, administrateur: admin) }
let(:admin2) { create(:administrateur) }
let!(:procedure2) { create(:procedure, :published, administrateur: admin2) }
subject { get :path_list }
let(:body) { JSON.parse(response.body) }
before do
subject
end
it { expect(response.status).to eq(200) }
it { expect(body.size).to eq(2) }
it { expect(body.first['label']).to eq(procedure.path) }
it { expect(body.first['mine']).to be_truthy }
it { expect(body.second['label']).to eq(procedure2.path) }
it { expect(body.second['mine']).to be_falsy }
context 'filtered' do
subject { get :path_list, request: procedure2.path }
it { expect(response.status).to eq(200) }
it { expect(body.size).to eq(1) }
it { expect(body.first['label']).to eq(procedure2.path) }
it { expect(body.first['mine']).to be_falsy }
end
end
end

View file

@ -152,6 +152,13 @@ describe Users::DossiersController, type: :controller do
end
end
describe 'GET #commencer' do
subject { get :commencer, procedure_path: procedure.path }
it { expect(subject.status).to eq 302 }
it { expect(subject).to redirect_to new_users_dossier_path(procedure_id: procedure.id) }
end
describe 'POST #siret_informations' do
before do
stub_request(:get, "https://api-dev.apientreprise.fr/v2/etablissements/#{siret_not_found}?token=#{SIADETOKEN}")

View file

@ -0,0 +1,29 @@
require 'spec_helper'
describe ProcedureDecorator do
let(:procedure) { create(:procedure, :published, created_at: Time.new(2015, 12, 24, 14, 10)) }
subject { procedure.decorate }
describe 'lien' do
subject { super().lien }
it { is_expected.to match(/fake_path/) }
end
describe 'created_at_fr' do
subject { super().created_at_fr }
it { is_expected.to eq('24/12/2015 14:10') }
end
describe 'logo_img' do
subject { super().logo_img }
it { is_expected.to eq('logo-tps.png') }
end
describe 'geographic_information' do
subject { super().geographic_information }
it { expect(subject.use_api_carto).to be_falsey }
it { expect(subject.quartiers_prioritaires).to be_falsey }
it { expect(subject.cadastre).to be_falsey }
end
end

View file

@ -1,4 +1,5 @@
FactoryGirl.define do
sequence(:published_path) { |n| "fake_path#{n}" }
factory :procedure do
lien_demarche 'http://localhost'
libelle 'Demande de subvention'
@ -6,6 +7,7 @@ FactoryGirl.define do
organisation "Orga SGMAP"
direction "direction SGMAP"
published false
administrateur { create(:administrateur) }
after(:build) do |procedure, _evaluator|
if procedure.module_api_carto.nil?
@ -55,8 +57,8 @@ FactoryGirl.define do
end
trait :published do
after(:build) do |procedure, _evaluator|
procedure.published = true
after(:create) do |procedure, _evaluator|
procedure.publish(generate(:published_path))
end
end
end

View file

@ -0,0 +1,5 @@
FactoryGirl.define do
factory :procedure_path do
path 'fake_path'
end
end

View file

@ -8,11 +8,13 @@ feature 'user path for dossier creation' do
context 'user arrives on siret page', js: true do
before do
visit new_users_dossiers_path(procedure_id: procedure.id)
visit commencer_path(procedure_path: procedure.path)
end
scenario 'he is redirected on login page' do
expect(page).to have_css('#login_user')
expect(page).to have_css('#logo_procedure')
expect(page).to have_css('#titre_procedure')
end
context 'user sign_in' do

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,38 @@
require 'spec_helper'
describe ProcedurePath do
describe 'assocations' do
it { is_expected.to belong_to(:administrateur) }
it { is_expected.to belong_to(:procedure) }
end
describe 'attributes' do
it { is_expected.to have_db_column(:path) }
end
describe 'validation' do
describe 'path' do
let(:admin) { create(:administrateur) }
let(:procedure) { create(:procedure) }
let(:procedure_path) { create(:procedure_path, administrateur: admin, procedure: procedure, path: path) }
context 'when path is nil' do
let(:path) { nil }
it { expect{procedure_path}.to raise_error ActiveRecord::RecordInvalid }
end
context 'when path is empty' do
let(:path) { '' }
it { expect{procedure_path}.to raise_error ActiveRecord::RecordInvalid }
end
context 'when path is invalid' do
let(:path) { 'Demande de subvention' }
it { expect{procedure_path}.to raise_error ActiveRecord::RecordInvalid }
end
context 'when path is valid' do
let(:path) { 'ma_super_procedure' }
it { expect{procedure_path}.not_to raise_error }
end
end
end
end

View file

@ -19,6 +19,7 @@ describe Procedure do
it { is_expected.to have_db_column(:logo) }
it { is_expected.to have_db_column(:logo_secure_token) }
it { is_expected.to have_db_column(:cerfa_flag) }
it { is_expected.to have_db_column(:published) }
end
describe 'validation' do
@ -156,10 +157,47 @@ describe Procedure do
describe 'procedure status is reset' do
let(:archived) { true }
let(:published) { true }
it 'sets published and archived to false' do
it 'Not published nor archived' do
expect(subject.archived).to be_falsey
expect(subject.published).to be_falsey
expect(subject.path).to be_nil
end
end
end
describe 'publish' do
let(:procedure) { create(:procedure, :published) }
let(:procedure_path) { ProcedurePath.find(procedure.procedure_path.id) }
it 'is available from a valid path' do
expect(procedure.path).to match(/fake_path/)
expect(procedure.published).to be_truthy
end
it 'is correctly set in ProcedurePath table' do
expect(ProcedurePath.count(path: procedure.path)).to eq(1)
expect(procedure_path.procedure_id).to eq(procedure.id)
expect(procedure_path.administrateur_id).to eq(procedure.administrateur_id)
end
end
describe 'archive' do
let(:procedure) { create(:procedure, :published) }
let(:procedure_path) { ProcedurePath.find(procedure.procedure_path.id) }
before do
procedure.archive
procedure.reload
end
it 'is not available from a valid path anymore' do
expect(procedure.path).to be_nil
expect(procedure.published).to be_truthy
expect(procedure.archived).to be_truthy
end
it 'is not in ProcedurePath table anymore' do
expect(ProcedurePath.count(path: procedure.path)).to eq(0)
expect(ProcedurePath.find_by_procedure_id(procedure.id)).to be_nil
end
end
end

View file

@ -1,6 +1,6 @@
require 'spec_helper'
describe 'admin/procedures/edit.html.haml', type: :view do
describe 'admin/procedures/edit.html.haml', type: :view, vcr: { cassette_name: 'admin_procedure_edit' } do
let(:logo) { Rack::Test::UploadedFile.new("./spec/support/files/logo_test_procedure.png", 'image/png') }
let(:procedure) { create(:procedure, logo: logo) }

View file

@ -2,41 +2,64 @@ require 'spec_helper'
describe 'admin/procedures/show.html.haml', type: :view do
let(:archived) { false }
let(:published) { false }
let(:procedure) { create(:procedure, published: published, archived: archived) }
let(:procedure) { create(:procedure, archived: archived) }
before do
assign(:facade, AdminProceduresShowFacades.new(procedure.decorate))
assign(:procedure, procedure)
render
end
describe 'publish button' do
it { expect(rendered).to have_content('Publier') }
end
describe 'archive and unarchive button' do
let(:published) { true }
context 'when procedure is published' do
it { expect(rendered).to have_content('Archiver') }
describe 'procedure is draft' do
before do
render
end
context 'when procedure is archived' do
let(:archived) { true }
it { expect(rendered).to have_content('Réactiver') }
describe 'publish button is visible' do
it { expect(rendered).to have_css('a#publish') }
it { expect(rendered).not_to have_css('button#archive') }
it { expect(rendered).not_to have_css('a#reenable') }
end
end
describe 'procedure link' do
context 'is not present when not published' do
describe 'procedure link is not present' do
it { expect(rendered).to have_content('Cette procédure n\'a pas encore été publiée et n\'est donc pas accessible par le public.') }
end
end
context 'is present when already published' do
let(:published) { true }
it { expect(rendered).to have_content(new_users_dossiers_url(procedure_id: procedure.id)) }
describe 'procedure is published' do
before do
procedure.publish('fake_path')
procedure.reload
render
end
describe 'archive button is visible', js: true do
it { expect(rendered).not_to have_css('a#publish') }
it { expect(rendered).to have_css('button#archive') }
it { expect(rendered).not_to have_css('a#reenable') }
end
describe 'procedure link is present' do
it { expect(rendered).to have_content(commencer_url(procedure_path: procedure.path)) }
end
end
describe 'procedure is archived' do
before do
procedure.publish('fake_path')
procedure.archive
procedure.reload
render
end
describe 'Re-enable button is visible' do
it { expect(rendered).not_to have_css('a#publish') }
it { expect(rendered).not_to have_css('button#archive') }
it { expect(rendered).to have_css('a#reenable') }
end
describe 'procedure link is not present' do
it { expect(rendered).to have_content('Cette procédure a été archivée et n\'est plus accessible par le public.') }
end
end
end

4608
vendor/assets/javascripts/handlebars.js vendored Normal file

File diff suppressed because one or more lines are too long