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