Files
fotospiel-app/tests/ui/admin/event-addon-upgrade.test.ts

143 lines
4.2 KiB
TypeScript

import { test, expectFixture as expect } from '../helpers/test-fixtures';
test.describe('Tenant admin add-on upgrades', () => {
test.beforeEach(async ({ signInTenantAdmin }) => {
await signInTenantAdmin();
});
test('purchasing an add-on increases photo limits in moderation view', async ({ page }) => {
let addonPurchased = false;
const initialLimits = {
photos: {
limit: 120,
used: 120,
remaining: 0,
percentage: 100,
state: 'limit_reached',
threshold_reached: 120,
next_threshold: null,
thresholds: [80, 95, 120],
},
guests: null,
gallery: {
state: 'warning',
expires_at: new Date(Date.now() + 86400000).toISOString(),
days_remaining: 1,
warning_thresholds: [7, 1],
warning_triggered: 1,
warning_sent_at: null,
expired_notified_at: null,
},
can_upload_photos: false,
can_add_guests: true,
};
const upgradedLimits = {
photos: {
limit: 620,
used: 120,
remaining: 500,
percentage: 19,
state: 'ok',
threshold_reached: 80,
next_threshold: 95,
thresholds: [80, 95, 120, 600],
},
guests: null,
gallery: initialLimits.gallery,
can_upload_photos: true,
can_add_guests: true,
};
await page.route('**/api/v1/tenant/addons/catalog', async (route) => {
await route.fulfill({
status: 200,
contentType: 'application/json',
body: JSON.stringify({
data: [
{ key: 'extra_photos_500', label: '+500 Fotos', price_id: 'pri_addon_photos', increments: { extra_photos: 500 } },
],
}),
});
});
await page.route('**/api/v1/tenant/events/limit-event/photos', async (route) => {
await route.fulfill({
status: 200,
contentType: 'application/json',
body: JSON.stringify({
data: [],
limits: addonPurchased ? upgradedLimits : initialLimits,
}),
});
});
await page.route('**/api/v1/tenant/events/limit-event', async (route) => {
const timestamp = new Date().toISOString();
await route.fulfill({
status: 200,
contentType: 'application/json',
body: JSON.stringify({
data: {
id: 101,
name: 'Limit Event',
slug: 'limit-event',
event_date: timestamp.slice(0, 10),
event_type_id: null,
event_type: null,
status: 'published',
addons: addonPurchased
? [
{
id: 1,
key: 'extra_photos_500',
addon_key: 'extra_photos_500',
label: '+500 Fotos',
status: 'completed',
price_id: 'pri_addon_photos',
transaction_id: 'txn_addon_1',
extra_photos: 500,
extra_guests: 0,
extra_gallery_days: 0,
purchased_at: timestamp,
metadata: { price_eur: 49 },
},
]
: [],
},
}),
});
});
await page.route('**/api/v1/tenant/events/limit-event/addons/checkout', async (route) => {
addonPurchased = true;
await route.fulfill({
status: 200,
contentType: 'application/json',
body: JSON.stringify({
checkout_url: '/event-admin/events/limit-event/photos?addon_success=1',
checkout_id: 'chk_addon_1',
expires_at: new Date(Date.now() + 600000).toISOString(),
}),
});
});
await page.goto('/event-admin/events/limit-event/photos');
await expect(page.getByText(/Upload-Limit erreicht/i)).toBeVisible();
const purchaseButton = page.getByRole('button', { name: /Mehr Fotos freischalten/i });
await expect(purchaseButton).toBeVisible();
await purchaseButton.click();
await expect(page).toHaveURL(/addon_success=1/);
await expect(page.getByText(/Add-on angewendet/i)).toBeVisible();
await expect(page.getByText(/Upload-Limit erreicht/i)).not.toBeVisible({ timeout: 10000 });
await expect(page.getByText(/\+500\s*Fotos/i)).toBeVisible();
});
});