@@ -1400,6 +1400,14 @@ async def departments(self) -> List[Department]:
14001400                                        name 
14011401                                    } 
14021402                                } 
1403+                             }, 
1404+                             building { 
1405+                                 edges { 
1406+                                     node { 
1407+                                         id 
1408+                                         name 
1409+                                     } 
1410+                                 } 
14031411                            } 
14041412                        } 
14051413                    }           
@@ -1452,6 +1460,16 @@ async def departments(self) -> List[Department]:
14521460                                                }
14531461                                            }
14541462                                        ]
1463+                                     },
1464+                                     "building" : {
1465+                                         "edges" : [
1466+                                             {
1467+                                                 "node" : {
1468+                                                     "id" : 2 ,
1469+                                                     "name" : "Building 1" 
1470+                                                 }
1471+                                             }
1472+                                         ]
14551473                                    }
14561474                                }
14571475                            },
@@ -1469,6 +1487,16 @@ async def departments(self) -> List[Department]:
14691487                                                }
14701488                                            }
14711489                                        ]
1490+                                     },
1491+                                     "building" : {
1492+                                         "edges" : [
1493+                                             {
1494+                                                 "node" : {
1495+                                                     "id" : 2 ,
1496+                                                     "name" : "Building 1" 
1497+                                                 }
1498+                                             }
1499+                                         ]
14721500                                    }
14731501                                }
14741502                            }
@@ -1494,6 +1522,16 @@ async def departments(self) -> List[Department]:
14941522                                                }
14951523                                            }
14961524                                        ]
1525+                                     },
1526+                                     "building" : {
1527+                                         "edges" : [
1528+                                             {
1529+                                                 "node" : {
1530+                                                     "id" : 2 ,
1531+                                                     "name" : "Building 1" 
1532+                                                 }
1533+                                             }
1534+                                         ]
14971535                                    }
14981536                                }
14991537                            }
@@ -1900,3 +1938,229 @@ async def employees(self) -> List[Employee]:
19001938                }
19011939            ]
19021940        }
1941+ 
1942+ 
1943+ @pytest .fixture  
1944+ def  secondary_tables_with_normal_relationship (base ):
1945+     EmployeeDepartmentJoinTable  =  Table (
1946+         "employee_department_join_table" ,
1947+         base .metadata ,
1948+         Column ("employee_id" , ForeignKey ("employee.id" ), primary_key = True ),
1949+         Column ("department_id" , ForeignKey (
1950+             "department.id" ), primary_key = True ),
1951+     )
1952+ 
1953+     class  Employee (base ):
1954+         __tablename__  =  "employee" 
1955+         id  =  Column (Integer , autoincrement = True , primary_key = True )
1956+         name  =  Column (String , nullable = False )
1957+         role  =  Column (String , nullable = False )
1958+         department  =  relationship (
1959+             "Department" ,
1960+             secondary = "employee_department_join_table" ,
1961+             back_populates = "employees" ,
1962+         )
1963+         building_id  =  Column (Integer , ForeignKey ("building.id" ))
1964+         building  =  relationship (
1965+             "Building" ,
1966+             back_populates = "employees" ,
1967+         )
1968+ 
1969+     class  Department (base ):
1970+         __tablename__  =  "department" 
1971+         id  =  Column (Integer , autoincrement = True , primary_key = True )
1972+         name  =  Column (String , nullable = False )
1973+         employees  =  relationship (
1974+             "Employee" ,
1975+             secondary = "employee_department_join_table" ,
1976+             back_populates = "department" ,
1977+         )
1978+ 
1979+     class  Building (base ):
1980+         __tablename__  =  "building" 
1981+         id  =  Column (Integer , autoincrement = True , primary_key = True )
1982+         name  =  Column (String , nullable = False )
1983+         employees  =  relationship (
1984+             "Employee" ,
1985+             back_populates = "building" ,
1986+         )
1987+ 
1988+     return  Employee , Department , Building 
1989+ 
1990+ 
1991+ @pytest .mark .asyncio  
1992+ async  def  test_query_with_secondary_table_with_values_list_and_normal_relationship (
1993+     secondary_tables_with_normal_relationship ,
1994+     base ,
1995+     async_engine ,
1996+     async_sessionmaker 
1997+ ):
1998+     async  with  async_engine .begin () as  conn :
1999+         await  conn .run_sync (base .metadata .create_all )
2000+ 
2001+     mapper  =  StrawberrySQLAlchemyMapper ()
2002+     EmployeeModel , DepartmentModel , BuildingModel  =  secondary_tables_with_normal_relationship 
2003+ 
2004+     @mapper .type (DepartmentModel ) 
2005+     class  Department ():
2006+         pass 
2007+ 
2008+     @mapper .type (EmployeeModel ) 
2009+     class  Employee ():
2010+         pass 
2011+ 
2012+     @mapper .type (BuildingModel ) 
2013+     class  Building ():
2014+         pass 
2015+ 
2016+     @strawberry .type  
2017+     class  Query :
2018+         @strawberry .field  
2019+         async  def  departments (self ) ->  List [Department ]:
2020+             async  with  async_sessionmaker () as  session :
2021+                 result  =  await  session .execute (select (DepartmentModel ))
2022+                 return  result .scalars ().all ()
2023+ 
2024+     mapper .finalize ()
2025+     schema  =  strawberry .Schema (query = Query )
2026+ 
2027+     query  =  """\  
2028+          query {
2029+             departments { 
2030+                 id 
2031+                 name 
2032+                 employees {                   
2033+                     edges { 
2034+                         node { 
2035+                             id 
2036+                             name 
2037+                             role 
2038+                             department { 
2039+                                 edges { 
2040+                                     node { 
2041+                                         id 
2042+                                         name 
2043+                                     } 
2044+                                 } 
2045+                             }, 
2046+                             building { 
2047+                                 id 
2048+                                 name 
2049+                             } 
2050+                         } 
2051+                     }           
2052+                 } 
2053+             } 
2054+         } 
2055+     """ 
2056+ 
2057+     # Create test data 
2058+     async  with  async_sessionmaker (expire_on_commit = False ) as  session :
2059+         building  =  BuildingModel (id = 2 , name = "Building 1" )
2060+         department1  =  DepartmentModel (id = 10 , name = "Department Test 1" )
2061+         department2  =  DepartmentModel (id = 3 , name = "Department Test 2" )
2062+         e1  =  EmployeeModel (id = 1 , name = "John" , role = "Developer" )
2063+         e2  =  EmployeeModel (id = 5 , name = "Bill" , role = "Doctor" )
2064+         e3  =  EmployeeModel (id = 4 , name = "Maria" , role = "Teacher" )
2065+         department1 .employees .append (e1 )
2066+         department1 .employees .append (e2 )
2067+         department2 .employees .append (e3 )
2068+         building .employees .append (e1 )
2069+         building .employees .append (e2 )
2070+         building .employees .append (e3 )
2071+         session .add_all ([department1 , department2 , e1 , e2 , e3 , building ])
2072+         await  session .commit ()
2073+ 
2074+         result  =  await  schema .execute (query , context_value = {
2075+             "sqlalchemy_loader" : StrawberrySQLAlchemyLoader (
2076+                 async_bind_factory = async_sessionmaker 
2077+             )
2078+         })
2079+         assert  result .errors  is  None 
2080+         assert  result .data  ==  {
2081+             "departments" : [
2082+                 {
2083+                     "id" : 10 ,
2084+                     "name" : "Department Test 1" ,
2085+                     "employees" : {
2086+                         "edges" : [
2087+                             {
2088+                                 "node" : {
2089+                                     "id" : 5 ,
2090+                                     "name" : "Bill" ,
2091+                                     "role" : "Doctor" ,
2092+                                     "department" : {
2093+                                         "edges" : [
2094+                                             {
2095+                                                 "node" : {
2096+                                                     "id" : 10 ,
2097+                                                     "name" : "Department Test 1" 
2098+                                                 }
2099+                                             }
2100+                                         ]
2101+                                     },
2102+                                     "building" : {
2103+                                         "id" : 2 ,
2104+                                         "name" : "Building 1" 
2105+                                     }
2106+                                 }
2107+                             },
2108+                             {
2109+                                 "node" : {
2110+                                     "id" : 1 ,
2111+                                     "name" : "John" ,
2112+                                     "role" : "Developer" ,
2113+                                     "department" : {
2114+                                         "edges" : [
2115+                                             {
2116+                                                 "node" : {
2117+                                                     "id" : 10 ,
2118+                                                     "name" : "Department Test 1" 
2119+                                                 }
2120+                                             }
2121+                                         ]
2122+                                     },
2123+                                     "building" : {
2124+                                         "id" : 2 ,
2125+                                         "name" : "Building 1" 
2126+                                     }
2127+                                 }
2128+                             }
2129+                         ]
2130+                     }
2131+                 },
2132+                 {
2133+                     "id" : 3 ,
2134+                     "name" : "Department Test 2" ,
2135+                     "employees" : {
2136+                         "edges" : [
2137+                             {
2138+                                 "node" : {
2139+                                     "id" : 4 ,
2140+                                     "name" : "Maria" ,
2141+                                     "role" : "Teacher" ,
2142+                                     "department" : {
2143+                                         "edges" : [
2144+                                             {
2145+                                                 "node" : {
2146+                                                     "id" : 3 ,
2147+                                                     "name" : "Department Test 2" 
2148+                                                 }
2149+                                             }
2150+                                         ]
2151+                                     },
2152+                                     "building" : {
2153+                                         "id" : 2 ,
2154+                                         "name" : "Building 1" 
2155+                                     }
2156+                                 }
2157+                             }
2158+                         ]
2159+                     }
2160+                 }
2161+             ]
2162+         }
2163+ 
2164+ 
2165+ # TODO 
2166+ # Make test with secondary table and normal relationship at same time 
0 commit comments