143 lines
4.3 KiB
TypeScript
143 lines
4.3 KiB
TypeScript
import { test, expectFixture as expect } from '../helpers/test-fixtures';
|
|
|
|
test.describe('Tenant admin add-on upgrades', () => {
|
|
test.beforeEach(async ({ tenantAdminCredentials, signInTenantAdmin }) => {
|
|
test.skip(!tenantAdminCredentials, 'Provide E2E_TENANT_EMAIL and E2E_TENANT_PASSWORD to run admin tests.');
|
|
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/mobile/events/limit-event/control-room?addon_success=1',
|
|
checkout_id: 'chk_addon_1',
|
|
expires_at: new Date(Date.now() + 600000).toISOString(),
|
|
}),
|
|
});
|
|
});
|
|
|
|
await page.goto('/event-admin/mobile/events/limit-event/control-room');
|
|
|
|
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(/Upload-Limit erreicht/i)).not.toBeVisible({ timeout: 10000 });
|
|
await expect(page.getByText(/\+500\s*Fotos/i)).toBeVisible();
|
|
});
|
|
});
|