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