Commit a1dd87b2 authored by jplang's avatar jplang

Upgrade to Rails 4.2.0 (#14534).

git-svn-id: https://svn.redmine.org/redmine/trunk@13892 e93f8b46-1217-0410-a6f0-8f06a7374b81
parent fd0249e5
source 'https://rubygems.org'
gem "rails", "4.1.8"
gem "rails", "4.2.0"
gem "jquery-rails", "~> 3.1.1"
gem "coderay", "~> 1.1.0"
gem "builder", ">= 3.0.4"
......@@ -86,7 +86,8 @@ end
group :test do
gem "minitest"
gem "mocha", "~> 1.0.0", :require => 'mocha/api'
gem "rails-dom-testing"
gem "mocha", "~> 1.0.0"
gem "simplecov", "~> 0.9.1", :require => false
# For running UI tests
gem "capybara"
......
......@@ -80,7 +80,7 @@ module ApplicationHelper
end
end
only_path = options[:only_path].nil? ? true : options[:only_path]
s = link_to(text, issue_path(issue, :only_path => only_path),
s = link_to(text, issue_url(issue, :only_path => only_path),
:class => issue.css_classes, :title => title)
s << h(": #{subject}") if subject
s = h("#{issue.project} - ") + s if options[:project]
......@@ -93,8 +93,9 @@ module ApplicationHelper
# * :download - Force download (default: false)
def link_to_attachment(attachment, options={})
text = options.delete(:text) || attachment.filename
route_method = options.delete(:download) ? :download_named_attachment_path : :named_attachment_path
route_method = options.delete(:download) ? :download_named_attachment_url : :named_attachment_url
html_options = options.slice!(:only_path)
options[:only_path] = true unless options.key?(:only_path)
url = send(route_method, attachment, attachment.filename, options)
link_to text, url, html_options
end
......@@ -120,9 +121,10 @@ module ApplicationHelper
def link_to_message(message, options={}, html_options = nil)
link_to(
message.subject.truncate(60),
board_message_path(message.board_id, message.parent_id || message.id, {
board_message_url(message.board_id, message.parent_id || message.id, {
:r => (message.parent_id && message.id),
:anchor => (message.parent_id ? "message-#{message.id}" : nil)
:anchor => (message.parent_id ? "message-#{message.id}" : nil),
:only_path => true
}.merge(options)),
html_options
)
......@@ -139,7 +141,9 @@ module ApplicationHelper
if project.archived?
h(project.name)
else
link_to project.name, project_path(project, options), html_options
link_to project.name,
project_url(project, {:only_path => true}.merge(options)),
html_options
end
end
......@@ -626,7 +630,7 @@ module ApplicationHelper
filename, ext, alt, alttext = $1.downcase, $2, $3, $4
# search for the picture in attachments
if found = Attachment.latest_attach(attachments, filename)
image_url = download_named_attachment_path(found, found.filename, :only_path => only_path)
image_url = download_named_attachment_url(found, found.filename, :only_path => only_path)
desc = found.description.to_s.gsub('"', '')
if !desc.blank? && alttext.blank?
alt = " title=\"#{desc}\" alt=\"#{desc}\""
......@@ -769,17 +773,17 @@ module ApplicationHelper
issue = Issue.visible.find_by_id(oid)
anchor = comment_id ? "note-#{comment_id}" : nil
link = link_to("##{oid}#{comment_suffix}",
issue_path(issue, :only_path => only_path, :anchor => anchor),
issue_url(issue, :only_path => only_path, :anchor => anchor),
:class => issue.css_classes,
:title => "#{issue.subject.truncate(100)} (#{issue.status.name})")
end
when 'document'
if document = Document.visible.find_by_id(oid)
link = link_to(document.title, document_path(document, :only_path => only_path), :class => 'document')
link = link_to(document.title, document_url(document, :only_path => only_path), :class => 'document')
end
when 'version'
if version = Version.visible.find_by_id(oid)
link = link_to(version.name, version_path(version, :only_path => only_path), :class => 'version')
link = link_to(version.name, version_url(version, :only_path => only_path), :class => 'version')
end
when 'message'
if message = Message.visible.find_by_id(oid)
......@@ -787,11 +791,11 @@ module ApplicationHelper
end
when 'forum'
if board = Board.visible.find_by_id(oid)
link = link_to(board.name, project_board_path(board.project, board, :only_path => only_path), :class => 'board')
link = link_to(board.name, project_board_url(board.project, board, :only_path => only_path), :class => 'board')
end
when 'news'
if news = News.visible.find_by_id(oid)
link = link_to(news.title, news_path(news, :only_path => only_path), :class => 'news')
link = link_to(news.title, news_url(news, :only_path => only_path), :class => 'news')
end
when 'project'
if p = Project.visible.find_by_id(oid)
......@@ -805,19 +809,19 @@ module ApplicationHelper
case prefix
when 'document'
if project && document = project.documents.visible.find_by_title(name)
link = link_to(document.title, document_path(document, :only_path => only_path), :class => 'document')
link = link_to(document.title, document_url(document, :only_path => only_path), :class => 'document')
end
when 'version'
if project && version = project.versions.visible.find_by_name(name)
link = link_to(version.name, version_path(version, :only_path => only_path), :class => 'version')
link = link_to(version.name, version_url(version, :only_path => only_path), :class => 'version')
end
when 'forum'
if project && board = project.boards.visible.find_by_name(name)
link = link_to(board.name, project_board_path(board.project, board, :only_path => only_path), :class => 'board')
link = link_to(board.name, project_board_url(board.project, board, :only_path => only_path), :class => 'board')
end
when 'news'
if project && news = project.news.visible.find_by_title(name)
link = link_to(news.title, news_path(news, :only_path => only_path), :class => 'news')
link = link_to(news.title, news_url(news, :only_path => only_path), :class => 'news')
end
when 'commit', 'source', 'export'
if project
......
......@@ -76,8 +76,7 @@ class Issue < ActiveRecord::Base
attr_protected :id
scope :visible, lambda {|*args|
includes(:project).
references(:project).
joins(:project).
where(Issue.visible_condition(args.shift || User.current, *args))
}
......
......@@ -17,7 +17,6 @@
class JournalDetail < ActiveRecord::Base
belongs_to :journal
before_save :normalize_values
attr_protected :id
def custom_field
......@@ -26,13 +25,16 @@ class JournalDetail < ActiveRecord::Base
end
end
private
def value=(arg)
write_attribute :value, normalize(arg)
end
def normalize_values
self.value = normalize(value)
self.old_value = normalize(old_value)
def old_value=(arg)
write_attribute :old_value, normalize(arg)
end
private
def normalize(v)
case v
when true
......
......@@ -46,7 +46,7 @@
<td class="last_login_on"><%= format_time(user.last_login_on) unless user.last_login_on.nil? %></td>
<td class="buttons">
<%= change_status_link(user) %>
<%= delete_link user_path(user, :back_url => users_path(params)) unless User.current == user %>
<%= delete_link user_path(user, :back_url => request.original_fullpath) unless User.current == user %>
</td>
</tr>
<% end -%>
......
......@@ -29,5 +29,7 @@ Rails.application.configure do
# Print deprecation notices to stderr and the Rails logger.
config.active_support.deprecation = [:stderr, :log]
config.secret_token = 'a secret token for running the tests'
config.secret_key_base = 'a secret token for running the tests'
config.active_support.test_order = :random
end
......@@ -146,6 +146,16 @@ module ActionMailer
end
end
# #deliver is deprecated in Rails 4.2
# Prevents massive deprecation warnings
module ActionMailer
class MessageDelivery < Delegator
def deliver
deliver_now
end
end
end
module ActionController
module MimeResponds
class Collector
......@@ -163,32 +173,8 @@ module ActionController
# TODO: remove it in a later version
def self.session=(*args)
$stderr.puts "Please remove config/initializers/session_store.rb and run `rake generate_secret_token`.\n" +
"Setting the session secret with ActionController.session= is no longer supported in Rails 3."
"Setting the session secret with ActionController.session= is no longer supported."
exit 1
end
end
end
if Rails::VERSION::MAJOR < 4 && RUBY_VERSION >= "2.1"
module ActiveSupport
class HashWithIndifferentAccess
def select(*args, &block)
dup.tap { |hash| hash.select!(*args, &block) }
end
def reject(*args, &block)
dup.tap { |hash| hash.reject!(*args, &block) }
end
end
class OrderedHash
def select(*args, &block)
dup.tap { |hash| hash.select!(*args, &block) }
end
def reject(*args, &block)
dup.tap { |hash| hash.reject!(*args, &block) }
end
end
end
end
......@@ -217,15 +217,16 @@ Rails.application.routes.draw do
get 'projects/:id/repository/:repository_id/statistics', :to => 'repositories#stats'
get 'projects/:id/repository/:repository_id/graph', :to => 'repositories#graph'
get 'projects/:id/repository/:repository_id/changes(/*path(.:ext))',
:to => 'repositories#changes'
get 'projects/:id/repository/:repository_id/changes(/*path)',
:to => 'repositories#changes',
:format => false
get 'projects/:id/repository/:repository_id/revisions/:rev', :to => 'repositories#revision'
get 'projects/:id/repository/:repository_id/revision', :to => 'repositories#revision'
post 'projects/:id/repository/:repository_id/revisions/:rev/issues', :to => 'repositories#add_related_issue'
delete 'projects/:id/repository/:repository_id/revisions/:rev/issues/:issue_id', :to => 'repositories#remove_related_issue'
get 'projects/:id/repository/:repository_id/revisions', :to => 'repositories#revisions'
get 'projects/:id/repository/:repository_id/revisions/:rev/:action(/*path(.:ext))',
get 'projects/:id/repository/:repository_id/revisions/:rev/:action(/*path)',
:controller => 'repositories',
:format => false,
:constraints => {
......@@ -236,27 +237,30 @@ Rails.application.routes.draw do
get 'projects/:id/repository/statistics', :to => 'repositories#stats'
get 'projects/:id/repository/graph', :to => 'repositories#graph'
get 'projects/:id/repository/changes(/*path(.:ext))',
:to => 'repositories#changes'
get 'projects/:id/repository/changes(/*path)',
:to => 'repositories#changes',
:format => false
get 'projects/:id/repository/revisions', :to => 'repositories#revisions'
get 'projects/:id/repository/revisions/:rev', :to => 'repositories#revision'
get 'projects/:id/repository/revision', :to => 'repositories#revision'
post 'projects/:id/repository/revisions/:rev/issues', :to => 'repositories#add_related_issue'
delete 'projects/:id/repository/revisions/:rev/issues/:issue_id', :to => 'repositories#remove_related_issue'
get 'projects/:id/repository/revisions/:rev/:action(/*path(.:ext))',
get 'projects/:id/repository/revisions/:rev/:action(/*path)',
:controller => 'repositories',
:format => false,
:constraints => {
:action => /(browse|show|entry|raw|annotate|diff)/,
:rev => /[a-z0-9\.\-_]+/
}
get 'projects/:id/repository/:repository_id/:action(/*path(.:ext))',
get 'projects/:id/repository/:repository_id/:action(/*path)',
:controller => 'repositories',
:action => /(browse|show|entry|raw|changes|annotate|diff)/
get 'projects/:id/repository/:action(/*path(.:ext))',
:action => /(browse|show|entry|raw|changes|annotate|diff)/,
:format => false
get 'projects/:id/repository/:action(/*path)',
:controller => 'repositories',
:action => /(browse|show|entry|raw|changes|annotate|diff)/
:action => /(browse|show|entry|raw|changes|annotate|diff)/,
:format => false
get 'projects/:id/repository/:repository_id', :to => 'repositories#show', :path => nil
get 'projects/:id/repository', :to => 'repositories#show', :path => nil
......
......@@ -15,7 +15,7 @@ file 'config/initializers/secret_token.rb' do
# change this key, all old sessions will become invalid! Make sure the
# secret is at least 30 characters and all random, no regular words or
# you'll be exposed to dictionary attacks.
RedmineApp::Application.config.secret_token = '#{secret}'
RedmineApp::Application.config.secret_key_base = '#{secret}'
EOF
end
end
......
......@@ -104,7 +104,7 @@ namespace :test do
Rake::TestTask.new(:ui => "db:test:prepare") do |t|
t.libs << "test"
t.verbose = true
t.test_files = FileList['test/ui/**/*_test.rb']
t.test_files = FileList['test/ui/**/*_test_ui.rb']
end
Rake::Task['test:ui'].comment = "Run the UI tests with Capybara (PhantomJS listening on port 4444 is required)"
end
......@@ -118,8 +118,8 @@ class ActivitiesControllerTest < ActionController::TestCase
assert_template 'common/feed'
assert_select 'feed' do
assert_select 'link[rel=self][href=?]', 'http://test.host/activity.atom?show_changesets=1&amp;show_documents=1&amp;show_files=1&amp;show_issues=1&amp;show_messages=1&amp;show_news=1&amp;show_time_entries=1&amp;show_wiki_edits=1&amp;with_subprojects=0'
assert_select 'link[rel=alternate][href=?]', 'http://test.host/activity?show_changesets=1&amp;show_documents=1&amp;show_files=1&amp;show_issues=1&amp;show_messages=1&amp;show_news=1&amp;show_time_entries=1&amp;show_wiki_edits=1&amp;with_subprojects=0'
assert_select 'link[rel=self][href=?]', 'http://test.host/activity.atom?show_changesets=1&show_documents=1&show_files=1&show_issues=1&show_messages=1&show_news=1&show_time_entries=1&show_wiki_edits=1&with_subprojects=0'
assert_select 'link[rel=alternate][href=?]', 'http://test.host/activity?show_changesets=1&show_documents=1&show_files=1&show_issues=1&show_messages=1&show_news=1&show_time_entries=1&show_wiki_edits=1&with_subprojects=0'
assert_select 'entry' do
assert_select 'link[href=?]', 'http://test.host/issues/11'
end
......
......@@ -94,7 +94,7 @@ class AuthSourcesControllerTest < ActionController::TestCase
get :edit, :id => 1
assert_response :success
assert_select 'input[value=secret]', 0
assert_select 'input[name=dummy_password][value=?]', /x+/
assert_select 'input[name=dummy_password][value^=xxxxxx]'
end
def test_edit_invalid_should_respond_with_404
......
......@@ -117,9 +117,13 @@ class BoardsControllerTest < ActionController::TestCase
assert_select 'select[name=?]', 'board[parent_id]' do
assert_select 'option', (Project.find(1).boards.size + 1)
assert_select 'option[value=""]', :text => '&nbsp;'
assert_select 'option[value=""]'
assert_select 'option[value="1"]', :text => 'Help'
end
# &nbsp; replaced by nokogiri, not easy to test in DOM assertions
assert_not_include '<option value=""></option>', response.body
assert_include '<option value="">&nbsp;</option>', response.body
end
def test_new_without_project_boards
......
......@@ -371,7 +371,7 @@ class IssuesControllerTest < ActionController::TestCase
assert_select 'a.atom[href="/issues.atom"]'
assert_select 'a.csv[href="/issues.csv"]'
assert_select 'a.pdf[href="/issues.pdf"]'
assert_select 'form#csv-export-form[action=/issues.csv]'
assert_select 'form#csv-export-form[action="/issues.csv"]'
end
def test_index_should_not_warn_when_not_exceeding_export_limit
......@@ -861,7 +861,7 @@ class IssuesControllerTest < ActionController::TestCase
get :index, :set_filter => 1, :c => %w(subject description)
assert_select 'table.issues thead th', 3 # columns: chekbox + id + subject
assert_select 'td.description[colspan=3]', :text => 'Unable to print recipes'
assert_select 'td.description[colspan="3"]', :text => 'Unable to print recipes'
get :index, :set_filter => 1, :c => %w(subject description), :format => 'pdf'
assert_response :success
......@@ -1012,7 +1012,7 @@ class IssuesControllerTest < ActionController::TestCase
@request.session[:user_id] = 2
get :show, :id => 1
assert_select 'form#issue-form[method=post][enctype=multipart/form-data]' do
assert_select 'form#issue-form[method=post][enctype="multipart/form-data"]' do
assert_select 'input[type=file][name=?]', 'attachments[dummy][file]'
end
end
......@@ -1622,7 +1622,7 @@ class IssuesControllerTest < ActionController::TestCase
@request.session[:user_id] = 2
get :new, :project_id => 1, :tracker_id => 1
assert_select 'form[id=issue-form][method=post][enctype=multipart/form-data]' do
assert_select 'form[id=issue-form][method=post][enctype="multipart/form-data"]' do
assert_select 'input[name=?][type=file]', 'attachments[dummy][file]'
end
end
......@@ -2429,7 +2429,7 @@ class IssuesControllerTest < ActionController::TestCase
assert_equal orig.subject, assigns(:issue).subject
assert assigns(:issue).copy?
assert_select 'form[id=issue-form][action=/projects/ecookbook/issues]' do
assert_select 'form[id=issue-form][action="/projects/ecookbook/issues"]' do
assert_select 'select[name=?]', 'issue[project_id]' do
assert_select 'option[value="1"][selected=selected]', :text => 'eCookbook'
assert_select 'option[value="2"]:not([selected])', :text => 'OnlineStore'
......@@ -2629,7 +2629,7 @@ class IssuesControllerTest < ActionController::TestCase
assert_not_nil assigns(:issue)
assert assigns(:issue).copy?
assert_select 'form#issue-form[action=/projects/ecookbook/issues]' do
assert_select 'form#issue-form[action="/projects/ecookbook/issues"]' do
assert_select 'select[name=?]', 'issue[project_id]' do
assert_select 'option[value="1"]:not([selected])', :text => 'eCookbook'
assert_select 'option[value="2"][selected=selected]', :text => 'OnlineStore'
......@@ -2701,7 +2701,7 @@ class IssuesControllerTest < ActionController::TestCase
assert_select 'option[value="7"][selected=selected]', :text => 'Urgent'
end
assert_select 'input[name=?][value=2.5]', 'time_entry[hours]'
assert_select 'input[name=?][value="2.5"]', 'time_entry[hours]'
assert_select 'select[name=?]', 'time_entry[activity_id]' do
assert_select 'option[value="10"][selected=selected]', :text => 'Development'
end
......
......@@ -245,7 +245,7 @@ class IssuesControllerTransactionTest < ActionController::TestCase
assert_select 'input[name=?][value=?]', 'time_entry[hours]', '2.5'
assert_select 'input[name=?][value=?]', 'time_entry[comments]', 'should not be added'
assert_select 'select[name=?]', 'time_entry[activity_id]' do
assert_select 'option[value=?][selected=selected]', TimeEntryActivity.first.id
assert_select 'option[value=?][selected=selected]', TimeEntryActivity.first.id.to_s
end
end
......
......@@ -83,9 +83,9 @@ class IssuesCustomFieldsVisibilityTest < ActionController::TestCase
end
@fields.each_with_index do |field, i|
if fields.include?(field)
assert_select "custom_field[id=#{field.id}] value", {:text => "Value#{i}", :count => 1}, "User #{user.id} was not able to view #{field.name} in API"
assert_select "custom_field[id=?] value", field.id.to_s, {:text => "Value#{i}", :count => 1}, "User #{user.id} was not able to view #{field.name} in API"
else
assert_select "custom_field[id=#{field.id}] value", {:text => "Value#{i}", :count => 0}, "User #{user.id} was not able to view #{field.name} in API"
assert_select "custom_field[id=?] value", field.id.to_s, {:text => "Value#{i}", :count => 0}, "User #{user.id} was not able to view #{field.name} in API"
end
end
end
......
......@@ -126,7 +126,7 @@ class MyControllerTest < ActionController::TestCase
get :destroy
assert_response :success
assert_template 'destroy'
assert_select 'form[action=/my/account/destroy]' do
assert_select 'form[action="/my/account/destroy"]' do
assert_select 'input[name=confirm]'
end
end
......
......@@ -123,7 +123,7 @@ class RepositoriesBazaarControllerTest < ActionController::TestCase
assert_response :success
assert_template 'diff'
# Line 11 removed
assert_select 'th.line-num:content(11) ~ td.diff_out', :text => /Display more information/
assert_select 'th.line-num:contains(11) ~ td.diff_out', :text => /Display more information/
end
end
......@@ -157,7 +157,7 @@ class RepositoriesBazaarControllerTest < ActionController::TestCase
assert_select "th.line-num", :text => '1' do
assert_select "+ td.revision" do
assert_select "a", :text => '2'
assert_select "+ td.author", :text => "test &amp;" do
assert_select "+ td.author", :text => "test &" do
assert_select "+ td",
:text => "author escaping test"
end
......
......@@ -275,14 +275,8 @@ class RepositoriesControllerTest < ActionController::TestCase
assert_response :success
assert_template 'committers'
assert_select 'td:content(dlopper) + td select' do
assert_select 'option[value="3"][selected=selected]', :text => 'Dave Lopper'
end
assert_select 'td:content(foo) + td select' do
assert_select 'option[value=""]'
assert_select 'option[selected=selected]', 0 # no option selected
end
assert_select 'input[value=dlopper] + select option[value="3"][selected=selected]', :text => 'Dave Lopper'
assert_select 'input[value=foo] + select option[selected=selected]', 0 # no option selected
end
def test_post_committers
......
......@@ -116,7 +116,7 @@ class RepositoriesDarcsControllerTest < ActionController::TestCase
assert_response :success
assert_template 'diff'
# Line 22 removed
assert_select 'th.line-num:content(22) ~ td.diff_out', :text => /def remove/
assert_select 'th.line-num:contains(22) ~ td.diff_out', :text => /def remove/
end
end
......
......@@ -265,7 +265,7 @@ class RepositoriesGitControllerTest < ActionController::TestCase
assert_response :success
assert_template 'diff'
# Line 22 removed
assert_select 'th.line-num:content(22) ~ td.diff_out', :text => /def remove/
assert_select 'th.line-num:contains(22) ~ td.diff_out', :text => /def remove/
assert_select 'h2', :text => /2f9c0091/
end
end
......@@ -286,7 +286,7 @@ class RepositoriesGitControllerTest < ActionController::TestCase
assert_response :success
assert_template 'diff'
# Line 22 removed
assert_select 'th.line-num:content(22) ~ td.diff_out', :text => /def remove/
assert_select 'th.line-num:contains(22) ~ td.diff_out', :text => /def remove/
assert_select 'h2', :text => /2f9c0091/
end
end
......
......@@ -293,7 +293,7 @@ class RepositoriesMercurialControllerTest < ActionController::TestCase
assert_template 'diff'
if @diff_c_support
# Line 22 removed
assert_select 'th.line-num:content(22) ~ td.diff_out', :text => /def remove/
assert_select 'th.line-num:contains(22) ~ td.diff_out', :text => /def remove/
assert_select 'h2', :text => /4:def6d2f1254a/
end
end
......
......@@ -315,8 +315,8 @@ class SearchControllerTest < ActionController::TestCase
get :index, :q => 'escaped_once'
assert_response :success
assert_select '#search-results' do
assert_select 'dt.issue a', :text => /&lt;subject&gt;/
assert_select 'dd', :text => /&lt;description&gt;/
assert_select 'dt.issue a', :text => /<subject>/
assert_select 'dd', :text => /<description>/
end
end
......
......@@ -139,9 +139,9 @@ class SettingsControllerTest < ActionController::TestCase
def test_get_plugin_settings
ActionController::Base.append_view_path(File.join(Rails.root, "test/fixtures/plugins"))
Redmine::Plugin.register :foo do
settings :partial => "foo_plugin/foo_plugin_settings",
:default => {'sample_setting' => 'Plugin setting value'}
settings :partial => "foo_plugin/foo_plugin_settings"
end
Setting.plugin_foo = {'sample_setting' => 'Plugin setting value'}
get :plugin, :id => 'foo'
assert_response :success
......
......@@ -667,7 +667,7 @@ class TimelogControllerTest < ActionController::TestCase
assert_select 'form[action=?][method=get]', '/projects/ecookbook/time_entries.csv' do
# filter
assert_select 'input[name=?][value=?]', 'f[]', 'spent_on'
assert_select 'input[name=?][value=?]', 'op[spent_on]', '&gt;='
assert_select 'input[name=?][value=?]', 'op[spent_on]', '>='
assert_select 'input[name=?][value=?]', 'v[spent_on][]', '2007-04-01'
# columns
assert_select 'input[name=?][value=?]', 'c[]', 'spent_on'
......
......@@ -127,7 +127,7 @@ class WelcomeControllerTest < ActionController::TestCase
get :index
assert_select "#header select" do
assert_select "option", :text => 'Foo &amp; Bar'
assert_select "option", :text => 'Foo & Bar'
end
end
......
......@@ -31,7 +31,7 @@ class WorkflowsControllerTest < ActionController::TestCase
assert_template 'index'
count = WorkflowTransition.where(:role_id => 1, :tracker_id => 2).count
assert_select 'a[href=?]', '/workflows/edit?role_id=1&amp;tracker_id=2', :content => count.to_s
assert_select 'a[href=?]', '/workflows/edit?role_id=1&tracker_id=2', :content => count.to_s
end
def test_get_edit
......
......@@ -41,7 +41,7 @@ class Redmine::ApiTest::AttachmentsTest < Redmine::ApiTest::Base
get '/attachments/7.xml', {}, credentials('jsmith')
assert_response :success
assert_equal 'application/xml', @response.content_type
assert_select 'attachment id:content(7)' do
assert_select 'attachment id', :text => '7' do
assert_select '~ filename', :text => 'archive.zip'
assert_select '~ content_url', :text => 'http://www.example.com/attachments/download/7/archive.zip'
end
......@@ -51,7 +51,7 @@ class Redmine::ApiTest::AttachmentsTest < Redmine::ApiTest::Base
get '/attachments/16.xml', {}, credentials('jsmith')
assert_response :success
assert_equal 'application/xml', @response.content_type
assert_select 'attachment id:content(16)' do
assert_select 'attachment id:contains(16)' do
assert_select '~ thumbnail_url', :text => 'http://www.example.com/attachments/thumbnail/16'
end
end
......
......@@ -105,7 +105,7 @@ class Redmine::ApiTest::GroupsTest < Redmine::ApiTest::Base
assert_select 'group' do
assert_select 'users' do
assert_select 'user', Group.find(10).users.count
assert_select 'user[id=8]'
assert_select 'user[id="8"]'
end
end
end
......
......@@ -25,7 +25,7 @@ class Redmine::ApiTest::IssueStatusesTest < Redmine::ApiTest::Base
assert_response :success
assert_equal 'application/xml', @response.content_type
assert_select 'issue_statuses[type=array] issue_status id:content(2)' do
assert_select 'issue_statuses[type=array] issue_status id', :text => '2' do
assert_select '~ name', :text => 'Assigned'
end
end
......
......@@ -74,12 +74,12 @@ class Redmine::ApiTest::IssuesTest < Redmine::ApiTest::Base
assert_response :success
assert_equal 'application/xml', @response.content_type
assert_select 'issue id:content(3)' do
assert_select 'issue id', :text => '3' do
assert_select '~ relations relation', 1
assert_select '~ relations relation[id="2"][issue_id="2"][issue_to_id="3"][relation_type=relates]'
end
assert_select 'issue id:content(1)' do
assert_select 'issue id', :text => '1' do
assert_select '~ relations'
assert_select '~ relations relation', 0
end
......@@ -281,7 +281,7 @@ class Redmine::ApiTest::IssuesTest < Redmine::ApiTest::Base
assert_select 'issue attachments[type=array]' do
assert_select 'attachment', 5
assert_select 'attachment id:content(4)' do
assert_select 'attachment id', :text => '4' do
assert_select '~ filename', :text => 'source.rb'
assert_select '~ content_url', :text => 'http://www.example.com/attachments/download/4/source.rb'
end
......@@ -292,9 +292,9 @@ class Redmine::ApiTest::IssuesTest < Redmine::ApiTest::Base
issue = Issue.generate_with_descendants!(:project_id => 1)
get "/issues/#{issue.id}.xml?include=children"
assert_select 'issue children[type=array]' do
assert_select 'issue', 2
assert_select 'issue children', 1
assert_select 'issue id', :text => issue.id.to_s do
assert_select '~ children[type=array] > issue', 2
assert_select '~ children[type=array] > issue > children', 1
end
end
......@@ -322,7 +322,7 @@ class Redmine::ApiTest::IssuesTest < Redmine::ApiTest::Base
assert_select 'issue' do
assert_select 'watchers', Issue.find(1).watchers.count
assert_select 'watchers' do
assert_select 'user[id=3]'
assert_select 'user[id="3"]'
end
end
end
......
......@@ -25,9 +25,9 @@ class Redmine::ApiTest::MembershipsTest < Redmine::ApiTest::Base
assert_response :success
assert_equal 'application/xml', @response.content_type
assert_select 'memberships[type=array] membership id:content(2)' do
assert_select '~ user[id=3][name=Dave Lopper]'
assert_select '~ roles role[id=2][name=Developer]'
assert_select 'memberships[type=array] membership id', :text => '2' do
assert_select '~ user[id="3"][name="Dave Lopper"]'
assert_select '~ roles role[id="2"][name=Developer]'
end
end
......@@ -94,9 +94,9 @@ class Redmine::ApiTest::MembershipsTest < Redmine::ApiTest::Base
assert_response :success
assert_equal 'application/xml', @response.content_type
assert_select 'membership id:content(2)' do
assert_select '~ user[id=3][name=Dave Lopper]'