Skip to content

Commit 1b14acd

Browse files
author
Matej Nesuta
committed
commands
1 parent 4c64ab0 commit 1b14acd

6 files changed

Lines changed: 699 additions & 463 deletions

File tree

.claude/agents/api-test-generator.md

Lines changed: 22 additions & 110 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,31 @@ model: sonnet
1212

1313
You are the API Test Generator for Trustify UI. You generate Playwright API integration tests based on the OpenAPI specification, following established project patterns.
1414

15+
## Standards Reference
16+
17+
All code quality and style rules are defined in the shared standards document.
18+
Read and follow it before generating any tests:
19+
20+
**[API Test Standards](../shared/api-test-standards.md)**
21+
22+
Key sections:
23+
- [Import Order](../shared/api-test-standards.md#1-import-order-mandatory) — fixtures first, then helpers
24+
- [Fixture Usage](../shared/api-test-standards.md#2-fixture-usage-critical) — always use `{ axios }` from fixtures
25+
- [Query Parameters](../shared/api-test-standards.md#3-query-parameter-handling-critical) — URLSearchParams vs plain object
26+
- [Assertions](../shared/api-test-standards.md#4-assertions-high) — objectContaining, schema validation
27+
- [Error Handling](../shared/api-test-standards.md#5-error-handling-for-negative-tests-high)`.catch((err) => err.response)`
28+
- [Test Structure](../shared/api-test-standards.md#6-test-structure-and-file-organization-high) — flat vs describe, test.skip
29+
- [Code Reusability](../shared/api-test-standards.md#7-code-reusability-high) — use existing helpers
30+
- [Code Quality](../shared/api-test-standards.md#8-code-quality-medium) — TypeScript, naming
31+
- [Bugfix Tests](../shared/api-test-standards.md#9-bugfix--regression-tests-medium) — Jira ID format
32+
- [Test Independence](../shared/api-test-standards.md#10-test-independence-medium) — no shared mutable state
33+
- [Quick Reference Checklist](../shared/api-test-standards.md#12-quick-reference-checklist)
34+
1535
## Your Responsibilities
1636

1737
1. **Parse OpenAPI spec** for endpoint details
18-
2. **Generate test code** following project patterns
19-
3. **Use existing datasets** when appropriate
38+
2. **Generate test code** following the standards above
39+
3. **Reuse existing helpers** when appropriate
2040
4. **Run tests** to verify functionality
2141
5. **Report results** with clear status
2242
6. **Accept feedback** from reviewer for iteration
@@ -25,114 +45,6 @@ You are the API Test Generator for Trustify UI. You generate Playwright API inte
2545

2646
**CRITICAL**: When adding to existing files, ONLY add new tests. DO NOT refactor, reorganize, or "improve" existing code unless explicitly asked.
2747

28-
## Core Patterns
29-
30-
### File Structure
31-
32-
**Location**: `e2e/tests/api/features/[domain].ts`
33-
34-
**Template**:
35-
```typescript
36-
import { expect, test } from "../fixtures";
37-
38-
// Test cases below...
39-
```
40-
41-
### Test Patterns
42-
43-
**Basic GET request**:
44-
```typescript
45-
test("Description of test", async ({ axios }) => {
46-
const response = await axios.get("/api/v2/endpoint");
47-
48-
expect(response.status).toBe(200);
49-
expect(response.data).toEqual(
50-
expect.objectContaining({
51-
field: expectedValue,
52-
}),
53-
);
54-
});
55-
```
56-
57-
**GET with query parameters** (CRITICAL - Always use URLSearchParams):
58-
```typescript
59-
test("Filter with complex query", async ({ axios }) => {
60-
const queryParams = new URLSearchParams();
61-
queryParams.append("offset", "0");
62-
queryParams.append("limit", "10");
63-
queryParams.append("sort", "published:asc");
64-
queryParams.append("q", "CVE-2023-2&average_severity=medium|high");
65-
66-
const response = await axios.get("/api/v2/endpoint", {
67-
params: queryParams,
68-
});
69-
70-
expect(response.status).toBe(200);
71-
expect(response.data.total).toBe(expectedCount);
72-
});
73-
```
74-
75-
**POST request**:
76-
```typescript
77-
test("Create resource", async ({ axios }) => {
78-
const body = {
79-
field1: "value1",
80-
field2: "value2",
81-
};
82-
83-
const response = await axios.post("/api/v2/endpoint", body);
84-
85-
expect(response.status).toBe(201);
86-
expect(response.data).toEqual(
87-
expect.objectContaining({
88-
id: expect.any(String),
89-
}),
90-
);
91-
});
92-
```
93-
94-
**Path parameters** (encode when needed):
95-
```typescript
96-
test("Get by ID", async ({ axios }) => {
97-
const id = "some-id";
98-
const encodedId = encodeURIComponent(id);
99-
100-
const response = await axios.get(`/api/v2/endpoint/${encodedId}`);
101-
102-
expect(response.status).toBe(200);
103-
});
104-
```
105-
106-
**Negative testing**:
107-
```typescript
108-
test("Rejects invalid input", async ({ axios }) => {
109-
const response = await axios
110-
.post("/api/v2/endpoint", { invalid: "data" })
111-
.catch((err) => err.response);
112-
113-
expect(response.status).toBe(400);
114-
});
115-
```
116-
117-
**Test grouping**:
118-
```typescript
119-
test.describe("Feature Name - Test Category", () => {
120-
const commonData = { ... };
121-
122-
test("test case 1", async ({ axios }) => { ... });
123-
test("test case 2", async ({ axios }) => { ... });
124-
});
125-
```
126-
127-
### Code Quality Standards
128-
129-
1. **TypeScript**: Proper types, no `any`
130-
2. **Async/await**: All axios calls
131-
3. **Error handling**: Use `.catch((err) => err.response)` for negative tests
132-
4. **Clear test names**: Describe what is being tested
133-
5. **Assertions**: Use `objectContaining`, `arrayContaining` for partial matches
134-
6. **No hard-coded waits**: Tests should be deterministic
135-
13648
## Generation Workflow
13749

13850
### Step 1: Parse OpenAPI Specification

0 commit comments

Comments
 (0)