Skip to content

Commit f7943ea

Browse files
committed
test: Add Pact mock server
1 parent 878464b commit f7943ea

14 files changed

Lines changed: 1994 additions & 237 deletions

File tree

.github/workflows/build.yaml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,12 @@ jobs:
3939
run: npm run test
4040
working-directory: customer-client
4141

42+
- name: Upload pact files
43+
uses: actions/upload-artifact@v4
44+
with:
45+
name: pact-files
46+
path: pacts/
47+
4248
- name: Upload Playwright report
4349
uses: actions/upload-artifact@v4
4450
if: failure()
@@ -47,6 +53,7 @@ jobs:
4753
path: customer-client/playwright-report/
4854

4955
build:
56+
needs: build-client
5057
runs-on: ubuntu-latest
5158
steps:
5259
- name: Checkout
@@ -59,6 +66,12 @@ jobs:
5966
distribution: 'temurin'
6067
cache: maven
6168

69+
- name: Download pact files
70+
uses: actions/download-artifact@v4
71+
with:
72+
name: pact-files
73+
path: pacts/
74+
6275
- name: Set up Node.js
6376
uses: actions/setup-node@v4
6477
with:

README.md

Lines changed: 40 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,38 +2,57 @@
22

33
Herzlich willkommen zum Workshop API Design.
44

5-
## Übungen
5+
## Übung: Von Playwright-Mocking zu Pact Consumer Tests
66

7-
### API Design
7+
### Ausgangssituation
88

9-
- [OpenAPI](https://github.com/openknowledge/workshop-api-design/tree/openapi)
10-
- [Mocking](https://github.com/openknowledge/workshop-api-design/tree/wiremock)
11-
- [AsyncAPI](https://github.com/openknowledge/workshop-api-design/tree/asyncapi)
9+
Im Branch `playwright-pact` befinden sich drei Playwright-Testdateien im Verzeichnis `customer-client/test/`:
1210

13-
### API Testing
11+
- `customer-list.spec.ts` – Tests für die Kundenliste
12+
- `customer-detail.spec.ts` – Tests für die Kundendetailansicht inkl. Adressen
13+
- `create-customer.spec.ts` – Tests für das Anlegen eines neuen Kunden (**bereits auf Pact umgebaut, dient als Referenz**)
1414

15-
- [Pact](https://github.com/openknowledge/workshop-api-design/tree/pact-mock-server)
16-
- [Pact Pipeline](https://github.com/openknowledge/workshop-api-design/tree/pact)
15+
Die Tests in `customer-list.spec.ts` und `customer-detail.spec.ts` verwenden aktuell Playwright's eingebautes `page.route()`, um API-Aufrufe direkt im Browser abzufangen und mit statischen Antworten zu mocken. Dieser Ansatz dokumentiert den API-Vertrag nicht maschinenlesbar und kann nicht automatisch gegen den echten Service verifiziert werden.
1716

18-
### API Security
17+
Das Hilfsmuster `pact-proxy.ts` stellt zwei Funktionen bereit:
18+
- `createProvider()` – erstellt einen Pact-Mock-Server mit Consumer- und Providernamen
19+
- `setupApiProxy(page, mockServerUrl)` – leitet alle API-Aufrufe der Seite transparent an den Pact-Mock-Server weiter
1920

20-
- [JWT](https://github.com/openknowledge/workshop-api-design/tree/jwt)
21-
- [OAuth2](https://github.com/openknowledge/workshop-api-design/tree/oauth2)
22-
- [OAuth2 mit PKCE](https://github.com/openknowledge/workshop-api-design/tree/oauth2-pkce)
21+
### Aufgabe
2322

24-
### API Governance
23+
Baue die Playwright-Tests in `customer-list.spec.ts` und `customer-detail.spec.ts` so um, dass sie statt `page.route()` den Pact-Mock-Server nutzen. Orientiere dich dabei an `create-customer.spec.ts`.
2524

26-
- [Linting](https://github.com/openknowledge/workshop-api-design/tree/linting)
25+
Für jeden Test, der API-Aufrufe mockt, gilt folgendes Muster:
2726

28-
### API Management
27+
```typescript
28+
await createProvider()
29+
.addInteraction({
30+
uponReceiving: 'Beschreibung der Anfrage',
31+
withRequest: {
32+
method: 'GET',
33+
path: '/customers/',
34+
},
35+
willRespondWith: {
36+
status: 200,
37+
headers: { 'Content-Type': 'application/json' },
38+
body: [ /* ... */ ],
39+
},
40+
})
41+
.executeTest(async (mockServer) => {
42+
await setupApiProxy(page, mockServer.url);
43+
// eigentlicher Test
44+
});
45+
```
2946

30-
- [Rate Limiting](https://github.com/openknowledge/workshop-api-design/tree/rate-limiting)
31-
- [Backstage](https://github.com/openknowledge/workshop-api-design/tree/backstage)
47+
**Hinweise:**
48+
- Tests, die keinerlei API-Aufrufe machen (z. B. reine UI-Validierungen), müssen nicht umgebaut werden.
49+
- Wenn ein Test mehrere API-Endpunkte anspricht, können mehrere `.addInteraction()`-Aufrufe verkettet werden.
50+
- Nach dem Umbau werden die Pact-Dateien automatisch im Verzeichnis `pacts/` erzeugt. Prüfe, ob die erzeugten Pacts den erwarteten Vertrag korrekt abbilden.
51+
- `beforeEach`-Blöcke mit `page.route()` müssen in die jeweiligen `executeTest`-Callbacks verschoben werden, weil `setupApiProxy` erst innerhalb des Callbacks aufgerufen werden kann.
3252

33-
### API Operation
53+
### Ziel
3454

35-
- [Observability](https://github.com/openknowledge/workshop-api-design/tree/observability)
55+
Nach dem Umbau laufen alle Tests weiterhin erfolgreich, und im Verzeichnis `pacts/` liegt eine aktualisierte JSON-Datei mit den Consumer-Driven Contracts, die später gegen den echten Customer Service verifiziert werden können.
3656

37-
### API Evolution
57+
Der entstandene Contract kann mit dem Provider Test `CustomerServiceTest.java` im Customer Service gegen die echte Implementierung überprüft werden.
3858

39-
- [Versioning](https://github.com/openknowledge/workshop-api-design/tree/versioning)

0 commit comments

Comments
 (0)