Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 16 additions & 7 deletions lib/igniter/libs/phoenix.ex
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
defmodule Igniter.Libs.Phoenix do
@moduledoc "Codemods & utilities for working with Phoenix"

@endpoint_modules [Phoenix.Endpoint, SiteEncrypt.Phoenix.Endpoint]

@doc """
Returns the web module name for the current app
"""
Expand Down Expand Up @@ -91,18 +93,23 @@ defmodule Igniter.Libs.Phoenix do
{Igniter.t(), list(module())}
def endpoints_for_router(igniter, router) do
Igniter.Project.Module.find_all_matching_modules(igniter, fn _module, zipper ->
with {:ok, _} <- Igniter.Code.Module.move_to_use(zipper, Phoenix.Endpoint),
{:ok, _} <-
Igniter.Code.Function.move_to_function_call_in_current_scope(
uses_endpoint? =
Enum.find_value(@endpoint_modules, fn endpoint_module ->
Igniter.Code.Module.move_to_use(zipper, endpoint_module) != :error
end)

if uses_endpoint? do
case Igniter.Code.Function.move_to_function_call_in_current_scope(
zipper,
:plug,
[1, 2],
&Igniter.Code.Function.argument_equals?(&1, 0, router)
) do
true
{:ok, _} -> true
_ -> false
end
else
_ ->
false
false
end
end)
end
Expand Down Expand Up @@ -130,7 +137,9 @@ defmodule Igniter.Libs.Phoenix do
else
{igniter, endpoints} =
Igniter.Project.Module.find_all_matching_modules(igniter, fn _mod, zipper ->
Igniter.Code.Module.move_to_use(zipper, Phoenix.Endpoint) != :error
Enum.find_value(@endpoint_modules, fn endpoint_module ->
Igniter.Code.Module.move_to_use(zipper, endpoint_module) != :error
end)
end)

case endpoints do
Expand Down
98 changes: 98 additions & 0 deletions test/igniter/libs/phoenix_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -322,6 +322,104 @@ defmodule Igniter.Libs.PhoenixTest do
end
end

describe "select_endpoint/3" do
test "finds endpoints using Phoenix.Endpoint" do
igniter =
assert test_project()
|> Igniter.create_new_file("lib/test_web/endpoint.ex", """
defmodule TestWeb.Endpoint do
use Phoenix.Endpoint, otp_app: :test
end
""")
|> apply_igniter!()

{_igniter, endpoint} = Igniter.Libs.Phoenix.select_endpoint(igniter)
assert endpoint == TestWeb.Endpoint
end

test "finds endpoints using SiteEncrypt.Phoenix.Endpoint" do
igniter =
assert test_project()
|> Igniter.create_new_file("lib/test_web/endpoint.ex", """
defmodule TestWeb.Endpoint do
use SiteEncrypt.Phoenix.Endpoint, otp_app: :test
end
""")
|> apply_igniter!()

{_igniter, endpoint} = Igniter.Libs.Phoenix.select_endpoint(igniter)
assert endpoint == TestWeb.Endpoint
end

test "finds multiple endpoints using both Phoenix.Endpoint and SiteEncrypt.Phoenix.Endpoint" do
igniter =
assert test_project()
|> Igniter.create_new_file("lib/test_web/endpoint.ex", """
defmodule TestWeb.Endpoint do
use Phoenix.Endpoint, otp_app: :test
end
""")
|> Igniter.create_new_file("lib/admin_web/endpoint.ex", """
defmodule AdminWeb.Endpoint do
use SiteEncrypt.Phoenix.Endpoint, otp_app: :test
end
""")
|> apply_igniter!()

{_igniter, endpoints} =
Igniter.Project.Module.find_all_matching_modules(igniter, fn _mod, zipper ->
Igniter.Code.Module.move_to_use(zipper, Phoenix.Endpoint) != :error ||
Igniter.Code.Module.move_to_use(zipper, SiteEncrypt.Phoenix.Endpoint) != :error
end)

assert TestWeb.Endpoint in endpoints
assert AdminWeb.Endpoint in endpoints
assert length(endpoints) == 2
end
end

describe "endpoints_for_router/2" do
test "finds Phoenix.Endpoint that uses a router" do
igniter =
assert test_project()
|> Igniter.create_new_file("lib/test_web/router.ex", """
defmodule TestWeb.Router do
use Phoenix.Router
end
""")
|> Igniter.create_new_file("lib/test_web/endpoint.ex", """
defmodule TestWeb.Endpoint do
use Phoenix.Endpoint, otp_app: :test
plug TestWeb.Router
end
""")
|> apply_igniter!()

{_igniter, endpoints} = Igniter.Libs.Phoenix.endpoints_for_router(igniter, TestWeb.Router)
assert TestWeb.Endpoint in endpoints
end

test "finds SiteEncrypt.Phoenix.Endpoint that uses a router" do
igniter =
assert test_project()
|> Igniter.create_new_file("lib/test_web/router.ex", """
defmodule TestWeb.Router do
use Phoenix.Router
end
""")
|> Igniter.create_new_file("lib/test_web/endpoint.ex", """
defmodule TestWeb.Endpoint do
use SiteEncrypt.Phoenix.Endpoint, otp_app: :test
plug TestWeb.Router
end
""")
|> apply_igniter!()

{_igniter, endpoints} = Igniter.Libs.Phoenix.endpoints_for_router(igniter, TestWeb.Router)
assert TestWeb.Endpoint in endpoints
end
end

describe "append_to_scope/4" do
setup do
router = """
Expand Down