@@ -266,15 +266,60 @@ defmodule AshPostgres.Test.ThroughRelationshipsTest do
266266 end
267267 end
268268
269+ describe "policy enforcement on through relationships" do
270+ test "filtering on through relationships respects intermediate classroom policy" , _setup do
271+ school_1 = create_school ( "Policy Test School 1" )
272+ school_2 = create_school ( "Policy Test School 2" )
273+ classroom_public = create_classroom ( "Public Classroom" , school_1 . id , public: true )
274+ classroom_private = create_classroom ( "Private Classroom" , school_2 . id , public: false )
275+ teacher_public = create_teacher ( "Teacher Public" )
276+ teacher_private = create_teacher ( "Teacher Private" )
277+
278+ assign_teacher ( classroom_public . id , teacher_public . id )
279+ assign_teacher ( classroom_private . id , teacher_private . id )
280+
281+ filter = [ teacher_public . name , teacher_private . name ]
282+
283+ assert [ % { name: "Policy Test School 1" } ] =
284+ AshPostgres.Test.Through.School
285+ |> Ash.Query . filter ( % { teachers: % { name: % { in: ^ filter } } } )
286+ |> Ash . read! ( authorize?: true )
287+ end
288+
289+ test "filtering on through relationships respects classroom_teacher policy (non-retired)" ,
290+ _setup do
291+ school_active = create_school ( "School With Active Teacher" )
292+ school_retired = create_school ( "School With Retired Teacher" )
293+ classroom_active = create_classroom ( "Active Classroom" , school_active . id , public: true )
294+ classroom_retired = create_classroom ( "Retired Classroom" , school_retired . id , public: true )
295+ teacher_active = create_teacher ( "Teacher Active" )
296+ teacher_retired = create_teacher ( "Teacher Retired" )
297+
298+ assign_teacher ( classroom_active . id , teacher_active . id )
299+ assign_teacher ( classroom_retired . id , teacher_retired . id , retired_at: DateTime . utc_now ( ) )
300+
301+ filter = [ teacher_active . name , teacher_retired . name ]
302+
303+ assert [ % { name: "School With Active Teacher" } ] =
304+ AshPostgres.Test.Through.School
305+ |> Ash.Query . filter ( % { teachers: % { name: % { in: ^ filter } } } )
306+ |> Ash . read! ( authorize?: true )
307+ end
308+ end
309+
269310 defp create_school ( name ) do
270311 AshPostgres.Test.Through.School
271312 |> Ash.Changeset . for_create ( :create , % { name: name } )
272313 |> Ash . create! ( )
273314 end
274315
275- defp create_classroom ( name , school_id ) do
316+ defp create_classroom ( name , school_id , opts \\ [ ] ) do
317+ attrs =
318+ % { name: name , school_id: school_id }
319+ |> Map . merge ( Map . new ( opts ) )
320+
276321 AshPostgres.Test.Through.Classroom
277- |> Ash.Changeset . for_create ( :create , % { name: name , school_id: school_id } )
322+ |> Ash.Changeset . for_create ( :create , attrs )
278323 |> Ash . create! ( )
279324 end
280325
0 commit comments