aboutsummaryrefslogtreecommitdiffstats
path: root/spec
diff options
context:
space:
mode:
Diffstat (limited to 'spec')
-rw-r--r--spec/controllers/journey_patterns_collections_controller_spec.rb2
-rw-r--r--spec/controllers/routes_controller_spec.rb4
-rw-r--r--spec/decorators/company_decorator_spec.rb2
-rw-r--r--spec/features/lines_spec.rb144
-rw-r--r--spec/features/routes_spec.rb193
-rw-r--r--spec/features/time_tables_spec.rb5
-rw-r--r--spec/features/vehicle_journeys_spec.rb2
-rw-r--r--spec/features/workbenches_spec.rb54
-rw-r--r--spec/helpers/table_builder_helper/custom_links_spec.rb8
-rw-r--r--spec/helpers/table_builder_helper_spec.rb10
-rw-r--r--spec/policies/access_link_policy_spec.rb20
-rw-r--r--spec/policies/access_point_policy_spec.rb20
-rw-r--r--spec/policies/boiv_policy_spec.rb16
-rw-r--r--spec/policies/calendar_policy_spec.rb22
-rw-r--r--spec/policies/company_policy_spec.rb42
-rw-r--r--spec/policies/connection_link_policy_spec.rb20
-rw-r--r--spec/policies/group_of_line_policy_spec.rb42
-rw-r--r--spec/policies/journey_pattern_policy_spec.rb20
-rw-r--r--spec/policies/line_policy_spec.rb54
-rw-r--r--spec/policies/network_policy_spec.rb42
-rw-r--r--spec/policies/referential_policy_spec.rb102
-rw-r--r--spec/policies/route_policy_spec.rb8
-rw-r--r--spec/policies/routing_constraint_zone_policy_spec.rb8
-rw-r--r--spec/policies/stop_area_policy_spec.rb42
-rw-r--r--spec/policies/stop_point_policy_spec.rb5
-rw-r--r--spec/policies/time_table_policy_spec.rb19
-rw-r--r--spec/support/apartment_stubbing.rb14
-rw-r--r--spec/support/devise.rb43
-rw-r--r--spec/support/pundit/policies.rb14
-rw-r--r--spec/support/pundit/shared_examples.rb83
30 files changed, 771 insertions, 289 deletions
diff --git a/spec/controllers/journey_patterns_collections_controller_spec.rb b/spec/controllers/journey_patterns_collections_controller_spec.rb
index 888281036..442d73fb7 100644
--- a/spec/controllers/journey_patterns_collections_controller_spec.rb
+++ b/spec/controllers/journey_patterns_collections_controller_spec.rb
@@ -1,5 +1,3 @@
-require 'rails_helper'
-
RSpec.describe JourneyPatternsCollectionsController, :type => :controller do
end
diff --git a/spec/controllers/routes_controller_spec.rb b/spec/controllers/routes_controller_spec.rb
index 18067dec7..000b799db 100644
--- a/spec/controllers/routes_controller_spec.rb
+++ b/spec/controllers/routes_controller_spec.rb
@@ -1,6 +1,4 @@
-require 'spec_helper'
-
-describe RoutesController, :type => :controller do
+RSpec.describe RoutesController, :type => :controller do
login_user
let!(:route) { create(:route) }
diff --git a/spec/decorators/company_decorator_spec.rb b/spec/decorators/company_decorator_spec.rb
index 42ed6a408..a1df03449 100644
--- a/spec/decorators/company_decorator_spec.rb
+++ b/spec/decorators/company_decorator_spec.rb
@@ -1,4 +1,2 @@
-require 'spec_helper'
-
describe CompanyDecorator do
end
diff --git a/spec/features/lines_spec.rb b/spec/features/lines_spec.rb
index a55f30ebc..2a442bd2f 100644
--- a/spec/features/lines_spec.rb
+++ b/spec/features/lines_spec.rb
@@ -8,89 +8,91 @@ describe "Lines", type: :feature do
let!(:group_of_line) { create(:group_of_line) }
subject { lines.first }
- describe "index" do
- before(:each) { visit line_referential_lines_path(line_referential) }
+ with_permissions "boiv:read" do
+ describe "index" do
+ before(:each) { visit line_referential_lines_path(line_referential) }
- it "displays lines" do
- expect(page).to have_content(lines.first.name)
- expect(page).to have_content(lines.last.name)
- end
-
- it 'allows only R in CRUD' do
- expect(page).to have_link(I18n.t('actions.show'))
- expect(page).not_to have_link(I18n.t('actions.edit'), href: edit_referential_line_path(referential, lines.first))
- expect(page).not_to have_link(I18n.t('actions.destroy'), href: referential_line_path(referential, lines.first))
- expect(page).not_to have_link(I18n.t('actions.add'), href: new_referential_line_path(referential))
- end
-
- context 'filtering' do
- it 'supports filtering by name' do
- fill_in 'q[name_or_number_or_objectid_cont]', with: lines.first.name
- click_button 'search-btn'
+ it "displays lines" do
expect(page).to have_content(lines.first.name)
- expect(page).not_to have_content(lines.last.name)
+ expect(page).to have_content(lines.last.name)
end
- it 'supports filtering by number' do
- fill_in 'q[name_or_number_or_objectid_cont]', with: lines.first.number
- click_button 'search-btn'
- expect(page).to have_content(lines.first.name)
- expect(page).not_to have_content(lines.last.name)
+ it 'allows only R in CRUD' do
+ expect(page).to have_link(I18n.t('actions.show'))
+ expect(page).not_to have_link(I18n.t('actions.edit'), href: edit_referential_line_path(referential, lines.first))
+ expect(page).not_to have_link(I18n.t('actions.destroy'), href: referential_line_path(referential, lines.first))
+ expect(page).not_to have_link(I18n.t('actions.add'), href: new_referential_line_path(referential))
end
- it 'supports filtering by objectid' do
- fill_in 'q[name_or_number_or_objectid_cont]', with: lines.first.objectid
- click_button 'search-btn'
- expect(page).to have_content(lines.first.name)
- expect(page).not_to have_content(lines.last.name)
+ context 'filtering' do
+ it 'supports filtering by name' do
+ fill_in 'q[name_or_number_or_objectid_cont]', with: lines.first.name
+ click_button 'search-btn'
+ expect(page).to have_content(lines.first.name)
+ expect(page).not_to have_content(lines.last.name)
+ end
+
+ it 'supports filtering by number' do
+ fill_in 'q[name_or_number_or_objectid_cont]', with: lines.first.number
+ click_button 'search-btn'
+ expect(page).to have_content(lines.first.name)
+ expect(page).not_to have_content(lines.last.name)
+ end
+
+ it 'supports filtering by objectid' do
+ fill_in 'q[name_or_number_or_objectid_cont]', with: lines.first.objectid
+ click_button 'search-btn'
+ expect(page).to have_content(lines.first.name)
+ expect(page).not_to have_content(lines.last.name)
+ end
end
end
- end
- describe "show" do
- it "displays line" do
- visit line_referential_line_path(line_referential, lines.first)
- expect(page).to have_content(lines.first.name)
+ describe "show" do
+ it "displays line" do
+ visit line_referential_line_path(line_referential, lines.first)
+ expect(page).to have_content(lines.first.name)
+ end
end
- end
- # Fixme #1780
- # describe "new" do
- # it "creates line and return to show" do
- # visit line_referential_lines_path(line_referential)
- # click_link "Ajouter une ligne"
- # fill_in "line_name", :with => "Line 1"
- # fill_in "Numéro d'enregistrement", :with => "1"
- # fill_in "Identifiant Neptune", :with => "chouette:test:Line:999"
- # click_button("Créer ligne")
- # expect(page).to have_content("Line 1")
- # end
- # end
+ # Fixme #1780
+ # describe "new" do
+ # it "creates line and return to show" do
+ # visit line_referential_lines_path(line_referential)
+ # click_link "Ajouter une ligne"
+ # fill_in "line_name", :with => "Line 1"
+ # fill_in "Numéro d'enregistrement", :with => "1"
+ # fill_in "Identifiant Neptune", :with => "chouette:test:Line:999"
+ # click_button("Créer ligne")
+ # expect(page).to have_content("Line 1")
+ # end
+ # end
- # Fixme #1780
- # describe "new with group of line", :js => true do
- # it "creates line and return to show" do
- # visit new_line_referential_line_path(line_referential)
- # fill_in "line_name", :with => "Line 1"
- # fill_in "Numéro d'enregistrement", :with => "1"
- # fill_in "Identifiant Neptune", :with => "test:Line:999"
- # fill_in_token_input('line_group_of_line_tokens', :with => "#{group_of_line.name}")
- # find_button("Créer ligne").trigger("click")
- # expect(page).to have_text("Line 1")
- # expect(page).to have_text("#{group_of_line.name}")
- # end
- # end
+ # Fixme #1780
+ # describe "new with group of line", :js => true do
+ # it "creates line and return to show" do
+ # visit new_line_referential_line_path(line_referential)
+ # fill_in "line_name", :with => "Line 1"
+ # fill_in "Numéro d'enregistrement", :with => "1"
+ # fill_in "Identifiant Neptune", :with => "test:Line:999"
+ # fill_in_token_input('line_group_of_line_tokens', :with => "#{group_of_line.name}")
+ # find_button("Créer ligne").trigger("click")
+ # expect(page).to have_text("Line 1")
+ # expect(page).to have_text("#{group_of_line.name}")
+ # end
+ # end
- # Fixme #1780
- # describe "edit and return to show" do
- # it "edit line" do
- # visit line_referential_line_path(line_referential, subject)
- # click_link "Editer cette ligne"
- # fill_in "line_name", :with => "Line Modified"
- # fill_in "Numéro d'enregistrement", :with => "test-1"
- # click_button("Editer ligne")
- # expect(page).to have_content("Line Modified")
- # end
- # end
+ # Fixme #1780
+ # describe "edit and return to show" do
+ # it "edit line" do
+ # visit line_referential_line_path(line_referential, subject)
+ # click_link "Editer cette ligne"
+ # fill_in "line_name", :with => "Line Modified"
+ # fill_in "Numéro d'enregistrement", :with => "test-1"
+ # click_button("Editer ligne")
+ # expect(page).to have_content("Line Modified")
+ # end
+ # end
+ end
end
diff --git a/spec/features/routes_spec.rb b/spec/features/routes_spec.rb
index 28015f011..561725ddd 100644
--- a/spec/features/routes_spec.rb
+++ b/spec/features/routes_spec.rb
@@ -1,6 +1,3 @@
-# -*- coding: utf-8 -*-
-require 'spec_helper'
-
describe "Routes", :type => :feature do
login_user
@@ -13,130 +10,132 @@ describe "Routes", :type => :feature do
before { @user.update(organisation: referential.organisation) }
- describe "from lines page to a line page" do
- it "display line's routes" do
- visit referential_lines_path(referential)
- first(:link, 'Consulter').click
- expect(page).to have_content(route.name)
- expect(page).to have_content(route2.name)
+ with_permissions "boiv:read" do
+ context "from lines page to a line page" do
+ it "display line's routes" do
+ visit referential_lines_path(referential)
+ first(:link, 'Consulter').click
+ expect(page).to have_content(route.name)
+ expect(page).to have_content(route2.name)
+ end
end
- end
- describe "from line's page to route's page" do
- it "display route properties" do
- visit referential_line_path(referential, line)
- click_link "#{route.name}"
- expect(page).to have_content(route.name)
- expect(page).to have_content(route.number)
+ describe "from line's page to route's page" do
+ it "display route properties" do
+ visit referential_line_path(referential, line)
+ click_link "#{route.name}"
+ expect(page).to have_content(route.name)
+ expect(page).to have_content(route.number)
+ end
end
- end
- describe "from line's page, create a new route" do
- it "return to line's page that display new route" do
- visit referential_line_path(referential, line)
- click_link "Ajouter un itinéraire"
- fill_in "route_name", :with => "A to B"
- fill_in "route_published_name", :with => "Published A to B"
- # select 'Aller', :from => "route_direction"
- check('route[wayback]')
- click_button("Valider")
- expect(page).to have_content("A to B")
- expect(page).to have_content("Published A to B")
-
+ describe "from line's page, create a new route" do
+ it "return to line's page that display new route" do
+ visit referential_line_path(referential, line)
+ click_link "Ajouter un itinéraire"
+ fill_in "route_name", :with => "A to B"
+ fill_in "route_published_name", :with => "Published A to B"
+ # select 'Aller', :from => "route_direction"
+ check('route[wayback]')
+ click_button("Valider")
+ expect(page).to have_content("A to B")
+ expect(page).to have_content("Published A to B")
+
+ end
end
- end
- describe "Modifies boarding/alighting properties on route stops" do
- xit "Puts (http) an update request" do
- #visit edit_boarding_alighting_referential_line_route_path(referential, line, route)
- visit referential_line_route_path(referential, line, route)
-
- click_link I18n.t('routes.actions.edit_boarding_alighting')
- #select('', :from => '')
- # Changes the boarding of the first stop
- # Changes the alighting of the last stop
- # save
- #click_button(I18n.t('helpers.submit.update', model: I18n.t('activerecord.models.route.one')))
- click_button(I18n.t('helpers.submit.update', model: I18n.t('activerecord.models.route.one')))
+ describe "Modifies boarding/alighting properties on route stops" do
+ xit "Puts (http) an update request" do
+ #visit edit_boarding_alighting_referential_line_route_path(referential, line, route)
+ visit referential_line_route_path(referential, line, route)
+
+ click_link I18n.t('routes.actions.edit_boarding_alighting')
+ #select('', :from => '')
+ # Changes the boarding of the first stop
+ # Changes the alighting of the last stop
+ # save
+ #click_button(I18n.t('helpers.submit.update', model: I18n.t('activerecord.models.route.one')))
+ click_button(I18n.t('helpers.submit.update', model: I18n.t('activerecord.models.route.one')))
+ end
end
- end
- describe 'show' do
- before(:each) { visit referential_line_route_path(referential, line, route) }
+ describe 'show' do
+ before(:each) { visit referential_line_route_path(referential, line, route) }
- context 'user has permission to edit journey patterns' do
- skip "not sure the spec is correct or the code" do
- it 'shows edit links for journey patterns' do
- expect(page).to have_link(I18n.t('actions.edit'), href: edit_referential_line_route_journey_pattern_path(referential, line, route, journey_pattern))
+ context 'user has permission to edit journey patterns' do
+ skip "not sure the spec is correct or the code" do
+ it 'shows edit links for journey patterns' do
+ expect(page).to have_link(I18n.t('actions.edit'), href: edit_referential_line_route_journey_pattern_path(referential, line, route, journey_pattern))
+ end
end
end
- end
- context 'user does not have permission to edit journey patterns' do
- it 'does not show edit links for journey patterns' do
- @user.update_attribute(:permissions, [])
- visit referential_line_route_path(referential, line, route)
- expect(page).not_to have_link(I18n.t('actions.edit'), href: edit_referential_line_route_journey_pattern_path(referential, line, route, journey_pattern))
+ context 'user does not have permission to edit journey patterns' do
+ it 'does not show edit links for journey patterns' do
+ @user.update_attribute(:permissions, [])
+ visit referential_line_route_path(referential, line, route)
+ expect(page).not_to have_link(I18n.t('actions.edit'), href: edit_referential_line_route_journey_pattern_path(referential, line, route, journey_pattern))
+ end
end
- end
- context 'user has permission to destroy journey patterns' do
- it 'shows destroy links for journey patterns' do
- expect(page).to have_content(I18n.t('actions.destroy'))
+ context 'user has permission to destroy journey patterns' do
+ it 'shows destroy links for journey patterns' do
+ expect(page).to have_content(I18n.t('actions.destroy'))
+ end
end
- end
- context 'user does not have permission to destroy journey patterns' do
- it 'does not show destroy links for journey patterns' do
- @user.update_attribute(:permissions, [])
- visit referential_line_route_path(referential, line, route)
- expect(page).not_to have_link(I18n.t('actions.destroy'), href: referential_line_route_journey_pattern_path(referential, line, route, journey_pattern))
+ context 'user does not have permission to destroy journey patterns' do
+ it 'does not show destroy links for journey patterns' do
+ @user.update_attribute(:permissions, [])
+ visit referential_line_route_path(referential, line, route)
+ expect(page).not_to have_link(I18n.t('actions.destroy'), href: referential_line_route_journey_pattern_path(referential, line, route, journey_pattern))
+ end
end
end
- end
- describe 'referential line show' do
- before(:each) { visit referential_line_path(referential, line) }
+ describe 'referential line show' do
+ before(:each) { visit referential_line_path(referential, line) }
- context 'user has permission to edit routes' do
- it 'shows edit buttons for routes' do
- expect(page).to have_content(I18n.t('actions.edit'))
+ context 'user has permission to edit routes' do
+ it 'shows edit buttons for routes' do
+ expect(page).to have_content(I18n.t('actions.edit'))
+ end
end
- end
- context 'user does not have permission to edit routes' do
- it 'does not show edit buttons for routes' do
- @user.update_attribute(:permissions, [])
- visit referential_line_path(referential, line)
- expect(page).not_to have_link(I18n.t('actions.edit'), href: edit_referential_line_route_path(referential, line, route))
+ context 'user does not have permission to edit routes' do
+ it 'does not show edit buttons for routes' do
+ @user.update_attribute(:permissions, [])
+ visit referential_line_path(referential, line)
+ expect(page).not_to have_link(I18n.t('actions.edit'), href: edit_referential_line_route_path(referential, line, route))
+ end
end
- end
- context 'user has permission to create routes' do
- it 'shows link to a create route page' do
- expect(page).to have_content(I18n.t('routes.actions.new'))
+ context 'user has permission to create routes' do
+ it 'shows link to a create route page' do
+ expect(page).to have_content(I18n.t('routes.actions.new'))
+ end
end
- end
- context 'user belongs to another organisation' do
- xit 'does not show link to a create route page' do
- expect(page).not_to have_content(I18n.t('routes.actions.new'))
+ context 'user belongs to another organisation' do
+ xit 'does not show link to a create route page' do
+ expect(page).not_to have_content(I18n.t('routes.actions.new'))
+ end
end
- end
- context 'user does not have permission to create routes' do
- it 'does not show link to a create route page' do
- @user.update_attribute(:permissions, [])
- visit referential_line_path(referential, line)
- expect(page).not_to have_content(I18n.t('routes.actions.new'))
+ context 'user does not have permission to create routes' do
+ it 'does not show link to a create route page' do
+ @user.update_attribute(:permissions, [])
+ visit referential_line_path(referential, line)
+ expect(page).not_to have_content(I18n.t('routes.actions.new'))
+ end
end
- end
- context 'user does not have permission to destroy routes' do
- it 'does not show destroy buttons for routes' do
- @user.update_attribute(:permissions, [])
- visit referential_line_path(referential, line)
- expect(page).not_to have_link(I18n.t('actions.destroy'), href: referential_line_route_path(referential, line, route))
+ context 'user does not have permission to destroy routes' do
+ it 'does not show destroy buttons for routes' do
+ @user.update_attribute(:permissions, [])
+ visit referential_line_path(referential, line)
+ expect(page).not_to have_link(I18n.t('actions.destroy'), href: referential_line_route_path(referential, line, route))
+ end
end
end
end
diff --git a/spec/features/time_tables_spec.rb b/spec/features/time_tables_spec.rb
index 58a1dc98f..0fb4bb30d 100644
--- a/spec/features/time_tables_spec.rb
+++ b/spec/features/time_tables_spec.rb
@@ -1,7 +1,4 @@
-# -*- coding: utf-8 -*-
-require 'spec_helper'
-
-describe "TimeTables", :type => :feature do
+RSpec.describe "TimeTables", :type => :feature do
login_user
let!(:time_tables) { Array.new(2) { create(:time_table) } }
diff --git a/spec/features/vehicle_journeys_spec.rb b/spec/features/vehicle_journeys_spec.rb
index 5a3a9ad7d..16a79e2c5 100644
--- a/spec/features/vehicle_journeys_spec.rb
+++ b/spec/features/vehicle_journeys_spec.rb
@@ -43,7 +43,7 @@ describe 'VehicleJourneys', type: :feature do
context 'user does not have permission to edit vehicle journeys' do
it 'does not show an edit link for vehicle journeys' do
- @user.tap { |u| u.permissions.delete('vehicle_journeys.edit') }.save
+ @user.tap { |u| u.permissions.delete('vehicle_journeys.update') }.save
visit referential_line_route_vehicle_journey_path(referential, line, route, vehicle_journey)
expect(page).not_to have_content(I18n.t('vehicle_journeys.actions.edit'))
end
diff --git a/spec/features/workbenches_spec.rb b/spec/features/workbenches_spec.rb
index 9a40a8376..9141b5673 100644
--- a/spec/features/workbenches_spec.rb
+++ b/spec/features/workbenches_spec.rb
@@ -121,7 +121,7 @@ describe 'Workbenches', type: :feature do
expect(page).to_not have_content(other_referential.name)
end
- it 'should keep filtering on sort' do
+ it 'should keep filtering on sort' do
dates = referential.validity_period.to_a
fill_validity_field dates[0], 'begin_gteq'
fill_validity_field dates[1], 'end_lteq'
@@ -149,47 +149,47 @@ describe 'Workbenches', type: :feature do
end
click_button 'Filtrer'
- ['begin_gteq', 'end_lteq'].each_with_index do |field, index|
+ ['begin_gteq', 'end_lteq'].each_with_index do |field, index|
expect(find("#q_validity_period_#{field}_3i").value).to eq dates[index].day.to_s
expect(find("#q_validity_period_#{field}_2i").value).to eq dates[index].month.to_s
expect(find("#q_validity_period_#{field}_1i").value).to eq dates[index].year.to_s
end
end
end
- end
- context 'permissions' do
- before(:each) do
- visit workbench_path(workbench)
- end
+ context 'permissions' do
+ before(:each) do
+ visit workbench_path(workbench)
+ end
- 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))
+ 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))
+ end
end
- end
- context 'user does not have the permission to create referentials' 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))
+ context 'user does not have the permission to create referentials' 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))
+ end
end
end
- end
- end
- describe 'create new Referential' do
- it "create a new Referential with a specifed line and period" do
- referential.destroy
+ describe 'create new Referential' do
+ it "create a new Referential with a specifed line and period" do
+ referential.destroy
- visit workbench_path(workbench)
- click_link I18n.t('actions.add')
- fill_in "referential[name]", with: "Referential to test creation"
- select workbench.lines.first.id, from: 'referential[metadatas_attributes][0][lines][]'
+ visit workbench_path(workbench)
+ click_link I18n.t('actions.add')
+ fill_in "referential[name]", with: "Referential to test creation"
+ select workbench.lines.first.id, from: 'referential[metadatas_attributes][0][lines][]'
- click_button "Valider"
- expect(page).to have_css("h1", text: "Referential to test creation")
+ click_button "Valider"
+ expect(page).to have_css("h1", text: "Referential to test creation")
+ end
+ end
end
end
end
diff --git a/spec/helpers/table_builder_helper/custom_links_spec.rb b/spec/helpers/table_builder_helper/custom_links_spec.rb
index b64e97527..4b07922a7 100644
--- a/spec/helpers/table_builder_helper/custom_links_spec.rb
+++ b/spec/helpers/table_builder_helper/custom_links_spec.rb
@@ -1,5 +1,3 @@
-require 'spec_helper'
-
describe TableBuilderHelper::CustomLinks do
describe "#actions_after_policy_check" do
it "includes :show" do
@@ -8,19 +6,17 @@ describe TableBuilderHelper::CustomLinks do
build_stubbed(
:user,
organisation: referential.organisation,
- permissions: [
- 'boiv:read-offer'
- ]
),
referential: referential
)
+ stub_policy_scope(referential)
expect(
TableBuilderHelper::CustomLinks.new(
referential,
user_context,
[:show]
- ).actions_after_policy_check
+ ).authorized_actions
).to eq([:show])
end
end
diff --git a/spec/helpers/table_builder_helper_spec.rb b/spec/helpers/table_builder_helper_spec.rb
index d90c14204..4f7c1bd69 100644
--- a/spec/helpers/table_builder_helper_spec.rb
+++ b/spec/helpers/table_builder_helper_spec.rb
@@ -16,8 +16,8 @@ describe TableBuilderHelper, type: :helper do
organisation: referential.organisation,
permissions: [
'referentials.create',
- 'referentials.edit',
- 'referentials.destroy'
+ 'referentials.update',
+ 'referentials.destroy',
]
),
referential: referential
@@ -27,6 +27,7 @@ describe TableBuilderHelper, type: :helper do
referentials = [referential]
allow(referentials).to receive(:model).and_return(Referential)
+ stub_policy_scope(referential)
allow(helper).to receive(:params).and_return({
controller: 'workbenches',
@@ -193,6 +194,7 @@ describe TableBuilderHelper, type: :helper do
companies,
with: CompanyDecorator
)
+ stub_policy_scope(company)
expected = <<-HTML
<table class="table has-search">
@@ -299,8 +301,10 @@ describe TableBuilderHelper, type: :helper do
companies = ModelDecorator.decorate(
companies,
- with: CompanyDecorator
+ with: CompanyDecorator,
+ context: {line_referential: line_referential}
)
+ stub_policy_scope(company)
expected = <<-HTML
<table class="table has-search">
diff --git a/spec/policies/access_link_policy_spec.rb b/spec/policies/access_link_policy_spec.rb
new file mode 100644
index 000000000..6194ae55c
--- /dev/null
+++ b/spec/policies/access_link_policy_spec.rb
@@ -0,0 +1,20 @@
+RSpec.describe AccessLinkPolicy, type: :policy do
+
+ let( :record ){ build_stubbed :access_link }
+
+ permissions :create? do
+ it_behaves_like 'permitted policy and same organisation', "access_links.create", archived: true
+ end
+ permissions :destroy? do
+ it_behaves_like 'permitted policy and same organisation', "access_links.destroy", archived: true
+ end
+ permissions :edit? do
+ it_behaves_like 'permitted policy and same organisation', "access_links.update", archived: true
+ end
+ permissions :new? do
+ it_behaves_like 'permitted policy and same organisation', "access_links.create", archived: true
+ end
+ permissions :update? do
+ it_behaves_like 'permitted policy and same organisation', "access_links.update", archived: true
+ end
+end
diff --git a/spec/policies/access_point_policy_spec.rb b/spec/policies/access_point_policy_spec.rb
new file mode 100644
index 000000000..b6bc46eb4
--- /dev/null
+++ b/spec/policies/access_point_policy_spec.rb
@@ -0,0 +1,20 @@
+RSpec.describe AccessPointPolicy, type: :policy do
+
+ let( :record ){ build_stubbed :access_point }
+
+ permissions :create? do
+ it_behaves_like 'permitted policy and same organisation', "access_points.create", archived: true
+ end
+ permissions :destroy? do
+ it_behaves_like 'permitted policy and same organisation', "access_points.destroy", archived: true
+ end
+ permissions :edit? do
+ it_behaves_like 'permitted policy and same organisation', "access_points.update", archived: true
+ end
+ permissions :new? do
+ it_behaves_like 'permitted policy and same organisation', "access_points.create", archived: true
+ end
+ permissions :update? do
+ it_behaves_like 'permitted policy and same organisation', "access_points.update", archived: true
+ end
+end
diff --git a/spec/policies/boiv_policy_spec.rb b/spec/policies/boiv_policy_spec.rb
deleted file mode 100644
index 6787ab2ac..000000000
--- a/spec/policies/boiv_policy_spec.rb
+++ /dev/null
@@ -1,16 +0,0 @@
-RSpec.describe BoivPolicy, type: :policy do
-
- let( :record ){ nil }
-
- permissions :index? do
- it_behaves_like 'permitted policy and same organisation', 'boiv:read-offer'
- end
-
- permissions :boiv_read_offer? do
- it_behaves_like 'permitted policy and same organisation', 'boiv:read-offer'
- end
-
- permissions :show? do
- it_behaves_like 'permitted policy and same organisation', 'boiv:read-offer'
- end
-end
diff --git a/spec/policies/calendar_policy_spec.rb b/spec/policies/calendar_policy_spec.rb
new file mode 100644
index 000000000..57f771c54
--- /dev/null
+++ b/spec/policies/calendar_policy_spec.rb
@@ -0,0 +1,22 @@
+RSpec.describe CalendarPolicy, type: :policy do
+
+ let( :record ){ build_stubbed :calendar }
+ before { stub_policy_scope(record) }
+
+
+ permissions :create? do
+ it_behaves_like 'permitted policy and same organisation', 'calendars.create', archived: true
+ end
+ permissions :destroy? do
+ it_behaves_like 'permitted policy and same organisation', 'calendars.destroy', archived: true
+ end
+ permissions :edit? do
+ it_behaves_like 'permitted policy and same organisation', 'calendars.update', archived: true
+ end
+ permissions :new? do
+ it_behaves_like 'permitted policy and same organisation', 'calendars.create', archived: true
+ end
+ permissions :update? do
+ it_behaves_like 'permitted policy and same organisation', 'calendars.update', archived: true
+ end
+end
diff --git a/spec/policies/company_policy_spec.rb b/spec/policies/company_policy_spec.rb
new file mode 100644
index 000000000..2d249a2be
--- /dev/null
+++ b/spec/policies/company_policy_spec.rb
@@ -0,0 +1,42 @@
+RSpec.describe CompanyPolicy, type: :policy do
+
+ let( :record ){ build_stubbed :company }
+ before { stub_policy_scope(record) }
+
+
+ #
+ # Non Destructive
+ # ---------------
+
+ context 'Non Destructive actions →' do
+ permissions :index? do
+ it_behaves_like 'always allowed', 'anything', archived: true
+ end
+ permissions :show? do
+ it_behaves_like 'always allowed', 'anything', archived: true
+ end
+ end
+
+
+ #
+ # Destructive
+ # -----------
+
+ context 'Destructive actions →' do
+ permissions :create? do
+ it_behaves_like 'always forbidden', 'companies.create', archived: true
+ end
+ permissions :destroy? do
+ it_behaves_like 'always forbidden', 'companies.destroy', archived: true
+ end
+ permissions :edit? do
+ it_behaves_like 'always forbidden', 'companies.update', archived: true
+ end
+ permissions :new? do
+ it_behaves_like 'always forbidden', 'companies.create', archived: true
+ end
+ permissions :update? do
+ it_behaves_like 'always forbidden', 'companies.update', archived: true
+ end
+ end
+end
diff --git a/spec/policies/connection_link_policy_spec.rb b/spec/policies/connection_link_policy_spec.rb
new file mode 100644
index 000000000..23e40abe3
--- /dev/null
+++ b/spec/policies/connection_link_policy_spec.rb
@@ -0,0 +1,20 @@
+RSpec.describe ConnectionLinkPolicy, type: :policy do
+
+ let( :record ){ build_stubbed :connection_link }
+
+ permissions :create? do
+ it_behaves_like 'permitted policy and same organisation', "connection_links.create", archived: true
+ end
+ permissions :destroy? do
+ it_behaves_like 'permitted policy and same organisation', "connection_links.destroy", archived: true
+ end
+ permissions :edit? do
+ it_behaves_like 'permitted policy and same organisation', "connection_links.update", archived: true
+ end
+ permissions :new? do
+ it_behaves_like 'permitted policy and same organisation', "connection_links.create", archived: true
+ end
+ permissions :update? do
+ it_behaves_like 'permitted policy and same organisation', "connection_links.update", archived: true
+ end
+end
diff --git a/spec/policies/group_of_line_policy_spec.rb b/spec/policies/group_of_line_policy_spec.rb
new file mode 100644
index 000000000..29fbb1bfb
--- /dev/null
+++ b/spec/policies/group_of_line_policy_spec.rb
@@ -0,0 +1,42 @@
+RSpec.describe GroupOfLinePolicy, type: :policy do
+
+ let( :record ){ build_stubbed :group_of_line }
+ before { stub_policy_scope(record) }
+
+
+ #
+ # Non Destructive
+ # ---------------
+
+ context 'Non Destructive actions →' do
+ permissions :index? do
+ it_behaves_like 'always allowed', 'anything', archived: true
+ end
+ permissions :show? do
+ it_behaves_like 'always allowed', 'anything', archived: true
+ end
+ end
+
+
+ #
+ # Destructive
+ # -----------
+
+ context 'Destructive actions →' do
+ permissions :create? do
+ it_behaves_like 'always forbidden', 'group_of_lines.create', archived: true
+ end
+ permissions :destroy? do
+ it_behaves_like 'always forbidden', 'group_of_lines.destroy', archived: true
+ end
+ permissions :edit? do
+ it_behaves_like 'always forbidden', 'group_of_lines.update', archived: true
+ end
+ permissions :new? do
+ it_behaves_like 'always forbidden', 'group_of_lines.create', archived: true
+ end
+ permissions :update? do
+ it_behaves_like 'always forbidden', 'group_of_lines.update', archived: true
+ end
+ end
+end
diff --git a/spec/policies/journey_pattern_policy_spec.rb b/spec/policies/journey_pattern_policy_spec.rb
new file mode 100644
index 000000000..39f849277
--- /dev/null
+++ b/spec/policies/journey_pattern_policy_spec.rb
@@ -0,0 +1,20 @@
+RSpec.describe JourneyPatternPolicy, type: :policy do
+
+ let( :record ){ build_stubbed :journey_pattern }
+
+ permissions :create? do
+ it_behaves_like 'permitted policy and same organisation', "journey_patterns.create", archived: true
+ end
+ permissions :destroy? do
+ it_behaves_like 'permitted policy and same organisation', "journey_patterns.destroy", archived: true
+ end
+ permissions :edit? do
+ it_behaves_like 'permitted policy and same organisation', "journey_patterns.update", archived: true
+ end
+ permissions :new? do
+ it_behaves_like 'permitted policy and same organisation', "journey_patterns.create", archived: true
+ end
+ permissions :update? do
+ it_behaves_like 'permitted policy and same organisation', "journey_patterns.update", archived: true
+ end
+end
diff --git a/spec/policies/line_policy_spec.rb b/spec/policies/line_policy_spec.rb
index e720b2bc7..334073506 100644
--- a/spec/policies/line_policy_spec.rb
+++ b/spec/policies/line_policy_spec.rb
@@ -1,21 +1,59 @@
RSpec.describe LinePolicy, type: :policy do
let( :record ){ build_stubbed :line }
+ before { stub_policy_scope(record) }
- %w{create destroy edit}.each do | permission |
- footnote_permission = "#{permission}_footnote"
- permissions "#{footnote_permission}?".to_sym do
- it_behaves_like 'permitted policy', "footnotes.#{permission}", archived: true
+ #
+ # Non Destructive
+ # ---------------
+
+ context 'Non Destructive actions →' do
+ permissions :index? do
+ it_behaves_like 'always allowed', 'anything', archived: true
+ end
+ permissions :show? do
+ it_behaves_like 'always allowed', 'anything', archived: true
+ end
+ end
+
+
+ #
+ # Destructive
+ # -----------
+
+ context 'Destructive actions →' do
+ permissions :create? do
+ it_behaves_like 'always forbidden', 'lines.create', archived: true
+ end
+ permissions :destroy? do
+ it_behaves_like 'always forbidden', 'lines.destroy', archived: true
end
+ permissions :edit? do
+ it_behaves_like 'always forbidden', 'lines.update', archived: true
+ end
+ permissions :new? do
+ it_behaves_like 'always forbidden', 'lines.create', archived: true
+ end
+ permissions :update? do
+ it_behaves_like 'always forbidden', 'lines.update', archived: true
+ end
+ end
+
+
+ #
+ # Custom Footnote Permissions
+ # ---------------------------
+
+ permissions :create_footnote? do
+ it_behaves_like 'permitted policy and same organisation', 'footnotes.create', archived: true
end
- permissions :new_footnote? do
- it_behaves_like 'permitted policy', 'footnotes.create', archived: true
+ permissions :destroy_footnote? do
+ it_behaves_like 'permitted policy and same organisation', 'footnotes.destroy', archived: true
end
permissions :update_footnote? do
- it_behaves_like 'permitted policy', 'footnotes.edit', archived: true
+ it_behaves_like 'permitted policy and same organisation', 'footnotes.update', archived: true
end
-
end
diff --git a/spec/policies/network_policy_spec.rb b/spec/policies/network_policy_spec.rb
new file mode 100644
index 000000000..ae4ffa03a
--- /dev/null
+++ b/spec/policies/network_policy_spec.rb
@@ -0,0 +1,42 @@
+RSpec.describe NetworkPolicy, type: :policy do
+
+ let( :record ){ build_stubbed :network }
+ before { stub_policy_scope(record) }
+
+
+ #
+ # Non Destructive
+ # ---------------
+
+ context 'Non Destructive actions →' do
+ permissions :index? do
+ it_behaves_like 'always allowed', 'anything', archived: true
+ end
+ permissions :show? do
+ it_behaves_like 'always allowed', 'anything', archived: true
+ end
+ end
+
+
+ #
+ # Destructive
+ # -----------
+
+ context 'Destructive actions →' do
+ permissions :create? do
+ it_behaves_like 'always forbidden', 'networks.create', archived: true
+ end
+ permissions :destroy? do
+ it_behaves_like 'always forbidden', 'networks.destroy', archived: true
+ end
+ permissions :edit? do
+ it_behaves_like 'always forbidden', 'networks.update', archived: true
+ end
+ permissions :new? do
+ it_behaves_like 'always forbidden', 'networks.create', archived: true
+ end
+ permissions :update? do
+ it_behaves_like 'always forbidden', 'networks.update', archived: true
+ end
+ end
+end
diff --git a/spec/policies/referential_policy_spec.rb b/spec/policies/referential_policy_spec.rb
new file mode 100644
index 000000000..d060317f9
--- /dev/null
+++ b/spec/policies/referential_policy_spec.rb
@@ -0,0 +1,102 @@
+RSpec.describe ReferentialPolicy, type: :policy do
+
+ let( :record ){ build_stubbed :referential }
+
+
+ #
+ # Collection Based Permissions differ from standard as there is no referential yet
+ # --------------------------------------------------------------------------------
+
+ permissions :create? do
+ it 'permissions present → allowed' do
+ add_permissions('referentials.create', for_user: user)
+ expect_it.to permit(user_context, record)
+ end
+ it 'permissions absent → forbidden' do
+ expect_it.not_to permit(user_context, record)
+ end
+ end
+
+ permissions :new? do
+ it 'permissions present → allowed' do
+ add_permissions('referentials.create', for_user: user)
+ expect_it.to permit(user_context, record)
+ end
+ it 'permissions absent → forbidden' do
+ expect_it.not_to permit(user_context, record)
+ end
+ end
+
+ #
+ # Standard Destructive Action Permissions
+ # ---------------------------------------
+
+ permissions :destroy? do
+ it_behaves_like 'permitted policy and same organisation', 'referentials.destroy', archived: true
+ end
+ permissions :edit? do
+ it_behaves_like 'permitted policy and same organisation', 'referentials.update', archived: true
+ end
+ permissions :update? do
+ it_behaves_like 'permitted policy and same organisation', 'referentials.update', archived: true
+ end
+
+ #
+ # Custom Permissions
+ # ------------------
+
+ permissions :clone? do
+ it_behaves_like 'permitted policy and same organisation', 'referentials.create', archived: true
+ end
+
+ permissions :archive? do
+
+ context 'permission present →' do
+ before do
+ add_permissions('referentials.update', for_user: user)
+ end
+
+ it 'allowed for unarchived referentials' do
+ expect_it.to permit(user_context, record)
+ end
+
+ it 'forbidden for archived referentials' do
+ record.archived_at = 1.second.ago
+ expect_it.not_to permit(user_context, record)
+ end
+ end
+
+ context 'permission absent →' do
+ it 'is forbidden' do
+ expect_it.not_to permit(user_context, record)
+ end
+ end
+
+ end
+
+ permissions :unarchive? do
+
+ context 'permission present →' do
+ before do
+ add_permissions('referentials.update', for_user: user)
+ end
+
+ it 'forbidden for unarchived referentials' do
+ expect_it.not_to permit(user_context, record)
+ end
+
+ it 'allowed for archived referentials' do
+ record.archived_at = 1.second.ago
+ expect_it.to permit(user_context, record)
+ end
+ end
+
+ context 'permission absent →' do
+ it 'is forbidden' do
+ record.archived_at = 1.second.ago
+ expect_it.not_to permit(user_context, record)
+ end
+ end
+
+ end
+end
diff --git a/spec/policies/route_policy_spec.rb b/spec/policies/route_policy_spec.rb
index cc949ff45..243d85acb 100644
--- a/spec/policies/route_policy_spec.rb
+++ b/spec/policies/route_policy_spec.rb
@@ -3,7 +3,7 @@ RSpec.describe RoutePolicy, type: :policy do
let( :record ){ build_stubbed :route }
permissions :create? do
- it_behaves_like 'permitted policy', 'routes.create', archived: true
+ it_behaves_like 'permitted policy and same organisation', 'routes.create', archived: true
end
permissions :destroy? do
@@ -11,14 +11,14 @@ RSpec.describe RoutePolicy, type: :policy do
end
permissions :edit? do
- it_behaves_like 'permitted policy and same organisation', 'routes.edit', archived: true
+ it_behaves_like 'permitted policy and same organisation', 'routes.update', archived: true
end
permissions :new? do
- it_behaves_like 'permitted policy', 'routes.create', archived: true
+ it_behaves_like 'permitted policy and same organisation', 'routes.create', archived: true
end
permissions :update? do
- it_behaves_like 'permitted policy and same organisation', 'routes.edit', archived: true
+ it_behaves_like 'permitted policy and same organisation', 'routes.update', archived: true
end
end
diff --git a/spec/policies/routing_constraint_zone_policy_spec.rb b/spec/policies/routing_constraint_zone_policy_spec.rb
index 2508b49f9..2ef15fa95 100644
--- a/spec/policies/routing_constraint_zone_policy_spec.rb
+++ b/spec/policies/routing_constraint_zone_policy_spec.rb
@@ -4,7 +4,7 @@ RSpec.describe RoutingConstraintZonePolicy, type: :policy do
permissions :create? do
- it_behaves_like 'permitted policy', 'routing_constraint_zones.create', archived: true
+ it_behaves_like 'permitted policy and same organisation', 'routing_constraint_zones.create', archived: true
end
permissions :destroy? do
@@ -12,14 +12,14 @@ RSpec.describe RoutingConstraintZonePolicy, type: :policy do
end
permissions :edit? do
- it_behaves_like 'permitted policy and same organisation', 'routing_constraint_zones.edit', archived: true
+ it_behaves_like 'permitted policy and same organisation', 'routing_constraint_zones.update', archived: true
end
permissions :new? do
- it_behaves_like 'permitted policy', 'routing_constraint_zones.create', archived: true
+ it_behaves_like 'permitted policy and same organisation', 'routing_constraint_zones.create', archived: true
end
permissions :update? do
- it_behaves_like 'permitted policy and same organisation', 'routing_constraint_zones.edit', archived: true
+ it_behaves_like 'permitted policy and same organisation', 'routing_constraint_zones.update', archived: true
end
end
diff --git a/spec/policies/stop_area_policy_spec.rb b/spec/policies/stop_area_policy_spec.rb
new file mode 100644
index 000000000..8fe59c8e3
--- /dev/null
+++ b/spec/policies/stop_area_policy_spec.rb
@@ -0,0 +1,42 @@
+RSpec.describe StopAreaPolicy, type: :policy do
+
+ let( :record ){ build_stubbed :stop_area }
+ before { stub_policy_scope(record) }
+
+
+ #
+ # Non Destructive
+ # ---------------
+
+ context 'Non Destructive actions →' do
+ permissions :index? do
+ it_behaves_like 'always allowed', 'anything', archived: true
+ end
+ permissions :show? do
+ it_behaves_like 'always allowed', 'anything', archived: true
+ end
+ end
+
+
+ #
+ # Destructive
+ # -----------
+
+ context 'Destructive actions →' do
+ permissions :create? do
+ it_behaves_like 'always forbidden', 'stop_areas.create', archived: true
+ end
+ permissions :destroy? do
+ it_behaves_like 'always forbidden', 'stop_areas.destroy', archived: true
+ end
+ permissions :edit? do
+ it_behaves_like 'always forbidden', 'stop_areas.update', archived: true
+ end
+ permissions :new? do
+ it_behaves_like 'always forbidden', 'stop_areas.create', archived: true
+ end
+ permissions :update? do
+ it_behaves_like 'always forbidden', 'stop_areas.update', archived: true
+ end
+ end
+end
diff --git a/spec/policies/stop_point_policy_spec.rb b/spec/policies/stop_point_policy_spec.rb
new file mode 100644
index 000000000..2a8b9b905
--- /dev/null
+++ b/spec/policies/stop_point_policy_spec.rb
@@ -0,0 +1,5 @@
+RSpec.describe Chouette::StopPoint do
+ describe "using RoutePolicy" do
+ it { expect( described_class.policy_class ).to eq(RoutePolicy) }
+ end
+end
diff --git a/spec/policies/time_table_policy_spec.rb b/spec/policies/time_table_policy_spec.rb
index 90e6600ea..dad3c13bc 100644
--- a/spec/policies/time_table_policy_spec.rb
+++ b/spec/policies/time_table_policy_spec.rb
@@ -2,20 +2,23 @@ RSpec.describe TimeTablePolicy, type: :policy do
let( :record ){ build_stubbed :time_table }
-
- permissions :duplicate? do
+ permissions :create? do
it_behaves_like 'permitted policy and same organisation', 'time_tables.create', archived: true
end
- %w{destroy edit}.each do | permission |
- permissions "#{permission}?".to_sym do
- it_behaves_like 'permitted policy and same organisation', "time_tables.#{permission}", archived: true
- end
+ permissions :destroy? do
+ it_behaves_like 'permitted policy and same organisation', 'time_tables.destroy', archived: true
end
- permissions :create? do
- it_behaves_like 'permitted policy', 'time_tables.create', archived: true
+ permissions :edit? do
+ it_behaves_like 'permitted policy and same organisation', 'time_tables.update', archived: true
end
+ permissions :new? do
+ it_behaves_like 'permitted policy and same organisation', 'time_tables.create', archived: true
+ end
+ permissions :update? do
+ it_behaves_like 'permitted policy and same organisation', 'time_tables.update', archived: true
+ end
end
diff --git a/spec/support/apartment_stubbing.rb b/spec/support/apartment_stubbing.rb
new file mode 100644
index 000000000..408d3b878
--- /dev/null
+++ b/spec/support/apartment_stubbing.rb
@@ -0,0 +1,14 @@
+module Support
+ # This is needed for referentials that are stubbed with `build_stubbed`
+ # As one cannot switch to such referentials (obviously the schema does not exist)
+ # we provide a stub for `scope.where(...` needed in ApplicationPolicy#show
+ module ApartmentStubbing
+ def stub_policy_scope(model)
+ allow(model.class).to receive(:where).with(id: model.id).and_return double("instance of #{model.class}").as_null_object
+ end
+ end
+end
+
+RSpec.configure do | conf |
+ conf.include Support::ApartmentStubbing
+end
diff --git a/spec/support/devise.rb b/spec/support/devise.rb
index d4a279a41..28703c072 100644
--- a/spec/support/devise.rb
+++ b/spec/support/devise.rb
@@ -4,12 +4,12 @@ module DeviseRequestHelper
def login_user
organisation = Organisation.where(:code => "first").first_or_create(attributes_for(:organisation))
@user ||= create(:user, :organisation => organisation,
- :permissions => ['routes.create', 'routes.edit', 'routes.destroy', 'journey_patterns.create', 'journey_patterns.edit', 'journey_patterns.destroy',
- 'vehicle_journeys.create', 'vehicle_journeys.edit', 'vehicle_journeys.destroy', 'time_tables.create', 'time_tables.edit', 'time_tables.destroy',
- 'footnotes.edit', 'footnotes.create', 'footnotes.destroy', 'routing_constraint_zones.create', 'routing_constraint_zones.edit', 'routing_constraint_zones.destroy',
- 'access_points.create', 'access_points.edit', 'access_points.destroy', 'access_links.create', 'access_links.edit', 'access_links.destroy',
- 'connection_links.create', 'connection_links.edit', 'connection_links.destroy', 'route_sections.create', 'route_sections.edit', 'route_sections.destroy',
- 'referentials.create', 'referentials.edit', 'referentials.destroy'])
+ :permissions => ['routes.create', 'routes.update', 'routes.destroy', 'journey_patterns.create', 'journey_patterns.update', 'journey_patterns.destroy',
+ 'vehicle_journeys.create', 'vehicle_journeys.update', 'vehicle_journeys.destroy', 'time_tables.create', 'time_tables.update', 'time_tables.destroy',
+ 'footnotes.update', 'footnotes.create', 'footnotes.destroy', 'routing_constraint_zones.create', 'routing_constraint_zones.update', 'routing_constraint_zones.destroy',
+ 'access_points.create', 'access_points.update', 'access_points.destroy', 'access_links.create', 'access_links.update', 'access_links.destroy',
+ 'connection_links.create', 'connection_links.update', 'connection_links.destroy', 'route_sections.create', 'route_sections.update', 'route_sections.destroy',
+ 'referentials.create', 'referentials.update', 'referentials.destroy'])
login_as @user, :scope => :user
# post_via_redirect user_session_path, 'user[email]' => @user.email, 'user[password]' => @user.password
end
@@ -36,25 +36,42 @@ module DeviseRequestHelper
end
module DeviseControllerHelper
+
def setup_user
+ _all_actions = %w{create destroy update}
+ _all_resources = %w{ access_links
+ access_points
+ connection_links
+ footnotes
+ journey_patterns
+ referentials
+ route_sections
+ routes
+ routing_constraint_zones
+ time_tables
+ vehicle_journeys }
+ join_with = -> (separator) do
+ -> (ary) { ary.join(separator) }
+ end
+
before do
@request.env["devise.mapping"] = Devise.mappings[:user]
organisation = Organisation.where(:code => "first").first_or_create(attributes_for(:organisation))
- @user = create(:user, :organisation => organisation,
- :permissions => ['routes.create', 'routes.edit', 'routes.destroy', 'journey_patterns.create', 'journey_patterns.edit', 'journey_patterns.destroy',
- 'vehicle_journeys.create', 'vehicle_journeys.edit', 'vehicle_journeys.destroy', 'time_tables.create', 'time_tables.edit', 'time_tables.destroy',
- 'footnotes.edit', 'footnotes.create', 'footnotes.destroy', 'routing_constraint_zones.create', 'routing_constraint_zones.edit', 'routing_constraint_zones.destroy',
- 'access_points.create', 'access_points.edit', 'access_points.destroy', 'access_links.create', 'access_links.edit', 'access_links.destroy',
- 'connection_links.create', 'connection_links.edit', 'connection_links.destroy', 'route_sections.create', 'route_sections.edit', 'route_sections.destroy',
- 'referentials.create', 'referentials.edit', 'referentials.destroy'])
+ @user = create(:user,
+ organisation: organisation,
+ permissions: _all_resources.product( _all_actions ).map(&join_with.('.')))
end
end
+
def login_user()
setup_user
before do
sign_in @user
end
end
+
+ private
+
end
RSpec.configure do |config|
diff --git a/spec/support/pundit/policies.rb b/spec/support/pundit/policies.rb
index 02fea2944..d5bb63243 100644
--- a/spec/support/pundit/policies.rb
+++ b/spec/support/pundit/policies.rb
@@ -35,10 +35,24 @@ module Support
end
end
end
+
+ module FeaturePermissionMacros
+ def with_permissions(*permissions, &blk)
+ perms, options = permissions.partition{|x| String === x}
+ context "with permissions #{perms.inspect}...", *options do
+ before do
+ add_permissions(*permissions, for_user: @user)
+ end
+ instance_eval(&blk)
+ end
+ end
+ end
end
end
RSpec.configure do | c |
c.include Support::Pundit::Policies, type: :policy
c.extend Support::Pundit::PoliciesMacros, type: :policy
+ c.include Support::Pundit::Policies, type: :feature
+ c.extend Support::Pundit::FeaturePermissionMacros, type: :feature
end
diff --git a/spec/support/pundit/shared_examples.rb b/spec/support/pundit/shared_examples.rb
index 33ed1ffae..b91caa479 100644
--- a/spec/support/pundit/shared_examples.rb
+++ b/spec/support/pundit/shared_examples.rb
@@ -1,57 +1,100 @@
-RSpec.shared_examples 'permitted policy and same organisation' do
- | permission, archived: false|
- context 'permission absent → ' do
- it "denies a user with a different organisation" do
- expect_it.not_to permit(user_context, record)
+RSpec.shared_examples 'always allowed' do
+ | permission, archived: false|
+ context 'same organisation →' do
+ before do
+ user.organisation_id = referential.organisation_id
end
- it 'and also a user with the same organisation' do
- user.organisation = referential.organisation
- expect_it.not_to permit(user_context, record)
+ it "allows a user with the same organisation" do
+ expect_it.to permit(user_context, record)
+ end
+ if archived
+ it 'does not remove permission for archived referentials' do
+ referential.archived_at = 42.seconds.ago
+ expect_it.to permit(user_context, record)
+ end
end
end
-
- context 'permission present → ' do
+
+ context 'different organisations →' do
before do
add_permissions(permission, for_user: user)
end
+ it "allows a user with a different organisation" do
+ expect_it.to permit(user_context, record)
+ end
+ if archived
+ it 'does not remove permission for archived referentials' do
+ referential.archived_at = 42.seconds.ago
+ expect_it.to permit(user_context, record)
+ end
+ end
+ end
+end
- it 'denies a user with a different organisation' do
+RSpec.shared_examples 'always forbidden' do
+ | permission, archived: false|
+ context 'same organisation →' do
+ before do
+ user.organisation_id = referential.organisation_id
+ end
+ it "allows a user with the same organisation" do
expect_it.not_to permit(user_context, record)
end
-
- it 'but allows it for a user with the same organisation' do
- user.organisation = referential.organisation
- expect_it.to permit(user_context, record)
+ if archived
+ it 'still no permission for archived referentials' do
+ referential.archived_at = 42.seconds.ago
+ expect_it.not_to permit(user_context, record)
+ end
end
+ end
+ context 'different organisations →' do
+ before do
+ add_permissions(permission, for_user: user)
+ end
+ it "denies a user with a different organisation" do
+ expect_it.not_to permit(user_context, record)
+ end
if archived
- it 'removes the permission for archived referentials' do
- user.organisation = referential.organisation
+ it 'still no permission for archived referentials' do
referential.archived_at = 42.seconds.ago
expect_it.not_to permit(user_context, record)
end
end
end
end
-
-RSpec.shared_examples 'permitted policy' do
+j
+RSpec.shared_examples 'permitted policy and same organisation' do
| permission, archived: false|
+
context 'permission absent → ' do
it "denies a user with a different organisation" do
expect_it.not_to permit(user_context, record)
end
+ it 'and also a user with the same organisation' do
+ user.organisation_id = referential.organisation_id
+ expect_it.not_to permit(user_context, record)
+ end
end
+
context 'permission present → ' do
before do
add_permissions(permission, for_user: user)
end
- it 'allows a user with a different organisation' do
+
+ it 'denies a user with a different organisation' do
+ expect_it.not_to permit(user_context, record)
+ end
+
+ it 'but allows it for a user with the same organisation' do
+ user.organisation_id = referential.organisation_id
expect_it.to permit(user_context, record)
end
if archived
it 'removes the permission for archived referentials' do
+ user.organisation_id = referential.organisation_id
referential.archived_at = 42.seconds.ago
expect_it.not_to permit(user_context, record)
end