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