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