@@ -5,6 +5,9 @@ class GlobalLocatorTest < ActiveSupport::TestCase
55 model = Person . new ( 'id' )
66 @gid = model . to_gid
77 @sgid = model . to_sgid
8+ @cpk_model = CompositePrimaryKeyModel . new ( id : [ "tenant-key-value" , "id-value" ] )
9+ @cpk_gid = @cpk_model . to_gid
10+ @cpk_sgid = @cpk_model . to_sgid
811 end
912
1013 test 'by GID' do
@@ -13,6 +16,12 @@ class GlobalLocatorTest < ActiveSupport::TestCase
1316 assert_equal @gid . model_id , found . id
1417 end
1518
19+ test 'composite primary key model by GID' do
20+ found = GlobalID ::Locator . locate ( @cpk_gid )
21+ assert_kind_of @cpk_gid . model_class , found
22+ assert_equal [ "tenant-key-value" , "id-value" ] , found . id
23+ end
24+
1625 test 'by GID with only: restriction with match' do
1726 found = GlobalID ::Locator . locate ( @gid , only : Person )
1827 assert_kind_of @gid . model_class , found
@@ -60,6 +69,18 @@ class GlobalLocatorTest < ActiveSupport::TestCase
6069 GlobalID ::Locator . locate_many ( [ Person . new ( '1' ) . to_gid , Person . new ( '2' ) . to_gid ] )
6170 end
6271
72+ test '#locate_many by composite primary key GIDs of the same class' do
73+ records = [ @cpk_model , CompositePrimaryKeyModel . new ( id : [ "tenant-key-value2" , "id-value2" ] ) ]
74+ located = GlobalID ::Locator . locate_many ( records . map ( &:to_gid ) )
75+ assert_equal records , located
76+ end
77+
78+ test '#locate_many by composite primary key GIDs of different classes' do
79+ records = [ @cpk_model , Person . new ( '1' ) ]
80+ located = GlobalID ::Locator . locate_many ( records . map ( &:to_gid ) )
81+ assert_equal records , located
82+ end
83+
6384 test 'by many GIDs of mixed classes' do
6485 assert_equal [ Person . new ( '1' ) , Person ::Child . new ( '1' ) , Person . new ( '2' ) ] ,
6586 GlobalID ::Locator . locate_many ( [ Person . new ( '1' ) . to_gid , Person ::Child . new ( '1' ) . to_gid , Person . new ( '2' ) . to_gid ] )
@@ -77,6 +98,12 @@ class GlobalLocatorTest < ActiveSupport::TestCase
7798 assert_equal @sgid . model_id , found . id
7899 end
79100
101+ test 'by SGID of a composite primary key model' do
102+ found = GlobalID ::Locator . locate_signed ( @cpk_sgid )
103+ assert_kind_of @cpk_sgid . model_class , found
104+ assert_equal @cpk_sgid . model_id , found . id
105+ end
106+
80107 test 'by SGID with only: restriction with match' do
81108 found = GlobalID ::Locator . locate_signed ( @sgid , only : Person )
82109 assert_kind_of @sgid . model_class , found
@@ -124,11 +151,23 @@ class GlobalLocatorTest < ActiveSupport::TestCase
124151 GlobalID ::Locator . locate_many_signed ( [ Person . new ( '1' ) . to_sgid , Person . new ( '2' ) . to_sgid ] )
125152 end
126153
154+ test 'by many SGIDs of the same composite primary key class' do
155+ records = [ @cpk_model , CompositePrimaryKeyModel . new ( id : [ "tenant-key-value2" , "id-value2" ] ) ]
156+ located = GlobalID ::Locator . locate_many_signed ( records . map ( &:to_sgid ) )
157+ assert_equal records , located
158+ end
159+
127160 test 'by many SGIDs of mixed classes' do
128161 assert_equal [ Person . new ( '1' ) , Person ::Child . new ( '1' ) , Person . new ( '2' ) ] ,
129162 GlobalID ::Locator . locate_many_signed ( [ Person . new ( '1' ) . to_sgid , Person ::Child . new ( '1' ) . to_sgid , Person . new ( '2' ) . to_sgid ] )
130163 end
131164
165+ test 'by many SGIDs of composite primary key model mixed with other models' do
166+ records = [ @cpk_model , Person . new ( '1' ) ]
167+ located = GlobalID ::Locator . locate_many_signed ( records . map ( &:to_sgid ) )
168+ assert_equal records , located
169+ end
170+
132171 test 'by many SGIDs with only: restriction to match subclass' do
133172 assert_equal [ Person ::Child . new ( '1' ) ] ,
134173 GlobalID ::Locator . locate_many_signed ( [ Person . new ( '1' ) . to_sgid , Person ::Child . new ( '1' ) . to_sgid , Person . new ( '2' ) . to_sgid ] , only : Person ::Child )
@@ -157,6 +196,12 @@ class GlobalLocatorTest < ActiveSupport::TestCase
157196 assert_equal @gid . model_id , found . id
158197 end
159198
199+ test 'by to_param encoding for a composite primary key model' do
200+ found = GlobalID ::Locator . locate ( @cpk_gid . to_param )
201+ assert_kind_of @cpk_gid . model_class , found
202+ assert_equal @cpk_gid . model_id , found . id
203+ end
204+
160205 test 'by non-GID returns nil' do
161206 assert_nil GlobalID ::Locator . locate 'This is not a GID'
162207 end
@@ -172,6 +217,13 @@ class GlobalLocatorTest < ActiveSupport::TestCase
172217 assert_nil GlobalID ::Locator . locate 'gid://app/Person/1/2'
173218 end
174219
220+ test 'locating by a GID URI with a mismatching model_id returns nil' do
221+ assert_nil GlobalID ::Locator . locate 'gid://app/Person/1/2'
222+ assert_nil GlobalID ::Locator . locate 'gid://app/CompositePrimaryKeyModel/tenant-key-value/id-value/something_else'
223+ assert_nil GlobalID ::Locator . locate 'gid://app/CompositePrimaryKeyModel/tenant-key-value/'
224+ assert_nil GlobalID ::Locator . locate 'gid://app/CompositePrimaryKeyModel/tenant-key-value'
225+ end
226+
175227 test 'use locator with block' do
176228 GlobalID ::Locator . use :foo do |gid |
177229 :foo
0 commit comments