You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: README.md
+82Lines changed: 82 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -48,3 +48,85 @@ Nach der Umsetzung:
48
48
- Der erzeugte Pact dokumentiert die Einschränkungen flexibel: Der `Location`-Header muss dem Regex-Muster entsprechen, die Kundennummer muss ein String sein – nicht aber einen bestimmten Wert haben.
49
49
- Der Provider-Test `CustomerServiceTest.java` verifiziert den Contract erfolgreich gegen die echte Implementierung.
50
50
51
+
---
52
+
53
+
## Übung: Pact States
54
+
55
+
### Ausgangssituation
56
+
57
+
Im Branch `playwright-pact-states` ist der Consumer-Test `create-customer.spec.ts` bereits auf Pact umgebaut. Der Test simuliert folgendes Szenario:
58
+
59
+
1. Ein neuer Kunde (Sherlock Holmes) wird per POST angelegt.
60
+
2. Danach wird die Kundenliste per GET abgerufen – und Sherlock Holmes soll darin erscheinen.
61
+
62
+
Dabei gibt es zwei Probleme:
63
+
64
+
- Der Test erstellt den `PactV4`-Provider noch manuell mit `new PactV4(...)` und einem eigenen Consumer-Namen, statt die gemeinsame Hilfsfunktion `createProvider()` aus `pact-proxy.ts` zu nutzen.
65
+
- Die GET-Interaction deklariert keine Vorbedingung: Der Provider-Test (`CustomerServiceTest.java`) weiß nicht, dass Sherlock Holmes für diese Verifikation bereits in der Datenbank vorhanden sein muss.
66
+
- Der `TestCustomerRepository` setzt seinen Zustand zwischen den einzelnen Pact-Interaktionen nicht zurück, sodass Daten aus einer Interaktion in die nächste „auslaufen" können.
67
+
68
+
### Aufgabe
69
+
70
+
#### Consumer-Seite (`create-customer.spec.ts`)
71
+
72
+
1. Ersetze `import { setupApiProxy } from './pact-proxy'` durch `import { createProvider, setupApiProxy } from './pact-proxy'`.
73
+
2. Ersetze die manuelle `new PactV4({...})`-Instanziierung durch den Aufruf `createProvider()`.
74
+
3. Füge der GET-Interaction eine Vorbedingung hinzu:
75
+
76
+
```typescript
77
+
awaitprovider
78
+
.addInteraction()
79
+
.given('Sherlock is available')
80
+
.uponReceiving('a request to get all customers (inkl. Sherlock)')
81
+
.withRequest('GET', '/customers/')
82
+
// ...
83
+
```
84
+
85
+
#### Provider-Seite (`CustomerServiceTest.java`)
86
+
87
+
Implementiere eine State-Handler-Methode, die für den Zustand `"Sherlock is available"` Sherlock Holmes in das Repository einfügt:
Damit der Repository-Zustand nach jeder HTTP-Anfrage zurückgesetzt wird (Testfälle sollen sich nicht gegenseitig beeinflussen), erweitere `TestCustomerRepository` um eine Reset-Methode. Entferne gleichzeitig die `@RequestScoped`-Annotation, da der Repository-Scope durch die übergeordnete Klasse bestimmt wird:
Damit der Reset auch den internen Zähler für Kundennummern zurücksetzt, muss in `CustomerRepository.initialize()` der Zähler explizit auf 0 gesetzt werden:
114
+
115
+
```java
116
+
@PostConstruct
117
+
publicvoid initialize() {
118
+
CUSTOMER_NUMBERS.set(0);
119
+
customers =newConcurrentHashMap<>();
120
+
// ...
121
+
}
122
+
```
123
+
124
+
### Ziel
125
+
126
+
Nach der Umsetzung:
127
+
128
+
- Nutzt `create-customer.spec.ts` die gemeinsame `createProvider()`-Hilfsfunktion und erzeugt einen Pact unter dem Consumer-Namen `customer-client`.
129
+
- Die GET-Interaction trägt den State `"Sherlock is available"`, der im erzeugten Pact-JSON dokumentiert ist.
130
+
- Der Provider-Test `CustomerServiceTest.java` kann alle Interaktionen erfolgreich verifizieren, weil er den State-Handler ausführt, bevor er die GET-Anfrage an den echten Service schickt.
131
+
- Der Datenbankzustand wird zwischen den Interaktionen automatisch zurückgesetzt, sodass die Tests unabhängig voneinander laufen.
0 commit comments