# `Bylaw.Credo.Check.Phoenix.UseVerifiedRoutes`
[🔗](https://github.com/ryanzidago/bylaw/blob/v0.4.0/lib/bylaw/credo/check/phoenix/use_verified_routes.ex#L1)

## Basics

> #### This check is disabled by default. {: .neutral}
>
> [Learn how to enable it](`e:credo:config_file.html#checks`) via `.credo.exs`.

This check has a base priority of `higher` and works with any version of Elixir.

## Explanation

Enforces Phoenix verified routes (`~p`) for application routes in the web layer.

Verified routes validate path structure and route parameters at compile time,
so renames and malformed paths fail near their source instead of becoming
runtime navigation or test failures. They also keep route construction tied
to the router that owns the route.

## Examples

Configure the Phoenix web boundary and one or more routers that define the
routes to match:

```elixir
{Bylaw.Credo.Check.Phoenix.UseVerifiedRoutes,
 [
   web_paths: ["lib/my_app_web/"],
   endpoint_paths: ["lib/my_app_web/endpoint.ex"],
   router_paths: ["lib/my_app_web/router.ex"],
   conn_case_modules: [MyAppWeb.ConnCase],
   routers: [MyAppWeb.Router, MyAppWeb.AdminRouter]
 ]}
```

Avoid:

      conn |> get("/api/v1/openapi")

      defp workspace_path(tenant_id, workspace_id) do
        "/api/v1/tenants/#{tenant_id}/workspaces/#{workspace_id}"
      end

      assert location == "/api/v1/tenants/#{tenant.id}/workspaces/#{workspace.id}"

Prefer:

      conn |> get(~p"/api/v1/openapi")

      defp workspace_path(tenant_id, workspace_id) do
        ~p"/api/v1/tenants/#{tenant_id}/workspaces/#{workspace_id}"
      end

      assert location == ~p"/api/v1/tenants/#{tenant.id}/workspaces/#{workspace.id}"

      params = %{filters: %{0 => %{field: "name", op: "==", value: "Staging"}}}
      conn |> get(~p"/api/v1/tenants/#{tenant_id}/workspaces?#{params}")

## Notes

The check only runs in configured web paths and tests using configured ConnCase
modules. It only flags path strings that normalize to a route exposed by one
of the configured routers or `:fallback_router_paths`. It ignores OpenAPI URI
templates like `"/api/v1/tenants/{tenant_id}/..."` and HEEx route attributes
for now.

This check uses static AST analysis, so it favors clear source-level patterns over runtime behavior.
Configure `:fallback_router_paths` when router modules are unavailable during Credo analysis.

## Options

Configure options in `.credo.exs` with the check tuple:

```elixir
%{
  configs: [
    %{
      name: "default",
      checks: [
        {Bylaw.Credo.Check.Phoenix.UseVerifiedRoutes,
         [
           web_paths: ["lib/my_app_web/"],
           endpoint_paths: ["lib/my_app_web/endpoint.ex"],
           router_paths: ["lib/my_app_web/router.ex"],
           conn_case_modules: [MyAppWeb.ConnCase],
           routers: [MyAppWeb.Router, MyAppWeb.AdminRouter],
           fallback_router_paths: [
             "/api/v1/openapi",
             "/admin/users/:id"
           ]
         ]}
      ]
    }
  ]
}
```

- `:web_paths` - Paths containing files where route strings should be checked.
- `:endpoint_paths` - Endpoint files to skip even when they match `:web_paths`.
- `:router_paths` - Router files to skip even when they match `:web_paths`.
- `:conn_case_modules` - Test case modules that identify request/controller tests.
- `:routers` - Phoenix router modules whose route paths should be matched.
- `:fallback_router_paths` - Route path patterns to use when router modules are unavailable.

## Usage

Add this check to Credo's `checks:` list in `.credo.exs`:

```elixir
%{
  configs: [
    %{
      name: "default",
      checks: [
        {Bylaw.Credo.Check.Phoenix.UseVerifiedRoutes,
         [
           web_paths: ["lib/my_app_web/"],
           conn_case_modules: [MyAppWeb.ConnCase],
           routers: [MyAppWeb.Router]
         ]}
      ]
    }
  ]
}
```

## Check-Specific Parameters

Use the following parameters to configure this check:

### `:web_paths`

  Paths containing files where route strings should be checked.

*This parameter defaults to* `[]`.

### `:endpoint_paths`

  Endpoint files to skip even when they match `:web_paths`.

*This parameter defaults to* `[]`.

### `:router_paths`

  Router files to skip even when they match `:web_paths`.

*This parameter defaults to* `[]`.

### `:conn_case_modules`

  Test case modules that identify request/controller tests.

*This parameter defaults to* `[]`.

### `:routers`

  Phoenix router modules whose route paths should be matched.

*This parameter defaults to* `[]`.

### `:fallback_router_paths`

  Route path patterns to use when router modules are unavailable.

*This parameter defaults to* `[]`.

## General Parameters

Like with all checks, [general params](`e:credo:check_params.html`) can be applied.

Parameters can be configured via the [`.credo.exs` config file](`e:credo:config_file.html`).

---

*Consult [api-reference.md](api-reference.md) for complete listing*
