Files
openproject/modules/backlogs/features/step_definitions/_when_steps.rb
T
Oliver Günther 2258309baa Fix cukes in backlogs due to js cucumber
We now need to run cukes with a JS scenario all the time. Backlogs
however used manually POST requests to set up some stuff which is no
longer working now.

We can tell capybara to switch the driver shortly just to perform the
request while keeping the session. It's a hack but will prevail until
backlogs is hopefully removed soon.
2020-07-02 15:00:30 +02:00

273 lines
9.3 KiB
Ruby

#-- 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.
#++
def perform_post(url, params = {})
session = page.get_rack_session
driver = Capybara.current_driver
begin
Capybara.current_driver = :rack_test
page.set_rack_session(session)
RequestStore[:response] = page.driver.post(url, params)
rescue StandardError => e
warn "Failed to perform rack request: #{e}"
raise e
ensure
Capybara.current_driver = driver
page.set_rack_session(session)
end
end
When /^I create the impediment$/ do
perform_post backlogs_project_sprint_impediments_url(
*@impediment_params.values_at('project_id', 'version_id')
), @impediment_params.except('author_id', 'author')
end
When /^I create the story$/ do
perform_post backlogs_project_sprint_stories_url(
*@story_params.values_at('project_id', 'version_id')
), @story_params.except('author_id', 'author')
end
When /^I create the task$/ do
perform_post backlogs_project_sprint_tasks_url(
*@task_params.values_at('project_id', 'version_id')
), @task_params.except('author_id', 'author')
end
When /^I move the (story|item|task) named (.+) below (.+)$/ do |type, story_subject, prev_subject|
work_package_class = if type.strip == 'task' then Task else Story end
story = work_package_class.find_by(subject: story_subject.strip)
prev = work_package_class.find_by(subject: prev_subject.strip)
attributes = story.attributes
attributes[:prev] = prev.id
if type == 'task'
# #attributes returns the parent_id to always be nil
attributes['parent_id'] = story.parent_id
else
attributes[:version_id] = prev.version_id
end
project = Project.find(attributes['project_id'])
sprint = prev.version
perform_post polymorphic_url(
[:backlogs, project, sprint.becomes(Sprint), story]
), attributes.merge('_method' => 'put')
end
When /^I move the story named (.+) (up|down) to the (\d+)(?:st|nd|rd|th) position of the sprint named (.+)$/ do |story_subject, direction, position, sprint_name|
position = position.to_i
story = Story.find_by(subject: story_subject)
sprint = Sprint.find_by(name: sprint_name)
story.version = sprint
attributes = story.attributes
attributes[:prev] = if position == 1
''
else
stories = Story.where(version_id: sprint.id, type_id: Story.types).order(Arel.sql('position ASC'))
raise "You indicated an invalid position (#{position}) in a sprint with #{stories.length} stories" if 0 > position or position > stories.length
stories[position - (direction == 'up' ? 2 : 1)].id
end
perform_post backlogs_project_sprint_story_url(
*attributes.values_at('project_id', 'version_id', 'id')
), attributes.merge('_method' => 'put')
end
When /^I move the (\d+)(?:st|nd|rd|th) story to the (\d+|last)(?:st|nd|rd|th)? position$/ do |old_pos, new_pos|
@story_ids = page.all(:css, '#owner_backlogs_container .stories .story .id')
story = @story_ids[old_pos.to_i - 1]
story.should_not == nil
prev = if new_pos.to_i == 1
nil
elsif new_pos == 'last'
@story_ids.last
elsif old_pos.to_i > new_pos.to_i
@story_ids[new_pos.to_i - 2]
else
@story_ids[new_pos.to_i - 1]
end
@story = Story.find(story.text.to_i)
perform_post backlogs_project_sprint_story_url(
@project.id,
@story.version_id,
@story.id
), prev: (prev.nil? ? '' : prev.text), '_method' => 'put'
end
When /^I update the impediment$/ do
perform_post backlogs_project_sprint_impediment_url(
*@impediment_params.values_at('project_id', 'version_id', 'id')
), @impediment_params.merge('_method' => 'put')
end
When /^I update the sprint$/ do
perform_post backlogs_project_sprint_url(
*@sprint_params.values_at('project_id', 'id')
), @sprint_params.merge('_method' => 'put')
end
When /^I update the story$/ do
perform_post backlogs_project_sprint_story_url(
*@story_params.values_at('project_id', 'version_id', 'id')
), @story_params.merge('_method' => 'put')
end
When /^I update the task$/ do
perform_post backlogs_project_sprint_task_url(
*@task_params.values_at('project_id', 'version_id', 'id')
), @task_params.merge('_method' => 'put')
end
When /^I view the master backlog$/ do
visit url_for(controller: '/projects', action: :show, id: @project)
click_link('Backlogs')
end
When /^I view the stories of (.+) in the work_packages tab/ do |sprint_name|
sprint = Sprint.find_by(name: sprint_name)
visit url_for(controller: '/rb_queries', action: :show, project_id: sprint.project, sprint_id: sprint, only_path: true)
end
When /^I view the stories in the work_packages tab/ do
visit url_for(controller: '/rb_queries', action: :show, project_id: @project, only_path: true)
end
# WARN: Depends on deprecated behavior of path_for('the task board for
# "sprint name"')
When /^I view the sprint notes$/ do
visit url_for(controller: '/rb_wikis', action: 'show', sprint_id: @sprint, project_id: @project)
end
# WARN: Depends on deprecated behavior of path_for('the task board for
# "sprint name"')
When /^I edit the sprint notes$/ do
visit url_for(controller: '/rb_wikis', action: 'edit', sprint_id: @sprint, project_id: @project)
end
When /^I follow "(.+?)" of the "(.+?)" (?:backlogs )?menu$/ do |link, backlog_name|
sprint = Sprint.find_by(name: backlog_name)
step %{I follow "#{link}" within "#backlog_#{sprint.id} .menu"}
end
When /^I open the "(.+?)" backlogs(?: )?menu/ do |backlog_name|
sprint = Sprint.find_by(name: backlog_name)
find(:css, "#backlog_#{sprint.id} .menu > div").click
end
When /^I close the "(.+?)" backlogs(?: )?menu/ do |backlog_name|
sprint = Sprint.find_by(name: backlog_name)
step %{I stop hovering over "#backlog_#{sprint.id} .menu"}
end
When /^I click on the text "(.+?)"$/ do |locator|
expect(page)
.to have_content(locator)
find(:xpath, %{//*[contains(text(), "#{locator}")]}).click
end
When /^I click on the link on the modal window with text "(.+?)"$/ do |locator|
browser = page.driver.browser
browser.switch_to.frame('modalIframe')
click_link(locator)
end
When /^I click on the element with class "([^"]+?)"$/ do |locator|
find(:css, ".#{locator}").click
end
When /^I confirm the story form$/ do
find(:css, 'input[name=subject]').native.send_key :return
step 'I wait for AJAX requests to finish'
step 'I should not see ".saving"'
end
When /^I fill in the ids of the (tasks|work_packages|stories) "(.+?)" for "(.+?)"$/ do |model_name, subjects, field|
model = Kernel.const_get(model_name.classify)
ids = subjects.split(/,/).map { |subject| model.find_by(subject: subject).id }
step %{I fill in "#{ids.join(', ')}" for "#{field}"}
end
When /^I click on the impediment called "(.+?)"$/ do |impediment_name|
step %{I click on the text "#{impediment_name}"}
end
When /^I click to add a new task for story "(.+?)"$/ do |story_name|
expect(page)
.to have_content(story_name)
story = Story.find_by(subject: story_name)
find("tr.story_#{story.id} td.add_new").click
end
When /^I fill in the id of the work_package "(.+?)" as the parent work_package$/ do |work_package_name|
work_package = WorkPackage.find_by(subject: work_package_name)
# TODO: Simplify once the work_package#edit/update action is implemented
find('#work_package_parent_id, #work_package_parent_id', visible: false).set(work_package.id)
end
When /^the request on task "(.+?)" is finished$/ do |task_name|
# Wait for the modal link of this task to appear...
elements = page.find(:xpath, "//div[contains(., '#{task_name}') and contains(@class,'task')]/descendant::a[contains(@href, .)]")
# ...by selecting the task board card for a specific task and then go for the
# link with the id only appearing after the task was saved
end
When /^I follow the link to add a subtask$/ do
step 'I follow "Relations"'
step 'I click "Children"'
step 'I press "Add child"'
end
When /^I change the fold state of a version$/ do
find('.backlog .toggler').click
end
When /^I click on the Export link$/ do
click_link('Export')
end
When(/^I click on the link for the story "(.*?)"$/) do |subject|
story = Story.find_by(subject: subject)
within("#story_#{story.id}") do
click_link(story.id)
end
end