# alexalkhatib/jira-testcase-generator architecture

> Architecture diagram of the GitHub repository alexalkhatib/jira-testcase-generator, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-11). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/alexalkhatib/jira-testcase-generator
- Repository: https://github.com/alexalkhatib/jira-testcase-generator

## Overview

Jira Test Case Generator is a web application that turns a Jira story into structured functional test cases using a locally hosted Ollama model. The main flow is browser request → validation and orchestration → Jira retrieval and acceptance-criteria extraction → prompt and model generation → JSON parsing and typed response. The UI also offers JSON/CSV/Markdown export and browser-local generation history; configuration and RFC 7807 errors are separate capabilities. Some secondary wiring is documented in the README rather than shown in sampled source.

Main entry points: [`src/main/java/com/asecurityguru/jiratestgen/service/TestSuiteService.java`](https://github.com/alexalkhatib/jira-testcase-generator/blob/main/src/main/java/com/asecurityguru/jiratestgen/service/TestSuiteService.java) (Suite orchestration), [`src/main/java/com/asecurityguru/jiratestgen/jira/JiraRestClient.java`](https://github.com/alexalkhatib/jira-testcase-generator/blob/main/src/main/java/com/asecurityguru/jiratestgen/jira/JiraRestClient.java) (Jira REST client), [`src/main/resources/static/js/app.js`](https://github.com/alexalkhatib/jira-testcase-generator/blob/main/src/main/resources/static/js/app.js) (Browser UI), [`src/main/java/com/asecurityguru/jiratestgen/ai/TestCaseGenerationService.java`](https://github.com/alexalkhatib/jira-testcase-generator/blob/main/src/main/java/com/asecurityguru/jiratestgen/ai/TestCaseGenerationService.java) (Generation service)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_web["Web experience"]
  node_browser_ui["Browser UI<br/>[app.js]"]
  node_test_controller["Test API"]
  node_config_controller["Config API"]
  node_response["Typed response"]
end

subgraph group_orchestration["Request orchestration"]
  node_suite_service["Suite orchestration"]
end

subgraph group_jira["Jira ingestion"]
  node_jira_client["Jira REST client"]
  node_adf["ADF text extraction"]
  node_criteria["Criteria extraction"]
  node_story_model["Jira story model<br/>[JiraStory.java]"]
end

subgraph group_generation["AI generation"]
  node_generation_service["Generation service"]
  node_prompt_factory["Prompt builder<br/>[PromptFactory.java]"]
  node_parser["Response parser"]
  node_test_models["Test case models<br/>[TestCase.java]"]
end

subgraph group_runtime["Runtime support"]
  node_config["Runtime configuration"]
  node_generation_limits["Generation limits"]
  node_error_handler["Problem responses"]
end

node_qa_user(("QA user"))
node_jira_service{{"Jira REST API"}}
node_ollama{{"Ollama model"}}

node_qa_user -->|"uses"| node_browser_ui
node_browser_ui -->|"requests generation"| node_test_controller
node_browser_ui -->|"reads configuration"| node_config_controller
node_test_controller -->|"delegates generation"| node_suite_service
node_suite_service -->|"fetches story"| node_jira_client
node_jira_client -->|"requests issue"| node_jira_service
node_jira_client -->|"flattens fields"| node_adf
node_jira_client -->|"extracts criteria"| node_criteria
node_jira_client -->|"maps issue"| node_story_model
node_suite_service -->|"generates cases"| node_generation_service
node_generation_service -->|"builds prompt"| node_prompt_factory
node_generation_service -->|"sends prompt"| node_ollama
node_generation_service -->|"parses output"| node_parser
node_parser -->|"creates cases"| node_test_models
node_suite_service -->|"maps result"| node_response
node_response -->|"returns JSON"| node_browser_ui
node_config_controller -->|"reports settings"| node_config
node_config_controller -->|"reports limits"| node_generation_limits
node_suite_service -->|"validates bounds"| node_generation_limits
node_error_handler -->|"returns problems"| node_browser_ui

click node_browser_ui "https://github.com/alexalkhatib/jira-testcase-generator/blob/main/src/main/resources/static/js/app.js"
click node_test_controller "https://github.com/alexalkhatib/jira-testcase-generator/blob/main/src/main/java/com/asecurityguru/jiratestgen/web/TestCaseController.java"
click node_config_controller "https://github.com/alexalkhatib/jira-testcase-generator/blob/main/src/main/java/com/asecurityguru/jiratestgen/web/ConfigController.java"
click node_response "https://github.com/alexalkhatib/jira-testcase-generator/blob/main/src/main/java/com/asecurityguru/jiratestgen/web/dto/GenerationResponse.java"
click node_suite_service "https://github.com/alexalkhatib/jira-testcase-generator/blob/main/src/main/java/com/asecurityguru/jiratestgen/service/TestSuiteService.java"
click node_jira_client "https://github.com/alexalkhatib/jira-testcase-generator/blob/main/src/main/java/com/asecurityguru/jiratestgen/jira/JiraRestClient.java"
click node_adf "https://github.com/alexalkhatib/jira-testcase-generator/blob/main/src/main/java/com/asecurityguru/jiratestgen/jira/AdfTextExtractor.java"
click node_criteria "https://github.com/alexalkhatib/jira-testcase-generator/blob/main/src/main/java/com/asecurityguru/jiratestgen/jira/AcceptanceCriteriaExtractor.java"
click node_story_model "https://github.com/alexalkhatib/jira-testcase-generator/blob/main/src/main/java/com/asecurityguru/jiratestgen/jira/JiraStory.java"
click node_generation_service "https://github.com/alexalkhatib/jira-testcase-generator/blob/main/src/main/java/com/asecurityguru/jiratestgen/ai/TestCaseGenerationService.java"
click node_prompt_factory "https://github.com/alexalkhatib/jira-testcase-generator/blob/main/src/main/java/com/asecurityguru/jiratestgen/ai/PromptFactory.java"
click node_parser "https://github.com/alexalkhatib/jira-testcase-generator/blob/main/src/main/java/com/asecurityguru/jiratestgen/ai/TestCaseResponseParser.java"
click node_test_models "https://github.com/alexalkhatib/jira-testcase-generator/blob/main/src/main/java/com/asecurityguru/jiratestgen/ai/model/TestCase.java"
click node_config "https://github.com/alexalkhatib/jira-testcase-generator/blob/main/src/main/java/com/asecurityguru/jiratestgen/config/JiraProperties.java"
click node_generation_limits "https://github.com/alexalkhatib/jira-testcase-generator/blob/main/src/main/java/com/asecurityguru/jiratestgen/config/GenerationProperties.java"
click node_error_handler "https://github.com/alexalkhatib/jira-testcase-generator/blob/main/src/main/java/com/asecurityguru/jiratestgen/web/ApiExceptionHandler.java"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_browser_ui,node_test_controller,node_config_controller,node_response,node_qa_user toneBlue
class node_suite_service toneAmber
class node_jira_client,node_adf,node_criteria,node_story_model,node_jira_service toneMint
class node_generation_service,node_prompt_factory,node_parser,node_test_models toneRose
class node_config,node_generation_limits,node_error_handler,node_ollama toneIndigo
```

## Components

### Web experience

- [Browser UI](https://github.com/alexalkhatib/jira-testcase-generator/blob/main/src/main/resources/static/js/app.js): `src/main/resources/static/js/app.js`
- [Test API](https://github.com/alexalkhatib/jira-testcase-generator/blob/main/src/main/java/com/asecurityguru/jiratestgen/web/TestCaseController.java): `src/main/java/com/asecurityguru/jiratestgen/web/TestCaseController.java`
- [Config API](https://github.com/alexalkhatib/jira-testcase-generator/blob/main/src/main/java/com/asecurityguru/jiratestgen/web/ConfigController.java): `src/main/java/com/asecurityguru/jiratestgen/web/ConfigController.java`
- [Typed response](https://github.com/alexalkhatib/jira-testcase-generator/blob/main/src/main/java/com/asecurityguru/jiratestgen/web/dto/GenerationResponse.java): `src/main/java/com/asecurityguru/jiratestgen/web/dto/GenerationResponse.java`

### Request orchestration

- [Suite orchestration](https://github.com/alexalkhatib/jira-testcase-generator/blob/main/src/main/java/com/asecurityguru/jiratestgen/service/TestSuiteService.java): `src/main/java/com/asecurityguru/jiratestgen/service/TestSuiteService.java`

### Jira ingestion

- [Jira REST client](https://github.com/alexalkhatib/jira-testcase-generator/blob/main/src/main/java/com/asecurityguru/jiratestgen/jira/JiraRestClient.java): `src/main/java/com/asecurityguru/jiratestgen/jira/JiraRestClient.java`
- [ADF text extraction](https://github.com/alexalkhatib/jira-testcase-generator/blob/main/src/main/java/com/asecurityguru/jiratestgen/jira/AdfTextExtractor.java): `src/main/java/com/asecurityguru/jiratestgen/jira/AdfTextExtractor.java`
- [Criteria extraction](https://github.com/alexalkhatib/jira-testcase-generator/blob/main/src/main/java/com/asecurityguru/jiratestgen/jira/AcceptanceCriteriaExtractor.java): `src/main/java/com/asecurityguru/jiratestgen/jira/AcceptanceCriteriaExtractor.java`
- [Jira story model](https://github.com/alexalkhatib/jira-testcase-generator/blob/main/src/main/java/com/asecurityguru/jiratestgen/jira/JiraStory.java): `src/main/java/com/asecurityguru/jiratestgen/jira/JiraStory.java`

### AI generation

- [Generation service](https://github.com/alexalkhatib/jira-testcase-generator/blob/main/src/main/java/com/asecurityguru/jiratestgen/ai/TestCaseGenerationService.java): `src/main/java/com/asecurityguru/jiratestgen/ai/TestCaseGenerationService.java`
- [Prompt builder](https://github.com/alexalkhatib/jira-testcase-generator/blob/main/src/main/java/com/asecurityguru/jiratestgen/ai/PromptFactory.java): `src/main/java/com/asecurityguru/jiratestgen/ai/PromptFactory.java`
- [Response parser](https://github.com/alexalkhatib/jira-testcase-generator/blob/main/src/main/java/com/asecurityguru/jiratestgen/ai/TestCaseResponseParser.java): `src/main/java/com/asecurityguru/jiratestgen/ai/TestCaseResponseParser.java`
- [Test case models](https://github.com/alexalkhatib/jira-testcase-generator/blob/main/src/main/java/com/asecurityguru/jiratestgen/ai/model/TestCase.java): `src/main/java/com/asecurityguru/jiratestgen/ai/model/TestCase.java`

### Runtime support

- [Runtime configuration](https://github.com/alexalkhatib/jira-testcase-generator/blob/main/src/main/java/com/asecurityguru/jiratestgen/config/JiraProperties.java): `src/main/java/com/asecurityguru/jiratestgen/config/JiraProperties.java`
- [Generation limits](https://github.com/alexalkhatib/jira-testcase-generator/blob/main/src/main/java/com/asecurityguru/jiratestgen/config/GenerationProperties.java): `src/main/java/com/asecurityguru/jiratestgen/config/GenerationProperties.java`
- [Problem responses](https://github.com/alexalkhatib/jira-testcase-generator/blob/main/src/main/java/com/asecurityguru/jiratestgen/web/ApiExceptionHandler.java): `src/main/java/com/asecurityguru/jiratestgen/web/ApiExceptionHandler.java`

### Other components

- **QA user**
- **Jira REST API**
- **Ollama model**

## Connections

- QA user → Browser UI: uses (evidence: `README.md`)
- Browser UI → Test API: requests generation (evidence: `README.md`)
- Browser UI → Config API: reads configuration (evidence: `README.md`)
- Test API → Suite orchestration: delegates generation (evidence: `src/main/java/com/asecurityguru/jiratestgen/web/TestCaseController.java`)
- Suite orchestration → Jira REST client: fetches story (evidence: `src/main/java/com/asecurityguru/jiratestgen/service/TestSuiteService.java`)
- Jira REST client → Jira REST API: requests issue (evidence: `README.md`)
- Jira REST client → ADF text extraction: flattens fields (evidence: `src/main/java/com/asecurityguru/jiratestgen/jira/JiraRestClient.java`)
- Jira REST client → Criteria extraction: extracts criteria (evidence: `src/main/java/com/asecurityguru/jiratestgen/jira/JiraRestClient.java`)
- Jira REST client → Jira story model: maps issue (evidence: `src/main/java/com/asecurityguru/jiratestgen/jira/JiraRestClient.java`)
- Suite orchestration → Generation service: generates cases (evidence: `src/main/java/com/asecurityguru/jiratestgen/service/TestSuiteService.java`)
- Generation service → Prompt builder: builds prompt (evidence: `src/main/java/com/asecurityguru/jiratestgen/ai/TestCaseGenerationService.java`)
- Generation service → Ollama model: sends prompt (evidence: `README.md`)
- Generation service → Response parser: parses output (evidence: `src/main/java/com/asecurityguru/jiratestgen/ai/TestCaseGenerationService.java`)
- Response parser → Test case models: creates cases (evidence: `src/main/java/com/asecurityguru/jiratestgen/ai/TestCaseResponseParser.java`)
- Suite orchestration → Typed response: maps result (evidence: `src/main/java/com/asecurityguru/jiratestgen/service/TestSuiteService.java`)
- Typed response → Browser UI: returns JSON (evidence: `README.md`)
- Config API → Runtime configuration: reports settings (evidence: `src/main/java/com/asecurityguru/jiratestgen/web/ConfigController.java`)
- Config API → Generation limits: reports limits (evidence: `src/main/java/com/asecurityguru/jiratestgen/web/ConfigController.java`)
- Suite orchestration → Generation limits: validates bounds (evidence: `src/main/java/com/asecurityguru/jiratestgen/service/TestSuiteService.java`)
- Problem responses → Browser UI: returns problems (evidence: `README.md`)
