@@ -221,4 +221,72 @@ mod test {
221221 . await
222222 . unwrap ( ) ;
223223 }
224+
225+ #[ tokio:: test]
226+ async fn test_load_composite_foreign_keys ( ) {
227+ let pool = pool ( ) ;
228+ let mut conn = pool. get ( & Request :: default ( ) ) . await . unwrap ( ) ;
229+
230+ // Create test tables with composite FK
231+ conn. execute ( "DROP TABLE IF EXISTS fk_comp_child CASCADE" )
232+ . await
233+ . unwrap ( ) ;
234+ conn. execute ( "DROP TABLE IF EXISTS fk_comp_parent CASCADE" )
235+ . await
236+ . unwrap ( ) ;
237+
238+ conn. execute (
239+ "CREATE TABLE fk_comp_parent (
240+ tenant_id INTEGER NOT NULL,
241+ id INTEGER NOT NULL,
242+ name TEXT,
243+ PRIMARY KEY (tenant_id, id)
244+ )" ,
245+ )
246+ . await
247+ . unwrap ( ) ;
248+
249+ conn. execute (
250+ "CREATE TABLE fk_comp_child (
251+ id SERIAL PRIMARY KEY,
252+ parent_tenant INTEGER NOT NULL,
253+ parent_id INTEGER NOT NULL,
254+ FOREIGN KEY (parent_tenant, parent_id) REFERENCES fk_comp_parent(tenant_id, id)
255+ )" ,
256+ )
257+ . await
258+ . unwrap ( ) ;
259+
260+ let columns = Column :: load ( & mut conn) . await . unwrap ( ) ;
261+
262+ let child_columns = columns
263+ . get ( & ( "pgdog" . to_string ( ) , "fk_comp_child" . to_string ( ) ) )
264+ . expect ( "fk_comp_child table should exist" ) ;
265+
266+ // Check parent_tenant column FK
267+ let parent_tenant_col = child_columns
268+ . iter ( )
269+ . find ( |c| c. column_name == "parent_tenant" )
270+ . expect ( "parent_tenant column should exist" ) ;
271+ assert_eq ! ( parent_tenant_col. foreign_keys. len( ) , 1 ) ;
272+ assert_eq ! ( parent_tenant_col. foreign_keys[ 0 ] . table, "fk_comp_parent" ) ;
273+ assert_eq ! ( parent_tenant_col. foreign_keys[ 0 ] . column, "tenant_id" ) ;
274+
275+ // Check parent_id column FK
276+ let parent_id_col = child_columns
277+ . iter ( )
278+ . find ( |c| c. column_name == "parent_id" )
279+ . expect ( "parent_id column should exist" ) ;
280+ assert_eq ! ( parent_id_col. foreign_keys. len( ) , 1 ) ;
281+ assert_eq ! ( parent_id_col. foreign_keys[ 0 ] . table, "fk_comp_parent" ) ;
282+ assert_eq ! ( parent_id_col. foreign_keys[ 0 ] . column, "id" ) ;
283+
284+ // Clean up
285+ conn. execute ( "DROP TABLE IF EXISTS fk_comp_child CASCADE" )
286+ . await
287+ . unwrap ( ) ;
288+ conn. execute ( "DROP TABLE IF EXISTS fk_comp_parent CASCADE" )
289+ . await
290+ . unwrap ( ) ;
291+ }
224292}
0 commit comments