Automatic Jest Test Generation for GitHub PRs with Dual AI Review
Go to WorkflowDescription
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…
Constructs JSON:
{ "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.