Automatic Jest Test Generation for GitHub PRs with Dual AI Review

Go to Workflow
553 views
Built by Varritech Varritech
Created on June 07, 2026

Description

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.

Nodes Used (6)

AI Agent
@n8n/n8n-nodes-langchain.agent
Code
n8n-nodes-base.code
GitHub
n8n-nodes-base.github
HTTP Request
n8n-nodes-base.httpRequest
OpenAI Chat Model
@n8n/n8n-nodes-langchain.lmChatOpenAi
Structured Output Parser
@n8n/n8n-nodes-langchain.outputParserStructured