Compare commits

..
42 Commits
Author SHA1 Message Date
Toshi MARUYAMA 5cefd924a2 Merged r10689 from trunk to 2.0-stable
Partial backout r10263.

Backout replacing shoulda context of test/unit/helpers/issues_helper_test.rb.
Test methods in shoulda context do not run on Ruby 1.8.7-p370.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.0-stable@10695 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-22 03:34:29 +00:00
Toshi MARUYAMA 1d888f25f6 Merged r10688 from trunk to 2.0-stable
Backout r10253.

Backout replacing shoulda context of test/unit/helpers/issues_helper_test.rb.
Test methods in shoulda context do not run on Ruby 1.8.7-p370.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.0-stable@10694 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-22 03:34:02 +00:00
Jean-Philippe Lang 45b297f3ae Updates for 2.0.4 release.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.0-stable@10393 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-16 12:44:38 +00:00
Jean-Philippe Lang 0dc0860226 XML output broken with builder 3.0.1.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.0-stable@10307 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-06 22:34:40 +00:00
Jean-Philippe Lang 1c0ef8a0c2 Merged r10304 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.0-stable@10305 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-06 17:34:40 +00:00
Jean-Philippe Lang dd3bd9a708 Merged r10134 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.0-stable@10303 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-06 17:30:59 +00:00
Jean-Philippe Lang 9ab59b43b8 Merged r10147 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.0-stable@10302 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-06 17:30:01 +00:00
Jean-Philippe Lang e56a1c98e3 Merged r9738, r10135 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.0-stable@10301 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-06 17:28:51 +00:00
Jean-Philippe Lang 4233589ee1 Merged r10294 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.0-stable@10298 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-06 17:21:53 +00:00
Toshi MARUYAMA 4d325a3b8a Merged r10287 from trunk to 2.0-stable
fix redmine_plugin generator output in USAGE.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.0-stable@10289 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-03 17:19:25 +00:00
Toshi MARUYAMA 16e4bdbc8a Merged r10286 from trunk to 2.0-stable
fix plugin generator script name of USAGE on Rails3.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.0-stable@10288 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-03 17:19:10 +00:00
Toshi MARUYAMA 2558ad0845 Merged r10252 from trunk to 2.0-stable (#11752)
scm: git: use with_settings at test_diff_truncated of functional test.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.0-stable@10274 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-01 07:26:15 +00:00
Toshi MARUYAMA 08ce7df5ea Merged r10251 from trunk to 2.0-stable (#11752)
scm: git: use diff_max_lines_displayed setting at test_diff_with_rev_and_path of functional test.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.0-stable@10273 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-01 07:26:00 +00:00
Toshi MARUYAMA d9dfa7b2b6 Merged r10245 from trunk to 2.0-stable (#11752)
scm: git: add functional test of diff with revision and path.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.0-stable@10272 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-01 07:25:45 +00:00
Toshi MARUYAMA e573b0455b Merged r10255 from trunk to 2.0-stable
add missing fixture to test/unit/lib/redmine/safe_attributes_test.rb.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.0-stable@10271 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-01 07:25:28 +00:00
Toshi MARUYAMA df6da812e7 Merged r10249 from trunk to 2.0-stable
set language en to test_label_for at test/unit/query_test.rb.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.0-stable@10270 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-01 07:25:11 +00:00
Toshi MARUYAMA 8810a4a343 Merged r9949 from trunk to 2.0-stable
Tests should not change settings.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.0-stable@10269 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-01 07:24:56 +00:00
Toshi MARUYAMA cf6382b92f Merged r10256 from trunk to 2.0-stable
add missing fixtures to test/unit/lib/redmine/hook_test.rb.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.0-stable@10268 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-01 07:24:38 +00:00
Toshi MARUYAMA 90c44e490e Merged r10253, r10257, r10263 and r10264 from trunk to 2.0-stable
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.0-stable@10267 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-01 07:24:21 +00:00
Toshi MARUYAMA 004a98df86 Merged r10219 from trunk to 2.0-stable (#11665)
add functional test to create non default document category.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.0-stable@10229 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-08-22 08:56:52 +00:00
Toshi MARUYAMA 33bf6d60d8 Merged r10216 from trunk
add missing fixtures to test/functional/documents_controller_test.rb

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.0-stable@10217 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-08-21 04:52:01 +00:00
Toshi MARUYAMA 004ec7a251 Merged r10213 from trunk
add missing fixtures to test/unit/document_test.rb

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.0-stable@10214 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-08-21 02:23:25 +00:00
Toshi MARUYAMA 656a656697 Merged r10169 from trunk to 2.0-stable (#11600)
fix plural form of the abbreviation for hours in Brazilian Portuguese.

Contributed by Mauricio Piacentini.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.0-stable@10171 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-08-08 01:33:43 +00:00
Toshi MARUYAMA 37c7de41ce Merged r10167 from trunk to 2.0-stable
Gemfile: mocha version up 0.12.3.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.0-stable@10170 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-08-08 01:33:28 +00:00
Jean-Philippe Lang b2e095cb87 Merged r10155 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.0-stable@10156 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-08-02 18:23:49 +00:00
Toshi MARUYAMA 10706c5a11 Merged r10011 from trunk to 2.0-stable
Removed assertion that is susceptible to fail if test runs slowly.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.0-stable@10140 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-07-31 11:12:57 +00:00
Toshi MARUYAMA 568cce5b22 Merged r10137 from trunk to 2.0-stable (#10320, #10818)
Gemfile: prevent "rake db:migrate RAILS_ENV=test" causes exception on Ruby 1.9.3.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.0-stable@10138 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-07-31 08:17:19 +00:00
Toshi MARUYAMA 48e4facc3c Merged r10083 from trunk to 2.0-stable (#11511)
fix confirmation page has broken HTML when a project folding sub project is deleted.

Contributed by Haruka Yoshihara.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.0-stable@10084 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-07-27 00:40:57 +00:00
Toshi MARUYAMA d42a675668 Merged r10055 from trunk to 2.0-stable (#11448)
Russian translation for 1.4-stable and 2.0-stable updated by Александр Закревский.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.0-stable@10056 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-07-20 10:05:54 +00:00
Jean-Philippe Lang 7dde34460c Merged r9984 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.0-stable@9999 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-07-15 15:56:23 +00:00
Jean-Philippe Lang 873a5cda4f Merged r9982 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.0-stable@9998 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-07-15 15:55:15 +00:00
Jean-Philippe Lang d006e357c0 Merged r9924 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.0-stable@9959 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-07-08 12:37:47 +00:00
Jean-Philippe Lang 004bc127b2 Merged r9925 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.0-stable@9958 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-07-08 12:36:31 +00:00
Jean-Philippe Lang 70d2f30e9f Merged r9909 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.0-stable@9957 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-07-08 12:35:11 +00:00
Jean-Philippe Lang 6488210ec1 Merged r9895 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.0-stable@9956 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-07-08 12:34:09 +00:00
Jean-Philippe Lang 3cc0730f54 Merged r9908 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.0-stable@9954 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-07-08 12:30:57 +00:00
Jean-Philippe Lang 4491d483f4 Merged r9896 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.0-stable@9953 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-07-08 12:29:27 +00:00
Jean-Philippe Lang a6252e6c6f Merged r9894 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.0-stable@9952 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-07-08 12:27:56 +00:00
Jean-Philippe Lang ba074d776b Merged r9875 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.0-stable@9950 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-07-08 12:24:49 +00:00
Toshi MARUYAMA bf9aea9a15 Merged r9911 from trunk to 2.0-stable (#11328)
Fix Japanese mistranslation for 'label_language_based'.

Contributed by Go MAEDA.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.0-stable@9913 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-07-05 12:36:41 +00:00
Toshi MARUYAMA 7fe9dac8c5 Merge r9871 from trunk
fix test_global_index of functional activities controller test fails around UTC 00:00.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.0-stable@9873 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-06-19 02:11:16 +00:00
Toshi MARUYAMA 711328d172 Merge r9870 from trunk
scm: git: fix unable to run unit lib test if git binary is not available on Windows.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.0-stable@9872 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-06-19 02:10:55 +00:00
55 changed files with 476 additions and 167 deletions
+4 -2
View File
@@ -5,7 +5,7 @@ gem 'prototype-rails', '3.2.1'
gem "i18n", "~> 0.6.0" gem "i18n", "~> 0.6.0"
gem "coderay", "~> 1.0.6" gem "coderay", "~> 1.0.6"
gem "fastercsv", "~> 1.5.0", :platforms => [:mri_18, :mingw_18, :jruby] gem "fastercsv", "~> 1.5.0", :platforms => [:mri_18, :mingw_18, :jruby]
gem "builder" gem "builder", "3.0.0"
# Optional gem for LDAP authentication # Optional gem for LDAP authentication
group :ldap do group :ldap do
@@ -74,7 +74,9 @@ end
group :test do group :test do
gem "shoulda", "~> 2.11" gem "shoulda", "~> 2.11"
gem "mocha" # Shoulda does not work nice on Ruby 1.9.3 and seems to need test-unit explicitely.
gem "test-unit", :platforms => [:mri_19]
gem "mocha", "0.12.3"
end end
local_gemfile = File.join(File.dirname(__FILE__), "Gemfile.local") local_gemfile = File.join(File.dirname(__FILE__), "Gemfile.local")
+4 -2
View File
@@ -253,7 +253,7 @@ module ApplicationHelper
def project_tree_options_for_select(projects, options = {}) def project_tree_options_for_select(projects, options = {})
s = '' s = ''
project_tree(projects) do |project, level| project_tree(projects) do |project, level|
name_prefix = (level > 0 ? (' ' * 2 * level + '» ').html_safe : '') name_prefix = (level > 0 ? (' ' * 2 * level + '» ') : '').html_safe
tag_options = {:value => project.id} tag_options = {:value => project.id}
if project == options[:selected] || (options[:selected].respond_to?(:include?) && options[:selected].include?(project)) if project == options[:selected] || (options[:selected].respond_to?(:include?) && options[:selected].include?(project))
tag_options[:selected] = 'selected' tag_options[:selected] = 'selected'
@@ -812,7 +812,7 @@ module ApplicationHelper
end end
end end
HEADING_RE = /(<h(1|2|3|4)( [^>]+)?>(.+?)<\/h(1|2|3|4)>)/i unless const_defined?(:HEADING_RE) HEADING_RE = /(<h(\d)( [^>]+)?>(.+?)<\/h(\d)>)/i unless const_defined?(:HEADING_RE)
def parse_sections(text, project, obj, attr, only_path, options) def parse_sections(text, project, obj, attr, only_path, options)
return unless options[:edit_section_links] return unless options[:edit_section_links]
@@ -883,6 +883,8 @@ module ApplicationHelper
# Renders the TOC with given headings # Renders the TOC with given headings
def replace_toc(text, headings) def replace_toc(text, headings)
text.gsub!(TOC_RE) do text.gsub!(TOC_RE) do
# Keep only the 4 first levels
headings = headings.select{|level, anchor, item| level <= 4}
if headings.empty? if headings.empty?
'' ''
else else
+1
View File
@@ -24,6 +24,7 @@ class Attachment < ActiveRecord::Base
validates_presence_of :filename, :author validates_presence_of :filename, :author
validates_length_of :filename, :maximum => 255 validates_length_of :filename, :maximum => 255
validates_length_of :disk_filename, :maximum => 255 validates_length_of :disk_filename, :maximum => 255
validates_length_of :description, :maximum => 255
validate :validate_max_file_size validate :validate_max_file_size
acts_as_event :title => :filename, acts_as_event :title => :filename,
+9 -6
View File
@@ -50,8 +50,8 @@ class MailHandler < ActionMailer::Base
cattr_accessor :ignored_emails_headers cattr_accessor :ignored_emails_headers
@@ignored_emails_headers = { @@ignored_emails_headers = {
'X-Auto-Response-Suppress' => 'OOF', 'X-Auto-Response-Suppress' => 'oof',
'Auto-Submitted' => 'auto-replied' 'Auto-Submitted' => /^auto-/
} }
# Processes incoming emails # Processes incoming emails
@@ -69,11 +69,14 @@ class MailHandler < ActionMailer::Base
# Ignore auto generated emails # Ignore auto generated emails
self.class.ignored_emails_headers.each do |key, ignored_value| self.class.ignored_emails_headers.each do |key, ignored_value|
value = email.header[key] value = email.header[key]
if value && value.to_s.downcase == ignored_value.downcase if value
if logger && logger.info value = value.to_s.downcase
logger.info "MailHandler: ignoring email with #{key}:#{value} header" if (ignored_value.is_a?(Regexp) && value.match(ignored_value)) || value == ignored_value
if logger && logger.info
logger.info "MailHandler: ignoring email with #{key}:#{value} header"
end
return false
end end
return false
end end
end end
@user = User.find_by_mail(sender_email) if sender_email.present? @user = User.find_by_mail(sender_email) if sender_email.present?
+3 -1
View File
@@ -361,7 +361,9 @@ class Mailer < ActionMailer::Base
def self.with_synched_deliveries(&block) def self.with_synched_deliveries(&block)
saved_method = ActionMailer::Base.delivery_method saved_method = ActionMailer::Base.delivery_method
if m = saved_method.to_s.match(%r{^async_(.+)$}) if m = saved_method.to_s.match(%r{^async_(.+)$})
ActionMailer::Base.delivery_method = m[1].to_sym synched_method = m[1]
ActionMailer::Base.delivery_method = synched_method.to_sym
ActionMailer::Base.send "#{synched_method}_settings=", ActionMailer::Base.send("async_#{synched_method}_settings")
end end
yield yield
ensure ensure
+2 -2
View File
@@ -174,9 +174,9 @@ class Query < ActiveRecord::Base
if values_for(field) if values_for(field)
case type_for(field) case type_for(field)
when :integer when :integer
add_filter_error(field, :invalid) if values_for(field).detect {|v| v.present? && !v.match(/^\d+$/) } add_filter_error(field, :invalid) if values_for(field).detect {|v| v.present? && !v.match(/^[+-]?\d+$/) }
when :float when :float
add_filter_error(field, :invalid) if values_for(field).detect {|v| v.present? && !v.match(/^\d+(\.\d*)?$/) } add_filter_error(field, :invalid) if values_for(field).detect {|v| v.present? && !v.match(/^[+-]?\d+(\.\d*)?$/) }
when :date, :date_past when :date, :date_past
case operator_for(field) case operator_for(field)
when "=", ">=", "<=", "><" when "=", ">=", "<=", "><"
+2 -2
View File
@@ -37,8 +37,8 @@ class Repository < ActiveRecord::Base
validates_presence_of :identifier, :unless => Proc.new { |r| r.is_default? || r.set_as_default? } validates_presence_of :identifier, :unless => Proc.new { |r| r.is_default? || r.set_as_default? }
validates_uniqueness_of :identifier, :scope => :project_id, :allow_blank => true validates_uniqueness_of :identifier, :scope => :project_id, :allow_blank => true
validates_exclusion_of :identifier, :in => %w(show entry raw changes annotate diff show stats graph) validates_exclusion_of :identifier, :in => %w(show entry raw changes annotate diff show stats graph)
# donwcase letters, digits, dashes but not digits only # donwcase letters, digits, dashes, underscores but not digits only
validates_format_of :identifier, :with => /^(?!\d+$)[a-z0-9\-]*$/, :allow_blank => true validates_format_of :identifier, :with => /^(?!\d+$)[a-z0-9\-_]*$/, :allow_blank => true
# Checks if the SCM is enabled when creating a repository # Checks if the SCM is enabled when creating a repository
validate :repo_create_validation, :on => :create validate :repo_create_validation, :on => :create
+1 -1
View File
@@ -10,7 +10,7 @@
<span> <span>
<%= file_field_tag 'attachments[1][file]', :size => 30, :id => nil, :class => 'file', <%= file_field_tag 'attachments[1][file]', :size => 30, :id => nil, :class => 'file',
:onchange => "checkFileSize(this, #{Setting.attachment_max_size.to_i.kilobytes}, '#{escape_javascript(l(:error_attachment_too_big, :max_size => number_to_human_size(Setting.attachment_max_size.to_i.kilobytes)))}');" -%> :onchange => "checkFileSize(this, #{Setting.attachment_max_size.to_i.kilobytes}, '#{escape_javascript(l(:error_attachment_too_big, :max_size => number_to_human_size(Setting.attachment_max_size.to_i.kilobytes)))}');" -%>
<%= text_field_tag 'attachments[1][description]', '', :id => nil, :class => 'description', :placeholder => l(:label_optional_description) %> <%= text_field_tag 'attachments[1][description]', '', :id => nil, :class => 'description', :maxlength => 255, :placeholder => l(:label_optional_description) %>
<%= link_to_function(image_tag('delete.png'), 'removeFileField(this)', :title => (l(:button_delete))) %> <%= link_to_function(image_tag('delete.png'), 'removeFileField(this)', :title => (l(:button_delete))) %>
</span> </span>
</span> </span>
+1 -1
View File
@@ -21,6 +21,6 @@
<% if @notes.present? %> <% if @notes.present? %>
<label><%= radio_button_tag 'conflict_resolution', 'add_notes' %> <%= l(:text_issue_conflict_resolution_add_notes) %></label><br /> <label><%= radio_button_tag 'conflict_resolution', 'add_notes' %> <%= l(:text_issue_conflict_resolution_add_notes) %></label><br />
<% end %> <% end %>
<label><%= radio_button_tag 'conflict_resolution', 'cancel' %> <%= l(:text_issue_conflict_resolution_cancel, :link => link_to_issue(@issue, :subject => false)) %></label> <label><%= radio_button_tag 'conflict_resolution', 'cancel' %> <%= l(:text_issue_conflict_resolution_cancel, :link => link_to_issue(@issue, :subject => false)).html_safe %></label>
</p> </p>
<p><%= submit_tag l(:button_submit) %></p> <p><%= submit_tag l(:button_submit) %></p>
+1 -1
View File
@@ -1,3 +1,3 @@
<p><%= l(:mail_body_wiki_content_added, :id => link_to(h(@wiki_content.page.pretty_title), @wiki_content_url), <p><%= l(:mail_body_wiki_content_added, :id => link_to(h(@wiki_content.page.pretty_title), @wiki_content_url),
:author => h(@wiki_content.author)) %><br /> :author => h(@wiki_content.author)).html_safe %><br />
<em><%=h @wiki_content.comments %></em></p> <em><%=h @wiki_content.comments %></em></p>
@@ -1,5 +1,5 @@
<p><%= l(:mail_body_wiki_content_updated, :id => link_to(h(@wiki_content.page.pretty_title), @wiki_content_url), <p><%= l(:mail_body_wiki_content_updated, :id => link_to(h(@wiki_content.page.pretty_title), @wiki_content_url),
:author => h(@wiki_content.author)) %><br /> :author => h(@wiki_content.author)).html_safe %><br />
<em><%=h @wiki_content.comments %></em></p> <em><%=h @wiki_content.comments %></em></p>
<p><%= l(:label_view_diff) %>:<br /> <p><%= l(:label_view_diff) %>:<br />
+2 -1
View File
@@ -4,7 +4,8 @@
<%=l(:text_project_destroy_confirmation)%> <%=l(:text_project_destroy_confirmation)%>
<% if @project_to_destroy.descendants.any? %> <% if @project_to_destroy.descendants.any? %>
<br /><%= l(:text_subprojects_destroy_warning, content_tag('strong', h(@project_to_destroy.descendants.collect{|p| p.to_s}.join(', ')))) %> <br /><%= l(:text_subprojects_destroy_warning,
content_tag('strong', h(@project_to_destroy.descendants.collect{|p| p.to_s}.join(', ')))).html_safe %>
<% end %> <% end %>
</p> </p>
<p> <p>
+1 -1
View File
@@ -758,7 +758,7 @@ ja:
label_week: 週 label_week: 週
label_date_from: "日付指定: " label_date_from: "日付指定: "
label_date_to: から label_date_to: から
label_language_based: 既定の言語の設定に従う label_language_based: ユーザの言語の設定に従う
label_sort_by: "並び替え %{value}" label_sort_by: "並び替え %{value}"
label_send_test_email: テストメールを送信 label_send_test_email: テストメールを送信
label_feeds_access_key: RSSアクセスキー label_feeds_access_key: RSSアクセスキー
+4 -4
View File
@@ -18,10 +18,10 @@ pt-BR:
time: time:
formats: formats:
default: "%A, %d de %B de %Y, %H:%M hs" default: "%A, %d de %B de %Y, %H:%M h"
time: "%H:%M hs" time: "%H:%M h"
short: "%d/%m, %H:%M hs" short: "%d/%m, %H:%M h"
long: "%A, %d de %B de %Y, %H:%M hs" long: "%A, %d de %B de %Y, %H:%M h"
only_second: "%S" only_second: "%S"
datetime: datetime:
formats: formats:
+34 -34
View File
@@ -1089,11 +1089,11 @@ ru:
notice_issue_successful_create: Задача %{id} создана. notice_issue_successful_create: Задача %{id} создана.
label_between: между label_between: между
setting_issue_group_assignment: Разрешить назначение задач группам пользователей setting_issue_group_assignment: Разрешить назначение задач группам пользователей
label_diff: diff label_diff: Разница(diff)
text_git_repository_note: Repository is bare and local (e.g. /gitrepo, c:\gitrepo) text_git_repository_note: Repository is bare and local (e.g. /gitrepo, c:\gitrepo)
description_query_sort_criteria_direction: Sort direction description_query_sort_criteria_direction: Порядок сортировки
description_project_scope: Search scope description_project_scope: Search scope
description_filter: Filter description_filter: Фильтр
description_user_mail_notification: Mail notification settings description_user_mail_notification: Mail notification settings
description_date_from: Enter start date description_date_from: Enter start date
description_message_content: Message content description_message_content: Message content
@@ -1101,23 +1101,23 @@ ru:
description_date_range_interval: Choose range by selecting start and end date description_date_range_interval: Choose range by selecting start and end date
description_issue_category_reassign: Choose issue category description_issue_category_reassign: Choose issue category
description_search: Searchfield description_search: Searchfield
description_notes: Notes description_notes: Примечания
description_date_range_list: Choose range from list description_date_range_list: Выберите диапазон из списка
description_choose_project: Projects description_choose_project: Проекты
description_date_to: Enter end date description_date_to: Введите дату выполнения
description_query_sort_criteria_attribute: Sort attribute description_query_sort_criteria_attribute: Критерий сортировки
description_wiki_subpages_reassign: Choose new parent page description_wiki_subpages_reassign: Выбрать новую родительскую страницу
description_selected_columns: Selected Columns description_selected_columns: Выбранные столбцы
label_parent_revision: Parent label_parent_revision: Родительский
label_child_revision: Child label_child_revision: Дочерний
error_scm_annotate_big_text_file: The entry cannot be annotated, as it exceeds the maximum text file size. error_scm_annotate_big_text_file: Комментарий невозможен из-за превышения максимального размера текстового файла.
setting_default_issue_start_date_to_creation_date: Use current date as start date for new issues setting_default_issue_start_date_to_creation_date: Использовать текущую дату в качестве даты начала для новых задач
button_edit_section: Edit this section button_edit_section: Редактировать эту секцию
setting_repositories_encodings: Attachments and repositories encodings setting_repositories_encodings: Кодировка вложений и хранилищ
description_all_columns: All Columns description_all_columns: Все столбцы
button_export: Export button_export: Экспорт
label_export_options: "%{export_format} export options" label_export_options: "%{export_format} параметры экспорта"
error_attachment_too_big: This file cannot be uploaded because it exceeds the maximum allowed file size (%{max_size}) error_attachment_too_big: Этот файл нельзя загрузить из-за превышения максимального размера файла (%{max_size})
notice_failed_to_save_time_entries: "Failed to save %{count} time entrie(s) on %{total} selected: %{ids}." notice_failed_to_save_time_entries: "Failed to save %{count} time entrie(s) on %{total} selected: %{ids}."
label_x_issues: label_x_issues:
zero: 0 Задач zero: 0 Задач
@@ -1125,21 +1125,21 @@ ru:
few: "%{count} Задач" few: "%{count} Задач"
many: "%{count} Задач" many: "%{count} Задач"
other: "%{count} Задач" other: "%{count} Задач"
label_repository_new: New repository label_repository_new: Новое хранилище
field_repository_is_default: Main repository field_repository_is_default: Хранилище по умолчанию
label_copy_attachments: Copy attachments label_copy_attachments: Копировать вложения
label_item_position: "%{position}/%{count}" label_item_position: "%{position}/%{count}"
label_completed_versions: Completed versions label_completed_versions: Завершенные версии
text_project_identifier_info: Only lower case letters (a-z), numbers, dashes and underscores are allowed.<br />Once saved, the identifier cannot be changed. text_project_identifier_info: Допускаются только строчные латинские буквы (a-z), цифры, тире и подчеркивания.<br />После сохранения идентификатор изменить нельзя.
field_multiple: Multiple values field_multiple: Множественные значения
setting_commit_cross_project_ref: Allow issues of all the other projects to be referenced and fixed setting_commit_cross_project_ref: Разрешить ссылаться и исправлять задачи во всех остальных проектах
text_issue_conflict_resolution_add_notes: Add my notes and discard my other changes text_issue_conflict_resolution_add_notes: Добавить мои примечания и отказаться от моих изменений
text_issue_conflict_resolution_overwrite: Apply my changes anyway (previous notes will be kept but some changes may be overwritten) text_issue_conflict_resolution_overwrite: Применить мои изменения (все предыдущие замечания будут сохранены, но некоторые изменения могут быть перезаписаны)
notice_issue_update_conflict: The issue has been updated by an other user while you were editing it. notice_issue_update_conflict: Кто-то изменил задачу, пока вы ее редактировали.
text_issue_conflict_resolution_cancel: Discard all my changes and redisplay %{link} text_issue_conflict_resolution_cancel: Отменить мои изменения и показать задачу заново %{link}
permission_manage_related_issues: Manage related issues permission_manage_related_issues: Управление связанными задачами
field_ldap_filter: LDAP filter field_ldap_filter: Фильтр LDAP
label_search_for_watchers: Search for watchers to add label_search_for_watchers: Найти наблюдателей
notice_account_deleted: "Ваша учетная запись полностью удалена" notice_account_deleted: "Ваша учетная запись полностью удалена"
setting_unsubscribe: "Разрешить пользователям удалять свои учетные записи" setting_unsubscribe: "Разрешить пользователям удалять свои учетные записи"
button_delete_my_account: "Удалить мою учетную запись" button_delete_my_account: "Удалить мою учетную запись"
+2
View File
@@ -224,6 +224,7 @@ RedmineApp::Application.routes.draw do
get 'projects/:id/repository/:repository_id/revisions', :to => 'repositories#revisions' 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(.:ext))',
:controller => 'repositories', :controller => 'repositories',
:format => false,
:constraints => { :constraints => {
:action => /(browse|show|entry|raw|annotate|diff)/, :action => /(browse|show|entry|raw|annotate|diff)/,
:rev => /[a-z0-9\.\-_]+/ :rev => /[a-z0-9\.\-_]+/
@@ -242,6 +243,7 @@ RedmineApp::Application.routes.draw do
delete 'projects/:id/repository/revisions/:rev/issues/:issue_id', :to => 'repositories#remove_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(.:ext))',
:controller => 'repositories', :controller => 'repositories',
:format => false,
:constraints => { :constraints => {
:action => /(browse|show|entry|raw|annotate|diff)/, :action => /(browse|show|entry|raw|annotate|diff)/,
:rev => /[a-z0-9\.\-_]+/ :rev => /[a-z0-9\.\-_]+/
+22
View File
@@ -4,6 +4,28 @@ Redmine - project management software
Copyright (C) 2006-2012 Jean-Philippe Lang Copyright (C) 2006-2012 Jean-Philippe Lang
http://www.redmine.org/ http://www.redmine.org/
== 2012-09-16 v2.0.4
* Defect #10818: Running rake in test environment causes exception
* Defect #11209: Wiki diff may generate broken HTML
* Defect #11217: Project names in drop-down are escaped twice
* Defect #11262: Link is escaped in wiki added/updated notification email
* Defect #11307: Can't filter for negative numeric custom fields
* Defect #11325: Unified diff link broken on specific file/revision diff view
* Defect #11341: Escaped link in conflict resolution form
* Defect #11365: Attachment description length is not validated
* Defect #11511: Confirmation page has broken HTML when a project folding sub project is deleted
* Defect #11533: rake redmine:plugins:test doesn't run tests in subdirectories
* Defect #11541: Version sharing is missing in the REST API
* Defect #11550: Issue reminder doesn't work when using asynchronous delivery
* Defect #11776: Can't override mailer views inside redmine plugin.
* Defect #11789: Edit section links broken with h5/h6 headings
* Feature #11338: Exclude emails with auto-submitted => auto-generated
* Patch #11299: redmine:plugins:migrate should update db/schema.rb
* Patch #11328: Fix Japanese mistranslation for 'label_language_based'
* Patch #11448: Russian translation for 1.4-stable and 2.0-stable
* Patch #11600: Fix plural form of the abbreviation for hours in Brazilian Portuguese
== 2012-06-18 v2.0.3 == 2012-06-18 v2.0.3
* Defect #10688: PDF export from Wiki - Problems with tables * Defect #10688: PDF export from Wiki - Problems with tables
+5 -2
View File
@@ -13,7 +13,7 @@ http://www.redmine.org/
* A database: * A database:
* MySQL (tested with MySQL 5.1) * MySQL (tested with MySQL 5.1)
* PostgreSQL (tested with PostgreSQL 8.4) * PostgreSQL (tested with PostgreSQL 9.1)
* SQLite3 (tested with SQLite 3.6) * SQLite3 (tested with SQLite 3.6)
Optional: Optional:
@@ -38,7 +38,10 @@ Optional:
3. Create an empty utf8 encoded database: "redmine" for example 3. Create an empty utf8 encoded database: "redmine" for example
4. Configure the database parameters in config/database.yml 4. Configure the database parameters in config/database.yml
for the "production" environment (default database is MySQL) for the "production" environment (default database is MySQL and ruby1.8)
If you're running Redmine with MySQL and ruby1.9, replace the adapter name
with `mysql2`
5. Generate a session store secret 5. Generate a session store secret
+17 -1
View File
@@ -2,7 +2,23 @@ Description:
The plugin generator creates stubs for a new Redmine plugin. The plugin generator creates stubs for a new Redmine plugin.
Example: Example:
./script/generate redmine_plugin meetings ./script/rails generate redmine_plugin meetings
create plugins/meetings/app
create plugins/meetings/app/controllers
create plugins/meetings/app/helpers
create plugins/meetings/app/models
create plugins/meetings/app/views
create plugins/meetings/db/migrate
create plugins/meetings/lib/tasks
create plugins/meetings/assets/images
create plugins/meetings/assets/javascripts
create plugins/meetings/assets/stylesheets
create plugins/meetings/config/locales
create plugins/meetings/test
create plugins/meetings/test/fixtures
create plugins/meetings/test/unit
create plugins/meetings/test/functional
create plugins/meetings/test/integration
create plugins/meetings/README.rdoc create plugins/meetings/README.rdoc
create plugins/meetings/init.rb create plugins/meetings/init.rb
create plugins/meetings/config/routes.rb create plugins/meetings/config/routes.rb
@@ -2,4 +2,4 @@ Description:
Generates a plugin controller. Generates a plugin controller.
Example: Example:
./script/generate redmine_plugin_controller meetings pools index show vote ./script/rails generate redmine_plugin_controller meetings pools index show vote
+1 -1
View File
@@ -2,4 +2,4 @@ Description:
Generates a plugin model. Generates a plugin model.
Examples: Examples:
./script/generate redmine_plugin_model meetings pool ./script/rails generate redmine_plugin_model meetings pool
+5 -4
View File
@@ -50,16 +50,17 @@ module Redmine
words_add += 1 words_add += 1
else else
del_at = pos unless del_at del_at = pos unless del_at
deleted << ' ' + h(change[2]) deleted << ' ' unless deleted.empty?
deleted << h(change[2])
words_del += 1 words_del += 1
end end
end end
if add_at if add_at
words[add_at] = '<span class="diff_in">' + words[add_at] words[add_at] = '<span class="diff_in">'.html_safe + words[add_at]
words[add_to] = words[add_to] + '</span>' words[add_to] = words[add_to] + '</span>'.html_safe
end end
if del_at if del_at
words.insert del_at - del_off + dels + words_add, '<span class="diff_out">' + deleted + '</span>' words.insert del_at - del_off + dels + words_add, '<span class="diff_out">'.html_safe + deleted + '</span>'.html_safe
dels += 1 dels += 1
del_off += words_del del_off += words_del
words_del = 0 words_del = 0
+1
View File
@@ -82,6 +82,7 @@ module Redmine #:nodoc:
view_path = File.join(p.directory, 'app', 'views') view_path = File.join(p.directory, 'app', 'views')
if File.directory?(view_path) if File.directory?(view_path)
ActionController::Base.prepend_view_path(view_path) ActionController::Base.prepend_view_path(view_path)
ActionMailer::Base.prepend_view_path(view_path)
end end
# Adds the app/{controllers,helpers,models} directories of the plugin to the autoload path # Adds the app/{controllers,helpers,models} directories of the plugin to the autoload path
+1 -1
View File
@@ -4,7 +4,7 @@ module Redmine
module VERSION #:nodoc: module VERSION #:nodoc:
MAJOR = 2 MAJOR = 2
MINOR = 0 MINOR = 0
TINY = 3 TINY = 4
# Branch values: # Branch values:
# * official release: nil # * official release: nil
+32
View File
@@ -70,6 +70,8 @@ namespace :redmine do
rescue Redmine::PluginNotFound rescue Redmine::PluginNotFound
abort "Plugin #{name} was not found." abort "Plugin #{name} was not found."
end end
Rake::Task["db:schema:dump"].invoke
end end
desc 'Copies plugins assets into the public directory.' desc 'Copies plugins assets into the public directory.'
@@ -82,6 +84,36 @@ namespace :redmine do
abort "Plugin #{name} was not found." abort "Plugin #{name} was not found."
end end
end end
desc 'Runs the plugins tests.'
task :test do
Rake::Task["redmine:plugins:test:units"].invoke
Rake::Task["redmine:plugins:test:functionals"].invoke
Rake::Task["redmine:plugins:test:integration"].invoke
end
namespace :test do
desc 'Runs the plugins unit tests.'
Rake::TestTask.new :units => "db:test:prepare" do |t|
t.libs << "test"
t.verbose = true
t.test_files = FileList["plugins/#{ENV['NAME'] || '*'}/test/unit/**/*_test.rb"]
end
desc 'Runs the plugins functional tests.'
Rake::TestTask.new :functionals => "db:test:prepare" do |t|
t.libs << "test"
t.verbose = true
t.test_files = FileList["plugins/#{ENV['NAME'] || '*'}/test/functional/**/*_test.rb"]
end
desc 'Runs the plugins integration tests.'
Rake::TestTask.new :integration => "db:test:prepare" do |t|
t.libs << "test"
t.verbose = true
t.test_files = FileList["plugins/#{ENV['NAME'] || '*'}/test/integration/**/*_test.rb"]
end
end
end end
end end
@@ -55,13 +55,16 @@ class ActivitiesControllerTest < ActionController::TestCase
end end
def test_global_index def test_global_index
@request.session[:user_id] = 1
get :index get :index
assert_response :success assert_response :success
assert_template 'index' assert_template 'index'
assert_not_nil assigns(:events_by_day) assert_not_nil assigns(:events_by_day)
i5 = Issue.find(5)
d5 = User.find(1).time_to_date(i5.created_on)
assert_tag :tag => "h3", assert_tag :tag => "h3",
:content => /#{5.day.ago.to_date.day}/, :content => /#{d5.day}/,
:sibling => { :tag => "dl", :sibling => { :tag => "dl",
:child => { :tag => "dt", :child => { :tag => "dt",
:attributes => { :class => /issue/ }, :attributes => { :class => /issue/ },
+23 -4
View File
@@ -18,7 +18,9 @@
require File.expand_path('../../test_helper', __FILE__) require File.expand_path('../../test_helper', __FILE__)
class DocumentsControllerTest < ActionController::TestCase class DocumentsControllerTest < ActionController::TestCase
fixtures :projects, :users, :roles, :members, :member_roles, :enabled_modules, :documents, :enumerations fixtures :projects, :users, :roles, :members, :member_roles,
:enabled_modules, :documents, :enumerations,
:groups_users, :attachments
def setup def setup
User.current = nil User.current = nil
@@ -95,16 +97,16 @@ LOREM
def test_create_with_one_attachment def test_create_with_one_attachment
ActionMailer::Base.deliveries.clear ActionMailer::Base.deliveries.clear
Setting.notified_events << 'document_added'
@request.session[:user_id] = 2 @request.session[:user_id] = 2
set_tmp_attachments_directory set_tmp_attachments_directory
post :create, :project_id => 'ecookbook', with_settings :notified_events => %w(document_added) do
post :create, :project_id => 'ecookbook',
:document => { :title => 'DocumentsControllerTest#test_post_new', :document => { :title => 'DocumentsControllerTest#test_post_new',
:description => 'This is a new document', :description => 'This is a new document',
:category_id => 2}, :category_id => 2},
:attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain')}} :attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain')}}
end
assert_redirected_to '/projects/ecookbook/documents' assert_redirected_to '/projects/ecookbook/documents'
document = Document.find_by_title('DocumentsControllerTest#test_post_new') document = Document.find_by_title('DocumentsControllerTest#test_post_new')
@@ -124,6 +126,23 @@ LOREM
assert_template 'new' assert_template 'new'
end end
def test_create_non_default_category
@request.session[:user_id] = 2
category2 = Enumeration.find_by_name('User documentation')
category2.update_attributes(:is_default => true)
category1 = Enumeration.find_by_name('Uncategorized')
post :create,
:project_id => 'ecookbook',
:document => { :title => 'no default',
:description => 'This is a new document',
:category_id => category1.id }
assert_redirected_to '/projects/ecookbook/documents'
doc = Document.find_by_title('no default')
assert_not_nil doc
assert_equal category1.id, doc.category_id
assert_equal category1, doc.category
end
def test_edit def test_edit
@request.session[:user_id] = 2 @request.session[:user_id] = 2
get :edit, :id => 1 get :edit, :id => 1
+6 -6
View File
@@ -58,13 +58,14 @@ class FilesControllerTest < ActionController::TestCase
def test_create_file def test_create_file
set_tmp_attachments_directory set_tmp_attachments_directory
@request.session[:user_id] = 2 @request.session[:user_id] = 2
Setting.notified_events = ['file_added']
ActionMailer::Base.deliveries.clear ActionMailer::Base.deliveries.clear
assert_difference 'Attachment.count' do with_settings :notified_events => %w(file_added) do
post :create, :project_id => 1, :version_id => '', assert_difference 'Attachment.count' do
:attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain')}} post :create, :project_id => 1, :version_id => '',
assert_response :redirect :attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain')}}
assert_response :redirect
end
end end
assert_redirected_to '/projects/ecookbook/files' assert_redirected_to '/projects/ecookbook/files'
a = Attachment.find(:first, :order => 'created_on DESC') a = Attachment.find(:first, :order => 'created_on DESC')
@@ -80,7 +81,6 @@ class FilesControllerTest < ActionController::TestCase
def test_create_version_file def test_create_version_file
set_tmp_attachments_directory set_tmp_attachments_directory
@request.session[:user_id] = 2 @request.session[:user_id] = 2
Setting.notified_events = ['file_added']
assert_difference 'Attachment.count' do assert_difference 'Attachment.count' do
post :create, :project_id => 1, :version_id => '2', post :create, :project_id => 1, :version_id => '2',
@@ -1371,6 +1371,7 @@ class IssuesControllerTest < ActionController::TestCase
:tag => 'input', :tag => 'input',
:attributes => {:type => 'file', :name => 'attachments[1][file]'} :attributes => {:type => 'file', :name => 'attachments[1][file]'}
} }
assert_select 'input[name=?][maxlength=255]', 'attachments[1][description]'
end end
def test_get_new_should_prefill_the_form_from_params def test_get_new_should_prefill_the_form_from_params
@@ -71,10 +71,14 @@ class IssuesControllerTransactionTest < ActionController::TestCase
assert_response :success assert_response :success
assert_template 'edit' assert_template 'edit'
assert_tag 'div', :attributes => {:class => 'conflict'}
assert_tag 'input', :attributes => {:name => 'conflict_resolution', :value => 'overwrite'} assert_select 'div.conflict'
assert_tag 'input', :attributes => {:name => 'conflict_resolution', :value => 'add_notes'} assert_select 'input[name=?][value=?]', 'conflict_resolution', 'overwrite'
assert_tag 'input', :attributes => {:name => 'conflict_resolution', :value => 'cancel'} assert_select 'input[name=?][value=?]', 'conflict_resolution', 'add_notes'
assert_select 'label' do
assert_select 'input[name=?][value=?]', 'conflict_resolution', 'cancel'
assert_select 'a[href=/issues/2]'
end
end end
def test_update_stale_issue_should_save_attachments def test_update_stale_issue_should_save_attachments
+3 -2
View File
@@ -91,11 +91,12 @@ class MessagesControllerTest < ActionController::TestCase
def test_post_new def test_post_new
@request.session[:user_id] = 2 @request.session[:user_id] = 2
ActionMailer::Base.deliveries.clear ActionMailer::Base.deliveries.clear
Setting.notified_events = ['message_posted']
post :new, :board_id => 1, with_settings :notified_events => %w(message_posted) do
post :new, :board_id => 1,
:message => { :subject => 'Test created message', :message => { :subject => 'Test created message',
:content => 'Message body'} :content => 'Message body'}
end
message = Message.find_by_subject('Test created message') message = Message.find_by_subject('Test created message')
assert_not_nil message assert_not_nil message
assert_redirected_to "/boards/1/topics/#{message.to_param}" assert_redirected_to "/boards/1/topics/#{message.to_param}"
+4 -3
View File
@@ -82,12 +82,13 @@ class NewsControllerTest < ActionController::TestCase
def test_post_create def test_post_create
ActionMailer::Base.deliveries.clear ActionMailer::Base.deliveries.clear
Setting.notified_events << 'news_added'
@request.session[:user_id] = 2 @request.session[:user_id] = 2
post :create, :project_id => 1, :news => { :title => 'NewsControllerTest',
with_settings :notified_events => %w(news_added) do
post :create, :project_id => 1, :news => { :title => 'NewsControllerTest',
:description => 'This is the description', :description => 'This is the description',
:summary => '' } :summary => '' }
end
assert_redirected_to '/projects/ecookbook/news' assert_redirected_to '/projects/ecookbook/news'
news = News.find_by_title('NewsControllerTest') news = News.find_by_title('NewsControllerTest')
@@ -412,6 +412,10 @@ class ProjectsControllerTest < ActionController::TestCase
assert_response :success assert_response :success
assert_template 'destroy' assert_template 'destroy'
assert_not_nil Project.find_by_id(1) assert_not_nil Project.find_by_id(1)
assert_tag :tag => 'strong',
:content => ['Private child of eCookbook',
'Child of private child, eCookbook Subproject 1',
'eCookbook Subproject 2'].join(', ')
end end
def test_destroy def test_destroy
@@ -287,26 +287,53 @@ class RepositoriesGitControllerTest < ActionController::TestCase
end end
end end
def test_diff_with_rev_and_path
assert_equal 0, @repository.changesets.count
@repository.fetch_changesets
@project.reload
assert_equal NUM_REV, @repository.changesets.count
with_settings :diff_max_lines_displayed => 1000 do
# Full diff of changeset 2f9c0091
['inline', 'sbs'].each do |dt|
get :diff,
:id => PRJ_ID,
:rev => '2f9c0091c754a91af7a9c478e36556b4bde8dcf7',
:path => repository_path_hash(['sources', 'watchers_controller.rb'])[:param],
:type => dt
assert_response :success
assert_template 'diff'
# Line 22 removed
assert_tag :tag => 'th',
:content => '22',
:sibling => { :tag => 'td',
:attributes => { :class => /diff_out/ },
:content => /def remove/ }
assert_tag :tag => 'h2', :content => /2f9c0091/
end
end
end
def test_diff_truncated def test_diff_truncated
assert_equal 0, @repository.changesets.count assert_equal 0, @repository.changesets.count
@repository.fetch_changesets @repository.fetch_changesets
@project.reload @project.reload
assert_equal NUM_REV, @repository.changesets.count assert_equal NUM_REV, @repository.changesets.count
Setting.diff_max_lines_displayed = 5
# Truncated diff of changeset 2f9c0091 with_settings :diff_max_lines_displayed => 5 do
with_cache do # Truncated diff of changeset 2f9c0091
get :diff, :id => PRJ_ID, :type => 'inline', with_cache do
:rev => '2f9c0091c754a91af7a9c478e36556b4bde8dcf7' get :diff, :id => PRJ_ID, :type => 'inline',
assert_response :success :rev => '2f9c0091c754a91af7a9c478e36556b4bde8dcf7'
assert @response.body.include?("... This diff was truncated") assert_response :success
assert @response.body.include?("... This diff was truncated")
Setting.default_language = 'fr' with_settings :default_language => 'fr' do
get :diff, :id => PRJ_ID, :type => 'inline', get :diff, :id => PRJ_ID, :type => 'inline',
:rev => '2f9c0091c754a91af7a9c478e36556b4bde8dcf7' :rev => '2f9c0091c754a91af7a9c478e36556b4bde8dcf7'
assert_response :success assert_response :success
assert ! @response.body.include?("... This diff was truncated") assert ! @response.body.include?("... This diff was truncated")
assert @response.body.include?("... Ce diff") assert @response.body.include?("... Ce diff")
end
end
end end
end end
@@ -57,6 +57,7 @@ class SettingsControllerTest < ActionController::TestCase
assert !Setting.bcc_recipients? assert !Setting.bcc_recipients?
assert_equal %w(issue_added issue_updated news_added), Setting.notified_events assert_equal %w(issue_added issue_updated news_added), Setting.notified_events
assert_equal 'Test footer', Setting.emails_footer assert_equal 'Test footer', Setting.emails_footer
Setting.clear_cache
end end
def test_get_plugin_settings def test_get_plugin_settings
+4
View File
@@ -33,6 +33,10 @@ class SysControllerTest < ActionController::TestCase
Setting.enabled_scm = %w(Subversion Git) Setting.enabled_scm = %w(Subversion Git)
end end
def teardown
Setting.clear_cache
end
def test_projects_with_repository_enabled def test_projects_with_repository_enabled
get :projects get :projects
assert_response :success assert_response :success
@@ -96,6 +96,16 @@ class WelcomeControllerTest < ActionController::TestCase
assert @controller.respond_to?(:call_hook) assert @controller.respond_to?(:call_hook)
end end
def test_project_jump_box_should_escape_names_once
Project.find(1).update_attribute :name, 'Foo & Bar'
@request.session[:user_id] = 2
get :index
assert_select "#header select" do
assert_select "option", :text => 'Foo &amp; Bar'
end
end
context "test_api_offset_and_limit" do context "test_api_offset_and_limit" do
context "without params" do context "without params" do
should "return 0, 25" do should "return 0, 25" do
+11 -3
View File
@@ -495,11 +495,19 @@ class WikiControllerTest < ActionController::TestCase
end end
def test_diff def test_diff
get :diff, :project_id => 1, :id => 'CookBook_documentation', :version => 2, :version_from => 1 content = WikiPage.find(1).content
assert_difference 'WikiContent::Version.count', 2 do
content.text = "Line removed\nThis is a sample text for testing diffs"
content.save!
content.text = "This is a sample text for testing diffs\nLine added"
content.save!
end
get :diff, :project_id => 1, :id => 'CookBook_documentation', :version => content.version, :version_from => (content.version - 1)
assert_response :success assert_response :success
assert_template 'diff' assert_template 'diff'
assert_tag :tag => 'span', :attributes => { :class => 'diff_in'}, assert_select 'span.diff_out', :text => 'Line removed'
:content => /updated/ assert_select 'span.diff_in', :text => 'Line added'
end end
def test_annotate def test_annotate
-2
View File
@@ -66,8 +66,6 @@ class AccountTest < ActionController::IntegrationTest
assert_template 'my/page' assert_template 'my/page'
assert_equal user.id, session[:user_id] assert_equal user.id, session[:user_id]
assert_not_nil user.reload.last_login_on assert_not_nil user.reload.last_login_on
seconds_ago = 10.second.ago.utc
assert user.last_login_on.utc > 10.second.ago.utc, "#{user.last_login_on.utc} was not > #{seconds_ago}"
end end
def test_lost_password def test_lost_password
+24 -4
View File
@@ -140,9 +140,11 @@ class RoutingRepositoriesTest < ActionController::IntegrationTest
) )
assert_routing( assert_routing(
{ :method => 'get', { :method => 'get',
:path => "/projects/redmine/repository/revisions/2457/diff.diff" }, :path => "/projects/redmine/repository/revisions/2457/diff" },
{ :controller => 'repositories', :action => 'diff', :id => 'redmine', { :controller => 'repositories', :action => 'diff', :id => 'redmine',
:rev => '2457', :format => 'diff' } :rev => '2457', :format => 'diff' },
{},
{ :format => 'diff' }
) )
assert_routing( assert_routing(
{ :method => 'get', { :method => 'get',
@@ -150,6 +152,14 @@ class RoutingRepositoriesTest < ActionController::IntegrationTest
{ :controller => 'repositories', :action => 'diff', :id => 'redmine', { :controller => 'repositories', :action => 'diff', :id => 'redmine',
:path => @path_hash[:param], :rev => '2' } :path => @path_hash[:param], :rev => '2' }
) )
assert_routing(
{ :method => 'get',
:path => "/projects/redmine/repository/revisions/2/diff/#{@path_hash[:path]}" },
{ :controller => 'repositories', :action => 'diff', :id => 'redmine',
:path => @path_hash[:param], :rev => '2', :format => 'diff' },
{},
{ :format => 'diff' }
)
assert_routing( assert_routing(
{ :method => 'get', { :method => 'get',
:path => "/projects/redmine/repository/revisions/2/entry/#{@path_hash[:path]}" }, :path => "/projects/redmine/repository/revisions/2/entry/#{@path_hash[:path]}" },
@@ -209,9 +219,11 @@ class RoutingRepositoriesTest < ActionController::IntegrationTest
) )
assert_routing( assert_routing(
{ :method => 'get', { :method => 'get',
:path => "/projects/redmine/repository/foo/revisions/2457/diff.diff" }, :path => "/projects/redmine/repository/foo/revisions/2457/diff" },
{ :controller => 'repositories', :action => 'diff', :id => 'redmine', :repository_id => 'foo', { :controller => 'repositories', :action => 'diff', :id => 'redmine', :repository_id => 'foo',
:rev => '2457', :format => 'diff' } :rev => '2457', :format => 'diff' },
{},
{ :format => 'diff' }
) )
assert_routing( assert_routing(
{ :method => 'get', { :method => 'get',
@@ -219,6 +231,14 @@ class RoutingRepositoriesTest < ActionController::IntegrationTest
{ :controller => 'repositories', :action => 'diff', :id => 'redmine', :repository_id => 'foo', { :controller => 'repositories', :action => 'diff', :id => 'redmine', :repository_id => 'foo',
:path => @path_hash[:param], :rev => '2' } :path => @path_hash[:param], :rev => '2' }
) )
assert_routing(
{ :method => 'get',
:path => "/projects/redmine/repository/foo/revisions/2/diff/#{@path_hash[:path]}" },
{ :controller => 'repositories', :action => 'diff', :id => 'redmine', :repository_id => 'foo',
:path => @path_hash[:param], :rev => '2', :format => 'diff' },
{},
{ :format => 'diff' }
)
assert_routing( assert_routing(
{ :method => 'get', { :method => 'get',
:path => "/projects/redmine/repository/foo/revisions/2/entry/#{@path_hash[:path]}" }, :path => "/projects/redmine/repository/foo/revisions/2/entry/#{@path_hash[:path]}" },
+6
View File
@@ -75,6 +75,12 @@ class AttachmentTest < ActiveSupport::TestCase
end end
end end
def test_description_length_should_be_validated
a = Attachment.new(:description => 'a' * 300)
assert !a.save
assert_not_nil a.errors[:description]
end
def test_destroy def test_destroy
a = Attachment.new(:container => Issue.find(1), a = Attachment.new(:container => Issue.find(1),
:file => uploaded_test_file("testfile.txt", "text/plain"), :file => uploaded_test_file("testfile.txt", "text/plain"),
+4 -3
View File
@@ -33,11 +33,12 @@ class CommentTest < ActiveSupport::TestCase
end end
def test_create_should_send_notification def test_create_should_send_notification
Setting.notified_events << 'news_comment_added'
Watcher.create!(:watchable => @news, :user => @jsmith) Watcher.create!(:watchable => @news, :user => @jsmith)
assert_difference 'ActionMailer::Base.deliveries.size' do with_settings :notified_events => %w(news_comment_added) do
Comment.create!(:commented => @news, :author => @jsmith, :comments => "my comment") assert_difference 'ActionMailer::Base.deliveries.size' do
Comment.create!(:commented => @news, :author => @jsmith, :comments => "my comment")
end
end end
end end
+9 -5
View File
@@ -18,7 +18,10 @@
require File.expand_path('../../test_helper', __FILE__) require File.expand_path('../../test_helper', __FILE__)
class DocumentTest < ActiveSupport::TestCase class DocumentTest < ActiveSupport::TestCase
fixtures :projects, :enumerations, :documents, :attachments fixtures :projects, :enumerations, :documents, :attachments,
:enabled_modules,
:users, :members, :member_roles, :roles,
:groups_users
def test_create def test_create
doc = Document.new(:project => Project.find(1), :title => 'New document', :category => Enumeration.find_by_name('User documentation')) doc = Document.new(:project => Project.find(1), :title => 'New document', :category => Enumeration.find_by_name('User documentation'))
@@ -27,10 +30,11 @@ class DocumentTest < ActiveSupport::TestCase
def test_create_should_send_email_notification def test_create_should_send_email_notification
ActionMailer::Base.deliveries.clear ActionMailer::Base.deliveries.clear
Setting.notified_events << 'document_added'
doc = Document.new(:project => Project.find(1), :title => 'New document', :category => Enumeration.find_by_name('User documentation')) with_settings :notified_events => %w(document_added) do
doc = Document.new(:project => Project.find(1), :title => 'New document', :category => Enumeration.find_by_name('User documentation'))
assert doc.save assert doc.save
end
assert_equal 1, ActionMailer::Base.deliveries.size assert_equal 1, ActionMailer::Base.deliveries.size
end end
+36 -8
View File
@@ -110,25 +110,53 @@ class IssuesHelperTest < ActionView::TestCase
context "with a start_date attribute" do context "with a start_date attribute" do
should "format the current date" do should "format the current date" do
@detail = JournalDetail.new(:property => 'attr', :old_value => '2010-01-01', :value => '2010-01-31', :prop_key => 'start_date') @detail = JournalDetail.new(
assert_match "01/31/2010", show_detail(@detail, true) :property => 'attr',
:old_value => '2010-01-01',
:value => '2010-01-31',
:prop_key => 'start_date'
)
with_settings :date_format => '%m/%d/%Y' do
assert_match "01/31/2010", show_detail(@detail, true)
end
end end
should "format the old date" do should "format the old date" do
@detail = JournalDetail.new(:property => 'attr', :old_value => '2010-01-01', :value => '2010-01-31', :prop_key => 'start_date') @detail = JournalDetail.new(
assert_match "01/01/2010", show_detail(@detail, true) :property => 'attr',
:old_value => '2010-01-01',
:value => '2010-01-31',
:prop_key => 'start_date'
)
with_settings :date_format => '%m/%d/%Y' do
assert_match "01/01/2010", show_detail(@detail, true)
end
end end
end end
context "with a due_date attribute" do context "with a due_date attribute" do
should "format the current date" do should "format the current date" do
@detail = JournalDetail.new(:property => 'attr', :old_value => '2010-01-01', :value => '2010-01-31', :prop_key => 'due_date') @detail = JournalDetail.new(
assert_match "01/31/2010", show_detail(@detail, true) :property => 'attr',
:old_value => '2010-01-01',
:value => '2010-01-31',
:prop_key => 'due_date'
)
with_settings :date_format => '%m/%d/%Y' do
assert_match "01/31/2010", show_detail(@detail, true)
end
end end
should "format the old date" do should "format the old date" do
@detail = JournalDetail.new(:property => 'attr', :old_value => '2010-01-01', :value => '2010-01-31', :prop_key => 'due_date') @detail = JournalDetail.new(
assert_match "01/01/2010", show_detail(@detail, true) :property => 'attr',
:old_value => '2010-01-01',
:value => '2010-01-31',
:prop_key => 'due_date'
)
with_settings :date_format => '%m/%d/%Y' do
assert_match "01/01/2010", show_detail(@detail, true)
end
end end
end end
+27 -18
View File
@@ -27,102 +27,111 @@ class JournalObserverTest < ActiveSupport::TestCase
# context: issue_updated notified_events # context: issue_updated notified_events
def test_create_should_send_email_notification_with_issue_updated def test_create_should_send_email_notification_with_issue_updated
Setting.notified_events = ['issue_updated']
issue = Issue.find(:first) issue = Issue.find(:first)
user = User.find(:first) user = User.find(:first)
journal = issue.init_journal(user, issue) journal = issue.init_journal(user, issue)
assert journal.save with_settings :notified_events => %w(issue_updated) do
assert journal.save
end
assert_equal 1, ActionMailer::Base.deliveries.size assert_equal 1, ActionMailer::Base.deliveries.size
end end
def test_create_should_not_send_email_notification_with_notify_set_to_false def test_create_should_not_send_email_notification_with_notify_set_to_false
Setting.notified_events = ['issue_updated']
issue = Issue.find(:first) issue = Issue.find(:first)
user = User.find(:first) user = User.find(:first)
journal = issue.init_journal(user, issue) journal = issue.init_journal(user, issue)
journal.notify = false journal.notify = false
assert journal.save with_settings :notified_events => %w(issue_updated) do
assert journal.save
end
assert_equal 0, ActionMailer::Base.deliveries.size assert_equal 0, ActionMailer::Base.deliveries.size
end end
def test_create_should_not_send_email_notification_without_issue_updated def test_create_should_not_send_email_notification_without_issue_updated
Setting.notified_events = []
issue = Issue.find(:first) issue = Issue.find(:first)
user = User.find(:first) user = User.find(:first)
journal = issue.init_journal(user, issue) journal = issue.init_journal(user, issue)
assert journal.save with_settings :notified_events => [] do
assert journal.save
end
assert_equal 0, ActionMailer::Base.deliveries.size assert_equal 0, ActionMailer::Base.deliveries.size
end end
# context: issue_note_added notified_events # context: issue_note_added notified_events
def test_create_should_send_email_notification_with_issue_note_added def test_create_should_send_email_notification_with_issue_note_added
Setting.notified_events = ['issue_note_added']
issue = Issue.find(:first) issue = Issue.find(:first)
user = User.find(:first) user = User.find(:first)
journal = issue.init_journal(user, issue) journal = issue.init_journal(user, issue)
journal.notes = 'This update has a note' journal.notes = 'This update has a note'
assert journal.save with_settings :notified_events => %w(issue_note_added) do
assert journal.save
end
assert_equal 1, ActionMailer::Base.deliveries.size assert_equal 1, ActionMailer::Base.deliveries.size
end end
def test_create_should_not_send_email_notification_without_issue_note_added def test_create_should_not_send_email_notification_without_issue_note_added
Setting.notified_events = []
issue = Issue.find(:first) issue = Issue.find(:first)
user = User.find(:first) user = User.find(:first)
journal = issue.init_journal(user, issue) journal = issue.init_journal(user, issue)
journal.notes = 'This update has a note' journal.notes = 'This update has a note'
assert journal.save with_settings :notified_events => [] do
assert journal.save
end
assert_equal 0, ActionMailer::Base.deliveries.size assert_equal 0, ActionMailer::Base.deliveries.size
end end
# context: issue_status_updated notified_events # context: issue_status_updated notified_events
def test_create_should_send_email_notification_with_issue_status_updated def test_create_should_send_email_notification_with_issue_status_updated
Setting.notified_events = ['issue_status_updated']
issue = Issue.find(:first) issue = Issue.find(:first)
user = User.find(:first) user = User.find(:first)
issue.init_journal(user, issue) issue.init_journal(user, issue)
issue.status = IssueStatus.last issue.status = IssueStatus.last
assert issue.save with_settings :notified_events => %w(issue_status_updated) do
assert issue.save
end
assert_equal 1, ActionMailer::Base.deliveries.size assert_equal 1, ActionMailer::Base.deliveries.size
end end
def test_create_should_not_send_email_notification_without_issue_status_updated def test_create_should_not_send_email_notification_without_issue_status_updated
Setting.notified_events = []
issue = Issue.find(:first) issue = Issue.find(:first)
user = User.find(:first) user = User.find(:first)
issue.init_journal(user, issue) issue.init_journal(user, issue)
issue.status = IssueStatus.last issue.status = IssueStatus.last
assert issue.save with_settings :notified_events => [] do
assert issue.save
end
assert_equal 0, ActionMailer::Base.deliveries.size assert_equal 0, ActionMailer::Base.deliveries.size
end end
# context: issue_priority_updated notified_events # context: issue_priority_updated notified_events
def test_create_should_send_email_notification_with_issue_priority_updated def test_create_should_send_email_notification_with_issue_priority_updated
Setting.notified_events = ['issue_priority_updated']
issue = Issue.find(:first) issue = Issue.find(:first)
user = User.find(:first) user = User.find(:first)
issue.init_journal(user, issue) issue.init_journal(user, issue)
issue.priority = IssuePriority.last issue.priority = IssuePriority.last
assert issue.save with_settings :notified_events => %w(issue_priority_updated) do
assert issue.save
end
assert_equal 1, ActionMailer::Base.deliveries.size assert_equal 1, ActionMailer::Base.deliveries.size
end end
def test_create_should_not_send_email_notification_without_issue_priority_updated def test_create_should_not_send_email_notification_without_issue_priority_updated
Setting.notified_events = []
issue = Issue.find(:first) issue = Issue.find(:first)
user = User.find(:first) user = User.find(:first)
issue.init_journal(user, issue) issue.init_journal(user, issue)
issue.priority = IssuePriority.last issue.priority = IssuePriority.last
assert issue.save with_settings :notified_events => [] do
assert issue.save
end
assert_equal 0, ActionMailer::Base.deliveries.size assert_equal 0, ActionMailer::Base.deliveries.size
end end
end end
+8 -2
View File
@@ -18,8 +18,14 @@
require File.expand_path('../../../../test_helper', __FILE__) require File.expand_path('../../../../test_helper', __FILE__)
class Redmine::Hook::ManagerTest < ActionView::TestCase class Redmine::Hook::ManagerTest < ActionView::TestCase
fixtures :projects, :users, :members, :member_roles, :roles,
fixtures :issues :groups_users,
:trackers, :projects_trackers,
:enabled_modules,
:versions,
:issue_statuses, :issue_categories, :issue_relations, :workflows,
:enumerations,
:issues
# Some hooks that are manually registered in these tests # Some hooks that are manually registered in these tests
class TestHook < Redmine::Hook::ViewListener; end class TestHook < Redmine::Hook::ViewListener; end
@@ -18,6 +18,7 @@
require File.expand_path('../../../../test_helper', __FILE__) require File.expand_path('../../../../test_helper', __FILE__)
class Redmine::SafeAttributesTest < ActiveSupport::TestCase class Redmine::SafeAttributesTest < ActiveSupport::TestCase
fixtures :users
class Base class Base
def attributes=(attrs) def attributes=(attrs)
@@ -10,16 +10,6 @@ begin
FELIX_HEX = "Felix Sch\xC3\xA4fer" FELIX_HEX = "Felix Sch\xC3\xA4fer"
CHAR_1_HEX = "\xc3\x9c" CHAR_1_HEX = "\xc3\x9c"
## Ruby uses ANSI api to fork a process on Windows.
## Japanese Shift_JIS and Traditional Chinese Big5 have 0x5c(backslash) problem
## and these are incompatible with ASCII.
## Git for Windows (msysGit) changed internal API from ANSI to Unicode in 1.7.10
## http://code.google.com/p/msysgit/issues/detail?id=80
## So, Latin-1 path tests fail on Japanese Windows
WINDOWS_PASS = (Redmine::Platform.mswin? &&
Redmine::Scm::Adapters::GitAdapter.client_version_above?([1, 7, 10]))
WINDOWS_SKIP_STR = "TODO: This test fails in Git for Windows above 1.7.10"
## Git, Mercurial and CVS path encodings are binary. ## Git, Mercurial and CVS path encodings are binary.
## Subversion supports URL encoding for path. ## Subversion supports URL encoding for path.
## Redmine Mercurial adapter and extension use URL encoding. ## Redmine Mercurial adapter and extension use URL encoding.
@@ -29,6 +19,16 @@ begin
JRUBY_SKIP_STR = "TODO: This test fails in JRuby" JRUBY_SKIP_STR = "TODO: This test fails in JRuby"
if File.directory?(REPOSITORY_PATH) if File.directory?(REPOSITORY_PATH)
## Ruby uses ANSI api to fork a process on Windows.
## Japanese Shift_JIS and Traditional Chinese Big5 have 0x5c(backslash) problem
## and these are incompatible with ASCII.
## Git for Windows (msysGit) changed internal API from ANSI to Unicode in 1.7.10
## http://code.google.com/p/msysgit/issues/detail?id=80
## So, Latin-1 path tests fail on Japanese Windows
WINDOWS_PASS = (Redmine::Platform.mswin? &&
Redmine::Scm::Adapters::GitAdapter.client_version_above?([1, 7, 10]))
WINDOWS_SKIP_STR = "TODO: This test fails in Git for Windows above 1.7.10"
def setup def setup
adapter_class = Redmine::Scm::Adapters::GitAdapter adapter_class = Redmine::Scm::Adapters::GitAdapter
assert adapter_class assert adapter_class
+6 -1
View File
@@ -35,6 +35,10 @@ class MailHandlerTest < ActiveSupport::TestCase
Setting.notified_events = Redmine::Notifiable.all.collect(&:name) Setting.notified_events = Redmine::Notifiable.all.collect(&:name)
end end
def teardown
Setting.clear_cache
end
def test_add_issue def test_add_issue
ActionMailer::Base.deliveries.clear ActionMailer::Base.deliveries.clear
# This email contains: 'Project: onlinestore' # This email contains: 'Project: onlinestore'
@@ -382,7 +386,8 @@ class MailHandlerTest < ActiveSupport::TestCase
[ [
"X-Auto-Response-Suppress: OOF", "X-Auto-Response-Suppress: OOF",
"Auto-Submitted: auto-replied", "Auto-Submitted: auto-replied",
"Auto-Submitted: Auto-Replied" "Auto-Submitted: Auto-Replied",
"Auto-Submitted: auto-generated"
].each do |header| ].each do |header|
raw = IO.read(File.join(FIXTURES_PATH, 'ticket_on_given_project.eml')) raw = IO.read(File.join(FIXTURES_PATH, 'ticket_on_given_project.eml'))
raw = header + "\n" + raw raw = header + "\n" + raw
+10
View File
@@ -404,6 +404,11 @@ class MailerTest < ActiveSupport::TestCase
Setting.default_language = lang.to_s Setting.default_language = lang.to_s
assert_difference 'ActionMailer::Base.deliveries.size' do assert_difference 'ActionMailer::Base.deliveries.size' do
assert Mailer.wiki_content_added(content).deliver assert Mailer.wiki_content_added(content).deliver
assert_select_email do
assert_select 'a[href=?]',
'http://mydomain.foo/projects/ecookbook/wiki/CookBook_documentation',
:text => 'CookBook documentation'
end
end end
end end
end end
@@ -414,6 +419,11 @@ class MailerTest < ActiveSupport::TestCase
Setting.default_language = lang.to_s Setting.default_language = lang.to_s
assert_difference 'ActionMailer::Base.deliveries.size' do assert_difference 'ActionMailer::Base.deliveries.size' do
assert Mailer.wiki_content_updated(content).deliver assert Mailer.wiki_content_updated(content).deliver
assert_select_email do
assert_select 'a[href=?]',
'http://mydomain.foo/projects/ecookbook/wiki/CookBook_documentation',
:text => 'CookBook documentation'
end
end end
end end
end end
+3 -2
View File
@@ -29,10 +29,11 @@ class NewsTest < ActiveSupport::TestCase
def test_create_should_send_email_notification def test_create_should_send_email_notification
ActionMailer::Base.deliveries.clear ActionMailer::Base.deliveries.clear
Setting.notified_events << 'news_added'
news = Project.find(1).news.new(valid_news) news = Project.find(1).news.new(valid_news)
assert news.save with_settings :notified_events => %w(news_added) do
assert news.save
end
assert_equal 1, ActionMailer::Base.deliveries.size assert_equal 1, ActionMailer::Base.deliveries.size
end end
+31
View File
@@ -18,6 +18,8 @@
require File.expand_path('../../test_helper', __FILE__) require File.expand_path('../../test_helper', __FILE__)
class QueryTest < ActiveSupport::TestCase class QueryTest < ActiveSupport::TestCase
include Redmine::I18n
fixtures :projects, :enabled_modules, :users, :members, fixtures :projects, :enabled_modules, :users, :members,
:member_roles, :roles, :trackers, :issue_statuses, :member_roles, :roles, :trackers, :issue_statuses,
:issue_categories, :enumerations, :issues, :issue_categories, :enumerations, :issues,
@@ -178,6 +180,20 @@ class QueryTest < ActiveSupport::TestCase
assert_equal 2, issues.first.id assert_equal 2, issues.first.id
end end
def test_operator_is_on_integer_custom_field_should_accept_negative_value
f = IssueCustomField.create!(:name => 'filter', :field_format => 'int', :is_for_all => true, :is_filter => true)
CustomValue.create!(:custom_field => f, :customized => Issue.find(1), :value => '7')
CustomValue.create!(:custom_field => f, :customized => Issue.find(2), :value => '-12')
CustomValue.create!(:custom_field => f, :customized => Issue.find(3), :value => '')
query = Query.new(:name => '_')
query.add_filter("cf_#{f.id}", '=', ['-12'])
assert query.valid?
issues = find_issues_with_query(query)
assert_equal 1, issues.size
assert_equal 2, issues.first.id
end
def test_operator_is_on_float_custom_field def test_operator_is_on_float_custom_field
f = IssueCustomField.create!(:name => 'filter', :field_format => 'float', :is_filter => true, :is_for_all => true) f = IssueCustomField.create!(:name => 'filter', :field_format => 'float', :is_filter => true, :is_for_all => true)
CustomValue.create!(:custom_field => f, :customized => Issue.find(1), :value => '7.3') CustomValue.create!(:custom_field => f, :customized => Issue.find(1), :value => '7.3')
@@ -191,6 +207,20 @@ class QueryTest < ActiveSupport::TestCase
assert_equal 2, issues.first.id assert_equal 2, issues.first.id
end end
def test_operator_is_on_float_custom_field_should_accept_negative_value
f = IssueCustomField.create!(:name => 'filter', :field_format => 'float', :is_filter => true, :is_for_all => true)
CustomValue.create!(:custom_field => f, :customized => Issue.find(1), :value => '7.3')
CustomValue.create!(:custom_field => f, :customized => Issue.find(2), :value => '-12.7')
CustomValue.create!(:custom_field => f, :customized => Issue.find(3), :value => '')
query = Query.new(:name => '_')
query.add_filter("cf_#{f.id}", '=', ['-12.7'])
assert query.valid?
issues = find_issues_with_query(query)
assert_equal 1, issues.size
assert_equal 2, issues.first.id
end
def test_operator_is_on_multi_list_custom_field def test_operator_is_on_multi_list_custom_field
f = IssueCustomField.create!(:name => 'filter', :field_format => 'list', :is_filter => true, :is_for_all => true, f = IssueCustomField.create!(:name => 'filter', :field_format => 'list', :is_filter => true, :is_for_all => true,
:possible_values => ['value1', 'value2', 'value3'], :multiple => true) :possible_values => ['value1', 'value2', 'value3'], :multiple => true)
@@ -738,6 +768,7 @@ class QueryTest < ActiveSupport::TestCase
end end
def test_label_for def test_label_for
set_language_if_valid 'en'
q = Query.new q = Query.new
assert_equal 'Assignee', q.label_for('assigned_to_id') assert_equal 'Assignee', q.label_for('assigned_to_id')
end end
+12 -2
View File
@@ -97,6 +97,15 @@ class RepositoryTest < ActiveSupport::TestCase
assert_equal [repository1, repository2], Project.find(3).repositories.sort assert_equal [repository1, repository2], Project.find(3).repositories.sort
end end
def test_identifier_should_accept_letters_digits_dashes_and_underscores
r = Repository::Subversion.new(
:project_id => 3,
:identifier => 'svn-123_45',
:url => 'file:///svn'
)
assert r.save
end
def test_destroy def test_destroy
repository = Repository.find(10) repository = Repository.find(10)
changesets = repository.changesets.count changesets = repository.changesets.count
@@ -140,7 +149,6 @@ class RepositoryTest < ActiveSupport::TestCase
def test_scan_changesets_for_issue_ids def test_scan_changesets_for_issue_ids
Setting.default_language = 'en' Setting.default_language = 'en'
Setting.notified_events = ['issue_added','issue_updated']
# choosing a status to apply to fix issues # choosing a status to apply to fix issues
Setting.commit_fix_status_id = IssueStatus.find( Setting.commit_fix_status_id = IssueStatus.find(
@@ -157,7 +165,9 @@ class RepositoryTest < ActiveSupport::TestCase
assert !fixed_issue.status.is_closed? assert !fixed_issue.status.is_closed?
old_status = fixed_issue.status old_status = fixed_issue.status
Repository.scan_changesets_for_issue_ids with_settings :notified_events => %w(issue_added issue_updated) do
Repository.scan_changesets_for_issue_ids
end
assert_equal [101, 102], Issue.find(3).changeset_ids assert_equal [101, 102], Issue.find(3).changeset_ids
# fixed issues # fixed issues
+4
View File
@@ -19,6 +19,10 @@ require File.expand_path('../../test_helper', __FILE__)
class SettingTest < ActiveSupport::TestCase class SettingTest < ActiveSupport::TestCase
def teardown
Setting.clear_cache
end
def test_read_default def test_read_default
assert_equal "Redmine", Setting.app_title assert_equal "Redmine", Setting.app_title
assert Setting.self_registration? assert Setting.self_registration?
+8 -4
View File
@@ -44,11 +44,13 @@ class WikiContentTest < ActiveSupport::TestCase
end end
def test_create_should_send_email_notification def test_create_should_send_email_notification
Setting.notified_events = ['wiki_content_added']
ActionMailer::Base.deliveries.clear ActionMailer::Base.deliveries.clear
page = WikiPage.new(:wiki => @wiki, :title => "A new page") page = WikiPage.new(:wiki => @wiki, :title => "A new page")
page.content = WikiContent.new(:text => "Content text", :author => User.find(1), :comments => "My comment") page.content = WikiContent.new(:text => "Content text", :author => User.find(1), :comments => "My comment")
assert page.save
with_settings :notified_events => %w(wiki_content_added) do
assert page.save
end
assert_equal 1, ActionMailer::Base.deliveries.size assert_equal 1, ActionMailer::Base.deliveries.size
end end
@@ -88,11 +90,13 @@ class WikiContentTest < ActiveSupport::TestCase
end end
def test_update_should_send_email_notification def test_update_should_send_email_notification
Setting.notified_events = ['wiki_content_updated']
ActionMailer::Base.deliveries.clear ActionMailer::Base.deliveries.clear
content = @page.content content = @page.content
content.text = "My new content" content.text = "My new content"
assert content.save
with_settings :notified_events => %w(wiki_content_updated) do
assert content.save
end
assert_equal 1, ActionMailer::Base.deliveries.size assert_equal 1, ActionMailer::Base.deliveries.size
end end