Workflow: Automatic Unit Test Creator from GitHub
🏗️ Architecture Overview
This workflow listens for GitHub pull-request events, analyzes changed React/TypeScript files, auto-generates Jest tests via AI, has them reviewed by a second AI pass, and posts suggestions back as PR comments:
- GitHub Webhook → PR opened or updated
- Fetch & Diff → Retrieve raw diff of changed files
- Filter & Split → Isolate .tsx files & their diffs
- Fetch File Contents → Provide full context for tests
- Test Maker Agent → Generate Jest tests for diff hunks
- Code Reviewer Agent → Refine tests for style & edge-cases
- Post PR Comment → Sends suggested tests back to GitHub
📦 Node-by-Node Breakdown
flowchart LR
A[Webhook: /github/pr-events] --> B[GitHub: Get PR]
B --> C[Function: Parse diff_url + owner/repo]
C --> D[HTTP Request: GET diff_url]
D --> E[Function: Split on "diff --git"]
E --> F[Filter: /\.tsx$/]
F --> G[GitHub: Get File Contents]
G --> H[Test Maker Agent]
H --> I[Code Reviewer Agent]
I --> J[Function: Build Comment Payload]
J --> K[HTTP Request: POST to PR Comments]
Webhook: GitHub PR Events
- Type: HTTP Webhook (
/webhook/github/pr-events
)
- Subscribed Events:
pull_request.opened
, pull_request.synchronize
GitHub: Get PR
- Node: GitHub
- Action: "Get Pull Request"
- Inputs: owner, repo, pull_number
Function: Parse diff_url + owner/repo
- Extracts:
- diff_url (e.g. …/pulls/123.diff)
- owner, repo, merge_commit_sha
HTTP Request: GET diff_url
- Fetches unified-diff text for the PR.
Function: Split on "diff --git"
- Splits the diff into file-specific segments.
Filter: /.tsx$/
- Keeps only segments where the file path ends with .tsx.
GitHub: Get File Contents
- For each .tsx file, fetches the latest blob via GitHub API.
Test Maker Agent
- Prompt:
- "Generate Jest unit tests covering only the behaviors changed in these diff hunks."
- Output: Raw Jest test code.
Code Reviewer Agent
- Reads file + generated tests
- Prompt:
- "Review and improve these tests for readability, edge-cases, and naming conventions."
- Output: Polished test suite.
Function: Build Comment Payload
- Wraps tests in TypeScript fences:
// generated tests…
{ "body": "<tests>" }
HTTP Request: POST to PR Comments
- URL:
https://api.github.com/repos/{owner}/{repo}/issues/{pull_number}/comments
- Body: Contains the suggested tests.
🔍 Design Rationale & Best Practices
Focused Diff Analysis
- Targets only .tsx files to cover UI logic.
Two-Stage AI
- Separate "generate" + "review" steps mimic TDD + code review.
Stateless Functions
- Pure JS for parsing & transformation, easy to test.
Non-Blocking PR Comments
- Asynchronous suggestions—developers aren't blocked.
Scoped Permissions
- GitHub token limited to reading PRs & posting comments.