Skip to content

Commit bb1e6a6

Browse files
committed
docs: Update all documentation and samples for new expect API
This commit updates all documentation, sample code, and tests to use the new expect API introduced in probitas v0.4.0 (PR #25) and probitas-client (PR #55). Changes: - Replace .ok() with .toBeSuccessful() - Replace .status(code) with .toHaveStatus(code) - Replace .dataContains() with .toHaveContentContaining() - Replace .count() with .toHaveRowCount() or .toHaveContent() - Replace .contentType() with .toHaveHeader("content-type", ...) - Replace .textContains() with .toHaveText() - Replace .durationLessThan() with .toHaveDurationLessThan() Modified files: - docs/overview.md, docs/client.md, docs/scenario.md - data/index/*.probitas.ts (all sample codes) - probitas/site-health.probitas.ts - .claude/content.md
1 parent 81002c8 commit bb1e6a6

9 files changed

Lines changed: 129 additions & 100 deletions

File tree

.claude/content.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ export default scenario("Example")
8686
.resource("http", client.http.createHttpClient())
8787
.step("make request", async ({ http }) => {
8888
const res = await http.get("/api/users");
89-
expect(res).ok().status(200);
89+
expect(res).toBeSuccessful().toHaveStatus(200);
9090
})
9191
.build();
9292
```

data/index/graphql_api.probitas.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ export default scenario("GraphQL API Test", {
1616
`);
1717

1818
expect(res)
19-
.ok()
20-
.dataContains({ echo: "Hello GraphQL" });
19+
.toBeSuccessful()
20+
.toHaveContentContaining({ echo: "Hello GraphQL" });
2121
})
2222
.step("echo - with variables", async (ctx) => {
2323
const { gql } = ctx.resources;
@@ -31,8 +31,8 @@ export default scenario("GraphQL API Test", {
3131
);
3232

3333
expect(res)
34-
.ok()
35-
.dataContains({ echo: "variable message" });
34+
.toBeSuccessful()
35+
.toHaveContentContaining({ echo: "variable message" });
3636
})
3737
.step("createMessage - mutation", async (ctx) => {
3838
const { gql } = ctx.resources;
@@ -45,6 +45,6 @@ export default scenario("GraphQL API Test", {
4545
}
4646
`);
4747

48-
expect(res).ok();
48+
expect(res).toBeSuccessful();
4949
})
5050
.build();

data/index/grpc_service.probitas.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ export default scenario("gRPC Service Test", {
1414
});
1515

1616
expect(res)
17-
.ok()
18-
.dataContains({ message: "Hello from probitas" });
17+
.toBeSuccessful()
18+
.toHaveContentContaining({ message: "Hello from probitas" });
1919
})
2020
.step("EchoWithDelay - delayed response", async (ctx) => {
2121
const { grpc } = ctx.resources;
@@ -25,8 +25,8 @@ export default scenario("gRPC Service Test", {
2525
});
2626

2727
expect(res)
28-
.ok()
29-
.dataContains({ message: "delayed" })
30-
.durationLessThan(5000);
28+
.toBeSuccessful()
29+
.toHaveContentContaining({ message: "delayed" })
30+
.toHaveDurationLessThan(5000);
3131
})
3232
.build();

data/index/redis_cache.probitas.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,14 @@ export default scenario("Redis Cache Test", {
1919
await redis.set(key, "hello world");
2020
const res = await redis.get(key);
2121

22-
expect(res).ok().value("hello world");
22+
expect(res).toBeSuccessful().toHaveContent("hello world");
2323
})
2424
.step("INCR counter", async (ctx) => {
2525
const { redis } = ctx.resources;
2626
await redis.set("test:counter", "0");
2727
const res = await redis.incr("test:counter");
2828

29-
expect(res).ok().count(1);
29+
expect(res).toBeSuccessful().toHaveContent(1);
3030

3131
// Cleanup
3232
await redis.del("test:counter");

data/index/user_api.probitas.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ export default scenario("User API Integration Test", {
3737
const res = await http.get(`/users/${user.id}`);
3838

3939
expect(res)
40-
.ok()
41-
.status(200)
42-
.dataContains({ id: user.id, name: user.name });
40+
.toBeSuccessful()
41+
.toHaveStatus(200)
42+
.toHaveContentContaining({ id: user.id, name: user.name });
4343
})
4444
.build();

docs/client.md

Lines changed: 33 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ export default scenario("API Test")
2626
.step("Make request", async (ctx) => {
2727
const { http } = ctx.resources;
2828
const res = await http.get("/health");
29-
expect(res).ok();
29+
expect(res).toBeSuccessful();
3030
})
3131
.build();
3232
```
@@ -118,16 +118,16 @@ Validate responses with chainable assertions:
118118

119119
```typescript
120120
expect(res)
121-
.ok() // Status 2xx
122-
.status(200) // Exact status code
123-
.contentType(/application\/json/) // Content-Type pattern
124-
.dataContains({ name: "Alice" }) // Partial JSON match
125-
.durationLessThan(1000); // Response time limit
121+
.toBeSuccessful() // Status 2xx
122+
.toHaveStatus(200) // Exact status code
123+
.toHaveHeader("content-type", /application\/json/) // Content-Type pattern
124+
.toHaveContentContaining({ name: "Alice" }) // Partial JSON match
125+
.toHaveDurationLessThan(1000); // Response time limit
126126

127127
// Additional assertions
128-
expect(res).notOk(); // Status not 2xx
129-
expect(res).headerExists("X-Request-Id");
130-
expect(res).textContains("success");
128+
expect(res).not.toBeSuccessful(); // Status not 2xx
129+
expect(res).toHaveHeader("X-Request-Id");
130+
expect(res).toHaveText(/success/);
131131
```
132132

133133
## SQL Clients
@@ -201,12 +201,12 @@ Validate query results:
201201

202202
```typescript
203203
expect(result)
204-
.ok()
205-
.count(1)
206-
.dataContains({ name: "Alice" });
204+
.toBeSuccessful()
205+
.toHaveRowCount(1)
206+
.toHaveContentContaining({ name: "Alice" });
207207

208208
// Match multiple rows
209-
expect(result).dataEquals([
209+
expect(result).toHaveContent([
210210
{ id: 1, name: "Alice" },
211211
{ id: 2, name: "Bob" },
212212
]);
@@ -235,7 +235,7 @@ const res = await grpc.call("echo.EchoService", "Echo", {
235235
message: "Hello",
236236
});
237237

238-
expect(res).ok().dataContains({ message: "Hello" });
238+
expect(res).toBeSuccessful().toHaveContentContaining({ message: "Hello" });
239239
const data = res.data();
240240
```
241241

@@ -250,7 +250,7 @@ for await (
250250
count: 3,
251251
})
252252
) {
253-
expect(res).ok();
253+
expect(res).toBeSuccessful();
254254
messages.push(res.data());
255255
}
256256
```
@@ -269,7 +269,7 @@ const res = await grpc.clientStream(
269269
yield { message: "Third" };
270270
},
271271
);
272-
expect(res).ok();
272+
expect(res).toBeSuccessful();
273273
```
274274

275275
### Bidirectional Streaming
@@ -287,7 +287,7 @@ for await (
287287
},
288288
)
289289
) {
290-
expect(res).ok();
290+
expect(res).toBeSuccessful();
291291
console.log("Received:", res.data());
292292
}
293293
```
@@ -310,7 +310,7 @@ const res = await connect.call("echo.EchoService", "Echo", {
310310
message: "Hello",
311311
});
312312

313-
expect(res).ok().dataContains({ message: "Hello" });
313+
expect(res).toBeSuccessful().toHaveContentContaining({ message: "Hello" });
314314
```
315315

316316
### Server Streaming
@@ -321,7 +321,7 @@ for await (
321321
count: 3,
322322
})
323323
) {
324-
expect(res).ok();
324+
expect(res).toBeSuccessful();
325325
console.log("Received:", res.data());
326326
}
327327
```
@@ -360,7 +360,9 @@ const res = await graphql.query(
360360
{ id: "1" },
361361
);
362362

363-
expect(res).ok().dataContains({ user: { name: "Alice" } });
363+
expect(res).toBeSuccessful().toHaveContentContaining({
364+
user: { name: "Alice" },
365+
});
364366
const user = res.data().user;
365367
```
366368

@@ -381,7 +383,7 @@ const res = await graphql.mutate(
381383
{ input: { name: "Alice", email: "alice@example.com" } },
382384
);
383385

384-
expect(res).ok();
386+
expect(res).toBeSuccessful();
385387
const newUser = res.data().createUser;
386388
```
387389

@@ -400,7 +402,7 @@ const subscription = graphql.subscribe(outdent`
400402
`);
401403

402404
for await (const res of subscription) {
403-
expect(res).ok();
405+
expect(res).toBeSuccessful();
404406
console.log("New user:", res.data().userCreated);
405407
}
406408
```
@@ -426,7 +428,7 @@ Common Redis operations:
426428
await redis.set("key", "value");
427429
await redis.set("key", "value", { ex: 3600 }); // With TTL
428430
const result = await redis.get("key");
429-
expect(result).ok().value("value");
431+
expect(result).toBeSuccessful().toHaveContent("value");
430432

431433
// Hashes
432434
await redis.hset("user:1", { name: "Alice", age: "30" });
@@ -469,11 +471,11 @@ const result = await users.insertOne({
469471
name: "Alice",
470472
email: "alice@example.com",
471473
});
472-
expect(result).ok();
474+
expect(result).toBeSuccessful();
473475

474476
// Find
475477
const user = await users.findOne({ _id: result.insertedId });
476-
expect(user).ok().documentContains({ name: "Alice" });
478+
expect(user).toBeSuccessful().toHaveContentContaining({ name: "Alice" });
477479

478480
// Find many
479481
const allUsers = await users.find({ age: { $gte: 18 } }).toArray();
@@ -504,7 +506,7 @@ By default, an in-memory database is used for testing.
504506
// Set and get
505507
await kv.set(["users", "1"], { name: "Alice" });
506508
const result = await kv.get(["users", "1"]);
507-
expect(result).ok().value({ name: "Alice" });
509+
expect(result).toBeSuccessful().toHaveContent({ name: "Alice" });
508510

509511
// List by prefix
510512
const users = await kv.list({ prefix: ["users"] });
@@ -549,7 +551,7 @@ await channel.sendToQueue("my-queue", content);
549551

550552
// Receive message
551553
const result = await channel.get("my-queue");
552-
expect(result).ok().hasContent();
554+
expect(result).toBeSuccessful().toHaveContent();
553555
if (result.message) {
554556
await channel.ack(result.message);
555557
}
@@ -582,7 +584,7 @@ await sqs.ensureQueue("my-queue");
582584

583585
// Send message
584586
const result = await sqs.send(JSON.stringify({ event: "user.created" }));
585-
expect(result).ok().hasMessageId();
587+
expect(result).toBeSuccessful().toHaveMessageId();
586588

587589
// Receive and process
588590
const messages = await sqs.receive({ maxMessages: 10 });
@@ -650,11 +652,11 @@ Use assertions for expected successes, explicit checks for expected failures:
650652
```typescript
651653
// Expected success - use assertions
652654
const res = await http.get("/users/1");
653-
expect(res).ok().status(200);
655+
expect(res).toBeSuccessful().toHaveStatus(200);
654656

655657
// Expected failure - disable throwing, check manually
656658
const res = await http.get("/users/nonexistent", { throwOnError: false });
657-
expect(res).status(404);
659+
expect(res).toHaveStatus(404);
658660
```
659661

660662
### Configure Retries
@@ -668,7 +670,7 @@ Use retry configuration for network-dependent operations. See
668670
const res = await http.get("/external-api", {
669671
retry: { maxAttempts: 3, backoff: "exponential" },
670672
});
671-
expect(res).ok();
673+
expect(res).toBeSuccessful();
672674
}, {
673675
timeout: 10000, // Allow time for retries
674676
})

docs/overview.md

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ other backend services.
1212
message queues with unified APIs
1313
- **Type-safe**: Full type inference through the builder chain
1414
- **Fluent assertions**: Natural syntax like
15-
`expect(result).ok().dataContains({...})`
15+
`expect(result).toBeSuccessful().toHaveContentContaining({...})`
1616

1717
## Installation
1818

@@ -72,9 +72,9 @@ export default scenario("User API Test")
7272
const res = await http.get("/users/1");
7373

7474
expect(res)
75-
.ok()
76-
.status(200)
77-
.dataContains({ id: 1 });
75+
.toBeSuccessful()
76+
.toHaveStatus(200)
77+
.toHaveContentContaining({ id: 1 });
7878
})
7979
.build();
8080
```
@@ -183,13 +183,20 @@ The `expect()` function auto-dispatches based on result type:
183183

184184
```typescript
185185
// HTTP response
186-
expect(httpResponse).ok().status(200).dataContains({ id: 1 });
186+
expect(httpResponse)
187+
.toBeSuccessful()
188+
.toHaveStatus(200)
189+
.toHaveContentContaining({ id: 1 });
187190

188191
// SQL result
189-
expect(sqlResult).count(1).dataContains({ name: "Alice" });
192+
expect(sqlResult)
193+
.toHaveRowCount(1)
194+
.toHaveContentContaining({ name: "Alice" });
190195

191196
// gRPC response
192-
expect(grpcResponse).ok().dataContains({ id: "123" });
197+
expect(grpcResponse)
198+
.toBeSuccessful()
199+
.toHaveContentContaining({ id: "123" });
193200
```
194201

195202
## Included Utilities

0 commit comments

Comments
 (0)