1Code.require_file("../../test_helper.exs", __DIR__)
2
3defmodule Mix.Tasks.App.ConfigTest do
4  use MixTest.Case
5
6  test "loads project configuration" do
7    Process.put(
8      {MixTest.Case.Sample, :application},
9      env: [from_env: :env, from_compile: :env, from_runtime: :env]
10    )
11
12    in_fixture("no_mixfile", fn ->
13      Mix.Project.push(MixTest.Case.Sample)
14      File.mkdir_p!("config")
15
16      File.write!("config/config.exs", """
17      import Config
18      config :sample, from_compile: :compile, from_runtime: :compile
19      config :sample, :nested, from_compile: :compile, from_runtime: :compile
20      """)
21
22      File.write!("config/runtime.exs", """
23      import Config
24      config :sample, from_runtime: :runtime
25      config :sample, :nested, from_compile: :compile, from_runtime: :compile
26      """)
27
28      Mix.Task.run("loadconfig")
29      Mix.Task.run("app.config")
30
31      assert Application.get_all_env(:sample) |> Enum.sort() == [
32               from_compile: :compile,
33               from_env: :env,
34               from_runtime: :runtime,
35               nested: [from_compile: :compile, from_runtime: :compile]
36             ]
37    end)
38  after
39    Application.delete_env(:sample, :nested, persistent: true)
40    Application.delete_env(:sample, :from_env, persistent: true)
41    Application.delete_env(:sample, :from_compile, persistent: true)
42    Application.delete_env(:sample, :from_runtime, persistent: true)
43  end
44
45  test "sets config_env() and config_target()" do
46    in_fixture("no_mixfile", fn ->
47      Mix.Project.push(MixTest.Case.Sample)
48      File.mkdir_p!("config")
49
50      File.write!("config/runtime.exs", """
51      import Config
52      config :sample, vars: {config_env(), config_target()}
53      """)
54
55      Mix.Task.run("app.config")
56      assert Application.get_all_env(:sample) == [vars: {:dev, :host}]
57    end)
58  after
59    Application.delete_env(:sample, :vars, persistent: true)
60  end
61
62  test "warns if kernel/stdlib are configured" do
63    in_fixture("no_mixfile", fn ->
64      Mix.Project.push(MixTest.Case.Sample)
65      File.mkdir_p!("config")
66
67      File.write!("config/runtime.exs", """
68      import Config
69      config :kernel, this_wont: :work
70      """)
71
72      Mix.Task.run("loadconfig")
73      Mix.Task.run("app.config")
74
75      assert_received {:mix_shell, :error, ["Cannot configure base applications: [:kernel]" <> _]}
76    end)
77  end
78
79  test "compiles and preloads the project" do
80    in_fixture("no_mixfile", fn ->
81      Mix.Project.push(MixTest.Case.Sample)
82
83      Mix.Task.run("app.config", ["--no-compile"])
84      refute :code.is_loaded(A)
85      refute File.regular?("_build/dev/lib/sample/ebin/Elixir.A.beam")
86      refute File.regular?("_build/dev/lib/sample/ebin/sample.app")
87
88      Mix.Task.rerun("app.config")
89      assert File.regular?("_build/dev/lib/sample/ebin/Elixir.A.beam")
90      assert File.regular?("_build/dev/lib/sample/ebin/sample.app")
91
92      assert :code.is_loaded(A)
93      purge([A])
94
95      Mix.Task.rerun("app.config", [])
96      refute :code.is_loaded(A)
97
98      Mix.Task.rerun("app.config", ["--preload-modules"])
99      assert :code.is_loaded(A)
100    end)
101  end
102
103  test "start checks for invalid configuration", context do
104    in_tmp(context.test, fn ->
105      Mix.Project.push(MixTest.Case.Sample)
106
107      :ok = :application.load({:application, :loaded_sample, [vsn: '1.0.0', env: []]})
108      Mix.ProjectStack.loaded_config([:sample, :unknown_sample, :loaded_sample], [])
109      Mix.Tasks.App.Config.run([])
110
111      assert_received {:mix_shell, :error,
112                       ["You have configured application :unknown_sample" <> _]}
113
114      refute_received {:mix_shell, :error,
115                       ["You have configured application :loaded_sample" <> _]}
116    end)
117  end
118
119  test "validates Elixir version requirement", context do
120    Mix.ProjectStack.post_config(elixir: "~> ~> 0.8.1")
121
122    in_tmp(context.test, fn ->
123      Mix.Project.push(MixTest.Case.Sample)
124
125      assert_raise Mix.Error, ~r"Invalid Elixir version requirement", fn ->
126        Mix.Tasks.App.Start.run(["--no-start"])
127      end
128    end)
129  end
130
131  test "validates the Elixir version with requirement", context do
132    Mix.ProjectStack.post_config(elixir: "~> 0.8.1")
133
134    in_tmp(context.test, fn ->
135      Mix.Project.push(MixTest.Case.Sample)
136
137      assert_raise Mix.ElixirVersionError, ~r/You're trying to run :sample on Elixir/, fn ->
138        Mix.Tasks.App.Start.run(["--no-start"])
139      end
140    end)
141  end
142
143  test "does not validate the Elixir version with requirement when disabled", context do
144    Mix.ProjectStack.post_config(elixir: "~> 0.8.1")
145
146    in_tmp(context.test, fn ->
147      Mix.Project.push(MixTest.Case.Sample)
148
149      Mix.Tasks.App.Start.run(["--no-start", "--no-elixir-version-check"])
150    end)
151  end
152end
153