diff options
| author | Luc Donnet | 2018-02-20 10:38:45 +0100 | 
|---|---|---|
| committer | GitHub | 2018-02-20 10:38:45 +0100 | 
| commit | d5ff5c82041a9807dbb8bb9a598b74e99ad538f9 (patch) | |
| tree | 8386fe81d95460b60c77a62385a8f3e8f2df055f | |
| parent | d0163321a875a64b8f1e15a614d18663d013da3c (diff) | |
| parent | 5404087a961c831b10c3d597f3113f05b6b02102 (diff) | |
| download | chouette-core-d5ff5c82041a9807dbb8bb9a598b74e99ad538f9.tar.bz2 | |
Merge pull request #294 from af83/5863-use-shallow-urls-for-referentials
5863 Remove workbench id from the querystring
25 files changed, 273 insertions, 222 deletions
| diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 8bd3da2f9..45b7f55f6 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -36,16 +36,6 @@ class ApplicationController < ActionController::Base    end    helper_method :current_organisation -  def current_offer_workbench -    current_organisation.workbenches.find_by_name("Gestion de l'offre") -  end -  helper_method :current_offer_workbench - -  def current_workgroup -    current_offer_workbench.workgroup -  end -  helper_method :current_workgroup -    def current_functional_scope      functional_scope = current_organisation.sso_attributes.try(:[], "functional_scope") if current_organisation      JSON.parse(functional_scope) if functional_scope diff --git a/app/controllers/referentials_controller.rb b/app/controllers/referentials_controller.rb index 0ed3f75dd..5267c15d8 100644 --- a/app/controllers/referentials_controller.rb +++ b/app/controllers/referentials_controller.rb @@ -1,5 +1,6 @@  class ReferentialsController < ChouetteController    defaults :resource_class => Referential +  before_action :load_workbench    include PolicyChecker    respond_to :html @@ -30,7 +31,7 @@ class ReferentialsController < ChouetteController    def show      resource.switch      show! do |format| -      @referential = @referential.decorate(context: { current_workbench_id: params[:current_workbench_id] } ) +      @referential = @referential.decorate()        @reflines = lines_collection.paginate(page: params[:page], per_page: 10)        @reflines = ReferentialLineDecorator.decorate(          @reflines, @@ -141,7 +142,6 @@ class ReferentialsController < ChouetteController      if params[:from]        source_referential = Referential.find(params[:from])        @referential = Referential.new_from(source_referential, current_functional_scope) -      @referential.workbench_id = params[:current_workbench_id]      end      @referential.data_format = current_organisation.data_format @@ -175,4 +175,12 @@ class ReferentialsController < ChouetteController      )    end +  def load_workbench +    @workbench ||= Workbench.find(params[:workbench_id]) if params[:workbench_id] +    @workbench ||= resource&.workbench if params[:id] +    @workbench +  end + +  alias_method :current_workbench, :load_workbench +  helper_method :current_workbench  end diff --git a/app/decorators/referential_decorator.rb b/app/decorators/referential_decorator.rb index 3132cbf92..41cad237d 100644 --- a/app/decorators/referential_decorator.rb +++ b/app/decorators/referential_decorator.rb @@ -22,12 +22,12 @@ class ReferentialDecorator < AF83::Decorator      instance_decorator.action_link policy: :clone, secondary: :show do |l|        l.content t('actions.clone') -      l.href { h.new_referential_path(from: object.id, current_workbench_id: context[:current_workbench_id]) } +      l.href { h.duplicate_workbench_referential_path(object) }      end      instance_decorator.action_link policy: :validate, secondary: :show do |l|        l.content t('actions.validate') -      l.href { h.referential_select_compliance_control_set_path(object.id) } +      l.href { h.select_compliance_control_set_referential_path(object.id) }      end      instance_decorator.action_link policy: :archive, secondary: :show do |l| diff --git a/app/helpers/referentials_helper.rb b/app/helpers/referentials_helper.rb index 8251377aa..e464ec8a5 100644 --- a/app/helpers/referentials_helper.rb +++ b/app/helpers/referentials_helper.rb @@ -15,4 +15,14 @@ module ReferentialsHelper      service = ReferentialOverview.new referential, self      render partial: "referentials/overview", locals: {referential: referential, overview: service}    end + +  def mutual_workbench workbench +    current_user.organisation.workbenches.where(workgroup_id: workbench.workgroup_id).last +  end + +  def duplicate_workbench_referential_path referential +    workbench = mutual_workbench referential.workbench +    raise "Missing workbench for referential #{referential.name}" unless workbench.present? +    new_workbench_referential_path(workbench, from: referential.id) +  end  end diff --git a/app/javascript/vehicle_journeys/components/tools/select2s/MissionSelect2.js b/app/javascript/vehicle_journeys/components/tools/select2s/MissionSelect2.js index 7ab85a1ea..72dbd0152 100644 --- a/app/javascript/vehicle_journeys/components/tools/select2s/MissionSelect2.js +++ b/app/javascript/vehicle_journeys/components/tools/select2s/MissionSelect2.js @@ -29,11 +29,11 @@ export default class BSelect4 extends Component {          val = this.props.selection.selectedJPModal        }      } -    if(this.useAjax()){ -      val = val.published_name -    } -    else{ -      if(val){ +    if(val){ +      if(this.useAjax()){ +        val = val.published_name +      } +      else{          val = val.id        }      } diff --git a/app/models/chouette/stop_area.rb b/app/models/chouette/stop_area.rb index 699616863..7170dd217 100644 --- a/app/models/chouette/stop_area.rb +++ b/app/models/chouette/stop_area.rb @@ -392,8 +392,8 @@ module Chouette      def country_name        return unless country_code -        country = ISO3166::Country[country_code] +      return unless country        country.translations[I18n.locale.to_s] || country.name      end diff --git a/app/models/organisation.rb b/app/models/organisation.rb index da7d1fcf3..e8fb4e060 100644 --- a/app/models/organisation.rb +++ b/app/models/organisation.rb @@ -80,4 +80,8 @@ class Organisation < ActiveRecord::Base      features && features.include?(feature.to_s)    end +  def default_workbench +    workbenches.default +  end +  end diff --git a/app/models/user.rb b/app/models/user.rb index 1342f60ed..31e634415 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -15,6 +15,7 @@ class User < ActiveRecord::Base    # Setup accessible (or protected) attributes for your model    # attr_accessible :email, :password, :current_password, :password_confirmation, :remember_me, :name, :organisation_attributes    belongs_to :organisation +  has_many :workbenches, through: :organisation    accepts_nested_attributes_for :organisation    validates :organisation, :presence => true diff --git a/app/models/workbench.rb b/app/models/workbench.rb index b80fa64ac..eb53af7aa 100644 --- a/app/models/workbench.rb +++ b/app/models/workbench.rb @@ -1,4 +1,6 @@  class Workbench < ActiveRecord::Base +  DEFAULT_WORKBENCH_NAME = "Gestion de l'offre" +    include ObjectidFormatterSupport    belongs_to :organisation    belongs_to :line_referential @@ -40,6 +42,11 @@ class Workbench < ActiveRecord::Base      end    end +  def self.default +    self.last if self.count == 1 +    where(name: DEFAULT_WORKBENCH_NAME).last +  end +    private    def initialize_output diff --git a/app/views/dashboards/_dashboard.html.slim b/app/views/dashboards/_dashboard.html.slim index 05257a766..7f78934a6 100644 --- a/app/views/dashboards/_dashboard.html.slim +++ b/app/views/dashboards/_dashboard.html.slim @@ -14,25 +14,25 @@          - if workbench.referentials.present?            .list-group              - workbench.referentials.limit(5).each do |referential| -              = link_to referential.name, referential_path(referential, workbench_id: referential.workbench_id, current_workbench_id: workbench.id), class: 'list-group-item' +              = link_to referential.name, referential_path(referential), class: 'list-group-item'          - else            .panel-body              em.small.text-muted = t('workbenches.index.offers.no_content') -    .panel.panel-default -      .panel-heading -        h3.panel-title.with_actions -          = link_to I18n.t("activerecord.models.calendar", count: @dashboard.current_organisation.calendars.size), workgroup_calendars_path(current_workgroup) -          div -            = link_to '', workgroup_calendars_path(current_workgroup), class: ' fa fa-chevron-right pull-right' -      - if @dashboard.current_organisation.calendars.present? -        .list-group -          - @dashboard.current_organisation.calendars.order("updated_at desc").limit(5).each do |calendar| -            = link_to calendar.name, workgroup_calendars_path(current_workgroup, calendar), class: 'list-group-item' -      - else -        .panel-body -          em.small.text-muted -            = t('dasboard.calendars.none') +      .panel.panel-default +        .panel-heading +          h3.panel-title.with_actions +            = link_to I18n.t("activerecord.models.calendar", count: @dashboard.current_organisation.calendars.size), workgroup_calendars_path(workbench.workgroup) +            div +              = link_to '', workgroup_calendars_path(workbench.workgroup), class: ' fa fa-chevron-right pull-right' +        - if @dashboard.current_organisation.calendars.present? +          .list-group +            - @dashboard.current_organisation.calendars.order("updated_at desc").limit(5).each do |calendar| +              = link_to calendar.name, workgroup_calendars_path(workbench.workgroup, calendar), class: 'list-group-item' +        - else +          .panel-body +            em.small.text-muted +              = t('dasboard.calendars.none')    .col-lg-6.col-md-6.col-sm-6.col-xs-12      .panel.panel-default diff --git a/app/views/layouts/navigation/_main_nav_left_content_stif.html.slim b/app/views/layouts/navigation/_main_nav_left_content_stif.html.slim index 1b7293d21..cb0698cf8 100644 --- a/app/views/layouts/navigation/_main_nav_left_content_stif.html.slim +++ b/app/views/layouts/navigation/_main_nav_left_content_stif.html.slim @@ -24,14 +24,14 @@      #miTwo.panel-collapse.collapse        .list-group -        - if current_user -          = link_to workbench_path(current_offer_workbench), class: "list-group-item #{params[:controller] == 'workbenches' ? 'active' : ''}" do +        - current_user.workbenches.each do |current_workbench| +          = link_to workbench_path(current_workbench), class: "list-group-item #{params[:controller] == 'workbenches' ? 'active' : ''}" do              span Jeux de données -          = link_to workbench_imports_path(current_offer_workbench), class: "list-group-item #{(params[:controller] == 'imports') ? 'active' : ''}" do +          = link_to workbench_imports_path(current_workbench), class: "list-group-item #{(params[:controller] == 'imports') ? 'active' : ''}" do              span Import -          = link_to workgroup_calendars_path(current_workgroup), class: 'list-group-item' do +          = link_to workgroup_calendars_path(current_workbench.workgroup), class: 'list-group-item' do              span Modèles de calendrier -          = link_to workbench_compliance_check_sets_path(current_offer_workbench), class: 'list-group-item' do +          = link_to workbench_compliance_check_sets_path(current_workbench), class: 'list-group-item' do              span Rapport de contrôle            = link_to compliance_control_sets_path, class: 'list-group-item' do              span Jeux de contrôle diff --git a/app/views/referentials/_form.html.slim b/app/views/referentials/_form.html.slim index 9927f05bd..1e59ab566 100644 --- a/app/views/referentials/_form.html.slim +++ b/app/views/referentials/_form.html.slim @@ -1,4 +1,6 @@ -= simple_form_for @referential, html: {class: 'form-horizontal', id: 'referential_form'}, wrapper: :horizontal_form do |form| +- url = @referential.new_record? ? [@workbench, @referential] : [@referential] + += simple_form_for @referential, url: url, html: {class: 'form-horizontal', id: 'referential_form'}, wrapper: :horizontal_form do |form|    .row      .col-lg-12 diff --git a/app/views/referentials/select_compliance_control_set.html.slim b/app/views/referentials/select_compliance_control_set.html.slim index 87a888c0a..69c87aab2 100644 --- a/app/views/referentials/select_compliance_control_set.html.slim +++ b/app/views/referentials/select_compliance_control_set.html.slim @@ -2,7 +2,7 @@    .container-fluid      .row        .col-lg-8.col-lg-offset-2.col-md-8.col-md-offset-2.col-sm-10.col-sm-offset-1 -        = form_tag validate_referential_path(params[:referential_id]), {class: 'form-horizontal', id: 'select_compliance_control_set', wrapper: :horizontal_form} do +        = form_tag validate_referential_path(@referential), {class: 'form-horizontal', id: 'select_compliance_control_set', wrapper: :horizontal_form} do            .row              .col-lg-12                .form-group diff --git a/app/views/stif/dashboards/_dashboard.html.slim b/app/views/stif/dashboards/_dashboard.html.slim index c28696a94..83a2106bb 100644 --- a/app/views/stif/dashboards/_dashboard.html.slim +++ b/app/views/stif/dashboards/_dashboard.html.slim @@ -47,7 +47,7 @@        - if @dashboard.referentials.present?          .list-group            - @dashboard.referentials.first(5).each_with_index do |referential, i| -            = link_to referential.name, referential_path(referential, workbench_id: referential.workbench_id, current_workbench_id: @dashboard.workbench.id), class: 'list-group-item' if i < 6 +            = link_to referential.name, referential_path(referential), class: 'list-group-item' if i < 6        - else          .panel-body @@ -60,12 +60,12 @@            span.badge.ml-xs = @dashboard.calendars.count if @dashboard.calendars.present?            div -            = link_to '', workgroup_calendars_path(current_workgroup), class: ' fa fa-chevron-right pull-right', title: t('.see') +            = link_to '', workgroup_calendars_path(@dashboard.workbench.workgroup), class: ' fa fa-chevron-right pull-right', title: t('.see')        - if @dashboard.calendars.present?          .list-group            - @dashboard.calendars.first(5).each_with_index do |calendar, i| -            = link_to calendar.name, workgroup_calendar_path(current_workgroup, calendar), class: 'list-group-item' if i < 6 +            = link_to calendar.name, workgroup_calendar_path(@dashboard.workbench.workgroup, calendar), class: 'list-group-item' if i < 6        - else          .panel-body diff --git a/app/views/workbenches/show.html.slim b/app/views/workbenches/show.html.slim index aae34c51b..159aa8ea2 100644 --- a/app/views/workbenches/show.html.slim +++ b/app/views/workbenches/show.html.slim @@ -5,7 +5,7 @@      .col-lg-12.text-right        - if policy(Referential).create?          = link_to t('actions.import'), workbench_imports_path(@workbench), class: 'btn btn-primary' -        = link_to t('actions.add'), new_referential_path(workbench_id: @workbench), class: 'btn btn-primary' +        = link_to t('actions.add'), new_workbench_referential_path(@workbench), class: 'btn btn-primary'        = link_to t('workbenches.actions.show_output'), workbench_output_path(@workbench), class: 'btn btn-primary'  .page_content @@ -25,7 +25,7 @@                    key: :name, \                    attribute: 'name', \                    link_to: lambda do |referential| \ -                    referential_path(referential, current_workbench_id: params[:id]) \ +                    referential_path(referential) \                    end \                  ), \                  TableBuilderHelper::Column.new( \ diff --git a/config/breadcrumbs.rb b/config/breadcrumbs.rb index 2772895fe..00ccf16bd 100644 --- a/config/breadcrumbs.rb +++ b/config/breadcrumbs.rb @@ -23,12 +23,12 @@ end  crumb :referential do |referential|    link breadcrumb_name(referential), referential_path(referential) -  parent :workbench, current_offer_workbench +  parent :workbench, mutual_workbench(referential.workbench)  end  crumb :referentials do |referential| -  link I18n.t('referentials.index.title'), referentials_path() -  parent :workbench, current_offer_workbench +  link I18n.t('referentials.index.title'), workbench_path(current_workbench) +  parent :workbench, mutual_workbench(current_workbench)  end  crumb :referential_companies do |referential| diff --git a/config/routes.rb b/config/routes.rb index 0b657b028..456cb66f5 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -19,99 +19,10 @@ ChouetteIhm::Application.routes.draw do      resource :output, controller: :workbench_outputs      resources :merges -  end - -  devise_for :users, :controllers => { -    :registrations => 'users/registrations', :invitations => 'users/invitations' -  } - -  devise_scope :user do -    authenticated :user do -      root :to => 'workbenches#index', as: :authenticated_root -    end - -    unauthenticated :user do -      target = 'devise/sessions#new' - -      if Rails.application.config.chouette_authentication_settings[:type] == "cas" -        target = 'devise/cas_sessions#new' -      end - -      root :to => target, as: :unauthenticated_root -    end -  end - -  mount Sidekiq::Web => '/sidekiq' - -  namespace :api do -    namespace :v1 do -      resources :workbenches, only: [:index, :show] do -        resources :imports, only: [:index, :show, :create] -      end -      resources :access_links, only: [:index, :show] -      resources :access_points, only: [:index, :show] -      resources :connection_links, only: [:index, :show] -      resources :companies, only: [:index, :show] -      resources :group_of_lines, only: [:index, :show] -      resources :netex_imports, only: :create -      resources :journey_patterns, only: :show -      resources :lines, only: [:index, :show] do -        resources :journey_patterns, only: [:index, :show] -        resources :routes, only: [:index, :show] do -          resources :vehicle_journeys, only: [:index, :show] -          resources :journey_patterns, only: [:index, :show] -          resources :stop_areas, only: [:index, :show] -        end -      end -      resources :networks, only: [:index, :show] -      resources :routes, only: :show -      resources :stop_areas, only: [:index, :show] -      resources :time_tables, only: [:index, :show] -      resources :vehicle_journeys, only: :show -      namespace :internals do -        get 'compliance_check_sets/:id/notify_parent', to: 'compliance_check_sets#notify_parent' -        get 'netex_imports/:id/notify_parent', to: 'netex_imports#notify_parent' -      end -    end -  end -  resource :organisation, :only => [:show, :edit, :update] do -    resources :users +    resources :referentials, only: %w(new create)    end -  resources :api_keys, :only => [:edit, :update, :new, :create, :destroy] - -  resources :compliance_control_sets do -    get :simple, on: :member -    get :clone, on: :member -    resources :compliance_controls, except: :index do -      get :select_type, on: :collection -    end -    resources :compliance_control_blocks, :except => [:show, :index] -  end - -  deactivable = Proc.new do -    put :deactivate, on: :member -    put :activate, on: :member -  end - -  resources :stop_area_referentials, :only => [:show] do -    post :sync, on: :member -    resources :stop_areas do -      put :deactivate, on: :member -      put :activate, on: :member -      get :autocomplete, on: :collection -    end -  end - -  resources :line_referentials, :only => [:show, :edit, :update] do -    post :sync, on: :member -    resources :lines, &deactivable -    resources :group_of_lines -    resources :companies -    resources :networks -  end -      resources :workgroups do      resources :calendars do        get :autocomplete, on: :collection, controller: 'autocomplete_calendars' @@ -121,13 +32,19 @@ ChouetteIhm::Application.routes.draw do      end    end -  resources :referentials, except: :index do +  resources :referentials, except: %w(new create) do + +    member do +      put :archive +      put :unarchive +      get :select_compliance_control_set +      post :validate +    end +      resources :autocomplete_stop_areas, only: [:show, :index] do        get 'around', on: :member      end      resources :autocomplete_purchase_windows, only: [:index] -    get :select_compliance_control_set -    post :validate, on: :member      resources :autocomplete_time_tables, only: [:index]      resources :autocomplete_timebands      resources :group_of_lines, controller: "referential_group_of_lines" do @@ -136,12 +53,6 @@ ChouetteIhm::Application.routes.draw do        end      end -    # Archive/unarchive -    member do -      put :archive -      put :unarchive -    end -      resources :networks, controller: "referential_networks"      match 'lines' => 'lines#destroy_all', :via => :delete @@ -239,6 +150,105 @@ ChouetteIhm::Application.routes.draw do      resources :clean_ups    end +  devise_for :users, :controllers => { +    :registrations => 'users/registrations', :invitations => 'users/invitations' +  } + +  devise_scope :user do +    authenticated :user do +      root :to => 'workbenches#index', as: :authenticated_root +    end + +    unauthenticated :user do +      target = 'devise/sessions#new' + +      if Rails.application.config.chouette_authentication_settings[:type] == "cas" +        target = 'devise/cas_sessions#new' +      end + +      root :to => target, as: :unauthenticated_root +    end +  end + +  mount Sidekiq::Web => '/sidekiq' + +  namespace :api do +    namespace :v1 do +      resources :workbenches, only: [:index, :show] do +        resources :imports, only: [:index, :show, :create] +      end +      resources :access_links, only: [:index, :show] +      resources :access_points, only: [:index, :show] +      resources :connection_links, only: [:index, :show] +      resources :companies, only: [:index, :show] +      resources :group_of_lines, only: [:index, :show] +      resources :netex_imports, only: :create +      resources :journey_patterns, only: :show +      resources :lines, only: [:index, :show] do +        resources :journey_patterns, only: [:index, :show] +        resources :routes, only: [:index, :show] do +          resources :vehicle_journeys, only: [:index, :show] +          resources :journey_patterns, only: [:index, :show] +          resources :stop_areas, only: [:index, :show] +        end +      end +      resources :networks, only: [:index, :show] +      resources :routes, only: :show +      resources :stop_areas, only: [:index, :show] +      resources :time_tables, only: [:index, :show] +      resources :vehicle_journeys, only: :show +      namespace :internals do +        get 'compliance_check_sets/:id/notify_parent', to: 'compliance_check_sets#notify_parent' +        get 'netex_imports/:id/notify_parent', to: 'netex_imports#notify_parent' +      end +    end +  end + +  resource :organisation, :only => [:show, :edit, :update] do +    resources :users +  end + +  resources :api_keys, :only => [:edit, :update, :new, :create, :destroy] + +  resources :compliance_control_sets do +    get :simple, on: :member +    get :clone, on: :member +    resources :compliance_controls, except: :index do +      get :select_type, on: :collection +    end +    resources :compliance_control_blocks, :except => [:show, :index] +  end + +  deactivable = Proc.new do +    put :deactivate, on: :member +    put :activate, on: :member +  end + +  resources :stop_area_referentials, :only => [:show] do +    post :sync, on: :member +    resources :stop_areas do +      put :deactivate, on: :member +      put :activate, on: :member +      get :autocomplete, on: :collection +    end +  end + +  resources :line_referentials, :only => [:show, :edit, :update] do +    post :sync, on: :member +    resources :lines, &deactivable +    resources :group_of_lines +    resources :companies +    resources :networks +  end + +  resources :calendars do +    get :autocomplete, on: :collection, controller: 'autocomplete_calendars' +    member do +      get 'month', defaults: { format: :json } +    end +  end + +    root :to => "dashboards#show"    if Rails.env.development? || Rails.env.test? diff --git a/spec/controllers/referentials_controller_spec.rb b/spec/controllers/referentials_controller_spec.rb index f97480600..5e0b1e505 100644 --- a/spec/controllers/referentials_controller_spec.rb +++ b/spec/controllers/referentials_controller_spec.rb @@ -15,8 +15,7 @@ describe ReferentialsController, :type => :controller do      end      context "user's organisation doesn't match referential's organisation" do -      pending "hotfix opens all unknow actions need to close the uneeded later" do -      #it 'raises a ActiveRecord::RecordNotFound' do +      it 'raises a ActiveRecord::RecordNotFound' do          expect { put :archive, id: other_referential.id }.to raise_error(ActiveRecord::RecordNotFound)        end      end @@ -26,7 +25,7 @@ describe ReferentialsController, :type => :controller do      it 'gets compliance control set for current organisation' do        compliance_control_set = create(:compliance_control_set, organisation: @user.organisation)        create(:compliance_control_set) -      get :select_compliance_control_set, referential_id: referential.id +      get :select_compliance_control_set, id: referential.id        expect(assigns[:compliance_control_sets]).to eq([compliance_control_set])      end    end @@ -43,16 +42,51 @@ describe ReferentialsController, :type => :controller do      end    end +  describe "GET #new" do +    context "when duplicating" do +      let(:workbench){ create :workbench} +      let(:request){ +        get :new, +          workbench_id: workbench.id, +          from: referential.id +      } + +      it "duplicates the given referential" do +        request +        new_referential = assigns(:referential) +        expect(new_referential.line_referential).to eq referential.line_referential +        expect(new_referential.stop_area_referential).to eq referential.stop_area_referential +        expect(new_referential.objectid_format).to eq referential.objectid_format +        expect(new_referential.prefix).to eq referential.prefix +        expect(new_referential.slug).to eq "#{referential.slug}_clone" +        expect(new_referential.workbench).to eq workbench +      end +    end +  end +    describe "POST #create" do +    let(:workbench){ create :workbench}      context "when duplicating" do -      it "displays a flash message", pending: 'requires more params to create a valid Referential' do +      let(:request){          post :create, -          from: referential.id, -          current_workbench_id: referential.workbench_id, -          referential: { -            name: 'Duplicated' -          } +        workbench_id: workbench.id, +        referential: { +          name: 'Duplicated', +          created_from_id: referential.id, +          stop_area_referential: referential.stop_area_referential, +          line_referential: referential.line_referential, +          objectid_format: referential.objectid_format, +          workbench_id: referential.workbench_id +        } +      } + +      it "creates the new referential" do +        expect{request}.to change{Referential.count}.by 1 +        expect(Referential.last.name).to eq "Duplicated" +      end +      it "displays a flash message" do +        request          expect(controller).to set_flash[:notice].to(            I18n.t('notice.referentials.duplicate')          ) diff --git a/spec/decorators/referential_decorator_spec.rb b/spec/decorators/referential_decorator_spec.rb index efc438132..1224aaf75 100644 --- a/spec/decorators/referential_decorator_spec.rb +++ b/spec/decorators/referential_decorator_spec.rb @@ -1,7 +1,8 @@  RSpec.describe ReferentialDecorator, type: [:helper, :decorator] do    include Support::DecoratorHelpers -  let( :object ){ build_stubbed :referential } +  let( :workbench ){ build_stubbed :workbench } +  let( :object ){ build_stubbed :referential, workbench: workbench }    let( :referential ){ object }    let( :user ){ build_stubbed :user } @@ -35,7 +36,7 @@ RSpec.describe ReferentialDecorator, type: [:helper, :decorator] do            expect_action_link_hrefs.to eq([              [object],              referential_time_tables_path(object), -            new_referential_path(from: object) +            new_workbench_referential_path(referential.workbench, from: object.id)            ])          end        end @@ -50,8 +51,8 @@ RSpec.describe ReferentialDecorator, type: [:helper, :decorator] do                [object],                [:edit, object],                referential_time_tables_path(object), -              new_referential_path(from: object), -              referential_select_compliance_control_set_path(object), +              new_workbench_referential_path(referential.workbench, from: object.id), +              select_compliance_control_set_referential_path(object),                archive_referential_path(object),                referential_path(object)              ]) @@ -65,8 +66,8 @@ RSpec.describe ReferentialDecorator, type: [:helper, :decorator] do              expect_action_link_hrefs(action).to eq([                [:edit, object],                referential_time_tables_path(object), -              new_referential_path(from: object), -              referential_select_compliance_control_set_path(object), +              new_workbench_referential_path(referential.workbench, from: object.id), +              select_compliance_control_set_referential_path(object),                archive_referential_path(object),                "#",                referential_path(object) @@ -91,7 +92,7 @@ RSpec.describe ReferentialDecorator, type: [:helper, :decorator] do            expect_action_link_hrefs.to eq([              [object],              referential_time_tables_path(object), -            new_referential_path(from: object) +            new_workbench_referential_path(referential.workbench, from: object.id)            ])          end        end diff --git a/spec/features/referentials_spec.rb b/spec/features/referentials_spec.rb index 9af0ed32e..d4890fda4 100644 --- a/spec/features/referentials_spec.rb +++ b/spec/features/referentials_spec.rb @@ -55,7 +55,7 @@ describe "Referentials", :type => :feature do      context 'user has the permission to create referentials' do        it 'shows the clone link for referetnial' do -        expect(page).to have_link(I18n.t('actions.clone'), href: new_referential_path(from: referential.id)) +        expect(page).to have_link(I18n.t('actions.clone'), href: new_workbench_referential_path(referential.workbench, from: referential.id))        end      end @@ -63,7 +63,7 @@ describe "Referentials", :type => :feature do        it 'does not show the clone link for referetnial' do          @user.update_attribute(:permissions, [])          visit referential_path(referential) -        expect(page).not_to have_link(I18n.t('actions.clone'), href: new_referential_path(from: referential.id)) +        expect(page).not_to have_link(I18n.t('actions.clone'), href: new_workbench_referential_path(referential.workbench, from: referential.id))        end      end @@ -108,8 +108,9 @@ describe "Referentials", :type => :feature do    end    describe "create" do +    let(:workbench){ @user.organisation.workbenches.last }      it "should" do -      visit new_referential_path +      visit new_workbench_referential_path(workbench)        fill_in "Nom", :with => "Test"        click_button "Valider" @@ -132,7 +133,7 @@ describe "Referentials", :type => :feature do      context "when user is from the same organisation" do        xit "should" do -        visit new_referential_path(from: referential.id, current_workbench_id: @user.organisation.workbenches.first.id) +        visit new_workbench_referential_path(referential.workbench, from: referential.id, current_workbench_id: @user.organisation.workbenches.first.id)          select "2018", :from => "referential_metadatas_attributes_0_periods_attributes_0_begin_1i" @@ -187,7 +188,8 @@ describe "Referentials", :type => :feature do    end    describe "destroy" do -    let(:referential) {  create(:referential, :organisation => @user.organisation) } +    let(:workbench){ @user.organisation.workbenches.last } +    let(:referential) {  create(:referential, :organisation => @user.organisation, workbench: workbench) }      it "should remove referential" do        visit referential_path(referential) diff --git a/spec/features/workbenches/workbenches_permissions_spec.rb b/spec/features/workbenches/workbenches_permissions_spec.rb index d58293538..1c073a4c5 100644 --- a/spec/features/workbenches/workbenches_permissions_spec.rb +++ b/spec/features/workbenches/workbenches_permissions_spec.rb @@ -22,7 +22,7 @@ describe 'Workbenches', type: :feature do          let( :permission ){ true }          it 'shows the corresponding button' do -          expected_href = new_referential_path(workbench_id: workbench) +          expected_href = new_workbench_referential_path(workbench)            expect( page ).to have_link('Créer', href: expected_href)          end        end diff --git a/spec/features/workbenches/workbenches_show_spec.rb b/spec/features/workbenches/workbenches_show_spec.rb index 7be813b94..405fdce82 100644 --- a/spec/features/workbenches/workbenches_show_spec.rb +++ b/spec/features/workbenches/workbenches_show_spec.rb @@ -232,7 +232,7 @@ RSpec.describe 'Workbenches', type: :feature do          context 'user has the permission to create referentials' do            it 'shows the link for a new referetnial' do -            expect(page).to have_link(I18n.t('actions.add'), href: new_referential_path(workbench_id: workbench.id)) +            expect(page).to have_link(I18n.t('actions.add'), href: new_workbench_referential_path(workbench))            end          end @@ -240,7 +240,7 @@ RSpec.describe 'Workbenches', type: :feature do            it 'does not show the clone link for referential' do              @user.update_attribute(:permissions, [])              visit referential_path(referential) -            expect(page).not_to have_link(I18n.t('actions.add'), href: new_referential_path(workbench_id: workbench.id)) +            expect(page).not_to have_link(I18n.t('actions.add'), href: new_workbench_referential_path(workbench))            end          end        end diff --git a/spec/helpers/table_builder_helper_spec.rb b/spec/helpers/table_builder_helper_spec.rb index 5bddbb16f..478875118 100644 --- a/spec/helpers/table_builder_helper_spec.rb +++ b/spec/helpers/table_builder_helper_spec.rb @@ -15,8 +15,9 @@ describe TableBuilderHelper, type: :helper do    describe "#table_builder_2" do      it "builds a table" do -      referential = build_stubbed(:workbench_referential) +      referential = create(:workbench_referential)        workbench = referential.workbench +      referential.organisation.workbenches << workbench        user_context = UserContext.new(          build_stubbed( @@ -30,7 +31,8 @@ describe TableBuilderHelper, type: :helper do          ),          referential: referential        ) -      allow(helper).to receive(:current_user).and_return(user_context) +      allow(helper).to receive(:pundit_user).and_return(user_context) +      allow(helper).to receive(:current_user).and_return(user_context.user)        referentials = [referential] @@ -90,7 +92,7 @@ describe TableBuilderHelper, type: :helper do                          </ul>                          <ul class="other">                              <li class=""><a href="/referentials/#{referential.id}/time_tables">Calendriers</a></li> -                            <li class=""><a href="/referentials/new?from=#{referential.id}">Dupliquer</a></li> +                            <li class=""><a href="/workbenches/#{workbench.id}/referentials/new?from=#{referential.id}">Dupliquer</a></li>                              <li class=""><a href="/referentials/#{referential.id}/select_compliance_control_set">Valider</a></li>                              <li class=""><a rel="nofollow" data-method="put" href="/referentials/#{referential.id}/archive">Conserver</a></li>                          </ul> @@ -193,7 +195,8 @@ describe TableBuilderHelper, type: :helper do          ),          referential: referential        ) -      allow(helper).to receive(:current_user).and_return(user_context) +      allow(helper).to receive(:pundit_user).and_return(user_context) +      allow(helper).to receive(:current_user).and_return(user_context.user)        allow(helper).to receive(:current_referential)          .and_return(referential) @@ -307,7 +310,8 @@ describe TableBuilderHelper, type: :helper do          ),          referential: referential        ) -      allow(helper).to receive(:current_user).and_return(user_context) +      allow(helper).to receive(:pundit_user).and_return(user_context) +      allow(helper).to receive(:current_user).and_return(user_context.user)        allow(helper).to receive(:current_referential)          .and_return(referential) @@ -398,8 +402,8 @@ describe TableBuilderHelper, type: :helper do      end      context "on a single row" do -      let(:referential){ build_stubbed :referential } -      let(:other_referential){ build_stubbed :referential } +      let(:referential){ build_stubbed :workbench_referential } +      let(:other_referential){ build_stubbed :workbench_referential }        let(:user_context){          UserContext.new(            build_stubbed( @@ -432,7 +436,9 @@ describe TableBuilderHelper, type: :helper do        let(:items){ [item, other_item] }        before(:each){ -        allow(helper).to receive(:current_user).and_return(user_context) +        allow(helper).to receive(:pundit_user).and_return(user_context) +        allow(helper).to receive(:current_user).and_return(user_context.user) +        allow(helper).to receive(:mutual_workbench).and_return(referential.workbench)        }        context "with all rows non-selectable" do diff --git a/spec/support/decorator_helpers.rb b/spec/support/decorator_helpers.rb index b2c41e842..544604f61 100644 --- a/spec/support/decorator_helpers.rb +++ b/spec/support/decorator_helpers.rb @@ -8,6 +8,7 @@ module Support          let( :features ){ [] }          let( :filtered_action_links){}          before do +          allow(subject.h).to receive(:duplicate_workbench_referential_path).and_return new_workbench_referential_path(referential.workbench, from: referential.id)            allow_any_instance_of(Draper::HelperProxy).to receive(:policy).and_return policy            allow_any_instance_of(AF83::Decorator::Link).to receive(:check_feature){|f|              features.include?(f) diff --git a/spec/views/referentials/show.html.erb_spec.rb b/spec/views/referentials/show.html.erb_spec.rb index ea3bc1fe1..a7f37d180 100644 --- a/spec/views/referentials/show.html.erb_spec.rb +++ b/spec/views/referentials/show.html.erb_spec.rb @@ -1,73 +1,48 @@  require 'spec_helper'  describe "referentials/show", type: :view do +    let!(:referential) do -    referential = create(:referential, organisation: organisation) +    referential = create(:workbench_referential)      assign :referential, referential.decorate(context: {        current_organisation: referential.organisation      })    end +  let(:organisation){ referential.try(:organisation) }    let(:permissions){ [] }    let(:current_organisation) { organisation } -  let(:current_offer_workbench) { create :workbench, organisation: organisation} -  let(:current_workgroup) { current_offer_workbench.workgroup }    let(:readonly){ false }    before :each do      assign :reflines, [] -    allow(view).to receive(:current_offer_workbench).and_return(current_offer_workbench)      allow(view).to receive(:current_organisation).and_return(current_organisation) -    allow(view).to receive(:current_workgroup).and_return(current_workgroup)      allow(view).to receive(:current_user).and_return(current_user) -      allow(view).to receive(:resource).and_return(referential)      allow(view).to receive(:has_feature?).and_return(true)      allow(view).to receive(:user_signed_in?).and_return true +    allow(view).to receive(:mutual_workbench).and_return referential.workbench      controller.request.path_parameters[:id] = referential.id      allow(view).to receive(:params).and_return({action: :show})      allow(referential).to receive(:referential_read_only?){ readonly } +    render template: "referentials/show", layout: "layouts/application"    end -  describe "action links" do -    set_invariant "referential.object.full_name", "referential_full_name" -    set_invariant "referential.object.updated_at", "01/01/2000 00:00".to_time -    set_invariant "referential.object.id", "99" - -    before(:each){ -      render template: "referentials/show", layout: "layouts/application" -    } -    context "with a readonly referential" do -      let(:readonly){ true } -      it { should match_actions_links_snapshot "referentials/show_readonly" } - -      %w(create destroy update).each do |p| -        with_permission "referentials.#{p}" do -          it { should match_actions_links_snapshot "referentials/show_readonly_#{p}" } -        end -      end -    end - -    context "with a non-readonly referential" do -      it { should match_actions_links_snapshot "referentials/show" } +  it "should not present edit button" do +    expect(rendered).to_not have_selector("a[href=\"#{view.edit_referential_path(referential)}\"]") +  end -      %w(create destroy update).each do |p| -        with_permission "referentials.#{p}" do -          it { should match_actions_links_snapshot "referentials/show_#{p}" } -        end -      end +  with_permission "referentials.update" do +    it "should present edit button" do +      expect(rendered).to have_selector("a[href=\"#{view.edit_referential_path(referential)}\"]")      end -    %w(purchase_windows referential_vehicle_journeys).each do |f| -      with_feature f do -        it { should match_actions_links_snapshot "referentials/show_#{f}" } - -        %w(create update destroy).each do |p| -          with_permission "referentials.#{p}" do -            it { should match_actions_links_snapshot "referentials/show_#{f}_#{p}" } -          end -        end +    context "with a readonly referential" do +      let(:readonly){ true } +      it "should not present edit button" do +        expect(rendered).to_not have_selector("a[href=\"#{view.edit_referential_path(referential)}\"]")        end      end    end +  end | 
