1Code.require_file("../../test_helper.exs", __DIR__)
2
3defmodule Mix.Tasks.Deps.TreeTest do
4  use MixTest.Case
5
6  defmodule ConvergedDepsApp do
7    def project do
8      [
9        app: :sample,
10        version: "0.1.0",
11        deps: [
12          {:deps_on_git_repo, "0.2.0", git: fixture_path("deps_on_git_repo")},
13          {:git_repo, ">= 0.1.0", git: MixTest.Case.fixture_path("git_repo")}
14        ]
15      ]
16    end
17  end
18
19  defmodule OverriddenDepsApp do
20    def project do
21      [
22        app: :sample,
23        version: "0.1.0",
24        deps: [
25          {:deps_on_git_repo, ~r"0.2.0", git: fixture_path("deps_on_git_repo"), only: :test},
26          {:git_repo, git: MixTest.Case.fixture_path("git_repo"), override: true}
27        ]
28      ]
29    end
30  end
31
32  test "shows the dependency tree", context do
33    in_tmp(context.test, fn ->
34      Mix.Project.push(ConvergedDepsApp)
35
36      Mix.Tasks.Deps.Tree.run(["--format", "pretty"])
37      assert_received {:mix_shell, :info, ["sample"]}
38      assert_received {:mix_shell, :info, ["├── deps_on_git_repo 0.2.0 (" <> _]}
39      assert_received {:mix_shell, :info, ["└── git_repo >= 0.1.0 (" <> _]}
40
41      Mix.Tasks.Deps.Get.run([])
42      Mix.Tasks.Deps.Tree.run(["--format", "pretty"])
43      assert_received {:mix_shell, :info, ["sample"]}
44      assert_received {:mix_shell, :info, ["├── deps_on_git_repo 0.2.0 (" <> _]}
45      assert_received {:mix_shell, :info, ["│   └── git_repo (" <> _]}
46      assert_received {:mix_shell, :info, ["└── git_repo >= 0.1.0 (" <> _]}
47    end)
48  after
49    purge([DepsOnGitRepo.MixProject, GitRepo.MixProject])
50  end
51
52  test "show the dependency tree for umbrella apps" do
53    in_fixture("umbrella_dep/deps/umbrella", fn ->
54      Mix.Project.in_project(:umbrella, ".", fn _ ->
55        Mix.Task.run("deps.tree", ["--format", "pretty"])
56        assert_received {:mix_shell, :info, ["foo"]}
57        assert_received {:mix_shell, :info, ["bar"]}
58        assert_received {:mix_shell, :info, ["└── foo (../foo)"]}
59      end)
60    end)
61  end
62
63  test "shows the given dependency", context do
64    in_tmp(context.test, fn ->
65      Mix.Project.push(ConvergedDepsApp)
66
67      assert_raise Mix.Error, "could not find dependency unknown", fn ->
68        Mix.Tasks.Deps.Tree.run(["--format", "pretty", "unknown"])
69      end
70
71      Mix.Tasks.Deps.Tree.run(["--format", "pretty", "deps_on_git_repo"])
72      assert_received {:mix_shell, :info, ["deps_on_git_repo 0.2.0 (" <> _]}
73      refute_received {:mix_shell, :info, ["└── git_repo (" <> _]}
74    end)
75  end
76
77  test "shows overridden deps", context do
78    in_tmp(context.test, fn ->
79      Mix.Project.push(OverriddenDepsApp)
80
81      Mix.Tasks.Deps.Tree.run(["--format", "pretty"])
82      assert_received {:mix_shell, :info, ["sample"]}
83      assert_received {:mix_shell, :info, ["└── git_repo (" <> msg]}
84      assert_received {:mix_shell, :info, ["├── deps_on_git_repo ~r/0.2.0/ (" <> _]}
85      assert msg =~ "*override*"
86    end)
87  end
88
89  test "excludes the given deps", context do
90    in_tmp(context.test, fn ->
91      Mix.Project.push(OverriddenDepsApp)
92
93      Mix.Tasks.Deps.Tree.run(["--format", "pretty", "--exclude", "deps_on_git_repo"])
94      assert_received {:mix_shell, :info, ["sample"]}
95      assert_received {:mix_shell, :info, ["└── git_repo (" <> _]}
96      refute_received {:mix_shell, :info, ["└── deps_on_git_repo ~r/0.2.0/ (" <> _]}
97    end)
98  end
99
100  test "shows a particular environment", context do
101    in_tmp(context.test, fn ->
102      Mix.Project.push(OverriddenDepsApp)
103
104      Mix.Tasks.Deps.Tree.run(["--format", "pretty", "--only", "prod"])
105      assert_received {:mix_shell, :info, ["sample"]}
106      assert_received {:mix_shell, :info, ["└── git_repo (" <> _]}
107      refute_received {:mix_shell, :info, ["└── deps_on_git_repo ~r/0.2.0/ (" <> _]}
108    end)
109  end
110
111  test "shows the dependency tree in DOT graph format", context do
112    in_tmp(context.test, fn ->
113      Mix.Project.push(ConvergedDepsApp)
114
115      Mix.Tasks.Deps.Tree.run(["--format", "dot"])
116
117      assert File.read!("deps_tree.dot") == """
118             digraph "dependency tree" {
119               "sample"
120               "sample" -> "deps_on_git_repo" [label="0.2.0"]
121               "sample" -> "git_repo" [label=">= 0.1.0"]
122             }
123             """
124
125      Mix.Tasks.Deps.Get.run([])
126      Mix.Tasks.Deps.Tree.run(["--format", "dot"])
127
128      assert File.read!("deps_tree.dot") == """
129             digraph "dependency tree" {
130               "sample"
131               "sample" -> "deps_on_git_repo" [label="0.2.0"]
132               "deps_on_git_repo" -> "git_repo" [label=""]
133               "sample" -> "git_repo" [label=">= 0.1.0"]
134             }
135             """
136    end)
137  after
138    purge([DepsOnGitRepo.MixProject, GitRepo.MixProject])
139  end
140end
141