firehose/plans/fix-readme-issues.md

143 lines
6.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Fix README quality gate issues
Zero defects: fix the 1 test failure, 41 credo issues, and 2 format issues reported in the README setup verification.
## 1. Fix test failure (1 issue)
**File:** `app/test/firehose_web/controllers/blog_tags_test.exs`
**Problem:** The `"clickable tags on index page"` describe block (lines 88122) asserts on specific tag names (`meta`, `ai`) that appear on the engineering blog index. These tags come from blog post content and will change as posts are added/removed. The tag-link rendering is already an implementation detail of `Blogex.Components.post_meta/1` (which correctly renders `<a href="...">` links), and the other two tests in the block (releases tag link + styling class) already pass.
**Fix:** Remove the entire `"clickable tags on index page"` describe block. Tag-link rendering is a component concern; the integration tests for tag pages (tag page loads, filtered posts, empty list, proper layout) remain and are sufficient.
**Files changed:**
- `app/test/firehose_web/controllers/blog_tags_test.exs` — remove lines 88122 (the `describe "clickable tags on index page"` block)
**Verify:** `mix test` → 142 tests, 0 failures
---
## 2. Fix credo issues (41 issues)
### 2a. Conn shadowing (35 issues — readability)
**Files:**
- `app/test/firehose_web/controllers/user_settings_controller_test.exs` — 9 occurrences
- `app/test/firehose_web/controllers/user_session_controller_test.exs` — 12 occurrences
- `app/test/firehose_web/controllers/user_registration_controller_test.exs` — 6 occurrences
- `app/test/firehose_web/controllers/blog_controller_test.exs` — 6 occurrences
- `app/test/firehose_web/controllers/blog_tags_test.exs` — 0 (already clean)
**Problem:** `conn = get(conn, ...)` shadows the `conn` variable. Credo warns about this.
**Fix:** Use `new_conn = get(conn, ...)` pattern or `conn |> get(...) |> ...` pipeline pattern. The project already has `refactor_conn_aliasing.sh` which can auto-fix these. Run it on each file, then review.
**Files changed:**
- `app/test/firehose_web/controllers/user_settings_controller_test.exs`
- `app/test/firehose_web/controllers/user_session_controller_test.exs`
- `app/test/firehose_web/controllers/user_registration_controller_test.exs`
- `app/test/firehose_web/controllers/blog_controller_test.exs`
### 2b. Missing @moduledoc (2 issues — readability)
**Files:**
- `app/lib/firehose_web/user_auth.ex` — no `@moduledoc`
- `app/lib/firehose/accounts/user_notifier.ex` — no `@moduledoc`
**Fix:** Add `@moduledoc` to both modules.
- `FirehoseWeb.UserAuth`: `"Authentication helpers for fetching, requiring, and redirecting users."`
- `Firehose.Accounts.UserNotifier`: `"Email delivery for account-related notifications (confirmation, login, email update)."`
### 2c. Alias ordering (2 issues — readability)
**Files:**
- `app/lib/firehose/accounts/user_notifier.ex``Firehose.Mailer` before `Firehose.Accounts.User` (M > A, not alphabetical)
- `app/lib/firehose/accounts.ex``UserToken` before `UserNotifier` in the group alias (To > N, not alphabetical)
**Fix:** Reorder aliases alphabetically in both files.
### 2d. Nested too deep (1 issue — refactoring)
**File:** `app/lib/firehose_web/user_auth.ex`, function `mount_current_scope/2` (line ~247)
**Problem:** Nesting depth is 3 (max allowed is 2). The `if/case` nesting inside `assign_new` callback is too deep.
**Current code:**
```elixir
defp mount_current_scope(socket, session) do
Phoenix.Component.assign_new(socket, :current_scope, fn ->
if token = session["user_token"] do
case Accounts.get_user_by_session_token(token) do
{user, _token_inserted_at} -> Scope.for_user(user)
nil -> Scope.for_user(nil)
end
else
Scope.for_user(nil)
end
end)
end
```
**Fix:** Extract the token→user lookup into a private helper to reduce nesting:
```elixir
defp mount_current_scope(socket, session) do
Phoenix.Component.assign_new(socket, :current_scope, fn ->
user = fetch_user_from_session(session)
Scope.for_user(user)
end)
end
defp fetch_user_from_session(%{"user_token" => token}) do
case Accounts.get_user_by_session_token(token) do
{user, _token_inserted_at} -> user
nil -> nil
end
end
defp fetch_user_from_session(_session), do: nil
```
### 2e. Nested module aliasing (2 issues — software design)
**Files:**
- `app/test/support/conn_case.ex:49``Firehose.Accounts.Scope` could be aliased
- `app/test/firehose_web/live/editor_dashboard_live_test.exs:44``Firehose.Test.FakeBlog` could be aliased
**Fix:** Add `alias` at the top of each module.
- `conn_case.ex`: add `alias Firehose.Accounts.Scope` (or inline `Firehose.Accounts.Scope.for_user(user)` → already uses full path, add alias and use short form)
- `editor_dashboard_live_test.exs`: add `alias Firehose.Test.FakeBlog`
**Verify after all credo fixes:** `mix credo --strict` → 0 issues, exit code 0
---
## 3. Fix format issues (2 files)
**Files:**
- `app/lib/firehose_web/controllers/page_html/home.html.heex` — trailing whitespace on line 16
- `app/lib/firehose_web/controllers/page_html/contact.html.heex` — long line on line 54 (inline `<a>` attributes should be split)
**Fix:** Run `mix format` which auto-fixes both.
**Verify:** `mix format --check-formatted` → 0 files not formatted, exit code 0
---
## Execution order
1. **Test** — remove the fragile describe block, verify `mix test` passes
2. **Credo** — fix all 41 issues across the files listed above, verify `mix credo --strict` passes
3. **Format** — run `mix format`, verify `mix format --check-formatted` passes
4. **Final gate** — run `mix precommit` (compile + deps.unlock + format + test) to confirm zero defects
## Risk assessment
- **Test removal:** Low risk — the removed test checks implementation detail (specific tag names in post content). Tag-page integration tests remain.
- **Conn shadowing:** Low risk — mechanical rename, no logic change.
- **Moduledoc/alias ordering:** Zero risk — documentation/style only.
- **Nesting refactor:** Low risk — extracts a simple helper, behaviour identical. Run full test suite to confirm.
- **Format:** Zero risk — auto-formatted by mix.