OpenProject is the leading open source project management software.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
openproject/modules/reporting/spec/features/permissions_spec.rb

145 lines
4.5 KiB

require 'spec_helper'
require_relative 'support/pages/cost_report_page'
describe 'Cost report calculations', type: :feature, js: true do
let(:project) { FactoryBot.create :project }
let(:admin) { FactoryBot.create :admin }
let!(:permissions) { %i(view_cost_entries view_own_cost_entries) }
let!(:role) { FactoryBot.create :role, permissions: permissions }
let!(:user) do
FactoryBot.create :user,
member_in_project: project,
member_through_role: role
end
let(:work_package) { FactoryBot.create :work_package, project: project }
let!(:hourly_rate_admin) { FactoryBot.create :default_hourly_rate, user: admin, rate: 1.00, valid_from: 1.year.ago }
let!(:hourly_rate_user) { FactoryBot.create :default_hourly_rate, user: user, rate: 1.00, valid_from: 1.year.ago }
let(:report_page) { ::Pages::CostReportPage.new project }
let!(:time_entry_user) do
FactoryBot.create :time_entry,
user: admin,
work_package: work_package,
project: project,
hours: 10
end
let!(:time_entry_admin) do
FactoryBot.create :time_entry,
user: user,
work_package: work_package,
project: project,
hours: 5
end
let!(:cost_type) do
type = FactoryBot.create :cost_type, name: 'Translations'
FactoryBot.create :cost_rate, cost_type: type, rate: 7.00
type
end
let!(:cost_entry_user) do
FactoryBot.create :cost_entry,
work_package: work_package,
project: project,
units: 3.00,
cost_type: cost_type,
user: user
end
before do
login_as current_user
visit '/cost_reports?set_filter=1'
end
context 'as anonymous' do
let(:current_user) { User.anonymous }
it 'is redirect to login' do
expect(page).to have_content 'Username'
expect(page).to have_content 'Password'
end
end
context 'as admin' do
let(:current_user) { admin }
it 'shows everything' do
expect(page).to have_content '5.00 hours'
expect(page).to have_content '10.00 hours'
report_page.switch_to_type 'Translations'
expect(page).to have_content '3.0 plural_unit'
expect(page).to have_content '21.00 EUR'
end
end
context 'as user with all permissions' do
let(:current_user) { user }
let!(:permissions) do
%i(view_own_hourly_rate view_hourly_rates view_cost_rates
view_own_time_entries view_own_cost_entries view_cost_entries
view_time_entries)
end
it 'shows everything' do
expect(page).to have_content '5.00 hours'
expect(page).to have_content '10.00 hours'
report_page.switch_to_type 'Translations'
expect(page).to have_selector('td.units', text: '3.0 plural_unit', wait: 10)
end
end
context 'as user with no permissions' do
let(:current_user) { user }
let!(:permissions) { %i() }
it 'shows nothing' do
expect(page).to have_text '[Error 403]'
end
end
context 'as user with own permissions' do
let(:current_user) { user }
let!(:permissions) do
%i(view_own_hourly_rate view_own_time_entries view_own_cost_entries)
end
it 'shows his own costs' do
expect(page).to have_content '5.00 hours'
expect(page).not_to have_content '10.00 hours'
report_page.switch_to_type 'Translations'
expect(page).to have_selector('td.units', text: '3.0 plural_unit', wait: 10)
end
end
context 'as user with own time permissions' do
let(:current_user) { user }
let!(:permissions) do
%i(view_own_time_entries)
end
it 'shows his own time only' do
expect(page).to have_content '5.00 hours'
expect(page).not_to have_content '10.00 hours'
report_page.switch_to_type 'Translations'
expect(page).to have_selector('.generic-table--no-results-title')
expect(page).to have_no_selector('td.unit', text: '3.0 plural_unit')
end
end
context 'as user with own costs permissions' do
let(:current_user) { user }
let!(:permissions) do
%i(view_own_cost_entries)
end
it 'shows his own costs' do
expect(page).to have_selector('.generic-table--no-results-title')
expect(page).not_to have_content '5.00 hours'
expect(page).not_to have_content '10.00 hours'
report_page.switch_to_type 'Translations'
expect(page).to have_no_selector('td.unit', text: '3.0 plural_unit')
end
end
end