1Code.require_file("../../test_helper.exs", __DIR__)
2
3defmodule Mix.Tasks.RunTest do
4  use MixTest.Case
5
6  setup do
7    Mix.Project.push(MixTest.Case.Sample)
8  end
9
10  test "run requires files before evaling commands", context do
11    git_repo = fixture_path("git_repo/lib/git_repo.ex")
12
13    in_tmp(context.test, fn ->
14      Mix.Tasks.Run.run(["-r", git_repo, "-e", "send self(), {:hello, GitRepo.hello()}"])
15      assert_received {:hello, "World"}
16
17      Mix.Tasks.Run.run(["-pr", git_repo, "-e", "send self(), {:hello, GitRepo.hello()}"])
18      assert_received {:hello, "World"}
19    end)
20  after
21    purge([GitRepo])
22  end
23
24  test "does not start applications on --no-start", context do
25    in_tmp(context.test, fn ->
26      expr = "send self(), {:apps, Application.started_applications()}"
27      Mix.Tasks.Run.run(["--no-start", "-e", expr])
28
29      assert_received {:apps, apps}
30      refute List.keyfind(apps, :sample, 0)
31      Mix.Task.clear()
32
33      Mix.Tasks.Run.run(["-e", expr])
34      assert_received {:apps, apps}
35      assert List.keyfind(apps, :sample, 0)
36    end)
37  end
38
39  test "run errors on missing files", context do
40    in_tmp(context.test, fn ->
41      message = "No files matched pattern \"non-existent\" given to --require"
42
43      assert_raise Mix.Error, message, fn ->
44        Mix.Tasks.Run.run(["-r", "non-existent"])
45      end
46
47      assert_raise Mix.Error, message, fn ->
48        Mix.Tasks.Run.run(["-pr", "non-existent"])
49      end
50
51      assert_raise Mix.Error, "No such file: non-existent", fn ->
52        Mix.Tasks.Run.run(["non-existent"])
53      end
54
55      File.mkdir_p!("lib")
56
57      assert_raise Mix.Error, "No such file: lib", fn ->
58        Mix.Tasks.Run.run(["lib"])
59      end
60    end)
61  after
62    purge([GitRepo])
63  end
64
65  test "run rewrites System.argv", context do
66    in_tmp(context.test, fn ->
67      file = "argv.exs"
68      expr = "send self(), {:argv, System.argv()}"
69
70      File.write!(file, expr)
71
72      unload_file = fn ->
73        Code.unrequire_files([Path.expand(file)])
74      end
75
76      Mix.Tasks.Run.run([file])
77      assert_received {:argv, []}
78
79      unload_file.()
80      Mix.Tasks.Run.run([file, "foo", "-e", "bar"])
81      assert_received {:argv, ["foo", "-e", "bar"]}
82
83      unload_file.()
84      Mix.Tasks.Run.run(["-e", expr, file, "foo", "-x", "bar"])
85      assert_received {:argv, [^file, "foo", "-x", "bar"]}
86
87      unload_file.()
88
89      send_evaled = "send self(), :evaled"
90      Mix.Tasks.Run.run(["-e", send_evaled, "-e", expr, "--no-compile", file, "-x", "bar"])
91
92      assert_received :evaled
93      assert_received {:argv, [^file, "-x", "bar"]}
94    end)
95  end
96end
97