diff --git a/features/members/membership.feature b/features/members/membership.feature deleted file mode 100644 index 2846a5d7e3..0000000000 --- a/features/members/membership.feature +++ /dev/null @@ -1,154 +0,0 @@ -#-- copyright -# OpenProject is a project management system. -# Copyright (C) 2012-2015 the OpenProject Foundation (OPF) -# -# 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-2013 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 doc/COPYRIGHT.rdoc for more details. -#++ - -Feature: Membership - - Background: - Given I am already admin - - Given there is a role "Manager" - And there is a role "Developer" - - And there is 1 project with the following: - | Identifier | project1 | - - And there is 1 User with: - | Login | peter | - | Firstname | Peter | - | Lastname | Pan | - - And there is 1 User with: - | Login | hannibal | - | Firstname | Hannibal | - | Lastname | Smith | - - And there is 1 User with: - | Login | crash | - | Firstname | | - | Lastname | | - - And there is a group named "A-Team" with the following members: - | peter | - | hannibal | - - @javascript - Scenario: Adding and Removing a Group as Member, non impaired - When I go to the members tab of the settings page of the project "project1" - And I add the principal "A-Team" as "Manager" - Then I should be on the members tab of the settings page of the project "project1" - And I should see "Successful creation." within ".flash.notice" - And I should see "A-Team" within ".generic-table" - - When I delete the "A-Team" membership - And I wait for the AJAX requests to finish - Then I should see "Nothing to display" - - @javascript - Scenario: Adding and removing a User as Member, non impaired - When I go to the members tab of the settings page of the project "project1" - And I add the principal "Hannibal Smith" as "Manager" - Then I should see "Successful creation." within ".flash.notice" - And I should see "Hannibal Smith" within ".generic-table" - - When I delete the "Hannibal Smith" membership - And I wait for the AJAX requests to finish - Then I should see "Nothing to display" - - @javascript - Scenario: Entering a Username as Member in firstname, lastname order, non impaired - When I go to the members tab of the settings page of the project "project1" - And I enter the principal name "Hannibal S" - Then I should see "Hannibal Smith" - - @javascript - Scenario: Entering a Username as Member in lastname, firstname order, non impaired - When I go to the members tab of the settings page of the project "project1" - And I enter the principal name "Smith, H" - Then I should see "Hannibal Smith" - - @javascript - Scenario: Escaping should work properly when entering a name - When I go to the members tab of the settings page of the project "project1" - And I enter the principal name "script" - Then I should not see an alert dialog - And I should see "" - - @javascript - Scenario: Escaping should work properly when selecting a user - When I go to the members tab of the settings page of the project "project1" - When I select the principal "script" - Then I should not see an alert dialog - And I should see "" - - @javascript - Scenario: Adding and Removing a Group as Member, impaired - When I am impaired - And I go to the members tab of the settings page of the project "project1" - And I add the principal "A-Team" as "Manager" - And I go to the members tab of the settings page of the project "project1" - Then I should not see "A-Team" within "#principal_results" - And I should see "A-Team" within ".generic-table" - - @javascript - Scenario: User should not appear in members form if he/she is already a member of the project, impaired - When I am impaired - And I go to the members tab of the settings page of the project "project1" - And I add the principal "A-Team" as "Manager" - Then I should be on the members tab of the settings page of the project "project1" - And I should see "Successful creation." within ".flash.notice" - And I should see "A-Team" within ".generic-table" - - When I delete the "A-Team" membership - And I wait for the AJAX requests to finish - Then I should see "Nothing to display" - - @javascript - Scenario: Entering a Username as Member in firstname, lastname order, impaired - When I am impaired - And I go to the members tab of the settings page of the project "project1" - And I enter the principal name "Hannibal S" - Then I should see "Hannibal Smith" - - @javascript - Scenario: Entering a Username as Member in lastname, firstname order, impaired - When I am impaired - And I go to the members tab of the settings page of the project "project1" - And I enter the principal name "Smith, H" - Then I should see "Hannibal Smith" - - @javascript - Scenario: Adding and removing a User as Member, impaired - When I am impaired - And I go to the members tab of the settings page of the project "project1" - And I add the principal "Hannibal Smith" as "Manager" - Then I should see "Successful creation." within ".flash.notice" - And I should see "Hannibal Smith" within ".generic-table" - - When I delete the "Hannibal Smith" membership - And I wait for the AJAX requests to finish - Then I should see "Nothing to display" diff --git a/spec/features/members/membership_spec.rb b/spec/features/members/membership_spec.rb new file mode 100644 index 0000000000..d1efdef121 --- /dev/null +++ b/spec/features/members/membership_spec.rb @@ -0,0 +1,127 @@ +#-- copyright +# OpenProject is a project management system. +# Copyright (C) 2012-2015 the OpenProject Foundation (OPF) +# +# 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-2013 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 doc/COPYRIGHT.rdoc for more details. +#++ + +require 'spec_helper' + +feature 'group memberships through groups page', type: :feature, js: true do + let!(:project) { FactoryGirl.create :project, name: 'Project 1', identifier: 'project1' } + + let(:admin) { FactoryGirl.create :admin } + let!(:peter) { FactoryGirl.create :user, firstname: 'Peter', lastname: 'Pan' } + let!(:hannibal) { FactoryGirl.create :user, firstname: 'Hannibal', lastname: 'Smith' } + let!(:crash) { FactoryGirl.create :user, firstname: "", + lastname: "" } + + let(:group) { FactoryGirl.create :group, lastname: 'A-Team' } + + let!(:manager) { FactoryGirl.create :role, name: 'Manager' } + let!(:developer) { FactoryGirl.create :role, name: 'Developer' } + + let(:members_page) { Pages::Project::Members.new project.identifier } + + before do + allow(User).to receive(:current).and_return admin + + group.add_member! peter + group.add_member! hannibal + end + + shared_examples 'adding and removing principals' do + scenario 'Adding and Removing a Group as Member' do + members_page.visit! + members_page.add_user! 'A-Team', as: 'Manager' + + expect(members_page).to have_added_user 'A-Team' + + members_page.remove_user! 'A-Team' + expect(page).to have_text 'Removed user from project' + expect(page).to have_text 'Nothing to display' + end + + scenario 'Adding and removing a User as Member' do + members_page.visit! + members_page.add_user! 'Hannibal Smith', as: 'Manager' + + expect(members_page).to have_added_user 'Hannibal Smith' + + members_page.remove_user! 'Hannibal Smith' + expect(page).to have_text 'Removed user from project' + expect(page).to have_text 'Nothing to display' + end + + scenario 'Entering a Username as Member in firstname, lastname order' do + members_page.visit! + members_page.open_new_member! + + members_page.enter_principal_search! 'Hannibal S' + expect(page).to have_text 'Hannibal Smith' + end + + scenario 'Entering a Username as Member in lastname, firstname order' do + members_page.visit! + members_page.open_new_member! + + members_page.enter_principal_search! 'Smith, H' + expect(page).to have_text 'Hannibal Smith' + end + + scenario 'Escaping should work properly when entering a name' do + members_page.visit! + members_page.open_new_member! + members_page.enter_principal_search! 'script' + + expect(members_page).not_to have_alert_dialog + expect(page).to have_text "" + end + end + + context 'with an impaired user' do + before do + admin.impaired = true + admin.save! + end + + it_behaves_like 'adding and removing principals' + end + + context 'with an un-impaired user' do + it_behaves_like 'adding and removing principals' + + # The following scenario is only tested with an unimpaired user + # as it does not make a difference whether or not the user is impaired. + + scenario 'Escaping should work properly when selecting a user' do + members_page.visit! + members_page.open_new_member! + members_page.select_principal! 'script' + + expect(members_page).not_to have_alert_dialog + expect(page).to have_text "" + end + end +end diff --git a/spec/support/pages/pages.rb b/spec/support/pages/pages.rb index 18861dd44e..d05b3138c3 100644 --- a/spec/support/pages/pages.rb +++ b/spec/support/pages/pages.rb @@ -55,6 +55,16 @@ module Pages page.driver.browser.switch_to.alert end + def has_alert_dialog? + if selenium_driver? + begin + page.driver.browser.switch_to.alert + rescue Selenium::WebDriver::Error::NoAlertPresentError + false + end + end + end + def selenium_driver? Capybara.current_driver.to_s.include?('selenium') end diff --git a/spec/support/pages/project/members.rb b/spec/support/pages/project/members.rb index 4362c7a7a3..7e4f3707ec 100644 --- a/spec/support/pages/project/members.rb +++ b/spec/support/pages/project/members.rb @@ -41,6 +41,10 @@ module Pages "/projects/#{project_identifier}/members" end + def open_new_member! + click_on 'Add Member' + end + ## # Adds the given user to this project. # @@ -110,6 +114,16 @@ module Pages find('form .roles').check role_name end end + + def enter_principal_search!(principal_name) + if !User.current.impaired? + find('#s2id_member_user_ids') + .find('.select2-choices .select2-input') + .set(principal_name) + else + fill_in 'principal_search', with: principal_name + end + end end end end