diff --git a/modules/ifc_models/spec/features/model_management_spec.rb b/modules/ifc_models/spec/features/model_management_spec.rb new file mode 100644 index 0000000000..df76591b12 --- /dev/null +++ b/modules/ifc_models/spec/features/model_management_spec.rb @@ -0,0 +1,127 @@ +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) 2012-2020 the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2017 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See docs/COPYRIGHT.rdoc for more details. +#++ + +require 'spec_helper' + +require_relative '../support/pages/ifc_models/index' + +describe 'model management', type: :feature, js: true do + let(:project) { FactoryBot.create :project } + let(:index_page) { Pages::IfcModels::Index.new(project) } + let(:role) { FactoryBot.create(:role, permissions: %i[view_ifc_models manage_ifc_models]) } + + let(:user) do + FactoryBot.create :user, + member_in_project: project, + member_through_role: role + end + + let(:model) do + FactoryBot.create(:ifc_model_converted, + project: project, + uploader: user) + end + + context 'with all permissions' do + before do + login_as(user) + model + index_page.visit! + end + + it 'I can perfom all actions on the models' do + index_page.model_listed true, model.title + index_page.add_model_allowed true + index_page.edit_model_allowed model.title, true + index_page.delete_model_allowed model.title, true + + index_page.edit_model model.title, 'My super cool new name' + index_page.delete_model 'My super cool new name' + end + + it 'I can see single models and the defaults' do + index_page.model_listed true, model.title + index_page.show_model model + + index_page.model_listed true, model.title + index_page.show_defaults + end + end + + context 'with only viewing permissions' do + let(:view_role) { FactoryBot.create(:role, permissions: %i[view_ifc_models]) } + let(:view_user) do + FactoryBot.create :user, + member_in_project: project, + member_through_role: view_role + end + + before do + login_as(view_user) + model + index_page.visit! + end + + it 'I can see, but not edit models' do + index_page.model_listed true, model.title + index_page.add_model_allowed false + index_page.edit_model_allowed model.title, false + index_page.delete_model_allowed model.title, false + end + + it 'I can see single models and the defaults' do + index_page.model_listed true, model.title + index_page.show_model model + + index_page.model_listed true, model.title + index_page.show_defaults + end + end + + context 'without any permissions' do + let(:no_permissions_role) { FactoryBot.create(:role, permissions: %i[]) } + let(:user_without_permissions) do + FactoryBot.create :user, + member_in_project: project, + member_through_role: no_permissions_role + end + + before do + login_as(user_without_permissions) + model + index_page.visit! + end + + it "I can't see any models and perform no actions" do + expected = '[Error 403] You are not authorized to access this page.' + expect(page).to have_selector('.notification-box.-error', text: expected) + + index_page.add_model_allowed false + end + end +end diff --git a/modules/ifc_models/spec/features/model_viewer_spec.rb b/modules/ifc_models/spec/features/model_viewer_spec.rb index f0d5a6078a..c91e68b929 100644 --- a/modules/ifc_models/spec/features/model_viewer_spec.rb +++ b/modules/ifc_models/spec/features/model_viewer_spec.rb @@ -33,36 +33,29 @@ require_relative '../support/pages/ifc_models/show' describe 'model viewer', type: :feature, js: true do let(:project) { FactoryBot.create :project } let(:role) { FactoryBot.create(:role, permissions: %i[view_ifc_models manage_ifc_models]) } - let(:view_role) { FactoryBot.create(:role, permissions: %i[view_ifc_models]) } - let(:no_permissions_role) { FactoryBot.create(:role, permissions: %i[]) } - let(:user) { FactoryBot.create :user, - member_in_project: project, - member_through_role: role } - - let(:view_user) { FactoryBot.create :user, - member_in_project: project, - member_through_role: view_role } - - let(:user_without_permissions) { FactoryBot.create :user, - member_in_project: project, - member_through_role: no_permissions_role } + let(:user) do + FactoryBot.create :user, + member_in_project: project, + member_through_role: role + end - let(:model) { FactoryBot.create(:ifc_model_converted, - project: project, - uploader: user) } + let(:model) do + FactoryBot.create(:ifc_model_converted, + project: project, + uploader: user) + end let(:show_model_page) { Pages::IfcModels::Show.new(project, model.id) } context 'with all permissions' do before do login_as(user) - end - - it 'loads and shows the viewer correctly' do show_model_page.visit! show_model_page.finished_loading + end + it 'loads and shows the viewer correctly' do show_model_page.model_viewer_visible true show_model_page.model_viewer_shows_a_toolbar true show_model_page.page_shows_a_toolbar true @@ -71,14 +64,20 @@ describe 'model viewer', type: :feature, js: true do end context 'with only viewing permissions' do - before do - login_as(view_user) + let(:view_role) { FactoryBot.create(:role, permissions: %i[view_ifc_models]) } + let(:view_user) do + FactoryBot.create :user, + member_in_project: project, + member_through_role: view_role end - it 'loads and shows the viewer correctly' do + before do + login_as(view_user) show_model_page.visit! show_model_page.finished_loading + end + it 'loads and shows the viewer correctly, but has no possibility to edit the model' do show_model_page.model_viewer_visible true show_model_page.model_viewer_shows_a_toolbar true show_model_page.page_shows_a_toolbar false @@ -87,13 +86,19 @@ describe 'model viewer', type: :feature, js: true do end context 'without any permissions' do + let(:no_permissions_role) { FactoryBot.create(:role, permissions: %i[]) } + let(:user_without_permissions) do + FactoryBot.create :user, + member_in_project: project, + member_through_role: no_permissions_role + end + before do login_as(user_without_permissions) + show_model_page.visit! end it 'shows no viewer' do - show_model_page.visit! - expected = '[Error 403] You are not authorized to access this page.' expect(page).to have_selector('.notification-box.-error', text: expected) diff --git a/modules/ifc_models/spec/support/pages/ifc_models/index.rb b/modules/ifc_models/spec/support/pages/ifc_models/index.rb new file mode 100644 index 0000000000..143e81cf6b --- /dev/null +++ b/modules/ifc_models/spec/support/pages/ifc_models/index.rb @@ -0,0 +1,138 @@ +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) 2012-2020 the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2017 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See docs/COPYRIGHT.rdoc for more details. +#++ + +require 'support/pages/page' + +module Pages + module IfcModels + class Index < ::Pages::Page + attr_accessor :project + + def initialize(project) + self.project = project + end + + def path + ifc_models_project_ifc_models_path(project) + end + + def model_listed(listed, model_name) + within '.generic-table' do + expect(page).to (listed ? have_text(model_name) : have_no_text(model_name)) + end + end + + def add_model_allowed(allowed) + if allowed + within '.toolbar' do + page.find('.button.-alt-highlight', text: 'IFC model').click + end + + expect(page).to have_text('New IFC model') + expect(current_path).to eql new_ifc_models_project_ifc_model_path(project) + + visit! + else + expect(page).to have_no_selector('.button.-alt-highlight', text: 'IFC model') + end + end + + def edit_model_allowed(model_name, allowed) + row = find_model_table_row model_name + within row do + expect(page).to (allowed ? have_selector('.icon-edit') : have_no_selector('.icon-edit')) + end + end + + def delete_model_allowed(model_name, allowed) + row = find_model_table_row model_name + within row do + expect(page).to (allowed ? have_selector('.icon-edit') : have_no_selector('.icon-edit')) + end + end + + def edit_model(model_name, new_name) + row = find_model_table_row model_name + within row do + page.find('.icon-edit').click + end + + expect(page).to have_selector('input[type="file"]') + expect(page).to have_field('ifc_models_ifc_model[title]', with: model_name) + fill_in 'ifc_models_ifc_model[title]', with: new_name + + click_on 'Save' + + model_listed true, new_name + expect(current_path).to eq ifc_models_project_ifc_models_path(project) + end + + def delete_model(model_name) + row = find_model_table_row model_name + within row do + page.find('.icon-delete').click + end + + page.driver.browser.switch_to.alert.accept + + model_listed false, model_name + expect(current_path).to eq ifc_models_project_ifc_models_path(project) + end + + def show_model(model) + within '.generic-table' do + page.find('td a', text: model.title).click + end + + expect(page).to have_selector('.ifc-model-viewer--container') + expect(current_path).to eq ifc_models_project_ifc_model_path(project, model) + + visit! + end + + def show_defaults + within '.toolbar' do + page.find('.button', text: 'Show defaults').click + end + + expect(page).to have_selector('.ifc-model-viewer--container') + expect(current_path).to eq show_defaults_ifc_models_project_ifc_models_path(project) + + visit! + end + + private + + def find_model_table_row(model_name) + within '.generic-table' do + page.find('td', text: model_name).find(:xpath, '..') + end + end + end + end +end