1defmodule Mix.Tasks.Ecto.DumpLoadTest do
2  use ExUnit.Case, async: true
3
4  alias Mix.Tasks.Ecto.{Load, Dump}
5
6  # Mocked adapters
7
8  defmodule Adapter do
9    @behaviour Ecto.Adapter.Structure
10    defmacro __before_compile__(_), do: :ok
11    def structure_dump(_, _), do: Process.get(:structure_dump) || raise "no structure_dump"
12    def structure_load(_, _), do: Process.get(:structure_load) || raise "no structure_load"
13  end
14
15  defmodule NoStructureAdapter do
16    defmacro __before_compile__(_), do: :ok
17  end
18
19  # Mocked repos
20
21  defmodule Repo do
22    use Ecto.Repo, otp_app: :ecto, adapter: Adapter
23  end
24
25  defmodule NoStructureRepo do
26    use Ecto.Repo, otp_app: :ecto, adapter: NoStructureAdapter
27  end
28
29  setup do
30    Application.put_env(:ecto, __MODULE__.Repo, [])
31    Application.put_env(:ecto, __MODULE__.NoStructureRepo, [])
32  end
33
34  ## Dump
35
36  test "runs the adapter structure_dump" do
37    Process.put(:structure_dump, {:ok, "foo"})
38    Dump.run ["-r", to_string(Repo)]
39    assert_received {:mix_shell, :info, ["The structure for Mix.Tasks.Ecto.DumpLoadTest.Repo has been dumped to foo"]}
40  end
41
42  test "runs the adapter structure_dump with --quiet" do
43    Process.put(:structure_dump, {:ok, "foo"})
44    Dump.run ["-r", to_string(Repo), "--quiet"]
45    refute_received {:mix_shell, :info, [_]}
46  end
47
48  test "raises an error when structure_dump gives an unknown feedback" do
49    Process.put(:structure_dump, {:error, :confused})
50    assert_raise Mix.Error, fn ->
51      Dump.run ["-r", to_string(Repo)]
52    end
53  end
54
55  test "raises an error on structure_dump when the adapter doesn't define a storage" do
56    assert_raise Mix.Error, ~r/to implement Ecto.Adapter.Structure/, fn ->
57      Dump.run ["-r", to_string(NoStructureRepo)]
58    end
59  end
60
61  ## Load
62
63  test "runs the adapter structure_load" do
64    Process.put(:structure_load, {:ok, "foo"})
65    Load.run ["-r", to_string(Repo)]
66    assert_received {:mix_shell, :info, ["The structure for Mix.Tasks.Ecto.DumpLoadTest.Repo has been loaded from foo"]}
67  end
68
69  test "runs the adapter structure_load with --quiet" do
70    Process.put(:structure_load, {:ok, "foo"})
71    Load.run ["-r", to_string(Repo), "--quiet"]
72    refute_received {:mix_shell, :info, [_]}
73  end
74
75  test "raises an error when structure_load gives an unknown feedback" do
76    Process.put(:structure_load, {:error, :confused})
77    assert_raise Mix.Error, fn ->
78      Load.run ["-r", to_string(Repo)]
79    end
80  end
81
82  test "raises an error on structure_load when the adapter doesn't define a storage" do
83    assert_raise Mix.Error, ~r/to implement Ecto.Adapter.Structure/, fn ->
84      Load.run ["-r", to_string(NoStructureRepo)]
85    end
86  end
87end
88