Refactor tests to be less brittle

This commit is contained in:
Jon Leighton
2011-06-12 18:09:09 +01:00
parent de01a64102
commit 14e6bbb149
3 changed files with 74 additions and 28 deletions

View File

@@ -538,15 +538,27 @@ class HasManyAssociationsTest < ActiveRecord::TestCase
end
def test_transactions_when_adding_to_persisted
force_signal37_to_load_all_clients_of_firm
Client.expects(:transaction)
companies(:first_firm).clients_of_firm.concat(Client.new("name" => "Natural Company"))
good = Client.new(:name => "Good")
bad = Client.new(:name => "Bad", :raise_on_save => true)
begin
companies(:first_firm).clients_of_firm.concat(good, bad)
rescue Client::RaisedOnSave
end
assert !companies(:first_firm).clients_of_firm(true).include?(good)
end
def test_transactions_when_adding_to_new_record
Client.expects(:transaction).never
firm = Firm.new
firm.clients_of_firm.concat(Client.new("name" => "Natural Company"))
prev_ignored_sql = ActiveRecord::SQLCounter.ignored_sql
ActiveRecord::SQLCounter.ignored_sql = []
assert_no_queries do
firm = Firm.new
firm.clients_of_firm.concat(Client.new("name" => "Natural Company"))
end
ensure
ActiveRecord::SQLCounter.ignored_sql = prev_ignored_sql
end
def test_new_aliased_to_build
@@ -791,18 +803,31 @@ class HasManyAssociationsTest < ActiveRecord::TestCase
end
def test_transaction_when_deleting_persisted
force_signal37_to_load_all_clients_of_firm
client = companies(:first_firm).clients_of_firm.create("name" => "Another Client")
Client.expects(:transaction)
companies(:first_firm).clients_of_firm.delete(client)
good = Client.new(:name => "Good")
bad = Client.new(:name => "Bad", :raise_on_destroy => true)
companies(:first_firm).clients_of_firm = [good, bad]
begin
companies(:first_firm).clients_of_firm.destroy(good, bad)
rescue Client::RaisedOnDestroy
end
assert_equal [good, bad], companies(:first_firm).clients_of_firm(true)
end
def test_transaction_when_deleting_new_record
client = Client.new("name" => "New Client")
firm = Firm.new
firm.clients_of_firm << client
Client.expects(:transaction).never
firm.clients_of_firm.delete(client)
prev_ignored_sql = ActiveRecord::SQLCounter.ignored_sql
ActiveRecord::SQLCounter.ignored_sql = []
assert_no_queries do
firm = Firm.new
client = Client.new("name" => "New Client")
firm.clients_of_firm << client
firm.clients_of_firm.destroy(client)
end
ensure
ActiveRecord::SQLCounter.ignored_sql = prev_ignored_sql
end
def test_clearing_an_association_collection
@@ -1139,21 +1164,29 @@ class HasManyAssociationsTest < ActiveRecord::TestCase
end
def test_transactions_when_replacing_on_persisted
firm = Firm.find(:first, :order => "id")
firm.clients = [companies(:first_client)]
assert firm.save, "Could not save firm"
firm.reload
good = Client.new(:name => "Good")
bad = Client.new(:name => "Bad", :raise_on_save => true)
Client.expects(:transaction)
firm.clients_of_firm = [Client.new("name" => "Natural Company")]
companies(:first_firm).clients_of_firm = [good]
begin
companies(:first_firm).clients_of_firm = [bad]
rescue Client::RaisedOnSave
end
assert_equal [good], companies(:first_firm).clients_of_firm(true)
end
def test_transactions_when_replacing_on_new_record
firm = Firm.new
firm.clients_of_firm << Client.new("name" => "Natural Company")
prev_ignored_sql = ActiveRecord::SQLCounter.ignored_sql
ActiveRecord::SQLCounter.ignored_sql = []
Client.expects(:transaction).never
firm.clients_of_firm = [Client.new("name" => "New Client")]
assert_no_queries do
firm = Firm.new
firm.clients_of_firm = [Client.new("name" => "New Client")]
end
ensure
ActiveRecord::SQLCounter.ignored_sql = prev_ignored_sql
end
def test_get_ids

View File

@@ -58,11 +58,12 @@ end
module ActiveRecord
class SQLCounter
IGNORED_SQL = [/^PRAGMA (?!(table_info))/, /^SELECT currval/, /^SELECT CAST/, /^SELECT @@IDENTITY/, /^SELECT @@ROWCOUNT/, /^SAVEPOINT/, /^ROLLBACK TO SAVEPOINT/, /^RELEASE SAVEPOINT/, /^SHOW max_identifier_length/, /^BEGIN/, /^COMMIT/]
cattr_accessor :ignored_sql
self.ignored_sql = [/^PRAGMA (?!(table_info))/, /^SELECT currval/, /^SELECT CAST/, /^SELECT @@IDENTITY/, /^SELECT @@ROWCOUNT/, /^SAVEPOINT/, /^ROLLBACK TO SAVEPOINT/, /^RELEASE SAVEPOINT/, /^SHOW max_identifier_length/, /^BEGIN/, /^COMMIT/]
# FIXME: this needs to be refactored so specific database can add their own
# ignored SQL. This ignored SQL is for Oracle.
IGNORED_SQL.concat [/^select .*nextval/i, /^SAVEPOINT/, /^ROLLBACK TO/, /^\s*select .* from all_triggers/im]
ignored_sql.concat [/^select .*nextval/i, /^SAVEPOINT/, /^ROLLBACK TO/, /^\s*select .* from all_triggers/im]
def initialize
$queries_executed = []
@@ -74,7 +75,7 @@ module ActiveRecord
# FIXME: this seems bad. we should probably have a better way to indicate
# the query was cached
unless 'CACHE' == values[:name]
$queries_executed << sql unless IGNORED_SQL.any? { |r| sql =~ r }
$queries_executed << sql unless self.class.ignored_sql.any? { |r| sql =~ r }
end
end
end

View File

@@ -124,6 +124,18 @@ class Client < Company
has_many :accounts, :through => :firm
belongs_to :account
class RaisedOnSave < RuntimeError; end
attr_accessor :raise_on_save
before_save do
raise RaisedOnSave if raise_on_save
end
class RaisedOnDestroy < RuntimeError; end
attr_accessor :raise_on_destroy
before_destroy do
raise RaisedOnDestroy if raise_on_destroy
end
# Record destruction so we can test whether firm.clients.clear has
# is calling client.destroy, deleting from the database, or setting
# foreign keys to NULL.