Skip to content

Commit c3a8075

Browse files
authored
Merge branch 'main' into feature/III-6997-event-preview-publication-status
2 parents 0ade125 + 10217fc commit c3a8075

File tree

14 files changed

+948
-15
lines changed

14 files changed

+948
-15
lines changed

CLAUDE.md

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -428,6 +428,51 @@ src/
428428
- Admin tests: `*.admin.spec.ts` files
429429
- Run: `yarn test:e2e`
430430
431+
#### Playwright Fixtures Pattern
432+
433+
**Use fixtures for expensive test setup** (creating entities, API calls) to avoid timeouts:
434+
435+
```typescript
436+
import { expect, test as base } from '@playwright/test';
437+
438+
type TestFixtures = {
439+
eventId: string;
440+
eventPreviewUrl: string;
441+
};
442+
443+
const test = base.extend<TestFixtures>({
444+
eventId: async ({ page, baseURL }, applyFixture) => {
445+
// Expensive setup: create event once
446+
await page.goto(`${baseURL}/create`);
447+
// ... event creation steps ...
448+
const eventId = extractedId;
449+
await applyFixture(eventId);
450+
},
451+
452+
eventPreviewUrl: async ({ eventId }, applyFixture) => {
453+
// Derived fixture using eventId
454+
await applyFixture(`/events/${eventId}`);
455+
},
456+
});
457+
458+
test.describe('My Tests', () => {
459+
test.beforeEach(async ({ page, eventPreviewUrl }) => {
460+
// Fast: just navigate using fixture
461+
await page.goto(eventPreviewUrl);
462+
});
463+
464+
test('my test', async ({ eventId }) => {
465+
// Use fixtures in tests
466+
});
467+
});
468+
```
469+
470+
**Benefits:**
471+
472+
- Fixtures run once per test file (not per test)
473+
- Prevents timeout issues from repeated setup
474+
- See examples: `src/test/e2e/manage/roles/roles-edit.admin.spec.ts`, `src/test/e2e/events/event-preview-actions.spec.ts`
475+
431476
### Unit Testing (Jest)
432477
433478
- Uses Jest with React Testing Library

src/hooks/api/events.ts

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -825,6 +825,46 @@ const useDeleteOnlineUrlMutation = (configuration = {}) =>
825825
mutationKey: 'events-delete-online-url',
826826
...configuration,
827827
});
828+
829+
type DuplicateEventArguments = {
830+
headers: Headers;
831+
eventId: string;
832+
calendarType: string;
833+
subEvent: SubEvent[];
834+
};
835+
836+
const duplicateEvent = async ({
837+
headers,
838+
eventId,
839+
calendarType,
840+
subEvent,
841+
}: DuplicateEventArguments) => {
842+
const resetSubEvents = subEvent.map((event) => ({
843+
...event,
844+
status: { type: 'Available' },
845+
bookingAvailability: { type: 'Available' },
846+
}));
847+
848+
return fetchFromApi({
849+
path: `/events/${eventId}/copies/`,
850+
options: {
851+
headers,
852+
method: 'POST',
853+
body: JSON.stringify({
854+
calendarType,
855+
subEvent: resetSubEvents,
856+
}),
857+
},
858+
});
859+
};
860+
861+
const useDuplicateEventMutation = (configuration = {}) =>
862+
useAuthenticatedMutation({
863+
mutationFn: duplicateEvent,
864+
mutationKey: 'events-duplicate',
865+
...configuration,
866+
});
867+
828868
export {
829869
useAddEventMutation,
830870
useChangeAttendanceModeMutation,
@@ -838,6 +878,7 @@ export {
838878
useChangeStatusSubEventsMutation,
839879
useDeleteEventByIdMutation,
840880
useDeleteOnlineUrlMutation,
881+
useDuplicateEventMutation,
841882
useGetCalendarSummaryQuery,
842883
useGetEventByIdQuery,
843884
useGetEventPermissionsQuery,

src/i18n/de.json

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1455,6 +1455,21 @@
14551455
"contact": "Keine Kontaktinformationen",
14561456
"images": "Keine Abbildungen",
14571457
"videos": "Keine videos"
1458+
},
1459+
"actions": {
1460+
"edit": "Bearbeiten",
1461+
"edit_as_movie": "Bearbeiten als Film",
1462+
"translate": "Übersetzen",
1463+
"duplicate": "Kopieren und bearbeiten",
1464+
"duplicate_as_movie": "Kopieren und bearbeiten als Film",
1465+
"change_availability": "Verfügbarkeit ändern",
1466+
"delete": "Löschen",
1467+
"delete_modal": {
1468+
"title": "Aktivität löschen",
1469+
"body": "Sind Sie sicher, dass Sie \"{{name}}\" löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden.",
1470+
"cancel": "Abbrechen",
1471+
"confirm": "Definitiv löschen"
1472+
}
14581473
}
14591474
}
14601475
}

src/i18n/fr.json

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1454,6 +1454,21 @@
14541454
"contact": "Aucune information de contact",
14551455
"images": "Aucune image",
14561456
"videos": "Aucune vidéo"
1457+
},
1458+
"actions": {
1459+
"edit": "Modifier",
1460+
"edit_as_movie": "Modifier comme film",
1461+
"translate": "Traduire",
1462+
"duplicate": "Copier et modifier",
1463+
"duplicate_as_movie": "Copier et modifier comme film",
1464+
"change_availability": "Modifier la disponibilité",
1465+
"delete": "Supprimer",
1466+
"delete_modal": {
1467+
"title": "Supprimer l'événement",
1468+
"body": "Êtes-vous sûr de vouloir supprimer \"{{title}}\" ? Cette action ne peut pas être annulée.",
1469+
"cancel": "Annuler",
1470+
"confirm": "Supprimer définitivement"
1471+
}
14571472
}
14581473
}
14591474
}

src/i18n/nl.json

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1511,6 +1511,21 @@
15111511
"contact": "Geen contact-informatie",
15121512
"images": "Geen afbeeldingen",
15131513
"videos": "Geen video's"
1514+
},
1515+
"actions": {
1516+
"edit": "Bewerken",
1517+
"edit_as_movie": "Bewerken als film",
1518+
"translate": "Vertalen",
1519+
"duplicate": "Kopiëren en aanpassen",
1520+
"duplicate_as_movie": "Kopiëren en aanpassen als film",
1521+
"change_availability": "Beschikbaarheid wijzigen",
1522+
"delete": "Verwijderen",
1523+
"delete_modal": {
1524+
"title": "Evenement verwijderen",
1525+
"body": "Ben je zeker dat je \"{{title}}\" wil verwijderen? Deze actie kan niet ongedaan worden.",
1526+
"cancel": "Annuleren",
1527+
"confirm": "Definitief verwijderen"
1528+
}
15141529
}
15151530
}
15161531
}

0 commit comments

Comments
 (0)