Skip to content

Commit 2cd81d0

Browse files
author
Rafael Mendonça França
committed
Make the configuration_tests pass
1 parent c4f9e10 commit 2cd81d0

File tree

4 files changed

+142
-52
lines changed

4 files changed

+142
-52
lines changed

lib/rails-observers.rb

+6-5
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
require "rails/observers/version"
1+
require 'rails'
2+
require 'rails/observers/version'
23

34
module Rails
4-
module Observes
5-
module Railtie < Rails::Railtie
5+
module Observers
6+
class Railtie < ::Rails::Railtie
67
initializer "active_record.observer" do
78
ActiveSupport.on_load(:active_record) do
89
require "rails/observers/activerecord/active_record"
@@ -17,10 +18,10 @@ module Railtie < Rails::Railtie
1718

1819
config.after_initialize do |app|
1920
ActiveSupport.on_load(:active_record) do
20-
ActiveRecord::Model.instantiate_observers
21+
ActiveRecord::Base.instantiate_observers
2122

2223
ActionDispatch::Reloader.to_prepare do
23-
ActiveRecord::Model.instantiate_observers
24+
ActiveRecord::Base.instantiate_observers
2425
end
2526
end
2627
end

rails-observers.gemspec

+2
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ Gem::Specification.new do |gem|
1515
gem.require_paths = ["lib"]
1616
gem.version = Rails::Observers::VERSION
1717

18+
gem.add_dependency 'railties', '~> 4.0.0.beta'
19+
1820
gem.add_development_dependency 'minitest', '>= 3'
1921
gem.add_development_dependency 'mocha'
2022
gem.add_development_dependency 'activerecord', '~> 4.0.0.beta'

test/configuration_test.rb

+30-47
Original file line numberDiff line numberDiff line change
@@ -1,58 +1,41 @@
1-
class ::MyMailObserver
2-
def self.delivered_email(email); email; end
3-
end
4-
5-
class ::MyOtherMailObserver < ::MyMailObserver; end
6-
7-
module ApplicationTests
8-
class ConfigurationTest < ActiveSupport::TestCase
9-
include ActiveSupport::Testing::Isolation
10-
11-
test "registers observers with ActionMailer" do
12-
add_to_config <<-RUBY
13-
config.action_mailer.observers = MyMailObserver
14-
RUBY
15-
16-
require "#{app_path}/config/environment"
17-
require "mail"
1+
require "isolation/abstract_unit"
2+
require "rails-observers"
183

19-
_ = ActionMailer::Base
4+
class ConfigurationTest < ActiveSupport::TestCase
5+
include ActiveSupport::Testing::Isolation
206

21-
assert_equal [::MyMailObserver], ::Mail.send(:class_variable_get, "@@delivery_notification_observers")
22-
end
23-
24-
test "registers multiple observers with ActionMailer" do
25-
add_to_config <<-RUBY
26-
config.action_mailer.observers = [MyMailObserver, "MyOtherMailObserver"]
27-
RUBY
28-
29-
require "#{app_path}/config/environment"
30-
require "mail"
7+
def app
8+
@app ||= Rails.application
9+
end
3110

32-
_ = ActionMailer::Base
11+
def setup
12+
build_app
13+
boot_rails
14+
FileUtils.rm_rf("#{app_path}/config/environments")
15+
end
3316

34-
assert_equal [::MyMailObserver, ::MyOtherMailObserver], ::Mail.send(:class_variable_get, "@@delivery_notification_observers")
35-
end
17+
def teardown
18+
teardown_app
19+
end
3620

37-
test "config.active_record.observers" do
38-
add_to_config <<-RUBY
39-
config.active_record.observers = :foo_observer
40-
RUBY
21+
test "config.active_record.observers" do
22+
add_to_config <<-RUBY
23+
config.active_record.observers = :foo_observer
24+
RUBY
4125

42-
app_file 'app/models/foo.rb', <<-RUBY
43-
class Foo < ActiveRecord::Base
44-
end
45-
RUBY
26+
app_file 'app/models/foo.rb', <<-RUBY
27+
class Foo < ActiveRecord::Base
28+
end
29+
RUBY
4630

47-
app_file 'app/models/foo_observer.rb', <<-RUBY
48-
class FooObserver < ActiveRecord::Observer
49-
end
50-
RUBY
31+
app_file 'app/models/foo_observer.rb', <<-RUBY
32+
class FooObserver < ActiveRecord::Observer
33+
end
34+
RUBY
5135

52-
require "#{app_path}/config/environment"
36+
require "#{app_path}/config/environment"
5337

54-
ActiveRecord::Base
55-
assert defined?(FooObserver)
56-
end
38+
ActiveRecord::Base
39+
assert defined?(FooObserver)
5740
end
5841
end

test/isolation/abstract_unit.rb

+104
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
# Note:
2+
# It is important to keep this file as light as possible
3+
# the goal for tests that require this is to test booting up
4+
# rails from an empty state, so anything added here could
5+
# hide potential failures
6+
#
7+
# It is also good to know what is the bare minimum to get
8+
# Rails booted up.
9+
require 'fileutils'
10+
11+
require 'bundler/setup'
12+
require 'minitest/autorun'
13+
require 'active_support/test_case'
14+
15+
# These files do not require any others and are needed
16+
# to run the tests
17+
require "active_support/testing/isolation"
18+
require "active_support/core_ext/kernel/reporting"
19+
require 'tmpdir'
20+
21+
module TestHelpers
22+
module Paths
23+
def app_template_path
24+
File.join Dir.tmpdir, 'app_template'
25+
end
26+
27+
def tmp_path(*args)
28+
@tmp_path ||= File.realpath(Dir.mktmpdir)
29+
File.join(@tmp_path, *args)
30+
end
31+
32+
def app_path(*args)
33+
tmp_path(*%w[app] + args)
34+
end
35+
end
36+
37+
module Generation
38+
# Build an application by invoking the generator and going through the whole stack.
39+
def build_app(options = {})
40+
@prev_rails_env = ENV['RAILS_ENV']
41+
ENV['RAILS_ENV'] = 'development'
42+
43+
FileUtils.rm_rf(app_path)
44+
FileUtils.cp_r(app_template_path, app_path)
45+
46+
# Delete the initializers unless requested
47+
unless options[:initializers]
48+
Dir["#{app_path}/config/initializers/*.rb"].each do |initializer|
49+
File.delete(initializer)
50+
end
51+
end
52+
53+
unless options[:gemfile]
54+
File.delete "#{app_path}/Gemfile"
55+
end
56+
57+
routes = File.read("#{app_path}/config/routes.rb")
58+
if routes =~ /(\n\s*end\s*)\Z/
59+
File.open("#{app_path}/config/routes.rb", 'w') do |f|
60+
f.puts $` + "\nmatch ':controller(/:action(/:id))(.:format)', :via => :all\n" + $1
61+
end
62+
end
63+
64+
add_to_config <<-RUBY
65+
config.secret_token = "3b7cd727ee24e8444053437c36cc66c4"
66+
config.session_store :cookie_store, :key => "_myapp_session"
67+
config.active_support.deprecation = :log
68+
config.action_controller.allow_forgery_protection = false
69+
config.eager_load = false
70+
RUBY
71+
end
72+
73+
def teardown_app
74+
ENV['RAILS_ENV'] = @prev_rails_env if @prev_rails_env
75+
end
76+
77+
def add_to_config(str)
78+
environment = File.read("#{app_path}/config/application.rb")
79+
if environment =~ /(\n\s*end\s*end\s*)\Z/
80+
File.open("#{app_path}/config/application.rb", 'w') do |f|
81+
f.puts $` + "\n#{str}\n" + $1
82+
end
83+
end
84+
end
85+
86+
def app_file(path, contents)
87+
FileUtils.mkdir_p File.dirname("#{app_path}/#{path}")
88+
File.open("#{app_path}/#{path}", 'w') do |f|
89+
f.puts contents
90+
end
91+
end
92+
93+
def boot_rails
94+
require 'rubygems' unless defined? Gem
95+
require 'bundler'
96+
Bundler.setup
97+
end
98+
end
99+
end
100+
101+
class ActiveSupport::TestCase
102+
include TestHelpers::Paths
103+
include TestHelpers::Generation
104+
end

0 commit comments

Comments
 (0)