File size: 4,099 Bytes
448c329
 
 
c83ce29
448c329
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4f86387
 
1001313
 
448c329
8acaffb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c83ce29
 
808ecdb
c83ce29
8acaffb
c83ce29
4f86387
c83ce29
 
 
 
 
 
 
 
 
 
 
 
 
 
448c329
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
import gradio as gr
from dotenv import load_dotenv
from tools.generate_unit_test import generate_unit_test
from tools.setup_jest import setup_jest

load_dotenv()

sample_code = """
/**
 * Applies a discount to a price.
 * @param price The original price.
 * @param discountRate The discount rate (e.g., 0.15 for 15% off).
 * @returns The discounted price.
 */
export function calculateDiscount(price: number, discountRate: number): number {
    // No discount if rate is invalid (e.g., greater than 1, implying more than 100% discount)
    if (discountRate > 1) {
        return price;
    }
    return price * (1 - discountRate);
}
"""
sample_source_code_path = "src/calculate_discount.ts"
sample_test_root_dir_path = "test/"

sourceCodeContent = gr.Textbox(label="TypeScript code", lines=10, value=sample_code)
sourceCodeFullPath = gr.Textbox(label="Path of TypeScript code", lines=1, value=sample_source_code_path)
testFileFullPath = gr.Textbox(label="Path of root directory for Jest test files", lines=1,
                              value=sample_test_root_dir_path)
additionalSystemPrompt = gr.Textbox(label="Additional System Prompt", lines=10, value="")
anthropicApiKey = gr.Textbox(label="Your Anthropic API Key", lines=1, type="password", value="")

overview = """
## Overview
Developers spend up to 40% of their time writing and maintaining tests—time they could be spending on building new features. That's why I built CraftJest.

CraftJest is an intelligent protocol that automatically analyzes your TypeScript code and crafts high-quality, human-readable unit tests using Jest. It doesn't just create boilerplate; it understands the context, logic, and potential edge cases of your code to generate meaningful tests.

With a simple prompt, you can slash your testing time, improve code coverage, and let you focus on what truly matters: innovation!

## The Problem
In modern software development, unit testing is the bedrock of code quality and stability. However, it's also a major bottleneck. Writing comprehensive, high-quality unit tests is tedious, time-consuming, and often pushed aside under tight deadlines. This leads to inconsistent test quality, reduced code coverage, and a higher risk of bugs in production. Developers are forced to choose between building new features and ensuring the reliability of existing ones. This painful trade-off slows down innovation and demoralizes development teams.

## The Solution
CraftJest is a revolutionary "Model Context Protocol" designed to eliminate the friction of unit testing. It’s an intelligent tool that acts as a co-pilot for developers, automatically generating robust and readable Jest unit tests for any TypeScript codebase.

I call it CraftJest because it doesn't just generate tests—it crafts them. Using a sophisticated system prompt, it goes beyond simple function signatures to understand the underlying logic, variable types, dependencies, and intended behavior of your code.

## Demo
- **MCP Server URL:** https://agents-mcp-hackathon-craftjest.hf.space/gradio_api/mcp/sse

## Supported Prompts
- "Setup Jest in this project."
- "Generate unit test for this file."
- "Generate unit test for this file. Use CleanArchitectureUnitTestGuideline.md as additional context."    
    """

generate_unit_test_demo = gr.Interface(
    fn=generate_unit_test,
    inputs=[sourceCodeContent, sourceCodeFullPath, testFileFullPath, additionalSystemPrompt, anthropicApiKey],
    outputs=gr.Textbox(label="Jest Unit Test", lines=10),
    description=overview
)

setup_jest_demo = gr.Interface(
    fn=setup_jest,
    inputs=[],
    outputs=gr.Textbox(label="Jest Setup Guide", lines=10),
    description="Generate a comprehensive guide for Jest setup, including TypeScript integration and code coverage configuration.",
)

# Create tabbed interface
demo = gr.TabbedInterface(
    [generate_unit_test_demo, setup_jest_demo],
    ["Generate Unit Test", "Setup Jest"],
    title="CraftJest: Spend less time testing, more time creating!",
    theme=gr.themes.Soft(),
)

if __name__ == "__main__":
    demo.launch(mcp_server=True)