require 'abstract_unit' require 'fixtures/company' require 'fixtures/topic' Company.has_many :accounts class CalculationsTest < Test::Unit::TestCase fixtures :companies, :accounts, :topics def test_should_sum_field assert_equal 265, Account.sum(:credit_limit) end def test_should_average_field value = Account.average(:credit_limit) assert_equal 53, value assert_kind_of Float, value end def test_should_get_maximum_of_field assert_equal 60, Account.maximum(:credit_limit) end def test_should_get_minimum_of_field assert_equal 50, Account.minimum(:credit_limit) end def test_should_group_by_field c = Account.sum(:credit_limit, :group => :firm_id) %w( 1 6 2 ).each { |firm_id| assert c.keys.include?(firm_id) } end def test_should_group_by_summed_field c = Account.sum(:credit_limit, :group => :firm_id) assert_equal 50, c['1'] assert_equal 105, c['6'] assert_equal 60, c['2'] end def test_should_group_by_summed_field_having_condition c = Account.sum(:credit_limit, :group => :firm_id, :having => 'sum(credit_limit) > 50') assert_nil c['1'] assert_equal 105, c['6'] assert_equal 60, c['2'] end def test_should_group_by_summed_association c = Account.sum(:credit_limit, :group => :firm) assert_equal 50, c[companies(:first_firm)] assert_equal 105, c[companies(:rails_core)] assert_equal 60, c[companies(:first_client)] end def test_should_sum_field_with_conditions assert_equal 105, Account.sum(:credit_limit, :conditions => 'firm_id = 6') end def test_should_group_by_summed_field_with_conditions c = Account.sum(:credit_limit, :conditions => 'firm_id > 1', :group => :firm_id) assert_nil c['1'] assert_equal 105, c['6'] assert_equal 60, c['2'] end def test_should_group_by_summed_field_with_conditions_and_having c = Account.sum(:credit_limit, :conditions => 'firm_id > 1', :group => :firm_id, :having => 'sum(credit_limit) > 60') assert_nil c['1'] assert_equal 105, c['6'] assert_nil c['2'] end def test_should_group_by_fields_with_table_alias c = Account.sum(:credit_limit, :group => 'accounts.firm_id') assert_equal 50, c['1'] assert_equal 105, c['6'] assert_equal 60, c['2'] end def test_should_calculate_with_invalid_field assert_equal 5, Account.calculate(:count, '*') assert_equal 5, Account.calculate(:count, :all) end def test_should_calculate_grouped_with_invalid_field c = Account.count(:all, :group => 'accounts.firm_id') assert_equal 1, c['1'] assert_equal 2, c['6'] assert_equal 1, c['2'] end def test_should_calculate_grouped_association_with_invalid_field c = Account.count(:all, :group => :firm) assert_equal 1, c[companies(:first_firm)] assert_equal 2, c[companies(:rails_core)] assert_equal 1, c[companies(:first_client)] end def test_should_calculate_grouped_by_function c = Company.count(:all, :group => 'UPPER(type)') assert_equal 2, c[nil] assert_equal 1, c['DEPENDENTFIRM'] assert_equal 3, c['CLIENT'] assert_equal 2, c['FIRM'] end def test_should_calculate_grouped_by_function_with_table_alias c = Company.count(:all, :group => 'UPPER(companies.type)') assert_equal 2, c[nil] assert_equal 1, c['DEPENDENTFIRM'] assert_equal 3, c['CLIENT'] assert_equal 2, c['FIRM'] end def test_should_sum_scoped_field assert_equal 15, companies(:rails_core).companies.sum(:id) end def test_should_sum_scoped_field_with_conditions assert_equal 8, companies(:rails_core).companies.sum(:id, :conditions => 'id > 7') end def test_should_group_by_scoped_field c = companies(:rails_core).companies.sum(:id, :group => :name) assert_equal 7, c['Leetsoft'] assert_equal 8, c['Jadedpixel'] end def test_should_group_by_summed_field_with_conditions_and_having c = companies(:rails_core).companies.sum(:id, :group => :name, :having => 'sum(id) > 7') assert_nil c['Leetsoft'] assert_equal 8, c['Jadedpixel'] end end