git-svn-id: http://svn.redmine.org/redmine/trunk@16864 e93f8b46-1217-0410-a6f0-8f06a7374b81tags/4.0.0
@@ -86,9 +86,10 @@ group :test do | |||
gem "rails-dom-testing" | |||
gem "mocha" | |||
gem "simplecov", "~> 0.14.1", :require => false | |||
# For running UI tests | |||
gem "capybara" | |||
gem "selenium-webdriver", "~> 2.53.4" | |||
# For running system tests | |||
gem 'puma', '~> 3.7' | |||
gem "capybara", '~> 2.13' | |||
gem "selenium-webdriver" | |||
end | |||
local_gemfile = File.join(File.dirname(__FILE__), "Gemfile.local") |
@@ -70,4 +70,4 @@ You need to have ChromeDriver installed and available in your PATH: | |||
https://sites.google.com/a/chromium.org/chromedriver/ | |||
Capybara tests can be run with: | |||
`rake test:ui` | |||
`rails test:system` |
@@ -0,0 +1,78 @@ | |||
# Redmine - project management software | |||
# Copyright (C) 2006-2017 Jean-Philippe Lang | |||
# | |||
# 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. | |||
require File.expand_path('../test_helper', __FILE__) | |||
class ApplicationSystemTestCase < ActionDispatch::SystemTestCase | |||
DOWNLOADS_PATH = File.expand_path(File.join(Rails.root, 'tmp', 'downloads')) | |||
driven_by :selenium, using: :chrome, screen_size: [1024, 900], options: { | |||
desired_capabilities: Selenium::WebDriver::Remote::Capabilities.chrome( | |||
'chromeOptions' => { | |||
'prefs' => { | |||
'download.default_directory' => DOWNLOADS_PATH, | |||
'download.prompt_for_download' => false, | |||
'plugins.plugins_disabled' => ["Chrome PDF Viewer"] | |||
} | |||
} | |||
) | |||
} | |||
setup do | |||
clear_downloaded_files | |||
Setting.delete_all | |||
Setting.clear_cache | |||
end | |||
teardown do | |||
Setting.delete_all | |||
Setting.clear_cache | |||
end | |||
# Should not depend on locale since Redmine displays login page | |||
# using default browser locale which depend on system locale for "real" browsers drivers | |||
def log_user(login, password) | |||
visit '/my/page' | |||
assert_equal '/login', current_path | |||
within('#login-form form') do | |||
fill_in 'username', :with => login | |||
fill_in 'password', :with => password | |||
find('input[name=login]').click | |||
end | |||
assert_equal '/my/page', current_path | |||
end | |||
def clear_downloaded_files | |||
FileUtils.rm downloaded_files | |||
end | |||
def downloaded_files | |||
Dir.glob("#{DOWNLOADS_PATH}/*").reject {|f| f=~/crdownload$/} | |||
end | |||
# Returns the path of the download file | |||
def downloaded_file | |||
Timeout.timeout(5) do | |||
while downloaded_files.empty? | |||
sleep 0.2 | |||
end | |||
end | |||
downloaded_files.first | |||
end | |||
end | |||
FileUtils.mkdir_p ApplicationSystemTestCase::DOWNLOADS_PATH |
@@ -1,109 +0,0 @@ | |||
# Redmine - project management software | |||
# Copyright (C) 2006-2017 Jean-Philippe Lang | |||
# | |||
# 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. | |||
require File.expand_path('../../test_helper', __FILE__) | |||
require 'capybara/rails' | |||
require 'fileutils' | |||
require 'timeout' | |||
module Redmine | |||
module UiTest | |||
module Downloads | |||
DOWNLOADS_PATH = File.expand_path(File.join(Rails.root, 'tmp', 'downloads')) | |||
def clear_downloaded_files | |||
FileUtils.rm downloaded_files | |||
end | |||
def downloaded_files | |||
Dir.glob("#{DOWNLOADS_PATH}/*").reject {|f| f=~/crdownload$/} | |||
end | |||
def downloaded_file | |||
Timeout.timeout(5) do | |||
while downloaded_files.empty? | |||
sleep 0.2 | |||
end | |||
end | |||
downloaded_files.first | |||
end | |||
end | |||
end | |||
end | |||
FileUtils.mkdir_p Redmine::UiTest::Downloads::DOWNLOADS_PATH | |||
Capybara.register_driver :chrome do |app| | |||
Capybara::Selenium::Driver.new(app, | |||
:browser => :chrome, | |||
:desired_capabilities => Selenium::WebDriver::Remote::Capabilities.chrome( | |||
'chromeOptions' => { | |||
'args' => [ "--window-size=1024,900" ], | |||
'prefs' => { | |||
'download.default_directory' => Redmine::UiTest::Downloads::DOWNLOADS_PATH, | |||
'download.prompt_for_download' => false, | |||
'plugins.plugins_disabled' => ["Chrome PDF Viewer"] | |||
} | |||
} | |||
) | |||
) | |||
end | |||
Capybara.default_driver = :chrome | |||
# default: 2 | |||
Capybara.default_wait_time = 2 | |||
module Redmine | |||
module UiTest | |||
# Base class for UI tests | |||
class Base < ActionDispatch::IntegrationTest | |||
include Capybara::DSL | |||
include Redmine::UiTest::Downloads | |||
# Stop ActiveRecord from wrapping tests in transactions | |||
# Transactional fixtures do not work with Selenium tests, because Capybara | |||
# uses a separate server thread, which the transactions would be hidden | |||
self.use_transactional_tests = false | |||
# Should not depend on locale since Redmine displays login page | |||
# using default browser locale which depend on system locale for "real" browsers drivers | |||
def log_user(login, password) | |||
visit '/my/page' | |||
assert_equal '/login', current_path | |||
within('#login-form form') do | |||
fill_in 'username', :with => login | |||
fill_in 'password', :with => password | |||
find('input[name=login]').click | |||
end | |||
assert_equal '/my/page', current_path | |||
end | |||
setup do | |||
clear_downloaded_files | |||
Setting.delete_all | |||
Setting.clear_cache | |||
end | |||
teardown do | |||
Capybara.reset_sessions! # Forget the (simulated) browser state | |||
Capybara.use_default_driver # Revert Capybara.current_driver to Capybara.default_driver | |||
Setting.delete_all | |||
Setting.clear_cache | |||
end | |||
end | |||
end | |||
end |
@@ -15,9 +15,9 @@ | |||
# along with this program; if not, write to the Free Software | |||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |||
require File.expand_path('../base', __FILE__) | |||
require File.expand_path('../../application_system_test_case', __FILE__) | |||
class Redmine::UiTest::IssuesTest < Redmine::UiTest::Base | |||
class IssuesTest < ApplicationSystemTestCase | |||
fixtures :projects, :users, :email_addresses, :roles, :members, :member_roles, | |||
:trackers, :projects_trackers, :enabled_modules, :issue_statuses, :issues, | |||
:enumerations, :custom_fields, :custom_values, :custom_fields_trackers, |
@@ -15,9 +15,9 @@ | |||
# along with this program; if not, write to the Free Software | |||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |||
require File.expand_path('../base', __FILE__) | |||
require File.expand_path('../../application_system_test_case', __FILE__) | |||
class Redmine::UiTest::MyPageTest < Redmine::UiTest::Base | |||
class MyPageTest < ApplicationSystemTestCase | |||
fixtures :projects, :users, :email_addresses, :roles, :members, :member_roles, | |||
:trackers, :projects_trackers, :enabled_modules, :issue_statuses, :issues, | |||
:enumerations, :custom_fields, :custom_values, :custom_fields_trackers, |
@@ -17,9 +17,9 @@ | |||
# along with this program; if not, write to the Free Software | |||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |||
require File.expand_path('../base', __FILE__) | |||
require File.expand_path('../../application_system_test_case', __FILE__) | |||
class Redmine::UiTest::QuickJumpTest < Redmine::UiTest::Base | |||
class QuickJumpTest < ApplicationSystemTestCase | |||
fixtures :projects, :users, :email_addresses, :roles, :members, :member_roles, | |||
:trackers, :projects_trackers, :enabled_modules, :issue_statuses, :issues, | |||
:enumerations, :custom_fields, :custom_values, :custom_fields_trackers, |
@@ -15,9 +15,9 @@ | |||
# along with this program; if not, write to the Free Software | |||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |||
require File.expand_path('../base', __FILE__) | |||
require File.expand_path('../../application_system_test_case', __FILE__) | |||
class Redmine::UiTest::SudoModeTest < Redmine::UiTest::Base | |||
class SudoModeTest < ApplicationSystemTestCase | |||
fixtures :users, :email_addresses | |||
def setup |
@@ -17,9 +17,11 @@ | |||
# along with this program; if not, write to the Free Software | |||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |||
require File.expand_path('../base', __FILE__) | |||
require File.expand_path('../../application_system_test_case', __FILE__) | |||
class Redmine::UiTest::TimelogTest < Redmine::UiTest::Base | |||
Capybara.default_max_wait_time = 2 | |||
class TimelogTest < ApplicationSystemTestCase | |||
fixtures :projects, :users, :email_addresses, :roles, :members, :member_roles, | |||
:trackers, :projects_trackers, :enabled_modules, :issue_statuses, :issues, | |||
:enumerations, :custom_fields, :custom_values, :custom_fields_trackers, | |||
@@ -85,10 +87,10 @@ class Redmine::UiTest::TimelogTest < Redmine::UiTest::Base | |||
visit '/settings?tab=timelog' | |||
# Remove a column | |||
select 'Comment', :from => 'Selected Columns' | |||
click_on "â†" | |||
click_on "←" | |||
# Add a column | |||
select 'Tracker', :from => 'Available Columns' | |||
click_on "→" | |||
click_on "→" | |||
click_on 'Save' | |||
# Display the list with updated settings |