diff --git a/test/grouped_scope/association_reflection_test.rb b/test/grouped_scope/association_reflection_test.rb index 349adcf..50d36ce 100644 --- a/test/grouped_scope/association_reflection_test.rb +++ b/test/grouped_scope/association_reflection_test.rb @@ -22,10 +22,6 @@ def setup end end - - should_eventually 'TEST COLLECTION READER METHOD GENERATION FOR ALL ASSOC TYPES' do - - end end diff --git a/test/grouped_scope/has_many_association_test.rb b/test/grouped_scope/has_many_association_test.rb index b4e8005..82ee8d9 100644 --- a/test/grouped_scope/has_many_association_test.rb +++ b/test/grouped_scope/has_many_association_test.rb @@ -6,103 +6,122 @@ def setup setup_environment end - context 'For existing ungrouped has_many associations' do + + context 'For an Employee' do - context 'for an Employee' do - - setup do - @employee = Factory(:employee) + setup do + @employee = Factory(:employee) + end + + should 'scope existing association to owner' do + assert_sql(/"reports".employee_id = #{@employee.id}/) do + @employee.reports(true) + end + end + + should 'scope group association to group' do + assert_sql(/"reports".employee_id IN \(#{@employee.id}\)/) do + @employee.group.reports(true) end + end + + context 'for counting sql' do - should 'scope existing association to owner' do - assert_sql(/"reports".employee_id = #{@employee.id}/) do - @employee.reports(true) - end + setup do + @e1 = Factory(:employee_with_reports, :group_id => 1) + @e2 = Factory(:employee_with_reports, :group_id => 1) end - should 'scope group association to group' do - assert_sql(/"reports".employee_id IN \(#{@employee.id}\)/) do - @employee.group.reports(true) + should 'scope count sql to owner' do + assert_sql(/SELECT count\(\*\)/,/employee_id = #{@e1.id}/) do + @e1.reports(true).count end end - context 'training association extensions' do - - setup do - @e1 = Factory(:employee_with_urgent_reports, :group_id => 1) - @e2 = Factory(:employee, :group_id => 1) - @urgent_reports = @e1.reports.select(&:urgent_title?) - end - - should 'find urgent report via normal ungrouped association' do - assert_same_elements @urgent_reports, @e1.reports(true).urgent - end - - should 'find urgent report via grouped reflection' do - assert_same_elements @urgent_reports, @e2.group.reports(true).urgent - end - - should 'use assoc extension SQL along with group reflection' do - assert_sql(/'URGENT'/,/"reports".employee_id IN/) do - @e2.group.reports(true).urgent - end + should 'scope count sql to group' do + assert_sql(/SELECT count\(\*\)/,/employee_id IN \(#{@e1.id},#{@e2.id}\)/) do + @e1.group.reports(true).count end + end + should 'have a group count equal to sum of seperate owner counts' do + assert_equal @e1.reports(true).count + @e2.reports(true).count, @e2.group.reports(true).count end - context 'training named scopes' do + end - setup do - @e1 = Factory(:employee_with_urgent_reports, :group_id => 1) - @e2 = Factory(:employee, :group_id => 1) - @urgent_titles = @e1.reports.select(&:urgent_title?) - @urgent_bodys = @e1.reports.select(&:urgent_body?) - end - - should 'find urgent reports via normal named scopes by normal owner' do - assert_same_elements @urgent_titles, @e1.reports(true).with_urgent_title - assert_same_elements @urgent_bodys, @e1.reports(true).with_urgent_body - end - - should 'find urgent reports via group reflection by group member' do - assert_same_elements @urgent_titles, @e2.group.reports(true).with_urgent_title - assert_same_elements @urgent_bodys, @e2.group.reports(true).with_urgent_body - end - - should 'use named scope SQL along with group reflection' do - assert_sql(/body LIKE '%URGENT%'/,/"title" = 'URGENT'/,/employee_id IN/) do - @e2.group.reports(true).with_urgent_title.with_urgent_body.inspect - end - end + context 'training association extensions' do + setup do + @e1 = Factory(:employee_with_urgent_reports, :group_id => 1) + @e2 = Factory(:employee, :group_id => 1) + @urgent_reports = @e1.reports.select(&:urgent_title?) end + should 'find urgent report via normal ungrouped association' do + assert_same_elements @urgent_reports, @e1.reports(true).urgent + end - end + should 'find urgent report via grouped reflection' do + assert_same_elements @urgent_reports, @e2.group.reports(true).urgent + end + + should 'use assoc extension SQL along with group reflection' do + assert_sql(/'URGENT'/,/"reports".employee_id IN/) do + @e2.group.reports(true).urgent + end + end - context 'for a LegacyEmployee' do + end + context 'training named scopes' do + setup do - @employee = Factory(:legacy_employee) + @e1 = Factory(:employee_with_urgent_reports, :group_id => 1) + @e2 = Factory(:employee, :group_id => 1) + @urgent_titles = @e1.reports.select(&:urgent_title?) + @urgent_bodys = @e1.reports.select(&:urgent_body?) end - - should 'scope existing association to owner' do - assert_sql(/"legacy_reports".email = '#{@employee.id}'/) do - @employee.reports(true) - end + + should 'find urgent reports via normal named scopes by normal owner' do + assert_same_elements @urgent_titles, @e1.reports(true).with_urgent_title + assert_same_elements @urgent_bodys, @e1.reports(true).with_urgent_body end - should 'scope group association to group' do - assert_sql(/"legacy_reports".email IN \('#{@employee.id}'\)/) do - @employee.group.reports(true) - end + should 'find urgent reports via group reflection by group member' do + assert_same_elements @urgent_titles, @e2.group.reports(true).with_urgent_title + assert_same_elements @urgent_bodys, @e2.group.reports(true).with_urgent_body end + should 'use named scope SQL along with group reflection' do + assert_sql(/body LIKE '%URGENT%'/,/"title" = 'URGENT'/,/employee_id IN/) do + @e2.group.reports(true).with_urgent_title.with_urgent_body.inspect + end + end + end - end + context 'For a LegacyEmployee' do + + setup do + @employee = Factory(:legacy_employee) + end + + should 'scope existing association to owner' do + assert_sql(/"legacy_reports".email = '#{@employee.id}'/) do + @employee.reports(true) + end + end + + should 'scope group association to group' do + assert_sql(/"legacy_reports".email IN \('#{@employee.id}'\)/) do + @employee.group.reports(true) + end + end + + end end diff --git a/test/helper.rb b/test/helper.rb index ebf420e..5b67da6 100644 --- a/test/helper.rb +++ b/test/helper.rb @@ -13,6 +13,9 @@ class GroupedScope::TestCase def setup_environment(options={}) options.reverse_merge! :group_column => :group_id setup_database(options) + Department.create! :name => 'IT' + Department.create! :name => 'Human Resources' + Department.create! :name => 'Finance' end protected @@ -30,6 +33,14 @@ def setup_database(options) t.column :body, :string t.column :employee_id, :integer end + connection.create_table :departments, :force => true do |t| + t.column :name, :string + end + connection.create_table :department_memberships, :force => true do |t| + t.column :employee_id, :integer + t.column :department_id, :integer + t.column :meta_info, :string + end connection.create_table :legacy_employees, :force => true, :id => false do |t| t.column :name, :string t.column :email, :string @@ -51,12 +62,11 @@ def setup_database(options) end class Employee < ActiveRecord::Base - has_many :reports do - def urgent - all(:conditions => {:title => 'URGENT'}) - end - end - grouped_scope :reports + has_many :reports do ; def urgent ; all(:conditions => {:title => 'URGENT'}) ; end ; end + has_many :taxonomies, :as => :classable + has_many :department_memberships + has_many :departments, :through => :department_memberships + grouped_scope :reports, :departments end class Report < ActiveRecord::Base @@ -67,6 +77,19 @@ def urgent_title? ; self[:title] == 'URGENT' ; end def urgent_body? ; self[:body] =~ /URGENT/ ; end end +class Department < ActiveRecord::Base + named_scope :it, :conditions => {:name => 'IT'} + named_scope :hr, :conditions => {:name => 'Human Resources'} + named_scope :finance, :conditions => {:name => 'Finance'} + has_many :department_memberships + has_many :employees, :through => :department_memberships +end + +class DepartmentMembership < ActiveRecord::Base + belongs_to :employee + belongs_to :department +end + class LegacyEmployee < ActiveRecord::Base set_primary_key :email has_many :reports, :class_name => 'LegacyReport', :foreign_key => 'email'