# `Bylaw.Credo.Check.Phoenix.UseVerifiedRoutes`
[🔗](https://github.com/ryanzidago/bylaw/blob/v0.1.0-alpha.1/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.

## 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*
