# `Skipper.TestId`
[🔗](https://github.com/get-skipper/skipper-elixir/blob/main/lib/skipper/test_id.ex#L1)

Test ID helpers: `relative/path > part1 > part2`, matched case-insensitively.

# `build`

```elixir
@spec build(Path.t(), [String.t()]) :: String.t()
```

Build an ID from a file path (made relative to the project root) and title parts.

# `normalize`

```elixir
@spec normalize(String.t()) :: String.t()
```

Canonical form for lookups: trim, lowercase, collapse whitespace.

# `project_root`

Outermost ancestor of `start` whose `mix.exs` is an umbrella (`apps_path`),
else the nearest directory with a `mix.exs`, else `start`. Cached.

# `relative`

Make `file` relative to the project root, with `/` separators.

---

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