1Code.require_file "../../../support/eval_helpers.exs", __DIR__ 2 3defmodule Ecto.Query.Builder.PreloadTest do 4 use ExUnit.Case, async: true 5 6 import Ecto.Query.Builder.Preload 7 doctest Ecto.Query.Builder.Preload 8 9 import Ecto.Query 10 import Support.EvalHelpers 11 12 test "raises on invalid preloads" do 13 assert_raise Ecto.Query.CompileError, ~r"`1` is not a valid preload expression", fn -> 14 quote_and_eval(%Ecto.Query{} |> preload(1)) 15 end 16 17 message = "expected key in preload to be an atom, got: `1`" 18 assert_raise ArgumentError, message, fn -> 19 temp = 1 20 preload(%Ecto.Query{}, [{^temp, :foo}]) 21 end 22 end 23 24 test "accumulates on multiple calls" do 25 query = %Ecto.Query{} |> preload(:foo) |> preload(:bar) 26 assert query.preloads == [:foo, :bar] 27 end 28 29 test "supports interpolation" do 30 comments = :comments 31 assert preload("posts", ^comments).preloads == [:comments] 32 assert preload("posts", ^[comments]).preloads == [[:comments]] 33 assert preload("posts", [users: ^comments]).preloads == [users: :comments] 34 assert preload("posts", [users: ^[comments]]).preloads == [users: [:comments]] 35 assert preload("posts", [{^:users, ^comments}]).preloads == [users: :comments] 36 37 query = from u in "users", limit: 10 38 assert preload("posts", [users: ^query]).preloads == [users: query] 39 assert preload("posts", [{^:users, ^query}]).preloads == [users: query] 40 assert preload("posts", [users: ^{query, :comments}]).preloads == [users: {query, :comments}] 41 42 fun = fn _ -> [] end 43 assert preload("posts", [users: ^fun]).preloads == [users: fun] 44 assert preload("posts", [{^:users, ^fun}]).preloads == [users: fun] 45 assert preload("posts", [users: ^{fun, :comments}]).preloads == [users: {fun, :comments}] 46 end 47end 48