Current section

Files

Jump to
nimble_template lib nimble_template addons variants phoenix ex_machina.ex
Raw

lib/nimble_template/addons/variants/phoenix/ex_machina.ex

defmodule NimbleTemplate.Addons.Phoenix.ExMachina do
@moduledoc false
use NimbleTemplate.Addons.Addon
@impl true
def do_apply(%Project{} = project, _opts) do
project
|> copy_files()
|> edit_files()
end
defp copy_files(%Project{base_module: base_module} = project) do
Generator.copy_file([{:eex, "test/support/factory.ex.eex", "test/support/factory.ex"}],
base_module: base_module
)
project
end
defp edit_files(%Project{} = project) do
project
|> inject_mix_dependency()
|> edit_mix_elixirc_paths()
|> edit_test_helper()
|> import_factory()
project
end
defp inject_mix_dependency(%Project{} = project) do
Generator.inject_mix_dependency({:ex_machina, latest_package_version(:ex_machina), only: :test})
project
end
def edit_mix_elixirc_paths(%Project{} = project) do
Generator.replace_content(
"mix.exs",
"""
defp elixirc_paths(:test), do: ["lib", "test/support"]
""",
"""
defp elixirc_paths(:test), do: ["lib", "test/support", "test/factories"]
"""
)
project
end
defp edit_test_helper(%Project{} = project) do
Generator.replace_content(
"test/test_helper.exs",
"""
ExUnit.start()
""",
"""
{:ok, _} = Application.ensure_all_started(:ex_machina)
ExUnit.start()
"""
)
project
end
defp import_factory(%Project{base_module: base_module, web_module: web_module} = project) do
Generator.replace_content(
"test/support/data_case.ex",
"""
import #{base_module}.DataCase
""",
"""
import #{base_module}.DataCase
import #{base_module}.Factory
"""
)
Generator.replace_content(
"test/support/channel_case.ex",
"""
import #{web_module}.ChannelCase
""",
"""
import #{web_module}.ChannelCase
import #{base_module}.Factory
"""
)
Generator.replace_content(
"test/support/conn_case.ex",
"""
import #{web_module}.ConnCase
""",
"""
import #{web_module}.ConnCase
import #{base_module}.Factory
"""
)
project
end
end