1- Code . require_file "../../../support/eval_helpers.exs" , __DIR__
1+ Code . require_file ( "../../../support/eval_helpers.exs" , __DIR__ )
22
33defmodule Ecto.Query.Builder.PreloadTest do
44 use ExUnit.Case , async: true
@@ -19,70 +19,92 @@ defmodule Ecto.Query.Builder.PreloadTest do
1919 comments = :comments
2020 assert preload ( "posts" , ^ comments ) . preloads == [ :comments ]
2121 assert preload ( "posts" , ^ [ comments ] ) . preloads == [ :comments ]
22- assert preload ( "posts" , [ users: ^ comments ] ) . preloads == [ users: :comments ]
22+ assert preload ( "posts" , users: ^ comments ) . preloads == [ users: :comments ]
2323 assert preload ( "posts" , ^ [ users: comments ] ) . preloads == [ users: :comments ]
24- assert preload ( "posts" , [ users: ^ [ comments ] ] ) . preloads == [ users: [ :comments ] ]
24+ assert preload ( "posts" , users: ^ [ comments ] ) . preloads == [ users: [ :comments ] ]
2525 assert preload ( "posts" , ^ [ users: [ comments ] ] ) . preloads == [ users: [ :comments ] ]
2626 assert preload ( "posts" , [ { ^ :users , ^ comments } ] ) . preloads == [ users: :comments ]
2727 assert preload ( "posts" , [ [ [ users: ^ comments ] ] ] ) . preloads == [ users: :comments ]
2828 assert preload ( "posts" , ^ [ [ [ users: comments ] ] ] ) . preloads == [ users: :comments ]
2929 assert preload ( "posts" , [ [ users: [ [ ^ comments ] ] ] ] ) . preloads == [ users: [ :comments ] ]
3030 assert preload ( "posts" , ^ [ [ users: [ [ comments ] ] ] ] ) . preloads == [ users: [ :comments ] ]
31- assert preload ( "posts" , [ [ :likes , users: [ [ ^ comments ] ] ] ] ) . preloads == [ { :users , [ :comments ] } , :likes ]
32- assert preload ( "posts" , ^ [ [ :likes , users: [ [ comments ] ] ] ] ) . preloads == [ { :users , [ :comments ] } , :likes ]
31+
32+ assert preload ( "posts" , [ [ :likes , users: [ [ ^ comments ] ] ] ] ) . preloads == [
33+ { :users , [ :comments ] } ,
34+ :likes
35+ ]
36+
37+ assert preload ( "posts" , ^ [ [ :likes , users: [ [ comments ] ] ] ] ) . preloads == [
38+ { :users , [ :comments ] } ,
39+ :likes
40+ ]
3341
3442 query = from u in "users" , limit: 10
35- assert preload ( "posts" , [ users: ^ query ] ) . preloads == [ users: query ]
43+ assert preload ( "posts" , users: ^ query ) . preloads == [ users: query ]
3644 assert preload ( "posts" , [ { ^ :users , ^ query } ] ) . preloads == [ users: query ]
3745 assert preload ( "posts" , ^ [ users: query ] ) . preloads == [ users: query ]
38- assert preload ( "posts" , [ users: ^ { query , :comments } ] ) . preloads == [ users: { query , :comments } ]
39- assert preload ( "posts" , ^ [ users: { query , :comments } ] ) . preloads == [ users: { query , [ :comments ] } ]
46+ assert preload ( "posts" , users: ^ { query , :comments } ) . preloads == [ users: { query , :comments } ]
47+
48+ assert preload ( "posts" , ^ [ users: { query , :comments } ] ) . preloads == [
49+ users: { query , [ :comments ] }
50+ ]
4051
4152 fun = fn _ -> [ ] end
42- assert preload ( "posts" , [ users: ^ fun ] ) . preloads == [ users: fun ]
53+ assert preload ( "posts" , users: ^ fun ) . preloads == [ users: fun ]
4354 assert preload ( "posts" , [ { ^ :users , ^ fun } ] ) . preloads == [ users: fun ]
4455 assert preload ( "posts" , ^ [ users: fun ] ) . preloads == [ users: fun ]
45- assert preload ( "posts" , [ users: ^ { fun , :comments } ] ) . preloads == [ users: { fun , :comments } ]
56+ assert preload ( "posts" , users: ^ { fun , :comments } ) . preloads == [ users: { fun , :comments } ]
4657 assert preload ( "posts" , ^ [ users: { fun , :comments } ] ) . preloads == [ users: { fun , [ :comments ] } ]
4758 end
4859
4960 test "supports interpolation with associations" do
5061 comments = :comments
5162
5263 query = from p in "posts" , join: c in assoc ( p , :comments ) , as: ^ comments
64+
5365 assert % { preloads: [ ] , assocs: [ { :comments , { 1 , [ ] } } ] } =
5466 preload ( query , [ { ^ comments , c } ] , [ { ^ comments , c } ] )
67+
5568 assert % { preloads: [ :foo ] , assocs: [ { :comments , { 1 , [ ] } } ] } =
5669 preload ( query , [ { ^ comments , c } ] , [ :foo , { ^ comments , c } ] )
5770
5871 query =
5972 from p in "posts" ,
60- join: f in assoc ( p , :foo ) , as: :foo ,
61- join: c in assoc ( f , :comments ) , as: ^ comments
73+ join: f in assoc ( p , :foo ) ,
74+ as: :foo ,
75+ join: c in assoc ( f , :comments ) ,
76+ as: ^ comments
77+
6278 assert % { preloads: [ ] , assocs: [ { :foo , { 1 , [ { :comments , { 2 , [ ] } } ] } } ] } =
63- preload ( query , [ { :foo , f } , { ^ comments , c } ] , [ foo: { f , [ { ^ comments , c } ] } ] )
79+ preload ( query , [ { :foo , f } , { ^ comments , c } ] , foo: { f , [ { ^ comments , c } ] } )
6480 end
6581
6682 test "supports dynamics for join association bindings using named bindings" do
6783 comments = :comments
6884
6985 query =
7086 from p in "posts" ,
71- join: c in assoc ( p , :comments ) ,
72- as: ^ comments
87+ join: c in assoc ( p , :comments ) ,
88+ as: ^ comments
89+
7390 preloads = [
7491 comments: dynamic ( [ { ^ comments , c } ] , c )
7592 ]
93+
7694 assert % { preloads: [ ] , assocs: [ comments: { 1 , [ ] } ] } = preload ( query , ^ preloads )
7795
7896 query =
7997 from p in "posts" ,
80- join: c in assoc ( p , :comments ) , as: ^ comments ,
81- join: l in assoc ( p , :likes ) , as: :likes
98+ join: c in assoc ( p , :comments ) ,
99+ as: ^ comments ,
100+ join: l in assoc ( p , :likes ) ,
101+ as: :likes
102+
82103 preloads = [
83104 likes: dynamic ( [ likes: l ] , l ) ,
84105 comments: dynamic ( [ { ^ comments , c } ] , c )
85106 ]
107+
86108 assert % { preloads: [ ] , assocs: [ likes: { 2 , [ ] } , comments: { 1 , [ ] } ] } =
87109 preload ( query , ^ preloads )
88110 end
@@ -94,20 +116,24 @@ defmodule Ecto.Query.Builder.PreloadTest do
94116
95117 query =
96118 from p in "posts" ,
97- join: assoc ( p , :comments ) ,
98- join: assoc ( p , :likes )
119+ join: assoc ( p , :comments ) ,
120+ join: assoc ( p , :likes )
121+
99122 preloads = [
100123 likes: dynamic ( [ _p , _c , l ] , l ) ,
101124 comments: dynamic ( [ _p , c ] , c )
102125 ]
126+
103127 assert % { preloads: [ ] , assocs: [ likes: { 2 , [ ] } , comments: { 1 , [ ] } ] } =
104128 preload ( query , ^ preloads )
105129
106130 query =
107131 from p in "posts" ,
108- join: c in assoc ( p , :comments ) ,
109- join: assoc ( c , :likes )
132+ join: c in assoc ( p , :comments ) ,
133+ join: assoc ( c , :likes )
134+
110135 preloads = [ comments: { dynamic ( [ _p , c ] , c ) , likes: dynamic ( [ _p , _c , l ] , l ) } ]
136+
111137 assert % { preloads: [ ] , assocs: [ comments: { 1 , [ likes: { 2 , [ ] } ] } ] } =
112138 preload ( query , ^ preloads )
113139 end
@@ -141,39 +167,46 @@ defmodule Ecto.Query.Builder.PreloadTest do
141167 assert_raise Ecto.Query.CompileError , message , fn ->
142168 quote_and_eval ( % Ecto.Query { } |> preload ( 1 ) )
143169 end
170+
144171 assert_raise Ecto.Query.CompileError , message , fn ->
145172 quote_and_eval ( % Ecto.Query { } |> preload ( [ 1 ] ) )
146173 end
147174
148175 assert_raise ArgumentError , message , fn ->
149- preload ( % Ecto.Query { } , ^ 1 )
176+ preload ( % Ecto.Query { } , ^ 1 )
150177 end
178+
151179 assert_raise ArgumentError , message , fn ->
152- preload ( % Ecto.Query { } , ^ [ 1 ] )
180+ preload ( % Ecto.Query { } , ^ [ 1 ] )
153181 end
154182 end
155183
156184 test "raises on invalid keys" do
157185 message = ~r" malformed key in preload `1`"
186+
158187 assert_raise Ecto.Query.CompileError , message , fn ->
159188 quote_and_eval ( % Ecto.Query { } |> preload ( [ { 1 , :foo } ] ) )
160189 end
161190
162191 message = ~r" expected key in preload to be an atom, got: `1`"
192+
163193 assert_raise ArgumentError , message , fn ->
164194 temp = 1
165- preload ( % Ecto.Query { } , [ { ^ temp , :foo } ] )
195+ preload ( % Ecto.Query { } , [ { ^ Process . get ( :unused , temp ) , :foo } ] )
166196 end
197+
167198 assert_raise ArgumentError , message , fn ->
168199 preload ( % Ecto.Query { } , ^ [ { 1 , :foo } ] )
169200 end
170201 end
171202
172203 test "raises when preload join association is nested in non-join" do
173204 message = ~r" cannot preload join association `:comments`"
205+
174206 assert_raise Ecto.Query.CompileError , message , fn ->
175- quote_and_eval ( % Ecto.Query { } |> preload ( [ _ , c ] , [ users: [ comments: c ] ] ) )
207+ quote_and_eval ( % Ecto.Query { } |> preload ( [ _ , c ] , users: [ comments: c ] ) )
176208 end
209+
177210 assert_raise ArgumentError , message , fn ->
178211 query = from p in "posts" , join: c in assoc ( p , :comments )
179212 preload ( query , ^ [ users: [ comments: dynamic ( [ _ , c ] , c ) ] ] )
@@ -182,6 +215,7 @@ defmodule Ecto.Query.Builder.PreloadTest do
182215
183216 test "raises when dynamic evaluates to something other than single binding" do
184217 message = ~r" invalid dynamic in preload: `dynamic\( \[ _, c\] , c.field\) `"
218+
185219 assert_raise ArgumentError , message , fn ->
186220 query = from p in "posts" , join: c in assoc ( p , :comments )
187221 preload ( query , ^ [ comments: dynamic ( [ _ , c ] , c . field ) ] )
@@ -190,9 +224,10 @@ defmodule Ecto.Query.Builder.PreloadTest do
190224
191225 test "raises when preload function has more than two arguments" do
192226 message = ~r" invalid preload for key `:comments`:"
227+
193228 assert_raise ArgumentError , message , fn ->
194229 query = from p in "posts" , join: c in assoc ( p , :comments )
195- preload ( query , ^ [ comments: fn _ , _ , _ -> [ ] end ] )
230+ preload ( query , ^ [ comments: fn _ , _ , _ -> [ ] end ] )
196231 end
197232 end
198233 end
0 commit comments