view .svn/pristine/1a/1abc7d9bb63cfe6a27d8a0852d2c50e8db93327c.svn-base @ 1082:997f6d7738f7 bug_531

In repo controller entry action, show the page for the file even if it's binary (so user still has access to history etc links). This makes it possible to use the entry action as the default when a file is clicked on
author Chris Cannam <chris.cannam@soundsoftware.ac.uk>
date Thu, 22 Nov 2012 18:04:17 +0000
parents cbb26bc654de
children
line wrap: on
line source
# Redmine - project management software
# Copyright (C) 2006-2011  Jean-Philippe Lang
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.

require File.expand_path('../../test_helper', __FILE__)

class MailerTest < ActiveSupport::TestCase
  include Redmine::I18n
  include ActionController::Assertions::SelectorAssertions
  fixtures :projects, :enabled_modules, :issues, :users, :members,
           :member_roles, :roles, :documents, :attachments, :news,
           :tokens, :journals, :journal_details, :changesets, :trackers,
           :issue_statuses, :enumerations, :messages, :boards, :repositories,
           :wikis, :wiki_pages, :wiki_contents, :wiki_content_versions,
           :versions,
           :comments

  def setup
    ActionMailer::Base.deliveries.clear
    Setting.host_name = 'mydomain.foo'
    Setting.protocol = 'http'
    Setting.plain_text_mail = '0'
  end

  def test_generated_links_in_emails
    Setting.host_name = 'mydomain.foo'
    Setting.protocol = 'https'

    journal = Journal.find(2)
    assert Mailer.deliver_issue_edit(journal)

    mail = ActionMailer::Base.deliveries.last
    assert_kind_of TMail::Mail, mail

    assert_select_email do
      # link to the main ticket
      assert_select "a[href=?]",
                    "https://mydomain.foo/issues/1#change-2",
                    :text => "Bug #1: Can't print recipes"
      # link to a referenced ticket
      assert_select "a[href=?][title=?]",
                    "https://mydomain.foo/issues/2",
                    "Add ingredients categories (Assigned)",
                    :text => "#2"
      # link to a changeset
      assert_select "a[href=?][title=?]",
                    "https://mydomain.foo/projects/ecookbook/repository/revisions/2",
                    "This commit fixes #1, #2 and references #1 &amp; #3",
                    :text => "r2"
    end
  end

  def test_generated_links_with_prefix
    relative_url_root = Redmine::Utils.relative_url_root
    Setting.host_name = 'mydomain.foo/rdm'
    Setting.protocol = 'http'
    Redmine::Utils.relative_url_root = '/rdm'

    journal = Journal.find(2)
    assert Mailer.deliver_issue_edit(journal)

    mail = ActionMailer::Base.deliveries.last
    assert_kind_of TMail::Mail, mail

    assert_select_email do
      # link to the main ticket
      assert_select "a[href=?]",
                    "http://mydomain.foo/rdm/issues/1#change-2",
                    :text => "Bug #1: Can't print recipes"
      # link to a referenced ticket
      assert_select "a[href=?][title=?]",
                    "http://mydomain.foo/rdm/issues/2",
                    "Add ingredients categories (Assigned)",
                    :text => "#2"
      # link to a changeset
      assert_select "a[href=?][title=?]",
                    "http://mydomain.foo/rdm/projects/ecookbook/repository/revisions/2",
                    "This commit fixes #1, #2 and references #1 &amp; #3",
                    :text => "r2"
    end
  ensure
    # restore it
    Redmine::Utils.relative_url_root = relative_url_root
  end

  def test_generated_links_with_prefix_and_no_relative_url_root
    relative_url_root = Redmine::Utils.relative_url_root
    Setting.host_name = 'mydomain.foo/rdm'
    Setting.protocol = 'http'
    Redmine::Utils.relative_url_root = nil

    journal = Journal.find(2)
    assert Mailer.deliver_issue_edit(journal)

    mail = ActionMailer::Base.deliveries.last
    assert_kind_of TMail::Mail, mail

    assert_select_email do
      # link to the main ticket
      assert_select "a[href=?]",
                    "http://mydomain.foo/rdm/issues/1#change-2",
                    :text => "Bug #1: Can't print recipes"
      # link to a referenced ticket
      assert_select "a[href=?][title=?]",
                    "http://mydomain.foo/rdm/issues/2",
                    "Add ingredients categories (Assigned)",
                    :text => "#2"
      # link to a changeset
      assert_select "a[href=?][title=?]",
                    "http://mydomain.foo/rdm/projects/ecookbook/repository/revisions/2",
                    "This commit fixes #1, #2 and references #1 &amp; #3",
                    :text => "r2"
    end
  ensure
    # restore it
    Redmine::Utils.relative_url_root = relative_url_root
  end

  def test_email_headers
    issue = Issue.find(1)
    Mailer.deliver_issue_add(issue)
    mail = ActionMailer::Base.deliveries.last
    assert_not_nil mail
    assert_equal 'OOF', mail.header_string('X-Auto-Response-Suppress')
    assert_equal 'auto-generated', mail.header_string('Auto-Submitted')
  end

  def test_plain_text_mail
    Setting.plain_text_mail = 1
    journal = Journal.find(2)
    Mailer.deliver_issue_edit(journal)
    mail = ActionMailer::Base.deliveries.last
    assert_equal "text/plain", mail.content_type
    assert_equal 0, mail.parts.size
    assert !mail.encoded.include?('href')
  end

  def test_html_mail
    Setting.plain_text_mail = 0
    journal = Journal.find(2)
    Mailer.deliver_issue_edit(journal)
    mail = ActionMailer::Base.deliveries.last
    assert_equal 2, mail.parts.size
    assert mail.encoded.include?('href')
  end

  def test_from_header
    with_settings :mail_from => 'redmine@example.net' do
      Mailer.deliver_test(User.find(1))
    end
    mail = ActionMailer::Base.deliveries.last
    assert_not_nil mail
    assert_equal 'redmine@example.net', mail.from_addrs.first.address
  end

  def test_from_header_with_phrase
    with_settings :mail_from => 'Redmine app <redmine@example.net>' do
      Mailer.deliver_test(User.find(1))
    end
    mail = ActionMailer::Base.deliveries.last
    assert_not_nil mail
    assert_equal 'redmine@example.net', mail.from_addrs.first.address
    assert_equal 'Redmine app', mail.from_addrs.first.name
  end

  def test_should_not_send_email_without_recipient
    news = News.find(:first)
    user = news.author
    # Remove members except news author
    news.project.memberships.each {|m| m.destroy unless m.user == user}

    user.pref[:no_self_notified] = false
    user.pref.save
    User.current = user
    Mailer.deliver_news_added(news.reload)
    assert_equal 1, last_email.bcc.size

    # nobody to notify
    user.pref[:no_self_notified] = true
    user.pref.save
    User.current = user
    ActionMailer::Base.deliveries.clear
    Mailer.deliver_news_added(news.reload)
    assert ActionMailer::Base.deliveries.empty?
  end

  def test_issue_add_message_id
    issue = Issue.find(1)
    Mailer.deliver_issue_add(issue)
    mail = ActionMailer::Base.deliveries.last
    assert_not_nil mail
    assert_equal Mailer.message_id_for(issue), mail.message_id
    assert_nil mail.references
  end

  def test_issue_edit_message_id
    journal = Journal.find(1)
    Mailer.deliver_issue_edit(journal)
    mail = ActionMailer::Base.deliveries.last
    assert_not_nil mail
    assert_equal Mailer.message_id_for(journal), mail.message_id
    assert_equal Mailer.message_id_for(journal.issue), mail.references.first.to_s
    assert_select_email do
      # link to the update
      assert_select "a[href=?]",
                    "http://mydomain.foo/issues/#{journal.journalized_id}#change-#{journal.id}"
    end
  end

  def test_message_posted_message_id
    message = Message.find(1)
    Mailer.deliver_message_posted(message)
    mail = ActionMailer::Base.deliveries.last
    assert_not_nil mail
    assert_equal Mailer.message_id_for(message), mail.message_id
    assert_nil mail.references
    assert_select_email do
      # link to the message
      assert_select "a[href=?]",
                    "http://mydomain.foo/boards/#{message.board.id}/topics/#{message.id}",
                    :text => message.subject
    end
  end

  def test_reply_posted_message_id
    message = Message.find(3)
    Mailer.deliver_message_posted(message)
    mail = ActionMailer::Base.deliveries.last
    assert_not_nil mail
    assert_equal Mailer.message_id_for(message), mail.message_id
    assert_equal Mailer.message_id_for(message.parent), mail.references.first.to_s
    assert_select_email do
      # link to the reply
      assert_select "a[href=?]",
                    "http://mydomain.foo/boards/#{message.board.id}/topics/#{message.root.id}?r=#{message.id}#message-#{message.id}",
                    :text => message.subject
    end
  end

  context("#issue_add") do
    setup do
      ActionMailer::Base.deliveries.clear
      Setting.bcc_recipients = '1'
      @issue = Issue.find(1)
    end

    should "notify project members" do
      assert Mailer.deliver_issue_add(@issue)
      assert last_email.bcc.include?('dlopper@somenet.foo')
    end

    should "not notify project members that are not allow to view the issue" do
      Role.find(2).remove_permission!(:view_issues)
      assert Mailer.deliver_issue_add(@issue)
      assert !last_email.bcc.include?('dlopper@somenet.foo')
    end

    should "notify issue watchers" do
      user = User.find(9)
      # minimal email notification options
      user.pref[:no_self_notified] = '1'
      user.pref.save
      user.mail_notification = false
      user.save

      Watcher.create!(:watchable => @issue, :user => user)
      assert Mailer.deliver_issue_add(@issue)
      assert last_email.bcc.include?(user.mail)
    end

    should "not notify watchers not allowed to view the issue" do
      user = User.find(9)
      Watcher.create!(:watchable => @issue, :user => user)
      Role.non_member.remove_permission!(:view_issues)
      assert Mailer.deliver_issue_add(@issue)
      assert !last_email.bcc.include?(user.mail)
    end
  end

  # test mailer methods for each language
  def test_issue_add
    issue = Issue.find(1)
    valid_languages.each do |lang|
      Setting.default_language = lang.to_s
      assert Mailer.deliver_issue_add(issue)
    end
  end

  def test_issue_edit
    journal = Journal.find(1)
    valid_languages.each do |lang|
      Setting.default_language = lang.to_s
      assert Mailer.deliver_issue_edit(journal)
    end
  end

  def test_document_added
    document = Document.find(1)
    valid_languages.each do |lang|
      Setting.default_language = lang.to_s
      assert Mailer.deliver_document_added(document)
    end
  end

  def test_attachments_added
    attachements = [ Attachment.find_by_container_type('Document') ]
    valid_languages.each do |lang|
      Setting.default_language = lang.to_s
      assert Mailer.deliver_attachments_added(attachements)
    end
  end

  def test_version_file_added
    attachements = [ Attachment.find_by_container_type('Version') ]
    assert Mailer.deliver_attachments_added(attachements)
    assert_not_nil last_email.bcc
    assert last_email.bcc.any?
    assert_select_email do
      assert_select "a[href=?]", "http://mydomain.foo/projects/ecookbook/files"
    end
  end

  def test_project_file_added
    attachements = [ Attachment.find_by_container_type('Project') ]
    assert Mailer.deliver_attachments_added(attachements)
    assert_not_nil last_email.bcc
    assert last_email.bcc.any?
    assert_select_email do
      assert_select "a[href=?]", "http://mydomain.foo/projects/ecookbook/files"
    end
  end

  def test_news_added
    news = News.find(:first)
    valid_languages.each do |lang|
      Setting.default_language = lang.to_s
      assert Mailer.deliver_news_added(news)
    end
  end

  def test_news_comment_added
    comment = Comment.find(2)
    valid_languages.each do |lang|
      Setting.default_language = lang.to_s
      assert Mailer.deliver_news_comment_added(comment)
    end
  end

  def test_message_posted
    message = Message.find(:first)
    recipients = ([message.root] + message.root.children).collect {|m| m.author.mail if m.author}
    recipients = recipients.compact.uniq
    valid_languages.each do |lang|
      Setting.default_language = lang.to_s
      assert Mailer.deliver_message_posted(message)
    end
  end

  def test_wiki_content_added
    content = WikiContent.find(:first)
    valid_languages.each do |lang|
      Setting.default_language = lang.to_s
      assert_difference 'ActionMailer::Base.deliveries.size' do
        assert Mailer.deliver_wiki_content_added(content)
      end
    end
  end

  def test_wiki_content_updated
    content = WikiContent.find(:first)
    valid_languages.each do |lang|
      Setting.default_language = lang.to_s
      assert_difference 'ActionMailer::Base.deliveries.size' do
        assert Mailer.deliver_wiki_content_updated(content)
      end
    end
  end

  def test_account_information
    user = User.find(2)
    valid_languages.each do |lang|
      user.update_attribute :language, lang.to_s
      user.reload
      assert Mailer.deliver_account_information(user, 'pAsswORd')
    end
  end

  def test_lost_password
    token = Token.find(2)
    valid_languages.each do |lang|
      token.user.update_attribute :language, lang.to_s
      token.reload
      assert Mailer.deliver_lost_password(token)
    end
  end

  def test_register
    token = Token.find(1)
    Setting.host_name = 'redmine.foo'
    Setting.protocol = 'https'

    valid_languages.each do |lang|
      token.user.update_attribute :language, lang.to_s
      token.reload
      ActionMailer::Base.deliveries.clear
      assert Mailer.deliver_register(token)
      mail = ActionMailer::Base.deliveries.last
      assert mail.body.include?("https://redmine.foo/account/activate?token=#{token.value}")
    end
  end

  def test_test
    user = User.find(1)
    valid_languages.each do |lang|
      user.update_attribute :language, lang.to_s
      assert Mailer.deliver_test(user)
    end
  end

  def test_reminders
    Mailer.reminders(:days => 42)
    assert_equal 1, ActionMailer::Base.deliveries.size
    mail = ActionMailer::Base.deliveries.last
    assert mail.bcc.include?('dlopper@somenet.foo')
    assert mail.body.include?('Bug #3: Error 281 when updating a recipe')
    assert_equal '1 issue(s) due in the next 42 days', mail.subject
  end

  def test_reminders_for_users
    Mailer.reminders(:days => 42, :users => ['5'])
    assert_equal 0, ActionMailer::Base.deliveries.size # No mail for dlopper
    Mailer.reminders(:days => 42, :users => ['3'])
    assert_equal 1, ActionMailer::Base.deliveries.size # No mail for dlopper
    mail = ActionMailer::Base.deliveries.last
    assert mail.bcc.include?('dlopper@somenet.foo')
    assert mail.body.include?('Bug #3: Error 281 when updating a recipe')
  end

  def last_email
    mail = ActionMailer::Base.deliveries.last
    assert_not_nil mail
    mail
  end

  def test_mailer_should_not_change_locale
    Setting.default_language = 'en'
    # Set current language to italian
    set_language_if_valid 'it'
    # Send an email to a french user
    user = User.find(1)
    user.language = 'fr'
    Mailer.deliver_account_activated(user)
    mail = ActionMailer::Base.deliveries.last
    assert mail.body.include?('Votre compte')

    assert_equal :it, current_language
  end

  def test_with_deliveries_off
    Mailer.with_deliveries false do
      Mailer.deliver_test(User.find(1))
    end
    assert ActionMailer::Base.deliveries.empty?
    # should restore perform_deliveries
    assert ActionMailer::Base.perform_deliveries
  end
  
  def test_tmail_to_header_field_should_not_include_blank_lines
    mail = TMail::Mail.new
    mail.to = ["a.user@example.com", "v.user2@example.com", "e.smith@example.com", "info@example.com", "v.pupkin@example.com",
      "b.user@example.com", "w.user2@example.com", "f.smith@example.com", "info2@example.com", "w.pupkin@example.com"]
    
    assert !mail.encoded.strip.split("\r\n").detect(&:blank?), "#{mail.encoded} malformed"
  end

  context "layout" do
    should "include the emails_header" do
      with_settings(:emails_header => "*Header content*") do
        assert Mailer.deliver_test(User.find(1))

        assert_select_email do
          assert_select ".header" do
            assert_select "strong", :text => "Header content"
          end
        end
      end
    end
  end
end