defmodule Mix.Tasks.EspecPhoenix.Init do
use Mix.Task
import Mix.Generator
@shortdoc "Create espec_phoenix folders and files"
@moduledoc """
Creates `spec/phoenix_helper.exs` and `spec/espec_phoenix_extend.ex`.
This task creates the following files:
* `spec/phoenix_helper.exs`
* `spec/espec_phoenix_extend.ex`
"""
@spec_folder "spec"
@espec_helper "spec_helper.exs"
@phoenix_helper "phoenix_helper.exs"
@espec_phoenix_extend "espec_phoenix_extend.ex"
def run(_args) do
Mix.Tasks.Espec.Init.run([])
app = Mix.Phoenix.base()
create_files(app)
patch_espec_config()
end
defp create_files(app) do
create_file(Path.join(@spec_folder, @phoenix_helper), phoenix_helper_template(app: app))
create_file(
Path.join(@spec_folder, @espec_phoenix_extend),
espec_phoenix_extend_template(app: app)
)
end
defp patch_espec_config do
append_to(Path.join(@spec_folder, @espec_helper), espec_helper_patch_text())
end
defp append_to(filepath, contents) do
File.write!(filepath, File.read!(filepath) <> contents)
end
embed_text(:espec_helper_patch, """
Code.require_file("spec/phoenix_helper.exs")
""")
embed_template(:phoenix_helper, """
Code.require_file("spec/espec_phoenix_extend.ex")
Ecto.Adapters.SQL.Sandbox.mode(<%= @app %>.Repo, :manual)
""")
embed_template(:espec_phoenix_extend, """
defmodule ESpec.Phoenix.Extend do
def model do
quote do
alias <%= @app %>.Repo
end
end
def controller do
quote do
alias <%= @app %>
import <%= @app %>Web.Router.Helpers
@endpoint <%= @app %>Web.Endpoint
end
end
def view do
quote do
import <%= @app %>Web.Router.Helpers
end
end
def channel do
quote do
alias <%= @app %>.Repo
@endpoint <%= @app %>Web.Endpoint
end
end
def live_view do
quote do
alias <%= @app %>
import <%= @app %>Web.Router.Helpers
@endpoint <%= @app %>Web.Endpoint
end
end
defmacro __using__(which) when is_atom(which) do
apply(__MODULE__, which, [])
end
end
""")
end