Skip to content

Commit 632cc68

Browse files
committed
Add through tests testing policies
1 parent 3d4a30a commit 632cc68

File tree

1 file changed

+47
-2
lines changed

1 file changed

+47
-2
lines changed

test/through_relationships_test.exs

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)