##// END OF EJS Templates
Small test refactoring, extract method....
Eric Davis -
r3837:fc6e7f12b70e
parent child
Show More
@@ -1,26 +1,24
1 require "#{File.dirname(__FILE__)}/../test_helper"
1 require "#{File.dirname(__FILE__)}/../test_helper"
2
2
3 class LayoutTest < ActionController::IntegrationTest
3 class LayoutTest < ActionController::IntegrationTest
4 fixtures :all
4 fixtures :all
5
5
6 test "browsing to a missing page should render the base layout" do
6 test "browsing to a missing page should render the base layout" do
7 get "/users/100000000"
7 get "/users/100000000"
8
8
9 assert_response :not_found
9 assert_response :not_found
10
10
11 # UsersController uses the admin layout by default
11 # UsersController uses the admin layout by default
12 assert_select "#admin-menu", :count => 0
12 assert_select "#admin-menu", :count => 0
13 end
13 end
14
14
15 test "browsing to an unauthorized page should render the base layout" do
15 test "browsing to an unauthorized page should render the base layout" do
16 user = User.find(9)
16 change_user_password('miscuser9', 'test')
17 user.password, user.password_confirmation = 'test', 'test'
18 user.save!
19
17
20 log_user('miscuser9','test')
18 log_user('miscuser9','test')
21
19
22 get "/admin"
20 get "/admin"
23 assert_response :forbidden
21 assert_response :forbidden
24 assert_select "#admin-menu", :count => 0
22 assert_select "#admin-menu", :count => 0
25 end
23 end
26 end
24 end
@@ -1,174 +1,180
1 # redMine - project management software
1 # redMine - project management software
2 # Copyright (C) 2006 Jean-Philippe Lang
2 # Copyright (C) 2006 Jean-Philippe Lang
3 #
3 #
4 # This program is free software; you can redistribute it and/or
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
7 # of the License, or (at your option) any later version.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU General Public License
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
17
18 ENV["RAILS_ENV"] = "test"
18 ENV["RAILS_ENV"] = "test"
19 require File.expand_path(File.dirname(__FILE__) + "/../config/environment")
19 require File.expand_path(File.dirname(__FILE__) + "/../config/environment")
20 require 'test_help'
20 require 'test_help'
21 require File.expand_path(File.dirname(__FILE__) + '/helper_testcase')
21 require File.expand_path(File.dirname(__FILE__) + '/helper_testcase')
22 require File.join(RAILS_ROOT,'test', 'mocks', 'open_id_authentication_mock.rb')
22 require File.join(RAILS_ROOT,'test', 'mocks', 'open_id_authentication_mock.rb')
23
23
24 require File.expand_path(File.dirname(__FILE__) + '/object_daddy_helpers')
24 require File.expand_path(File.dirname(__FILE__) + '/object_daddy_helpers')
25 include ObjectDaddyHelpers
25 include ObjectDaddyHelpers
26
26
27 class ActiveSupport::TestCase
27 class ActiveSupport::TestCase
28 # Transactional fixtures accelerate your tests by wrapping each test method
28 # Transactional fixtures accelerate your tests by wrapping each test method
29 # in a transaction that's rolled back on completion. This ensures that the
29 # in a transaction that's rolled back on completion. This ensures that the
30 # test database remains unchanged so your fixtures don't have to be reloaded
30 # test database remains unchanged so your fixtures don't have to be reloaded
31 # between every test method. Fewer database queries means faster tests.
31 # between every test method. Fewer database queries means faster tests.
32 #
32 #
33 # Read Mike Clark's excellent walkthrough at
33 # Read Mike Clark's excellent walkthrough at
34 # http://clarkware.com/cgi/blosxom/2005/10/24#Rails10FastTesting
34 # http://clarkware.com/cgi/blosxom/2005/10/24#Rails10FastTesting
35 #
35 #
36 # Every Active Record database supports transactions except MyISAM tables
36 # Every Active Record database supports transactions except MyISAM tables
37 # in MySQL. Turn off transactional fixtures in this case; however, if you
37 # in MySQL. Turn off transactional fixtures in this case; however, if you
38 # don't care one way or the other, switching from MyISAM to InnoDB tables
38 # don't care one way or the other, switching from MyISAM to InnoDB tables
39 # is recommended.
39 # is recommended.
40 self.use_transactional_fixtures = true
40 self.use_transactional_fixtures = true
41
41
42 # Instantiated fixtures are slow, but give you @david where otherwise you
42 # Instantiated fixtures are slow, but give you @david where otherwise you
43 # would need people(:david). If you don't want to migrate your existing
43 # would need people(:david). If you don't want to migrate your existing
44 # test cases which use the @david style and don't mind the speed hit (each
44 # test cases which use the @david style and don't mind the speed hit (each
45 # instantiated fixtures translates to a database query per test method),
45 # instantiated fixtures translates to a database query per test method),
46 # then set this back to true.
46 # then set this back to true.
47 self.use_instantiated_fixtures = false
47 self.use_instantiated_fixtures = false
48
48
49 # Add more helper methods to be used by all tests here...
49 # Add more helper methods to be used by all tests here...
50
50
51 def log_user(login, password)
51 def log_user(login, password)
52 User.anonymous
52 User.anonymous
53 get "/login"
53 get "/login"
54 assert_equal nil, session[:user_id]
54 assert_equal nil, session[:user_id]
55 assert_response :success
55 assert_response :success
56 assert_template "account/login"
56 assert_template "account/login"
57 post "/login", :username => login, :password => password
57 post "/login", :username => login, :password => password
58 assert_equal login, User.find(session[:user_id]).login
58 assert_equal login, User.find(session[:user_id]).login
59 end
59 end
60
60
61 def uploaded_test_file(name, mime)
61 def uploaded_test_file(name, mime)
62 ActionController::TestUploadedFile.new(ActiveSupport::TestCase.fixture_path + "/files/#{name}", mime)
62 ActionController::TestUploadedFile.new(ActiveSupport::TestCase.fixture_path + "/files/#{name}", mime)
63 end
63 end
64
64
65 # Mock out a file
65 # Mock out a file
66 def mock_file
66 def mock_file
67 file = 'a_file.png'
67 file = 'a_file.png'
68 file.stubs(:size).returns(32)
68 file.stubs(:size).returns(32)
69 file.stubs(:original_filename).returns('a_file.png')
69 file.stubs(:original_filename).returns('a_file.png')
70 file.stubs(:content_type).returns('image/png')
70 file.stubs(:content_type).returns('image/png')
71 file.stubs(:read).returns(false)
71 file.stubs(:read).returns(false)
72 file
72 file
73 end
73 end
74
74
75 # Use a temporary directory for attachment related tests
75 # Use a temporary directory for attachment related tests
76 def set_tmp_attachments_directory
76 def set_tmp_attachments_directory
77 Dir.mkdir "#{RAILS_ROOT}/tmp/test" unless File.directory?("#{RAILS_ROOT}/tmp/test")
77 Dir.mkdir "#{RAILS_ROOT}/tmp/test" unless File.directory?("#{RAILS_ROOT}/tmp/test")
78 Dir.mkdir "#{RAILS_ROOT}/tmp/test/attachments" unless File.directory?("#{RAILS_ROOT}/tmp/test/attachments")
78 Dir.mkdir "#{RAILS_ROOT}/tmp/test/attachments" unless File.directory?("#{RAILS_ROOT}/tmp/test/attachments")
79 Attachment.storage_path = "#{RAILS_ROOT}/tmp/test/attachments"
79 Attachment.storage_path = "#{RAILS_ROOT}/tmp/test/attachments"
80 end
80 end
81
81
82 def with_settings(options, &block)
82 def with_settings(options, &block)
83 saved_settings = options.keys.inject({}) {|h, k| h[k] = Setting[k].dup; h}
83 saved_settings = options.keys.inject({}) {|h, k| h[k] = Setting[k].dup; h}
84 options.each {|k, v| Setting[k] = v}
84 options.each {|k, v| Setting[k] = v}
85 yield
85 yield
86 saved_settings.each {|k, v| Setting[k] = v}
86 saved_settings.each {|k, v| Setting[k] = v}
87 end
87 end
88
88
89 def change_user_password(login, new_password)
90 user = User.first(:conditions => {:login => login})
91 user.password, user.password_confirmation = new_password, new_password
92 user.save!
93 end
94
89 def self.ldap_configured?
95 def self.ldap_configured?
90 @test_ldap = Net::LDAP.new(:host => '127.0.0.1', :port => 389)
96 @test_ldap = Net::LDAP.new(:host => '127.0.0.1', :port => 389)
91 return @test_ldap.bind
97 return @test_ldap.bind
92 rescue Exception => e
98 rescue Exception => e
93 # LDAP is not listening
99 # LDAP is not listening
94 return nil
100 return nil
95 end
101 end
96
102
97 # Returns the path to the test +vendor+ repository
103 # Returns the path to the test +vendor+ repository
98 def self.repository_path(vendor)
104 def self.repository_path(vendor)
99 File.join(RAILS_ROOT.gsub(%r{config\/\.\.}, ''), "/tmp/test/#{vendor.downcase}_repository")
105 File.join(RAILS_ROOT.gsub(%r{config\/\.\.}, ''), "/tmp/test/#{vendor.downcase}_repository")
100 end
106 end
101
107
102 # Returns true if the +vendor+ test repository is configured
108 # Returns true if the +vendor+ test repository is configured
103 def self.repository_configured?(vendor)
109 def self.repository_configured?(vendor)
104 File.directory?(repository_path(vendor))
110 File.directory?(repository_path(vendor))
105 end
111 end
106
112
107 # Shoulda macros
113 # Shoulda macros
108 def self.should_render_404
114 def self.should_render_404
109 should_respond_with :not_found
115 should_respond_with :not_found
110 should_render_template 'common/404'
116 should_render_template 'common/404'
111 end
117 end
112
118
113 def self.should_have_before_filter(expected_method, options = {})
119 def self.should_have_before_filter(expected_method, options = {})
114 should_have_filter('before', expected_method, options)
120 should_have_filter('before', expected_method, options)
115 end
121 end
116
122
117 def self.should_have_after_filter(expected_method, options = {})
123 def self.should_have_after_filter(expected_method, options = {})
118 should_have_filter('after', expected_method, options)
124 should_have_filter('after', expected_method, options)
119 end
125 end
120
126
121 def self.should_have_filter(filter_type, expected_method, options)
127 def self.should_have_filter(filter_type, expected_method, options)
122 description = "have #{filter_type}_filter :#{expected_method}"
128 description = "have #{filter_type}_filter :#{expected_method}"
123 description << " with #{options.inspect}" unless options.empty?
129 description << " with #{options.inspect}" unless options.empty?
124
130
125 should description do
131 should description do
126 klass = "action_controller/filters/#{filter_type}_filter".classify.constantize
132 klass = "action_controller/filters/#{filter_type}_filter".classify.constantize
127 expected = klass.new(:filter, expected_method.to_sym, options)
133 expected = klass.new(:filter, expected_method.to_sym, options)
128 assert_equal 1, @controller.class.filter_chain.select { |filter|
134 assert_equal 1, @controller.class.filter_chain.select { |filter|
129 filter.method == expected.method && filter.kind == expected.kind &&
135 filter.method == expected.method && filter.kind == expected.kind &&
130 filter.options == expected.options && filter.class == expected.class
136 filter.options == expected.options && filter.class == expected.class
131 }.size
137 }.size
132 end
138 end
133 end
139 end
134
140
135 def self.should_show_the_old_and_new_values_for(prop_key, model, &block)
141 def self.should_show_the_old_and_new_values_for(prop_key, model, &block)
136 context "" do
142 context "" do
137 setup do
143 setup do
138 if block_given?
144 if block_given?
139 instance_eval &block
145 instance_eval &block
140 else
146 else
141 @old_value = model.generate!
147 @old_value = model.generate!
142 @new_value = model.generate!
148 @new_value = model.generate!
143 end
149 end
144 end
150 end
145
151
146 should "use the new value's name" do
152 should "use the new value's name" do
147 @detail = JournalDetail.generate!(:property => 'attr',
153 @detail = JournalDetail.generate!(:property => 'attr',
148 :old_value => @old_value.id,
154 :old_value => @old_value.id,
149 :value => @new_value.id,
155 :value => @new_value.id,
150 :prop_key => prop_key)
156 :prop_key => prop_key)
151
157
152 assert_match @new_value.name, show_detail(@detail, true)
158 assert_match @new_value.name, show_detail(@detail, true)
153 end
159 end
154
160
155 should "use the old value's name" do
161 should "use the old value's name" do
156 @detail = JournalDetail.generate!(:property => 'attr',
162 @detail = JournalDetail.generate!(:property => 'attr',
157 :old_value => @old_value.id,
163 :old_value => @old_value.id,
158 :value => @new_value.id,
164 :value => @new_value.id,
159 :prop_key => prop_key)
165 :prop_key => prop_key)
160
166
161 assert_match @old_value.name, show_detail(@detail, true)
167 assert_match @old_value.name, show_detail(@detail, true)
162 end
168 end
163 end
169 end
164 end
170 end
165
171
166 def self.should_create_a_new_user(&block)
172 def self.should_create_a_new_user(&block)
167 should "create a new user" do
173 should "create a new user" do
168 user = instance_eval &block
174 user = instance_eval &block
169 assert user
175 assert user
170 assert_kind_of User, user
176 assert_kind_of User, user
171 assert !user.new_record?
177 assert !user.new_record?
172 end
178 end
173 end
179 end
174 end
180 end
General Comments 0
You need to be logged in to leave comments. Login now