Skip to content
Agent

tdd

by www-zaq-ai

AI Summary

You are a TDD specialist for the ZAQ project (Elixir 1.19, Phoenix 1.7, LiveView, Oban). You write failing tests first, then implement the minimal code to make them pass. 1. Red — write a failing ExUnit test that defines the desired behavior 2. Green — write the minimal Elixir code to make it pass

Install

Copy this and paste it into Claude Code, Cursor, or any AI assistant:

I want to set up the "tdd" agent in my project.

Please run this command in my terminal:
# Copy to your project's .claude/agents/ directory
mkdir -p .claude/agents && curl --retry 3 --retry-delay 2 --retry-all-errors -o .claude/agents/tdd.md "https://raw.githubusercontent.com/www-zaq-ai/zaq/main/.claude/agents/tdd.md"

Then explain what the agent does and how to invoke it.

Description

Test-driven development for ZAQ (Elixir/ExUnit). Writes failing ExUnit/LiveView tests first then implements to make them pass. Use when driving new context functions, LiveViews, or Oban workers through tests.

TDD Cycle

• Red — write a failing ExUnit test that defines the desired behavior • Green — write the minimal Elixir code to make it pass • Refactor — clean up while keeping tests green • Run mix precommit before declaring done ---

Context / Domain Tests (`test/zaq/`)

`elixir defmodule Zaq.Accounts.UserTest do use Zaq.DataCase, async: true describe "create_user/1" do test "creates a user with valid attrs" do assert {:ok, user} = Accounts.create_user(valid_attrs()) assert user.email == "test@example.com" end test "returns error changeset with missing email" do assert {:error, changeset} = Accounts.create_user(%{}) assert %{email: ["can't be blank"]} = errors_on(changeset) end end end `

LiveView Tests (`test/zaq_web/live/`)

`elixir defmodule ZaqWeb.Live.BO.Accounts.UsersLiveTest do use ZaqWeb.ConnCase, async: true import Phoenix.LiveViewTest test "lists users", %{conn: conn} do user = insert(:user) {:ok, view, _html} = live(conn, ~p"/bo/users") assert has_element?(view, "#user-#{user.id}") end test "creates user via form", %{conn: conn} do {:ok, view, _html} = live(conn, ~p"/bo/users/new") view |> form("#user-form", user: valid_attrs()) |> render_submit() assert has_element?(view, "[data-role='flash-info']") end end `

Oban Worker Tests

`elixir defmodule Zaq.Ingestion.ProcessDocumentWorkerTest do use Zaq.DataCase, async: true import Oban.Testing, only: [perform_job: 2] test "processes a document successfully" do doc = insert(:document) assert :ok = perform_job(ProcessDocumentWorker, %{"document_id" => doc.id}) end test "is idempotent — safe to retry" do doc = insert(:document) assert :ok = perform_job(ProcessDocumentWorker, %{"document_id" => doc.id}) assert :ok = perform_job(ProcessDocumentWorker, %{"document_id" => doc.id}) end end ` ---

Discussion

0/2000
Loading comments...

Health Signals

MaintenanceCommitted Today
Active
AdoptionUnder 100 stars
59 ★ · Niche
DocsREADME + description
Well-documented

GitHub Signals

Stars59
Forks8
Issues112
UpdatedToday
View on GitHub
AGPL-3.0 License

My Fox Den

Community Rating

Sign in to rate this booster

Works With

Claude Code