AutomationFlowsAI & RAG › Test Case Generator

Test Case Generator

Test Case Generator. Uses jira, gmail, lmChatGoogleGemini, agent. Event-driven trigger; 25 nodes.

Event trigger★★★★☆ complexityAI-powered25 nodesJiraGmailGoogle Gemini ChatAgentGoogle Sheets
AI & RAG Trigger: Event Nodes: 25 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow follows the Agent → Gmail recipe pattern — see all workflows that pair these two integrations.

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "name": "Test Case Generator",
  "nodes": [
    {
      "parameters": {},
      "type": "n8n-nodes-base.manualTrigger",
      "typeVersion": 1,
      "position": [
        -864,
        528
      ],
      "id": "2d4d6f74-abf5-4ad0-ba33-20d743f1e831",
      "name": "Manual Trigger"
    },
    {
      "parameters": {
        "operation": "getAll",
        "options": {
          "jql": "=project = ShopNestAutomation AND issuetype = Story AND status = \"To Do\" AND sprint = \n\"Sprint 3\""
        }
      },
      "type": "n8n-nodes-base.jira",
      "typeVersion": 1,
      "position": [
        -640,
        528
      ],
      "id": "626a9cfe-f3f0-4107-b975-f5b6489d05d5",
      "name": "Fetch Jira Stories",
      "alwaysOutputData": true,
      "credentials": {
        "jiraSoftwareCloudApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "8a41353b-a1b4-4b70-acd6-21b2172e201b",
              "name": "story_id",
              "value": "={{ $json.key }}",
              "type": "string"
            },
            {
              "id": "602f8162-cd76-4bd9-ae9c-d096423b9961",
              "name": "description",
              "value": "={{ $json.fields.description }}",
              "type": "string"
            },
            {
              "id": "d59e518a-adb9-4131-a7ab-41aea2da42bb",
              "name": "title",
              "value": "={{ $json.fields.summary }}",
              "type": "string"
            },
            {
              "id": "bd64b72c-bde9-4eff-a9c7-4c2ede8e67b7",
              "name": "priority",
              "value": "={{ $json.fields.priority.name }}",
              "type": "string"
            },
            {
              "id": "56d3d384-200e-4a2e-bc3c-253863be5568",
              "name": "status",
              "value": "={{ $json.fields.status.name }}",
              "type": "string"
            },
            {
              "id": "518ef427-33e8-47ff-8d1e-d453c3d21377",
              "name": "story_type",
              "value": "={{ $json.fields.issuetype.name }}",
              "type": "string"
            },
            {
              "id": "b5492fef-6f3e-436f-8723-b55e877bb3c6",
              "name": "sprint_name",
              "value": "={{ $json.fields.customfield_10020[0].name }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        -416,
        528
      ],
      "id": "df0dcc30-63c6-4075-9201-0c1379b7f801",
      "name": "Extract Story Fields"
    },
    {
      "parameters": {
        "options": {}
      },
      "type": "n8n-nodes-base.splitInBatches",
      "typeVersion": 3,
      "position": [
        -192,
        528
      ],
      "id": "ebb09c96-47d7-4119-a937-99a1720d7479",
      "name": "Loop Each Story",
      "alwaysOutputData": false
    },
    {
      "parameters": {
        "jsCode": "const raw = $input.first().json.output;\n\n// Clean the raw output\nconst cleaned = raw\n  .replace(/```json/g, '')\n  .replace(/```/g, '')\n  .replace(/\\\\n/g, '')\n  .replace(/\\n/g, '')\n  .trim();\n\n// Find the JSON array\nconst startBracket = cleaned.indexOf('[');\nconst lastBracket = cleaned.lastIndexOf(']');\n\nif (startBracket === -1 || lastBracket === -1) {\n  throw new Error('No valid JSON array found in output: ' + cleaned.substring(0, 100));\n}\n\nconst jsonString = cleaned.substring(startBracket, lastBracket + 1) + ']';\n\nlet testCases;\ntry {\n  testCases = JSON.parse(cleaned);\n} catch(e) {\n  try {\n    testCases = JSON.parse(jsonString);\n  } catch(e2) {\n    throw new Error('Failed to parse JSON: ' + cleaned.substring(0, 200));\n  }\n}\n\nconst currentStory = $('Extract Story Fields').item.json;\n\nreturn testCases.map((tc, index) => ({\n  json: {\n    ...tc,\n    unique_id: `${currentStory.story_id}-TC${String(index + 1).padStart(3, '0')}`,\n    story_id: currentStory.story_id,\n    story_title: `${currentStory.story_id} - ${currentStory.title}`,\n    'Test Title': tc['Test Title'] || tc.title,\n    test_id: `TC${String(index + 1).padStart(3, '0')}`,\n    sprint_name: currentStory.sprint_name,\n    status: 'Not Executed'\n  }\n}));"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        768,
        544
      ],
      "id": "6a4be8fe-d590-463e-a953-924e0fddbb35",
      "name": "Parse Test Cases"
    },
    {
      "parameters": {
        "sendTo": "test.demouser26@gmail.com",
        "subject": "QA Test Case Generation Complete",
        "emailType": "text",
        "message": "=  Project: ShopNestAutomation\n \n  Sprint: {{ $json.concatenated_Sprint.split(\",\")[0] }}\n  Stories Processed: {{ $json.unique_count_Story_ID }}\n  Test Cases Generated:{{ $json.count_Test_Title }}\n  \n  All user stories have been processed by the AI Test Case Generator.\n  \n  Please check Google Sheets for the generated test cases:\n  - Sheet: {{ $json.concatenated_Sprint.split(\",\")[0] }}\n  - Status: Not Executed\n  - Generated: {{ $now }}\n  \n  This is an automated message from your n8n QA Pipeline.",
        "options": {}
      },
      "type": "n8n-nodes-base.gmail",
      "typeVersion": 2.2,
      "position": [
        720,
        160
      ],
      "id": "a2c58889-261c-4936-a045-f3cb5b81ad28",
      "name": "Notify QA Team",
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "project": {
          "__rl": true,
          "value": "10001",
          "mode": "list",
          "cachedResultName": "ShopNestAutomation"
        },
        "issueType": {
          "__rl": true,
          "value": "10010",
          "mode": "list",
          "cachedResultName": "Subtask"
        },
        "summary": "={{ $json['Test Title'] }}",
        "additionalFields": {
          "description": "={{ $json.Preconditions }}",
          "parentIssueKey": "={{ $json['Story ID'] }}"
        }
      },
      "type": "n8n-nodes-base.jira",
      "typeVersion": 1,
      "position": [
        1984,
        528
      ],
      "id": "18306884-8b51-4788-8c58-724b3f0aa586",
      "name": "Create Jira Subtask",
      "credentials": {
        "jiraSoftwareCloudApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "fieldsToSummarize": {
          "values": [
            {
              "aggregation": "countUnique",
              "field": "Story ID"
            },
            {
              "field": "Test Title"
            },
            {
              "aggregation": "concatenate",
              "field": "Sprint"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.summarize",
      "typeVersion": 1.1,
      "position": [
        528,
        160
      ],
      "id": "dc3be8da-05c4-4e1a-ab40-3e71ce9cf309",
      "name": "Summarize",
      "alwaysOutputData": true
    },
    {
      "parameters": {
        "operation": "update",
        "issueKey": "={{ $json.story_id }}",
        "updateFields": {
          "statusId": {
            "__rl": true,
            "value": "21",
            "mode": "id"
          }
        }
      },
      "type": "n8n-nodes-base.jira",
      "typeVersion": 1,
      "position": [
        224,
        544
      ],
      "id": "fe1dc7f3-15d6-48bf-b008-b6226ccf3b65",
      "name": "Update an issue",
      "credentials": {
        "jiraSoftwareCloudApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "amount": 2
      },
      "type": "n8n-nodes-base.wait",
      "typeVersion": 1.1,
      "position": [
        32,
        544
      ],
      "id": "04f4104b-e16c-45a4-993d-ebcc89e40c19",
      "name": "Wait"
    },
    {
      "parameters": {
        "amount": 2
      },
      "type": "n8n-nodes-base.wait",
      "typeVersion": 1.1,
      "position": [
        960,
        544
      ],
      "id": "71d5574f-5bdf-4eac-9def-ab2b0bd6426c",
      "name": "Wait1"
    },
    {
      "parameters": {},
      "type": "n8n-nodes-base.merge",
      "typeVersion": 3.2,
      "position": [
        288,
        160
      ],
      "id": "5d879264-e54a-4e44-90ea-408e9d084809",
      "name": "Merge",
      "alwaysOutputData": true
    },
    {
      "parameters": {
        "content": "## Happy Path",
        "height": 544,
        "width": 1824,
        "color": 2
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -928,
        400
      ],
      "id": "18a20b68-7c6e-452a-a5d4-5145c3a21c18",
      "name": "Sticky Note"
    },
    {
      "parameters": {
        "content": "## Notification:",
        "height": 384,
        "width": 912,
        "color": 3
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        0,
        16
      ],
      "id": "2255085e-564a-4be5-811f-a24229e632bc",
      "name": "Sticky Note1"
    },
    {
      "parameters": {
        "content": "## AI Score Test Case",
        "height": 560,
        "width": 544,
        "color": 5
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        896,
        384
      ],
      "id": "e83ff196-bf3b-483b-8a5e-4ccf4a1ba162",
      "name": "Sticky Note2"
    },
    {
      "parameters": {
        "content": "## Failed \u2192 Alert sent to team",
        "height": 240,
        "width": 816,
        "color": 6
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        1440,
        704
      ],
      "id": "63bf5207-87a6-4a1e-a2c9-af5d58c0061c",
      "name": "Sticky Note3"
    },
    {
      "parameters": {
        "content": "## Passed \u2192 Logged to Sheets + Jira",
        "height": 320,
        "width": 816,
        "color": 2
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        1440,
        384
      ],
      "id": "1bde9040-5fac-46dd-8877-08eab1b19767",
      "name": "Sticky Note4"
    },
    {
      "parameters": {
        "modelName": "models/gemini-3.5-flash-lite",
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "typeVersion": 1,
      "position": [
        560,
        768
      ],
      "id": "cf9e013d-8994-4d13-8688-4b9581b92abf",
      "name": "Google Gemini Chat Model2",
      "credentials": {
        "googlePalmApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "=Story: {{ $('Extract Story Fields').item.json.title }}\nDescription: {{ $('Extract Story Fields').item.json.description }}\n\nGenerate exactly 3 test cases:\n- 1 Positive (happy path)\n- 1 Negative (error scenario)  \n- 1 Edge case\n\nRules:\n- Test Title: describe specific scenario, NOT story name\n- Steps: minimum 5 numbered steps, include exact button/field names and data values\n- Expected Result: specific and measurable, max 20 words\n- Cover ALL acceptance criteria from description above\n\nReturn ONLY this JSON format:\n[\n  {\n    \"Test Title\": \"specific scenario description\",\n    \"Preconditions\": \"specific setup required\",\n    \"Steps\": \"1. specific action 2. specific action 3. specific action 4. specific action 5. verify result\",\n    \"Expected Result\": \"specific measurable outcome\",\n    \"Priority\": \"High/Medium/Low\",\n    \"Type\": \"Positive/Negative/Edge\"\n  }\n]",
        "hasOutputParser": true,
        "options": {
          "systemMessage": "You are a senior QA engineer creating test cases that score 7+ out of 10.\n\nScoring criteria:\n- Clarity of steps (1-3): Steps must be numbered, specific, include exact UI element names\n- Completeness of expected result (1-3): Must be measurable and specific\n- Coverage of acceptance criteria (1-4): Must cover all story requirements\n\nReturn ONLY a valid JSON array, no markdown, no code fences.\n\nSTRICT RULE: Generate EXACTLY 3 test cases. No more, no less.\nArray must have exactly 3 objects."
        }
      },
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 2,
      "position": [
        448,
        544
      ],
      "id": "ff149201-ed4a-40b0-8e40-5368fdb8df91",
      "name": "Generate Test Case",
      "alwaysOutputData": true
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "=Score these test cases for story: {{ $('Extract Story Fields').item.json.title }}\n\nTest Cases:\n{{ $json['Test Title'] }}\n\nSteps:\n{{ $json['Steps'] }}\n\nExpected Results:\n{{ $json['Expected Result'] }}\n\nEvaluate ALL test cases together on:\n1. Clarity of steps (1-3)\n2. Completeness of expected result (1-3)\n3. Coverage of acceptance criteria (1-4)\n\nReturn ONLY this JSON:\n{\n  \"score\": 8,\n  \"approved\": true,\n  \"feedback\": \"reason if score below 10\"\n}\n\n\n\nRules:\n- Score >= 8 = approved true\n- Score < 8 = approved false\n- Max score = 10",
        "options": {
          "systemMessage": "You are a QA review expert. Score a batch of test cases.\nReturn ONLY valid JSON, no markdown, no code fences."
        }
      },
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 2,
      "position": [
        1184,
        544
      ],
      "id": "afc1f279-38b7-4d0d-ab81-33af78f44401",
      "name": "Score Quality",
      "retryOnFail": true,
      "maxTries": 2,
      "waitBetweenTries": 5000
    },
    {
      "parameters": {
        "modelName": "models/gemini-3.6-flash",
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "typeVersion": 1,
      "position": [
        1184,
        800
      ],
      "id": "2ff54bd5-e5da-4253-a5d6-ebea7bc04e08",
      "name": "Google Gemini Chat Model1",
      "credentials": {
        "googlePalmApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 2
          },
          "conditions": [
            {
              "id": "ff3ce0c4-a6d8-4009-8c25-236cc102714c",
              "leftValue": "={{ JSON.parse($json.output.replace(/\\\\n/g, '').replace(/\\n/g, '')).approved }}",
              "rightValue": "",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.2,
      "position": [
        1552,
        544
      ],
      "id": "1eb44d68-198f-4329-b18c-14f02a8729db",
      "name": "If"
    },
    {
      "parameters": {
        "operation": "appendOrUpdate",
        "documentId": {
          "__rl": true,
          "value": "1RBQC1q_s320cgJ5Ys_pRGYuIZosjOrPzQe7wGc81cjo",
          "mode": "list",
          "cachedResultName": "ShopNest QA Test Cases",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1RBQC1q_s320cgJ5Ys_pRGYuIZosjOrPzQe7wGc81cjo/edit?usp=drivesdk"
        },
        "sheetName": {
          "__rl": true,
          "value": "gid=0",
          "mode": "list",
          "cachedResultName": "Sprint1",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1RBQC1q_s320cgJ5Ys_pRGYuIZosjOrPzQe7wGc81cjo/edit#gid=0"
        },
        "columns": {
          "mappingMode": "defineBelow",
          "value": {
            "Story ID": "={{ $('Parse Test Cases').item.json.story_id }}",
            "Unique ID": "={{ $('Parse Test Cases').item.json.unique_id }}",
            "Story Title": "={{ $('Parse Test Cases').item.json.story_title }}",
            "Test Title": "={{ $('Parse Test Cases').item.json['Test Title'] }}",
            "Preconditions": "={{ $('Parse Test Cases').item.json.Preconditions }}",
            "Steps": "={{ $('Parse Test Cases').item.json.Steps }}",
            "Expected Result": "={{ $('Parse Test Cases').item.json['Expected Result'] }}",
            "Priority": "={{ $('Parse Test Cases').item.json.Priority }}",
            "Type": "={{ $('Parse Test Cases').item.json.Type }}",
            "Status": "={{ $('Parse Test Cases').item.json.status }}",
            "Date": "={{$now}}",
            "Test ID": "={{ $('Parse Test Cases').item.json.test_id }}",
            "Sprint": "={{ $('Extract Story Fields').item.json.sprint_name }}"
          },
          "matchingColumns": [
            "Unique ID"
          ],
          "schema": [
            {
              "id": "Unique ID",
              "displayName": "Unique ID",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": false
            },
            {
              "id": "Test ID",
              "displayName": "Test ID",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": false
            },
            {
              "id": "Sprint",
              "displayName": "Sprint",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": false
            },
            {
              "id": "Story ID",
              "displayName": "Story ID",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": false
            },
            {
              "id": "Story Title",
              "displayName": "Story Title",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": false
            },
            {
              "id": "Test Title",
              "displayName": "Test Title",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": false
            },
            {
              "id": "Preconditions",
              "displayName": "Preconditions",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": false
            },
            {
              "id": "Steps",
              "displayName": "Steps",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": false
            },
            {
              "id": "Expected Result",
              "displayName": "Expected Result",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": false
            },
            {
              "id": "Priority",
              "displayName": "Priority",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": false
            },
            {
              "id": "Type",
              "displayName": "Type",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": false
            },
            {
              "id": "Status",
              "displayName": "Status",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": false
            },
            {
              "id": "Date",
              "displayName": "Date",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": false
            }
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {}
      },
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.6,
      "position": [
        1792,
        528
      ],
      "id": "761f03c8-de45-4ebe-aaa3-c1098c433d13",
      "name": "Google Sheets",
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "sendTo": " test.demouser26@gmail.com",
        "subject": "=\u26a0\ufe0f QA Alert: Test Cases Failed Quality Check - {{ $('Extract Story Fields').first().json.sprint_name }}",
        "emailType": "text",
        "message": "=Project: ShopNestAutomation Sprint: {{ $('Extract Story Fields').first().json.sprint_name }} Story: {{ $('Extract Story Fields').first().json.title }}  Some test cases failed quality check after regeneration and require manual review.  Story ID: {{ $json.story_id }} Status: Failed Quality Check Generated: {{ $now }}  Please manually create test cases for this story or re-run the pipeline.  This is an automated message from your n8n QA Pipeline.",
        "options": {}
      },
      "type": "n8n-nodes-base.gmail",
      "typeVersion": 2.1,
      "position": [
        1920,
        768
      ],
      "id": "d0496174-8494-40ef-9c67-0ccdae3045d0",
      "name": "Gmail",
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "1ade4796-a355-435d-bf6e-a1843ccc2a77",
              "name": "Story ID",
              "value": "={{ $('Google Sheets').item.json['Story ID'] }}",
              "type": "string"
            },
            {
              "id": "d6ffbbe5-6265-46c5-af6f-604586128e25",
              "name": "Test Title",
              "value": "={{ $('Google Sheets').item.json['Test Title'] }}",
              "type": "string"
            },
            {
              "id": "8ddf0f91-1dd5-4976-aa94-047c0d29ec26",
              "name": "Priority",
              "value": "={{ $('Google Sheets').item.json.Priority }}",
              "type": "string"
            },
            {
              "id": "d48f17f0-3dee-482a-8a6f-621f05be19ea",
              "name": "Type",
              "value": "={{ $('Google Sheets').item.json.Type }}",
              "type": "string"
            },
            {
              "id": "b462a9dd-3011-460b-acbc-14a8fe38efa7",
              "name": "Sprint",
              "value": "={{ $('Google Sheets').item.json.Sprint }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.5,
      "position": [
        2160,
        528
      ],
      "id": "108cb53d-630f-4206-93dc-5fc58a653b34",
      "name": "Edit Fields"
    }
  ],
  "connections": {
    "Manual Trigger": {
      "main": [
        [
          {
            "node": "Fetch Jira Stories",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch Jira Stories": {
      "main": [
        [
          {
            "node": "Extract Story Fields",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract Story Fields": {
      "main": [
        [
          {
            "node": "Loop Each Story",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Loop Each Story": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 1
          }
        ],
        [
          {
            "node": "Wait",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parse Test Cases": {
      "main": [
        [
          {
            "node": "Wait1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait": {
      "main": [
        [
          {
            "node": "Update an issue",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge": {
      "main": [
        [
          {
            "node": "Summarize",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Update an issue": {
      "main": [
        [
          {
            "node": "Generate Test Case",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Gemini Chat Model2": {
      "ai_languageModel": [
        [
          {
            "node": "Generate Test Case",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Wait1": {
      "main": [
        [
          {
            "node": "Score Quality",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Gemini Chat Model1": {
      "ai_languageModel": [
        [
          {
            "node": "Score Quality",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Score Quality": {
      "main": [
        [
          {
            "node": "If",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "If": {
      "main": [
        [
          {
            "node": "Google Sheets",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Gmail",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Sheets": {
      "main": [
        [
          {
            "node": "Create Jira Subtask",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate Test Case": {
      "main": [
        [
          {
            "node": "Parse Test Cases",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create Jira Subtask": {
      "main": [
        [
          {
            "node": "Edit Fields",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Edit Fields": {
      "main": [
        [
          {
            "node": "Loop Each Story",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Summarize": {
      "main": [
        [
          {
            "node": "Notify QA Team",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1",
    "binaryMode": "separate"
  },
  "versionId": "230e4f80-c9cc-4f84-96fe-d7689cb4e77a",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "nodeGroups": [],
  "id": "3BF804FWYjawYhwr",
  "tags": []
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

Test Case Generator. Uses jira, gmail, lmChatGoogleGemini, agent. Event-driven trigger; 25 nodes.

Source: https://github.com/swatijanapana/qa-test-case-generator-n8n/blob/main/workflow/test-case-generator.json — original creator credit. Request a take-down →

More AI & RAG workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

AI & RAG

Arvifund - Supabase (Fixed v5). Uses httpRequest, telegram, googleSheets, telegramTrigger. Event-driven trigger; 91 nodes.

HTTP Request, Telegram, Google Sheets +9
AI & RAG

Arvifund - Supabase. Uses httpRequest, telegram, googleSheets, telegramTrigger. Event-driven trigger; 90 nodes.

HTTP Request, Telegram, Google Sheets +8
AI & RAG

Arvifund - Supabase (Fixed v2). Uses httpRequest, telegram, googleSheets, telegramTrigger. Event-driven trigger; 90 nodes.

HTTP Request, Telegram, Google Sheets +9
AI & RAG

Arvifund - Supabase (Fixed v4). Uses httpRequest, telegram, googleSheets, telegramTrigger. Event-driven trigger; 90 nodes.

HTTP Request, Telegram, Google Sheets +9
AI & RAG

Arvifund - Supabase (Fixed v3). Uses httpRequest, telegram, googleSheets, telegramTrigger. Event-driven trigger; 90 nodes.

HTTP Request, Telegram, Google Sheets +9