1+ require "test_helper"
2+
3+ class HasClosureTreeRootTest < ActiveSupport ::TestCase
4+ setup do
5+ ENV [ 'FLOCK_DIR' ] = Dir . mktmpdir
6+ end
7+
8+ teardown do
9+ FileUtils . remove_entry_secure ENV [ 'FLOCK_DIR' ]
10+ end
11+ def create_tree ( group )
12+ @ct1 = ContractType . create! ( name : "Type1" )
13+ @ct2 = ContractType . create! ( name : "Type2" )
14+ @user1 = User . create! ( email : "1@example.com" , group_id : group . id )
15+ @user2 = User . create! ( email : "2@example.com" , group_id : group . id )
16+ @user3 = User . create! ( email : "3@example.com" , group_id : group . id )
17+ @user4 = User . create! ( email : "4@example.com" , group_id : group . id )
18+ @user5 = User . create! ( email : "5@example.com" , group_id : group . id )
19+ @user6 = User . create! ( email : "6@example.com" , group_id : group . id )
20+
21+ # The tree (contract types in parens)
22+ #
23+ # U1(1)
24+ # / \
25+ # U2(1) U3(1&2)
26+ # / / \
27+ # U4(2) U5(1) U6(2)
28+
29+ @user1 . children << @user2
30+ @user1 . children << @user3
31+ @user2 . children << @user4
32+ @user3 . children << @user5
33+ @user3 . children << @user6
34+
35+ @user1 . contracts . create! ( title : "Contract 1" , contract_type : @ct1 )
36+ @user2 . contracts . create! ( title : "Contract 2" , contract_type : @ct1 )
37+ @user3 . contracts . create! ( title : "Contract 3" , contract_type : @ct1 )
38+ @user3 . contracts . create! ( title : "Contract 4" , contract_type : @ct2 )
39+ @user4 . contracts . create! ( title : "Contract 5" , contract_type : @ct2 )
40+ @user5 . contracts . create! ( title : "Contract 6" , contract_type : @ct1 )
41+ @user6 . contracts . create! ( title : "Contract 7" , contract_type : @ct2 )
42+ end
43+
44+ test "loads all nodes in a constant number of queries" do
45+ group = Group . create! ( name : "TheGrouping" )
46+ create_tree ( group )
47+ reloaded_group = group . reload
48+ exceed_query_limit ( 2 ) do
49+ root = reloaded_group . root_user_including_tree
50+ assert_equal "2@example.com" , root . children [ 0 ] . email
51+ assert_equal "3@example.com" , root . children [ 0 ] . parent . children [ 1 ] . email
52+ end
53+ end
54+
55+ test "loads all nodes plus single association in a constant number of queries" do
56+ group = Group . create! ( name : "TheGrouping" )
57+ create_tree ( group )
58+ reloaded_group = group . reload
59+ exceed_query_limit ( 3 ) do
60+ root = reloaded_group . root_user_including_tree ( :contracts )
61+ assert_equal "2@example.com" , root . children [ 0 ] . email
62+ assert_equal "3@example.com" , root . children [ 0 ] . parent . children [ 1 ] . email
63+ assert_equal "Contract 7" , root . children [ 0 ] . children [ 0 ] . contracts [ 0 ] . user . parent . parent . children [ 1 ] . children [ 1 ] . contracts [ 0 ] . title
64+ end
65+ end
66+
67+ test "loads all nodes and associations in a constant number of queries" do
68+ group = Group . create! ( name : "TheGrouping" )
69+ create_tree ( group )
70+ reloaded_group = group . reload
71+ exceed_query_limit ( 4 ) do
72+ root = reloaded_group . root_user_including_tree ( contracts : :contract_type )
73+ assert_equal "2@example.com" , root . children [ 0 ] . email
74+ assert_equal "3@example.com" , root . children [ 0 ] . parent . children [ 1 ] . email
75+ assert_equal %w[ Type1 Type2 ] , root . children [ 1 ] . contracts . map ( &:contract_type ) . map ( &:name )
76+ assert_equal "Type1" , root . children [ 1 ] . children [ 0 ] . contracts [ 0 ] . contract_type . name
77+ assert_equal "Type2" , root . children [ 0 ] . children [ 0 ] . contracts [ 0 ] . user . parent . parent . children [ 1 ] . children [ 1 ] . contracts [ 0 ] . contract_type . name
78+ end
79+ end
80+ end
0 commit comments