@@ -66,9 +66,9 @@ defmodule Ecto.Query.Builder.PreloadTest do
6666 test "supports dynamics for join association bindings using named bindings" do
6767 comments = :comments
6868
69- query =
70- from p in "posts" ,
71- join: c in assoc ( p , :comments ) ,
69+ query =
70+ from p in "posts" ,
71+ join: c in assoc ( p , :comments ) ,
7272 as: ^ comments
7373 preloads = [
7474 comments: dynamic ( [ { ^ comments , c } ] , c )
@@ -120,6 +120,18 @@ defmodule Ecto.Query.Builder.PreloadTest do
120120 preloads = [ comments: outer_dynamic ]
121121 assert % { preloads: [ ] , assocs: [ comments: { 1 , [ ] } ] } = preload ( query , ^ preloads )
122122 end
123+
124+ test "supports preload functions" do
125+ query = from p in "posts" , join: c in assoc ( p , :comments ) , as: :comments
126+ function_1 = fn _ -> [ ] end
127+ function_2 = fn _ , _ -> [ ] end
128+
129+ preloads = [ comments: function_1 ]
130+ assert % { preloads: ^ preloads , assocs: [ ] } = preload ( query , ^ preloads )
131+
132+ preloads = [ comments: function_2 ]
133+ assert % { preloads: ^ preloads , assocs: [ ] } = preload ( query , ^ preloads )
134+ end
123135 end
124136
125137 describe "invalid preload" do
@@ -175,5 +187,13 @@ defmodule Ecto.Query.Builder.PreloadTest do
175187 preload ( query , ^ [ comments: dynamic ( [ _ , c ] , c . field ) ] )
176188 end
177189 end
190+
191+ test "raises when preload function has more than two arguments" do
192+ message = ~r" invalid preload for key `:comments`:"
193+ assert_raise ArgumentError , message , fn ->
194+ query = from p in "posts" , join: c in assoc ( p , :comments )
195+ preload ( query , ^ [ comments: fn _ , _ , _ -> [ ] end ] )
196+ end
197+ end
178198 end
179199end
0 commit comments