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