test_helper.rb 6.18 KB
Newer Older
Jean-Philippe Lang's avatar
Jean-Philippe Lang committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
# redMine - project management software
# Copyright (C) 2006  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.

18
ENV["RAILS_ENV"] = "test"
Jean-Philippe Lang's avatar
Jean-Philippe Lang committed
19 20
require File.expand_path(File.dirname(__FILE__) + "/../config/environment")
require 'test_help'
21
require File.expand_path(File.dirname(__FILE__) + '/helper_testcase')
22
require File.join(RAILS_ROOT,'test', 'mocks', 'open_id_authentication_mock.rb')
Jean-Philippe Lang's avatar
Jean-Philippe Lang committed
23

24 25
require File.expand_path(File.dirname(__FILE__) + '/object_daddy_helpers')
include ObjectDaddyHelpers
26

27
class ActiveSupport::TestCase
Jean-Philippe Lang's avatar
Jean-Philippe Lang committed
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
  # Transactional fixtures accelerate your tests by wrapping each test method
  # in a transaction that's rolled back on completion.  This ensures that the
  # test database remains unchanged so your fixtures don't have to be reloaded
  # between every test method.  Fewer database queries means faster tests.
  #
  # Read Mike Clark's excellent walkthrough at
  #   http://clarkware.com/cgi/blosxom/2005/10/24#Rails10FastTesting
  #
  # Every Active Record database supports transactions except MyISAM tables
  # in MySQL.  Turn off transactional fixtures in this case; however, if you
  # don't care one way or the other, switching from MyISAM to InnoDB tables
  # is recommended.
  self.use_transactional_fixtures = true

  # Instantiated fixtures are slow, but give you @david where otherwise you
  # would need people(:david).  If you don't want to migrate your existing
  # test cases which use the @david style and don't mind the speed hit (each
  # instantiated fixtures translates to a database query per test method),
  # then set this back to true.
  self.use_instantiated_fixtures  = false

  # Add more helper methods to be used by all tests here...
Jean-Philippe Lang's avatar
Jean-Philippe Lang committed
50 51
  
  def log_user(login, password)
52
    User.anonymous
53
    get "/login"
Jean-Philippe Lang's avatar
Jean-Philippe Lang committed
54
    assert_equal nil, session[:user_id]
Jean-Philippe Lang's avatar
Jean-Philippe Lang committed
55 56
    assert_response :success
    assert_template "account/login"
57
    post "/login", :username => login, :password => password
Jean-Philippe Lang's avatar
Jean-Philippe Lang committed
58
    assert_equal login, User.find(session[:user_id]).login
Jean-Philippe Lang's avatar
Jean-Philippe Lang committed
59
  end
60
  
61
  def uploaded_test_file(name, mime)
62
    ActionController::TestUploadedFile.new(ActiveSupport::TestCase.fixture_path + "/files/#{name}", mime)
63
  end
64 65 66 67 68 69 70 71 72 73

  # Mock out a file
  def mock_file
    file = 'a_file.png'
    file.stubs(:size).returns(32)
    file.stubs(:original_filename).returns('a_file.png')
    file.stubs(:content_type).returns('image/png')
    file.stubs(:read).returns(false)
    file
  end
74 75 76
  
  # Use a temporary directory for attachment related tests
  def set_tmp_attachments_directory
77
    Dir.mkdir "#{RAILS_ROOT}/tmp/test" unless File.directory?("#{RAILS_ROOT}/tmp/test")
78 79 80
    Dir.mkdir "#{RAILS_ROOT}/tmp/test/attachments" unless File.directory?("#{RAILS_ROOT}/tmp/test/attachments")
    Attachment.storage_path = "#{RAILS_ROOT}/tmp/test/attachments"
  end
81 82 83 84 85 86 87
  
  def with_settings(options, &block)
    saved_settings = options.keys.inject({}) {|h, k| h[k] = Setting[k].dup; h}
    options.each {|k, v| Setting[k] = v}
    yield
    saved_settings.each {|k, v| Setting[k] = v}
  end
88

89 90 91
  def self.ldap_configured?
    @test_ldap = Net::LDAP.new(:host => '127.0.0.1', :port => 389)
    return @test_ldap.bind
92 93 94
  rescue Exception => e
    # LDAP is not listening
    return nil
95
  end
96 97 98 99 100 101 102 103 104 105
  
  # Returns the path to the test +vendor+ repository
  def self.repository_path(vendor)
    File.join(RAILS_ROOT.gsub(%r{config\/\.\.}, ''), "/tmp/test/#{vendor.downcase}_repository")
  end
  
  # Returns true if the +vendor+ test repository is configured
  def self.repository_configured?(vendor)
    File.directory?(repository_path(vendor))
  end
106

107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
  # Shoulda macros
  def self.should_render_404
    should_respond_with :not_found
    should_render_template 'common/404'
  end

  def self.should_have_before_filter(expected_method, options = {})
    should_have_filter('before', expected_method, options)
  end

  def self.should_have_after_filter(expected_method, options = {})
    should_have_filter('after', expected_method, options)
  end

  def self.should_have_filter(filter_type, expected_method, options)
    description = "have #{filter_type}_filter :#{expected_method}"
    description << " with #{options.inspect}" unless options.empty?

    should description do
      klass = "action_controller/filters/#{filter_type}_filter".classify.constantize
      expected = klass.new(:filter, expected_method.to_sym, options)
      assert_equal 1, @controller.class.filter_chain.select { |filter|
        filter.method == expected.method && filter.kind == expected.kind &&
        filter.options == expected.options && filter.class == expected.class
      }.size
    end
  end
134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164

  def self.should_show_the_old_and_new_values_for(prop_key, model, &block)
    context "" do
      setup do
        if block_given?
          instance_eval &block
        else
          @old_value = model.generate!
          @new_value = model.generate!
        end
      end

      should "use the new value's name" do
        @detail = JournalDetail.generate!(:property => 'attr',
                                          :old_value => @old_value.id,
                                          :value => @new_value.id,
                                          :prop_key => prop_key)
        
        assert_match @new_value.name, show_detail(@detail, true)
      end

      should "use the old value's name" do
        @detail = JournalDetail.generate!(:property => 'attr',
                                          :old_value => @old_value.id,
                                          :value => @new_value.id,
                                          :prop_key => prop_key)
        
        assert_match @old_value.name, show_detail(@detail, true)
      end
    end
  end
Jean-Philippe Lang's avatar
Jean-Philippe Lang committed
165
end