diff --git a/app/controllers/admin/types_de_champ_controller.rb b/app/controllers/admin/types_de_champ_controller.rb index 6aa974d74..8eab26c02 100644 --- a/app/controllers/admin/types_de_champ_controller.rb +++ b/app/controllers/admin/types_de_champ_controller.rb @@ -21,7 +21,7 @@ class Admin::TypesDeChampController < AdminController def update_params params .require(:procedure) - .permit(types_de_champ_attributes: [:libelle, :description, :order_place, :type_champ, :id, :mandatory]) + .permit(types_de_champ_attributes: [:libelle, :description, :order_place, :type_champ, :id, :mandatory, :type]) end def move_up diff --git a/app/controllers/admin/types_de_champ_private_controller.rb b/app/controllers/admin/types_de_champ_private_controller.rb new file mode 100644 index 000000000..d8f1af66c --- /dev/null +++ b/app/controllers/admin/types_de_champ_private_controller.rb @@ -0,0 +1,44 @@ +class Admin::TypesDeChampPrivateController < AdminController + before_action :retrieve_procedure + before_action :procedure_locked? + + def destroy + @procedure.types_de_champ_private.destroy(params[:id]) + render 'show', format: :js + rescue ActiveRecord::RecordNotFound + render json: { message: 'Champ not found' }, status: 404 + end + + def show + + end + + def update + @procedure.update_attributes(update_params) + flash.now.notice = 'Modifications sauvegardées' + render 'show', format: :js + end + + def update_params + params + .require(:procedure) + .permit(types_de_champ_private_attributes: [:libelle, :description, :order_place, :type_champ, :id, :mandatory, :type]) + end + + def move_up + index = params[:index].to_i - 1 + if @procedure.switch_types_de_champ_private index + render 'show', format: :js + else + render json: {}, status: 400 + end + end + + def move_down + if @procedure.switch_types_de_champ_private params[:index].to_i + render 'show', format: :js + else + render json: {}, status: 400 + end + end +end \ No newline at end of file diff --git a/app/decorators/type_de_champ_decorator.rb b/app/decorators/type_de_champ_decorator.rb index 6e92f6647..d149996a7 100644 --- a/app/decorators/type_de_champ_decorator.rb +++ b/app/decorators/type_de_champ_decorator.rb @@ -1,12 +1,13 @@ - class TypeDeChampDecorator < Draper::Decorator + delegate_all + def button_up params - h.link_to '', params[:url], class: up_classes, id: "btn_up_#{params[:index]}", remote: true, method: :post if display_up_button?(params[:index]) + h.link_to '', params[:url], class: up_classes, id: "btn_up_#{params[:index]}", remote: true, method: :post if display_up_button?(params[:index], params[:private]) end def button_down params - h.link_to '', params[:url], class: down_classes, id: "btn_down_#{params[:index]}", remote: true, method: :post if display_down_button?(params[:index]) + h.link_to '', params[:url], class: down_classes, id: "btn_down_#{params[:index]}", remote: true, method: :post if display_down_button?(params[:index], params[:private]) end private @@ -23,15 +24,19 @@ class TypeDeChampDecorator < Draper::Decorator %w(btn btn-default form-control fa) end - def display_up_button?(index) - !(index == 0 || count_type_de_champ < 2) + def display_up_button?(index, private) + !(index == 0 || count_type_de_champ(private) < 2) end - def display_down_button?(index) - (index + 1) < count_type_de_champ + def display_down_button?(index, private) + (index + 1) < count_type_de_champ(private) end - def count_type_de_champ - @count_type_de_champ ||= procedure.types_de_champ.count + def count_type_de_champ private + if private + @count_type_de_champ ||= procedure.types_de_champ_private.count + else + @count_type_de_champ ||= procedure.types_de_champ.count + end end end \ No newline at end of file diff --git a/app/decorators/type_de_champ_private_decorator.rb b/app/decorators/type_de_champ_private_decorator.rb new file mode 100644 index 000000000..1adcaca84 --- /dev/null +++ b/app/decorators/type_de_champ_private_decorator.rb @@ -0,0 +1,3 @@ +class TypeDeChampPrivateDecorator < TypeDeChampDecorator + +end \ No newline at end of file diff --git a/app/models/procedure.rb b/app/models/procedure.rb index c09adbe39..73f950cef 100644 --- a/app/models/procedure.rb +++ b/app/models/procedure.rb @@ -1,7 +1,7 @@ class Procedure < ActiveRecord::Base has_many :types_de_piece_justificative, dependent: :destroy - has_many :types_de_champ, dependent: :destroy - has_many :types_de_champ_private, class_name: 'TypeDeChampPrivate', dependent: :destroy + has_many :types_de_champ, class_name: 'TypeDeChampPublic', dependent: :destroy + has_many :types_de_champ_private, dependent: :destroy has_many :dossiers has_one :procedure_path, dependent: :destroy @@ -18,6 +18,7 @@ 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 :types_de_champ_private mount_uploader :logo, ProcedureLogoUploader @@ -36,6 +37,10 @@ class Procedure < ActiveRecord::Base types_de_champ.order(:order_place) end + def types_de_champ_private_ordered + types_de_champ_private.order(:order_place) + end + def types_de_piece_justificative_ordered types_de_piece_justificative.order(:order_place) end @@ -52,6 +57,10 @@ class Procedure < ActiveRecord::Base switch_list_order(types_de_champ_ordered, index_of_first_element) end + def switch_types_de_champ_private index_of_first_element + switch_list_order(types_de_champ_private_ordered, index_of_first_element) + end + def switch_types_de_piece_justificative index_of_first_element switch_list_order(types_de_piece_justificative_ordered, index_of_first_element) end diff --git a/app/models/type_de_champ.rb b/app/models/type_de_champ.rb index 6a738957f..e4df31ea0 100644 --- a/app/models/type_de_champ.rb +++ b/app/models/type_de_champ.rb @@ -18,8 +18,6 @@ class TypeDeChamp < ActiveRecord::Base has_many :champ, dependent: :destroy - default_scope { where(private: false) } - validates :libelle, presence: true, allow_blank: false, allow_nil: false validates :type_champ, presence: true, allow_blank: false, allow_nil: false # validates :order_place, presence: true, allow_blank: false, allow_nil: false diff --git a/app/models/type_de_champ_private.rb b/app/models/type_de_champ_private.rb index c9acf24e2..804bb2e99 100644 --- a/app/models/type_de_champ_private.rb +++ b/app/models/type_de_champ_private.rb @@ -1,9 +1,3 @@ class TypeDeChampPrivate < TypeDeChamp - after_initialize :force_private_value - default_scope { where(private: true) } - - def force_private_value - self.private = true - end end \ No newline at end of file diff --git a/app/models/type_de_champ_public.rb b/app/models/type_de_champ_public.rb new file mode 100644 index 000000000..90052b762 --- /dev/null +++ b/app/models/type_de_champ_public.rb @@ -0,0 +1,3 @@ +class TypeDeChampPublic < TypeDeChamp + +end \ No newline at end of file diff --git a/app/serializers/type_de_champ_serializer.rb b/app/serializers/type_de_champ_serializer.rb index ebf66c0b8..bbe2cb7dc 100644 --- a/app/serializers/type_de_champ_serializer.rb +++ b/app/serializers/type_de_champ_serializer.rb @@ -3,6 +3,5 @@ class TypeDeChampSerializer < ActiveModel::Serializer :libelle, {:type_champ => :type}, :order_place, - :description, - :private + :description end \ No newline at end of file diff --git a/app/views/admin/procedures/_navbar.html.haml b/app/views/admin/procedures/_navbar.html.haml index 25198c9b0..6a382894a 100644 --- a/app/views/admin/procedures/_navbar.html.haml +++ b/app/views/admin/procedures/_navbar.html.haml @@ -16,5 +16,9 @@ = link_to_unless(@procedure.locked?, 'Pièces justificatives', admin_procedure_pieces_justificatives_path(@procedure)) do = link_to('Pièces justificatives', '#') +%li{ class: ('disabled' if @procedure.locked?) || ('active' if active == 'Champs privés') } + = link_to_unless(@procedure.locked?, 'Champs privés', admin_procedure_types_de_champ_private_path(@procedure)) do + = link_to('Champs privés', '#') + %li{ class: ('active' if active == 'Prévisualisation'), style: 'float:right' } = link_to('Prévisualisation', admin_procedure_previsualisation_path(@procedure), {style: 'font-style: italic;'}) \ No newline at end of file diff --git a/app/views/admin/types_de_champ/_fields.html.haml b/app/views/admin/types_de_champ/_fields.html.haml index 4103a2329..dd0250fbd 100644 --- a/app/views/admin/types_de_champ/_fields.html.haml +++ b/app/views/admin/types_de_champ/_fields.html.haml @@ -6,7 +6,7 @@ .form-group.type %h4 Type - = ff.select :type_champ, TypeDeChamp.type_champs, {}, {class: 'form-control type_champ'} + = ff.select :type_champ, TypeDeChampPublic.type_champs, {}, {class: 'form-control type_champ'} .form-group.description %h4 Description @@ -19,6 +19,7 @@ .form-group = ff.hidden_field :order_place, value: ff.index + = ff.hidden_field :type = ff.hidden_field :id - unless ff.object.id.nil? .form-group @@ -26,7 +27,6 @@ = ff.object.button_up(index: ff.index, url: move_up_admin_procedure_types_de_champ_path(@procedure, ff.index)) = ff.object.button_down(index: ff.index, url: move_down_admin_procedure_types_de_champ_path(@procedure, ff.index)) - .form-group %br   - if ff.object.id.nil? diff --git a/app/views/admin/types_de_champ/_form.html.haml b/app/views/admin/types_de_champ/_form.html.haml index 2b2ce0b37..d92771855 100644 --- a/app/views/admin/types_de_champ/_form.html.haml +++ b/app/views/admin/types_de_champ/_form.html.haml @@ -3,4 +3,4 @@ = f.submit "Enregistrer", class: 'btn btn-success', id: :save %hr #new_type_de_champ - = render partial: 'fields', locals: { types_de_champ: TypeDeChamp.new.decorate, f: f } + = render partial: 'fields', locals: { types_de_champ: TypeDeChampPublic.new.decorate, f: f } diff --git a/app/views/admin/types_de_champ_private/_fields.html.haml b/app/views/admin/types_de_champ_private/_fields.html.haml new file mode 100644 index 000000000..6da37a941 --- /dev/null +++ b/app/views/admin/types_de_champ_private/_fields.html.haml @@ -0,0 +1,38 @@ += f.fields_for :types_de_champ_private, types_de_champ_private, remote: true do |ff| + .form-inline{class:"#{ff.object.object.type_champ == 'header_section' ? 'header_section' : ''}"} + .form-group.libelle + %h4 Libellé + = ff.text_field :libelle, class: 'form-control libelle', placeholder: 'Libellé' + + .form-group.type + %h4 Type + = ff.select :type_champ, TypeDeChampPrivate.type_champs, {}, {class: 'form-control type_champ'} + + .form-group.description + %h4 Description + = ff.text_area :description, class: 'form-control description', placeholder: 'Description' + + .form-group.mandatory + %h4 Obligatoire ? + .center + = ff.check_box :mandatory, placeholder: 'Obligatoire ?' + + .form-group + = ff.hidden_field :order_place, value: ff.index + = ff.hidden_field :type + = ff.hidden_field :id + + - unless ff.object.id.nil? + .form-group + %br   + = ff.object.button_up(index: ff.index, url: move_up_admin_procedure_types_de_champ_private_path(@procedure, ff.index), private: true) + = ff.object.button_down(index: ff.index, url: move_down_admin_procedure_types_de_champ_private_path(@procedure, ff.index), private: true) + + .form-group + %br   + - if ff.object.id.nil? + = f.submit "Ajouter le champ", class: 'btn btn-success', id: :add_type_de_champ_private + - else + = link_to("", admin_procedure_type_de_champ_private_path(@procedure, ff.object.id), method: :delete, remote: true, id: "delete_type_de_champ_private_#{ff.object.id}", class: %w(form-control btn btn-danger fa fa-trash-o) ) + + diff --git a/app/views/admin/types_de_champ_private/_form.html.haml b/app/views/admin/types_de_champ_private/_form.html.haml new file mode 100644 index 000000000..a098de1f8 --- /dev/null +++ b/app/views/admin/types_de_champ_private/_form.html.haml @@ -0,0 +1,6 @@ += form_for [:admin, @procedure], url: admin_procedure_types_de_champ_private_path(@procedure) , remote: true do |f| + = render partial: 'fields', locals: { types_de_champ_private: @procedure.types_de_champ_private_ordered.decorate, f: f } + = f.submit "Enregistrer", class: 'btn btn-success', id: :save + %hr + #new_type_de_champ + = render partial: 'fields', locals: { types_de_champ_private: TypeDeChampPrivate.new.decorate, f: f } diff --git a/app/views/admin/types_de_champ_private/show.html.haml b/app/views/admin/types_de_champ_private/show.html.haml new file mode 100644 index 000000000..464f9083d --- /dev/null +++ b/app/views/admin/types_de_champ_private/show.html.haml @@ -0,0 +1,4 @@ +=render partial: 'admin/procedures/head', locals: {active: 'Champs privés'} + +#liste_champ + = render partial: 'form' \ No newline at end of file diff --git a/app/views/admin/types_de_champ_private/show.js.erb b/app/views/admin/types_de_champ_private/show.js.erb new file mode 100644 index 000000000..259d609e3 --- /dev/null +++ b/app/views/admin/types_de_champ_private/show.js.erb @@ -0,0 +1,5 @@ +<% flash.each do |type, message| %> +$("#flash_message").html("
<%= message.html_safe %>
").children().fadeOut(5000) +<% end %> +$('#liste_champ').html("<%= escape_javascript(render partial: 'form', locals: { procedure: @procedure, types_de_champ: @types_de_champ } ) %>"); +on_change_type_de_champ_select (); \ No newline at end of file diff --git a/config/initializers/inflections.rb b/config/initializers/inflections.rb index 1e5e84144..940e78aad 100644 --- a/config/initializers/inflections.rb +++ b/config/initializers/inflections.rb @@ -13,6 +13,7 @@ ActiveSupport::Inflector.inflections(:en) do |inflect| inflect.irregular 'piece_justificative', 'pieces_justificatives' inflect.irregular 'type_de_piece_justificative', 'types_de_piece_justificative' inflect.irregular 'type_de_champ', 'types_de_champ' + inflect.irregular 'type_de_champ_private', 'types_de_champ_private' inflect.irregular 'assign_to', 'assign_tos' end diff --git a/config/routes.rb b/config/routes.rb index cb11c81c3..a60906714 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -93,10 +93,20 @@ Rails.application.routes.draw do get 'profile' => 'profile#show', as: :profile resources :procedures do + resources :types_de_champ, only: [:destroy] resource :types_de_champ, only: [:show, :update] do post '/:index/move_up' => 'types_de_champ#move_up', as: :move_up post '/:index/move_down' => 'types_de_champ#move_down', as: :move_down end + + resources :types_de_champ_private, only: [:destroy] + resource :types_de_champ_private, only: [:show, :update] do + post '/:index/move_up' => 'types_de_champ_private#move_up', as: :move_up + post '/:index/move_down' => 'types_de_champ_private#move_down', as: :move_down + end + + resource :pieces_justificatives, only: [:show, :update] + resources :pieces_justificatives, only: :destroy resource :pieces_justificatives, only: [:show, :update] do post '/:index/move_up' => 'pieces_justificatives#move_up', as: :move_up post '/:index/move_down' => 'pieces_justificatives#move_down', as: :move_down @@ -111,9 +121,6 @@ Rails.application.routes.draw do resource :previsualisation, only: [:show] - resources :types_de_champ, only: [:destroy] - resource :pieces_justificatives, only: [:show, :update] - resources :pieces_justificatives, only: :destroy end namespace :accompagnateurs do diff --git a/db/migrate/20160802161734_add_type_attr_on_type_de_champ.rb b/db/migrate/20160802161734_add_type_attr_on_type_de_champ.rb new file mode 100644 index 000000000..d1ab25589 --- /dev/null +++ b/db/migrate/20160802161734_add_type_attr_on_type_de_champ.rb @@ -0,0 +1,5 @@ +class AddTypeAttrOnTypeDeChamp < ActiveRecord::Migration + def change + add_column :types_de_champ, :type, :string + end +end diff --git a/db/migrate/20160803081304_fix_default_type_on_type_de_champ_table.rb b/db/migrate/20160803081304_fix_default_type_on_type_de_champ_table.rb new file mode 100644 index 000000000..b5aec3a3a --- /dev/null +++ b/db/migrate/20160803081304_fix_default_type_on_type_de_champ_table.rb @@ -0,0 +1,17 @@ +class FixDefaultTypeOnTypeDeChampTable < ActiveRecord::Migration + class TypeDeChamp < ActiveRecord::Base + + end + + def up + TypeDeChamp.where("private = false").update_all("type = 'TypeDeChampPublic'") + TypeDeChamp.where("private = true").update_all("type = 'TypeDeChampPrivate'") + remove_column :types_de_champ, :private + end + + def down + add_column :types_de_champ, :private, :boolean, default: true + TypeDeChamp.where("type = 'TypeDeChampPublic'").update_all("private = false") + TypeDeChamp.where("type = 'TypeDeChampPrivate'").update_all("private = true") + end +end diff --git a/db/schema.rb b/db/schema.rb index 65a008f87..d022e46cd 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20160802131031) do +ActiveRecord::Schema.define(version: 20160803081304) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -296,7 +296,7 @@ ActiveRecord::Schema.define(version: 20160802131031) do t.integer "procedure_id" t.text "description" t.boolean "mandatory", default: false - t.boolean "private", default: false + t.string "type" end create_table "types_de_piece_justificative", force: :cascade do |t| diff --git a/spec/controllers/admin/types_de_champ_controller_spec.rb b/spec/controllers/admin/types_de_champ_controller_spec.rb index c334ccb0c..68203e16f 100644 --- a/spec/controllers/admin/types_de_champ_controller_spec.rb +++ b/spec/controllers/admin/types_de_champ_controller_spec.rb @@ -121,7 +121,7 @@ describe Admin::TypesDeChampController, type: :controller do end end context 'when procedure and type de champs are not linked' do - let(:type_de_champ) { create(:type_de_champ) } + let(:type_de_champ) { create(:type_de_champ_public) } let(:type_de_champ_id) { type_de_champ.id } it { expect(subject.status).to eq(404) } end @@ -136,20 +136,20 @@ describe Admin::TypesDeChampController, type: :controller do end context 'when procedure have only one type de champ' do let(:index) { 1 } - let!(:type_de_champ) { create(:type_de_champ, procedure: procedure) } + let!(:type_de_champ) { create(:type_de_champ_public, procedure: procedure) } it { expect(subject.status).to eq(400) } end context 'when procedure have tow type de champs' do context 'when index == 0' do let(:index) { 0 } - let!(:type_de_champ_1) { create(:type_de_champ, procedure: procedure) } - let!(:type_de_champ_2) { create(:type_de_champ, procedure: procedure) } + let!(:type_de_champ_1) { create(:type_de_champ_public, procedure: procedure) } + let!(:type_de_champ_2) { create(:type_de_champ_public, procedure: procedure) } it { expect(subject.status).to eq(400) } end context 'when index > 0' do let(:index) { 1 } - let!(:type_de_champ_0) { create(:type_de_champ, procedure: procedure, order_place: 0) } - let!(:type_de_champ_1) { create(:type_de_champ, procedure: procedure, order_place: 1) } + let!(:type_de_champ_0) { create(:type_de_champ_public, procedure: procedure, order_place: 0) } + let!(:type_de_champ_1) { create(:type_de_champ_public, procedure: procedure, order_place: 1) } it { expect(subject.status).to eq(200) } it { expect(subject).to render_template('show') } @@ -174,12 +174,12 @@ describe Admin::TypesDeChampController, type: :controller do it { expect(subject.status).to eq(400) } end context 'when procedure have only one type de champ' do - let!(:type_de_champ_0) { create(:type_de_champ, procedure: procedure) } + let!(:type_de_champ_0) { create(:type_de_champ_public, procedure: procedure) } it { expect(subject.status).to eq(400) } end context 'when procedure have 2 type de champ' do - let!(:type_de_champ_0) { create(:type_de_champ, procedure: procedure, order_place: 0) } - let!(:type_de_champ_1) { create(:type_de_champ, procedure: procedure, order_place: 1) } + let!(:type_de_champ_0) { create(:type_de_champ_public, procedure: procedure, order_place: 0) } + let!(:type_de_champ_1) { create(:type_de_champ_public, procedure: procedure, order_place: 1) } context 'when index represent last type_de_champ' do let(:index) { 1 } it { expect(subject.status).to eq(400) } diff --git a/spec/controllers/admin/types_de_champ_private_controller_spec.rb b/spec/controllers/admin/types_de_champ_private_controller_spec.rb new file mode 100644 index 000000000..2db709955 --- /dev/null +++ b/spec/controllers/admin/types_de_champ_private_controller_spec.rb @@ -0,0 +1,202 @@ +require 'spec_helper' + +describe Admin::TypesDeChampPrivateController, type: :controller do + let(:admin) { create(:administrateur) } + let(:procedure) { create(:procedure, administrateur: admin) } + + before do + sign_in admin + end + + describe 'GET #show' do + let(:published) { false } + let(:procedure) { create(:procedure, administrateur: admin, published: published) } + let(:procedure_id) { procedure.id } + + subject { get :show, procedure_id: procedure_id } + + context 'when procedure is not found' do + let(:procedure_id) { 9_999_999 } + it { expect(subject.status).to eq(404) } + end + + context 'when procedure is published' do + let(:published) { true } + it { is_expected.to redirect_to admin_procedure_path id: procedure_id } + end + + context 'when procedure does not belong to admin' do + let(:admin_2) { create(:administrateur) } + let(:procedure) { create(:procedure, administrateur: admin_2) } + it { expect(subject.status).to eq(404) } + end + end + + describe '#update' do + let(:libelle) { 'mon libelle' } + let(:type_champ) { 'text' } + let(:description) { 'titi' } + let(:order_place) { '' } + let(:types_de_champ_id) { '' } + let(:mandatory) { 'on' } + + let(:procedure_params) do + { types_de_champ_private_attributes: + { '0' => + { + libelle: libelle, + type_champ: type_champ, + description: description, + order_place: order_place, + id: types_de_champ_id, + mandatory: mandatory, + type: 'TypeDeChampPrivate' + } + } + } + end + + let(:request) { put :update, format: :js, procedure_id: procedure.id, procedure: procedure_params } + + context 'when procedure is found' do + it { expect{ request }.to change(TypeDeChamp, :count).by(1) } + + describe 'created type de champ' do + before do + request + procedure.reload + end + subject { procedure.types_de_champ_private.first } + + it { expect(subject.libelle).to eq('mon libelle') } + it { expect(subject.type_champ).to eq('text') } + it { expect(subject.description).to eq('titi') } + it { expect(subject.mandatory).to be_truthy } + end + + context 'when type_de_champ already exist' do + let(:procedure) { create(:procedure, :with_type_de_champ_private, administrateur: admin) } + let(:type_de_champ) { procedure.types_de_champ_private.first } + let(:types_de_champ_id) { type_de_champ.id } + let(:libelle) { 'toto' } + let(:type_champ) { 'text' } + let(:description) { 'citrouille' } + let(:order_place) { '0' } + let(:mandatory) { 'on' } + before do + request + procedure.reload + end + subject { procedure.types_de_champ_private.first } + it { expect(subject.libelle).to eq('toto') } + it { expect(subject.type_champ).to eq('text') } + it { expect(subject.description).to eq('citrouille') } + it { expect(subject.order_place).to eq(0) } + it { expect(subject.order_place).to be_truthy } + end + end + context 'when procedure is not found' do + subject { put :update, format: :js, procedure_id: 9_999_999, procedure: procedure_params } + it 'creates type de champ' do + expect(subject.status).to eq(404) + end + end + end + + describe '#destroy' do + before do + delete :destroy, procedure_id: procedure.id, id: type_de_champ_id, format: :js + end + + context 'when type de champs does not exist' do + let(:type_de_champ_id) { 99999999 } + it { expect(subject.status).to eq(404) } + end + context 'when types_de_champ exists' do + let(:procedure) { create(:procedure, :with_type_de_champ_private, administrateur: admin) } + let(:type_de_champ_id) { procedure.types_de_champ_private.first.id } + it { expect(subject.status).to eq(200) } + it 'destroy type de champ' do + procedure.reload + expect(procedure.types_de_champ.count).to eq(0) + end + end + context 'when procedure and type de champs are not linked' do + let(:type_de_champ) { create(:type_de_champ_public) } + let(:type_de_champ_id) { type_de_champ.id } + it { expect(subject.status).to eq(404) } + end + end + + describe 'POST #move_up' do + subject { post :move_up, procedure_id: procedure.id, index: index, format: :js } + + context 'when procedure have no type de champ' do + let(:index) { 0 } + it { expect(subject.status).to eq(400) } + end + context 'when procedure have only one type de champ' do + let(:index) { 1 } + let!(:type_de_champ) { create(:type_de_champ_private, procedure: procedure) } + it { expect(subject.status).to eq(400) } + end + context 'when procedure have tow type de champs' do + context 'when index == 0' do + let(:index) { 0 } + let!(:type_de_champ_1) { create(:type_de_champ_private, procedure: procedure) } + let!(:type_de_champ_2) { create(:type_de_champ_private, procedure: procedure) } + it { expect(subject.status).to eq(400) } + end + context 'when index > 0' do + let(:index) { 1 } + let!(:type_de_champ_0) { create(:type_de_champ_private, procedure: procedure, order_place: 0) } + let!(:type_de_champ_1) { create(:type_de_champ_private, procedure: procedure, order_place: 1) } + + it { expect(subject.status).to eq(200) } + it { expect(subject).to render_template('show') } + it 'changes order places' do + post :move_up, procedure_id: procedure.id, index: index, format: :js + type_de_champ_0.reload + type_de_champ_1.reload + expect(type_de_champ_0.order_place).to eq(1) + expect(type_de_champ_1.order_place).to eq(0) + end + end + end + end + + describe 'POST #move_down' do + let(:request) { post :move_down, procedure_id: procedure.id, index: index, format: :js } + let(:index) { 0 } + + subject { request } + + context 'when procedure have no type de champ' do + it { expect(subject.status).to eq(400) } + end + context 'when procedure have only one type de champ' do + let!(:type_de_champ_0) { create(:type_de_champ_private, procedure: procedure) } + it { expect(subject.status).to eq(400) } + end + context 'when procedure have 2 type de champ' do + let!(:type_de_champ_0) { create(:type_de_champ_private, procedure: procedure, order_place: 0) } + let!(:type_de_champ_1) { create(:type_de_champ_private, procedure: procedure, order_place: 1) } + context 'when index represent last type_de_champ' do + let(:index) { 1 } + it { expect(subject.status).to eq(400) } + end + context 'when index does not represent last type_de_champ' do + let(:index) { 0 } + it { expect(subject.status).to eq(200) } + it { expect(subject).to render_template('show') } + it 'changes order place' do + request + type_de_champ_0.reload + type_de_champ_1.reload + expect(type_de_champ_0.order_place).to eq(1) + expect(type_de_champ_1.order_place).to eq(0) + end + end + end + end +end diff --git a/spec/controllers/api/v1/dossiers_controller_spec.rb b/spec/controllers/api/v1/dossiers_controller_spec.rb index 6ff404ec4..a2eeaeeca 100644 --- a/spec/controllers/api/v1/dossiers_controller_spec.rb +++ b/spec/controllers/api/v1/dossiers_controller_spec.rb @@ -230,7 +230,7 @@ describe API::V1::DossiersController do it { expect(subject[:libelle]).to eq('Description') } it { expect(subject[:description]).to eq('description de votre projet') } it { expect(subject.keys.include?(:order_place)).to be_truthy } - it { expect(subject[:type]).to eq('text') } + it { expect(subject[:type_champ]).to eq('text') } end end end diff --git a/spec/decorators/type_de_champ_decorator_spec.rb b/spec/decorators/type_de_champ_decorator_spec.rb index 61a2bc73f..7ab455e00 100644 --- a/spec/decorators/type_de_champ_decorator_spec.rb +++ b/spec/decorators/type_de_champ_decorator_spec.rb @@ -5,9 +5,9 @@ describe TypeDeChampDecorator do let(:procedure) { create(:procedure) } let(:url) { 'http://localhost' } let(:params) { { url: url, index: index } } - let!(:type_de_champ_0) { create(:type_de_champ, procedure: procedure, order_place: 0) } - let!(:type_de_champ_1) { create(:type_de_champ, procedure: procedure, order_place: 1) } - let!(:type_de_champ_2) { create(:type_de_champ, procedure: procedure, order_place: 2) } + let!(:type_de_champ_0) { create(:type_de_champ_public, procedure: procedure, order_place: 0) } + let!(:type_de_champ_1) { create(:type_de_champ_public, procedure: procedure, order_place: 1) } + let!(:type_de_champ_2) { create(:type_de_champ_public, procedure: procedure, order_place: 2) } describe '#button_up' do diff --git a/spec/factories/procedure.rb b/spec/factories/procedure.rb index d8d5dc8c1..11cd238b1 100644 --- a/spec/factories/procedure.rb +++ b/spec/factories/procedure.rb @@ -24,15 +24,23 @@ FactoryGirl.define do trait :with_type_de_champ do after(:build) do |procedure, _evaluator| - type_de_champ = create(:type_de_champ) + type_de_champ = create(:type_de_champ_public) procedure.types_de_champ << type_de_champ end end + trait :with_type_de_champ_private do + after(:build) do |procedure, _evaluator| + type_de_champ = create(:type_de_champ_private) + + procedure.types_de_champ_private << type_de_champ + end + end + trait :with_type_de_champ_mandatory do after(:build) do |procedure, _evaluator| - type_de_champ = create(:type_de_champ, mandatory: true) + type_de_champ = create(:type_de_champ_public, mandatory: true) procedure.types_de_champ << type_de_champ end @@ -40,7 +48,7 @@ FactoryGirl.define do trait :with_datetime do after(:build) do |procedure, _evaluator| - type_de_champ = create(:type_de_champ, mandatory: true, type_champ: :datetime) + type_de_champ = create(:type_de_champ_public, mandatory: true, type_champ: :datetime) procedure.types_de_champ << type_de_champ end diff --git a/spec/factories/type_de_champ_private.rb b/spec/factories/type_de_champ_private.rb new file mode 100644 index 000000000..408279d05 --- /dev/null +++ b/spec/factories/type_de_champ_private.rb @@ -0,0 +1,9 @@ +FactoryGirl.define do + factory :type_de_champ_private do + libelle 'Description' + description 'description de votre projet' + type_champ 'text' + order_place 1 + mandatory false + end +end diff --git a/spec/factories/type_de_champ.rb b/spec/factories/type_de_champ_public.rb similarity index 82% rename from spec/factories/type_de_champ.rb rename to spec/factories/type_de_champ_public.rb index 8e348a254..937921d0d 100644 --- a/spec/factories/type_de_champ.rb +++ b/spec/factories/type_de_champ_public.rb @@ -1,5 +1,5 @@ FactoryGirl.define do - factory :type_de_champ do + factory :type_de_champ_public do libelle 'Description' description 'description de votre projet' type_champ 'text' diff --git a/spec/features/admin/move_down_type_de_champ_private_spec.rb b/spec/features/admin/move_down_type_de_champ_private_spec.rb new file mode 100644 index 000000000..b811617a0 --- /dev/null +++ b/spec/features/admin/move_down_type_de_champ_private_spec.rb @@ -0,0 +1,29 @@ +require 'spec_helper' + +feature 'move down button type de champs', js: true do + let(:administrateur) { create(:administrateur) } + + before do + login_as administrateur, scope: :administrateur + end + + let(:procedure) { create(:procedure, administrateur: administrateur) } + let!(:type_de_champ_0) { create(:type_de_champ_private, procedure: procedure, order_place: 0) } + let!(:type_de_champ_1) { create(:type_de_champ_private, procedure: procedure, order_place: 1) } + let!(:type_de_champ_2) { create(:type_de_champ_private, procedure: procedure, order_place: 2) } + let!(:type_de_champ_3) { create(:type_de_champ_private, procedure: procedure, order_place: 3) } + + context 'when clicking on move down for type de champ 1' do + before do + visit admin_procedure_types_de_champ_private_path procedure.id + page.find_by_id('btn_down_1').click + wait_for_ajax + type_de_champ_1.reload + type_de_champ_2.reload + end + scenario 'it switches type_de_champ 1 and 2 place ' do + expect(type_de_champ_1.order_place).to eq(2) + expect(type_de_champ_2.order_place).to eq(1) + end + end +end diff --git a/spec/features/admin/move_down_type_de_champ_spec.rb b/spec/features/admin/move_down_type_de_champ_spec.rb index 84f291caf..0e9243cf9 100644 --- a/spec/features/admin/move_down_type_de_champ_spec.rb +++ b/spec/features/admin/move_down_type_de_champ_spec.rb @@ -8,10 +8,10 @@ feature 'move down button type de champs', js: true do end let(:procedure) { create(:procedure, administrateur: administrateur) } - let!(:type_de_champ_0) { create(:type_de_champ, procedure: procedure, order_place: 0) } - let!(:type_de_champ_1) { create(:type_de_champ, procedure: procedure, order_place: 1) } - let!(:type_de_champ_2) { create(:type_de_champ, procedure: procedure, order_place: 2) } - let!(:type_de_champ_3) { create(:type_de_champ, procedure: procedure, order_place: 3) } + let!(:type_de_champ_0) { create(:type_de_champ_public, procedure: procedure, order_place: 0) } + let!(:type_de_champ_1) { create(:type_de_champ_public, procedure: procedure, order_place: 1) } + let!(:type_de_champ_2) { create(:type_de_champ_public, procedure: procedure, order_place: 2) } + let!(:type_de_champ_3) { create(:type_de_champ_public, procedure: procedure, order_place: 3) } context 'when clicking on move down for type de champ 1' do before do diff --git a/spec/features/admin/move_up_type_de_champ_private_spec.rb b/spec/features/admin/move_up_type_de_champ_private_spec.rb new file mode 100644 index 000000000..377fcea61 --- /dev/null +++ b/spec/features/admin/move_up_type_de_champ_private_spec.rb @@ -0,0 +1,29 @@ +require 'spec_helper' + +feature 'move up button type de champs', js: true do + let(:administrateur) { create(:administrateur) } + + before do + login_as administrateur, scope: :administrateur + end + + let(:procedure) { create(:procedure, administrateur: administrateur) } + let!(:type_de_champ_0) { create(:type_de_champ_private, procedure: procedure, order_place: 0) } + let!(:type_de_champ_1) { create(:type_de_champ_private, procedure: procedure, order_place: 1) } + let!(:type_de_champ_2) { create(:type_de_champ_private, procedure: procedure, order_place: 2) } + let!(:type_de_champ_3) { create(:type_de_champ_private, procedure: procedure, order_place: 3) } + + context 'when clicking on move down for type de champ 1' do + before do + visit admin_procedure_types_de_champ_private_path procedure.id + page.find_by_id('btn_up_1').click + wait_for_ajax + type_de_champ_0.reload + type_de_champ_1.reload + end + scenario 'it switches type_de_champ 1 and 2 place ' do + expect(type_de_champ_0.order_place).to eq(1) + expect(type_de_champ_1.order_place).to eq(0) + end + end +end diff --git a/spec/features/admin/move_up_type_de_champ_spec.rb b/spec/features/admin/move_up_type_de_champ_spec.rb index 4f0679509..28c0ab9f5 100644 --- a/spec/features/admin/move_up_type_de_champ_spec.rb +++ b/spec/features/admin/move_up_type_de_champ_spec.rb @@ -8,10 +8,10 @@ feature 'move up button type de champs', js: true do end let(:procedure) { create(:procedure, administrateur: administrateur) } - let!(:type_de_champ_0) { create(:type_de_champ, procedure: procedure, order_place: 0) } - let!(:type_de_champ_1) { create(:type_de_champ, procedure: procedure, order_place: 1) } - let!(:type_de_champ_2) { create(:type_de_champ, procedure: procedure, order_place: 2) } - let!(:type_de_champ_3) { create(:type_de_champ, procedure: procedure, order_place: 3) } + let!(:type_de_champ_0) { create(:type_de_champ_public, procedure: procedure, order_place: 0) } + let!(:type_de_champ_1) { create(:type_de_champ_public, procedure: procedure, order_place: 1) } + let!(:type_de_champ_2) { create(:type_de_champ_public, procedure: procedure, order_place: 2) } + let!(:type_de_champ_3) { create(:type_de_champ_public, procedure: procedure, order_place: 3) } context 'when clicking on move down for type de champ 1' do before do diff --git a/spec/models/champ_spec.rb b/spec/models/champ_spec.rb index 0e2cd61a8..edd9bfa2e 100644 --- a/spec/models/champ_spec.rb +++ b/spec/models/champ_spec.rb @@ -23,7 +23,7 @@ describe Champ do context 'when type_champ is datetime' do before do - champ.type_de_champ = create :type_de_champ, type_champ: 'datetime' + champ.type_de_champ = create :type_de_champ_public, type_champ: 'datetime' end it { is_expected.to eq 'datepicker' } @@ -31,7 +31,7 @@ describe Champ do context 'when type_champ is address' do before do - champ.type_de_champ = create :type_de_champ, type_champ: 'address' + champ.type_de_champ = create :type_de_champ_public, type_champ: 'address' end it { is_expected.to eq 'typeahead' } diff --git a/spec/models/dossier_spec.rb b/spec/models/dossier_spec.rb index 3a789effc..ebf8b2c9c 100644 --- a/spec/models/dossier_spec.rb +++ b/spec/models/dossier_spec.rb @@ -591,12 +591,12 @@ describe Dossier do let(:dossier_2) { Dossier.new(id: 0, procedure: procedure_2) } before do - create :type_de_champ, libelle: 'type_1_1', order_place: 1, procedure: dossier_1.procedure - create :type_de_champ, libelle: 'type_1_2', order_place: 2, procedure: dossier_1.procedure + create :type_de_champ_public, libelle: 'type_1_1', order_place: 1, procedure: dossier_1.procedure + create :type_de_champ_public, libelle: 'type_1_2', order_place: 2, procedure: dossier_1.procedure - create :type_de_champ, libelle: 'type_2_1', order_place: 1, procedure: dossier_2.procedure - create :type_de_champ, libelle: 'type_2_2', order_place: 2, procedure: dossier_2.procedure - create :type_de_champ, libelle: 'type_2_3', order_place: 3, procedure: dossier_2.procedure + create :type_de_champ_public, libelle: 'type_2_1', order_place: 1, procedure: dossier_2.procedure + create :type_de_champ_public, libelle: 'type_2_2', order_place: 2, procedure: dossier_2.procedure + create :type_de_champ_public, libelle: 'type_2_3', order_place: 3, procedure: dossier_2.procedure dossier_1.build_default_champs dossier_2.build_default_champs diff --git a/spec/models/procedure_spec.rb b/spec/models/procedure_spec.rb index 1724ed8d2..6e4f6fdbb 100644 --- a/spec/models/procedure_spec.rb +++ b/spec/models/procedure_spec.rb @@ -44,8 +44,8 @@ describe Procedure do describe '#types_de_champ_ordered' do let(:procedure) { create(:procedure) } - let!(:type_de_champ_0) { create(:type_de_champ, procedure: procedure, order_place: 1) } - let!(:type_de_champ_1) { create(:type_de_champ, procedure: procedure, order_place: 0) } + let!(:type_de_champ_0) { create(:type_de_champ_public, procedure: procedure, order_place: 1) } + let!(:type_de_champ_1) { create(:type_de_champ_public, procedure: procedure, order_place: 0) } subject { procedure.types_de_champ_ordered } it { expect(subject.first).to eq(type_de_champ_1) } it { expect(subject.last).to eq(type_de_champ_0) } @@ -60,8 +60,8 @@ describe Procedure do it { expect(subject).to eq(false) } end context 'when procedure have 2 types de champ' do - let!(:type_de_champ_0) { create(:type_de_champ, procedure: procedure, order_place: 0) } - let!(:type_de_champ_1) { create(:type_de_champ, procedure: procedure, order_place: 1) } + let!(:type_de_champ_0) { create(:type_de_champ_public, procedure: procedure, order_place: 0) } + let!(:type_de_champ_1) { create(:type_de_champ_public, procedure: procedure, order_place: 1) } context 'when index is not the last element' do it { expect(subject).to eq(true) } it 'switch order place' do @@ -128,8 +128,8 @@ describe Procedure do let(:archived) { false } let(:published) { false } let(:procedure) { create(:procedure, archived: archived, published: published) } - let!(:type_de_champ_0) { create(:type_de_champ, procedure: procedure, order_place: 0) } - let!(:type_de_champ_1) { create(:type_de_champ, procedure: procedure, order_place: 1) } + let!(:type_de_champ_0) { create(:type_de_champ_public, procedure: procedure, order_place: 0) } + let!(:type_de_champ_1) { create(:type_de_champ_public, procedure: procedure, order_place: 1) } let!(:piece_justificative_0) { create(:type_de_piece_justificative, procedure: procedure, order_place: 0) } let!(:piece_justificative_1) { create(:type_de_piece_justificative, procedure: procedure, order_place: 1) } subject { procedure.clone } diff --git a/spec/models/type_de_champ_private_spec.rb b/spec/models/type_de_champ_private_spec.rb new file mode 100644 index 000000000..6f0b1ce8a --- /dev/null +++ b/spec/models/type_de_champ_private_spec.rb @@ -0,0 +1,7 @@ +require 'spec_helper' + +describe TypeDeChampPrivate do + require 'models/type_de_champ_shared_example' + + it_should_behave_like "type_de_champ_spec" +end diff --git a/spec/models/type_de_champ_public_spec.rb b/spec/models/type_de_champ_public_spec.rb new file mode 100644 index 000000000..fc855566f --- /dev/null +++ b/spec/models/type_de_champ_public_spec.rb @@ -0,0 +1,7 @@ +require 'spec_helper' + +describe TypeDeChampPublic do + require 'models/type_de_champ_shared_example' + + it_should_behave_like "type_de_champ_spec" +end diff --git a/spec/models/type_de_champ_shared_example.rb b/spec/models/type_de_champ_shared_example.rb new file mode 100644 index 000000000..5ce94d7d3 --- /dev/null +++ b/spec/models/type_de_champ_shared_example.rb @@ -0,0 +1,44 @@ +shared_examples 'type_de_champ_spec' do + describe 'database columns' do + it { is_expected.to have_db_column(:libelle) } + it { is_expected.to have_db_column(:type_champ) } + it { is_expected.to have_db_column(:order_place) } + it { is_expected.to have_db_column(:description) } + end + + describe 'associations' do + it { is_expected.to belong_to(:procedure) } + it { is_expected.to have_many(:champ) } + end + + describe 'validation' do + context 'libelle' do + it { is_expected.not_to allow_value(nil).for(:libelle) } + it { is_expected.not_to allow_value('').for(:libelle) } + it { is_expected.to allow_value('Montant projet').for(:libelle) } + end + + context 'type' do + it { is_expected.not_to allow_value(nil).for(:type_champ) } + it { is_expected.not_to allow_value('').for(:type_champ) } + + it { is_expected.to allow_value('text').for(:type_champ) } + it { is_expected.to allow_value('textarea').for(:type_champ) } + it { is_expected.to allow_value('datetime').for(:type_champ) } + it { is_expected.to allow_value('number').for(:type_champ) } + it { is_expected.to allow_value('checkbox').for(:type_champ) } + end + + context 'order_place' do + # it { is_expected.not_to allow_value(nil).for(:order_place) } + # it { is_expected.not_to allow_value('').for(:order_place) } + it { is_expected.to allow_value(1).for(:order_place) } + end + + context 'description' do + it { is_expected.to allow_value(nil).for(:description) } + it { is_expected.to allow_value('').for(:description) } + it { is_expected.to allow_value('blabla').for(:description) } + end + end +end \ No newline at end of file diff --git a/spec/models/type_de_champ_spec.rb b/spec/models/type_de_champ_spec.rb index 101b2be02..9649c4078 100644 --- a/spec/models/type_de_champ_spec.rb +++ b/spec/models/type_de_champ_spec.rb @@ -1,46 +1,9 @@ require 'spec_helper' describe TypeDeChamp do - describe 'database columns' do - it { is_expected.to have_db_column(:libelle) } - it { is_expected.to have_db_column(:type_champ) } - it { is_expected.to have_db_column(:order_place) } - it { is_expected.to have_db_column(:description) } - end - describe 'associations' do - it { is_expected.to belong_to(:procedure) } - it { is_expected.to have_many(:champ) } - end + require 'models/type_de_champ_shared_example' - describe 'validation' do - context 'libelle' do - it { is_expected.not_to allow_value(nil).for(:libelle) } - it { is_expected.not_to allow_value('').for(:libelle) } - it { is_expected.to allow_value('Montant projet').for(:libelle) } - end - - context 'type' do - it { is_expected.not_to allow_value(nil).for(:type_champ) } - it { is_expected.not_to allow_value('').for(:type_champ) } - - it { is_expected.to allow_value('text').for(:type_champ) } - it { is_expected.to allow_value('textarea').for(:type_champ) } - it { is_expected.to allow_value('datetime').for(:type_champ) } - it { is_expected.to allow_value('number').for(:type_champ) } - it { is_expected.to allow_value('checkbox').for(:type_champ) } - end - - context 'order_place' do - # it { is_expected.not_to allow_value(nil).for(:order_place) } - # it { is_expected.not_to allow_value('').for(:order_place) } - it { is_expected.to allow_value(1).for(:order_place) } - end - - context 'description' do - it { is_expected.to allow_value(nil).for(:description) } - it { is_expected.to allow_value('').for(:description) } - it { is_expected.to allow_value('blabla').for(:description) } - end - end + it_should_behave_like "type_de_champ_spec" end + diff --git a/spec/views/admin/types_de_champ/show.html.haml_spec.rb b/spec/views/admin/types_de_champ/show.html.haml_spec.rb index d6b7d1355..4029d7e98 100644 --- a/spec/views/admin/types_de_champ/show.html.haml_spec.rb +++ b/spec/views/admin/types_de_champ/show.html.haml_spec.rb @@ -6,8 +6,8 @@ describe 'admin/types_de_champ/show.html.haml', type: :view do describe 'fields sorted' do let(:first_libelle) { 'salut la compagnie' } let(:last_libelle) { 'je suis bien sur la page' } - let!(:type_de_champ_1) { create(:type_de_champ, procedure: procedure, order_place: 1, libelle: last_libelle) } - let!(:type_de_champ_0) { create(:type_de_champ, procedure: procedure, order_place: 0, libelle: first_libelle) } + let!(:type_de_champ_1) { create(:type_de_champ_public, procedure: procedure, order_place: 1, libelle: last_libelle) } + let!(:type_de_champ_0) { create(:type_de_champ_public, procedure: procedure, order_place: 0, libelle: first_libelle) } before do procedure.reload assign(:procedure, procedure) @@ -30,15 +30,15 @@ describe 'admin/types_de_champ/show.html.haml', type: :view do it { expect(subject).not_to have_css('.fa-chevron-up') } end context 'when there is only one field in database' do - let!(:type_de_champ_0) { create(:type_de_champ, procedure: procedure, order_place: 0) } + let!(:type_de_champ_0) { create(:type_de_champ_public, procedure: procedure, order_place: 0) } it { expect(subject).not_to have_css('#btn_down_0') } it { expect(subject).not_to have_css('#btn_up_0') } it { expect(subject).not_to have_css('#btn_up_1') } it { expect(subject).not_to have_css('#btn_down_1') } end context 'when there are 2 fields in database' do - let!(:type_de_champ_0) { create(:type_de_champ, procedure: procedure, order_place: 0) } - let!(:type_de_champ_1) { create(:type_de_champ, procedure: procedure, order_place: 1) } + let!(:type_de_champ_0) { create(:type_de_champ_public, procedure: procedure, order_place: 0) } + let!(:type_de_champ_1) { create(:type_de_champ_public, procedure: procedure, order_place: 1) } it { expect(subject).to have_css('#btn_down_0') } it { expect(subject).not_to have_css('#btn_up_0') } it { expect(subject).to have_css('#btn_up_1') } diff --git a/spec/views/admin/types_de_champ_private/show.html.haml_spec.rb b/spec/views/admin/types_de_champ_private/show.html.haml_spec.rb new file mode 100644 index 000000000..e3515a0df --- /dev/null +++ b/spec/views/admin/types_de_champ_private/show.html.haml_spec.rb @@ -0,0 +1,48 @@ +require 'spec_helper' + +describe 'admin/types_de_champ_private/show.html.haml', type: :view do + let(:procedure) { create(:procedure) } + + describe 'fields sorted' do + let(:first_libelle) { 'salut la compagnie' } + let(:last_libelle) { 'je suis bien sur la page' } + let!(:type_de_champ_1) { create(:type_de_champ_private, procedure: procedure, order_place: 1, libelle: last_libelle) } + let!(:type_de_champ_0) { create(:type_de_champ_private, procedure: procedure, order_place: 0, libelle: first_libelle) } + before do + procedure.reload + assign(:procedure, procedure) + render + end + it 'sorts by order place' do + expect(rendered).to match(/#{first_libelle}.*#{last_libelle}/m) + end + end + + describe 'arrow button' do + subject do + procedure.reload + assign(:procedure, procedure) + render + rendered + end + context 'when there is no field in database' do + it { expect(subject).not_to have_css('.fa-chevron-down') } + it { expect(subject).not_to have_css('.fa-chevron-up') } + end + context 'when there is only one field in database' do + let!(:type_de_champ_0) { create(:type_de_champ_private, procedure: procedure, order_place: 0) } + it { expect(subject).not_to have_css('#btn_down_0') } + it { expect(subject).not_to have_css('#btn_up_0') } + it { expect(subject).not_to have_css('#btn_up_1') } + it { expect(subject).not_to have_css('#btn_down_1') } + end + context 'when there are 2 fields in database' do + let!(:type_de_champ_0) { create(:type_de_champ_private, procedure: procedure, order_place: 0) } + let!(:type_de_champ_1) { create(:type_de_champ_private, procedure: procedure, order_place: 1) } + it { expect(subject).to have_css('#btn_down_0') } + it { expect(subject).not_to have_css('#btn_up_0') } + it { expect(subject).to have_css('#btn_up_1') } + it { expect(subject).not_to have_css('#btn_down_1') } + end + end +end \ No newline at end of file