/** * Beneficiary Management E2E Tests * * Critical flows tested: * 1. Beneficiary list loads correctly * 2. Beneficiary detail page navigation * 3. Add new beneficiary flow * 4. Beneficiary card displays correct info * 5. Equipment/sensors access * 6. Subscription access * 7. Share functionality access */ import { test, expect } from '@playwright/test'; import { LoginPage, OtpPage, BeneficiariesPage, BeneficiaryDetailPage, EquipmentPage, SubscriptionPage, AddLovedOnePage, } from '../helpers/page-objects'; import { enableConsoleLogging, TEST_CREDENTIALS, BASE_URL, } from '../helpers/test-helpers'; // Run tests serially to maintain login state test.describe.configure({ mode: 'serial' }); test.describe('Beneficiary Management', () => { // Login once before all tests test.beforeAll(async ({ browser }) => { const page = await browser.newPage(); const loginPage = new LoginPage(page); await loginPage.goto(); await loginPage.expectLoaded(); await loginPage.loginWithEmail(TEST_CREDENTIALS.existingUser.email); const otpPage = new OtpPage(page); await otpPage.expectLoaded(); await otpPage.enterCode(TEST_CREDENTIALS.existingUser.bypassOtp); // Wait for successful login await page.waitForTimeout(5000); await page.close(); }); test.beforeEach(async ({ page }) => { enableConsoleLogging(page); // Login for each test const loginPage = new LoginPage(page); await loginPage.goto(); // Check if already logged in (redirected to app) const isOnLogin = await loginPage.welcomeText.isVisible({ timeout: 2000 }).catch(() => false); if (isOnLogin) { await loginPage.loginWithEmail(TEST_CREDENTIALS.existingUser.email); const otpPage = new OtpPage(page); await otpPage.expectLoaded(); await otpPage.enterCode(TEST_CREDENTIALS.existingUser.bypassOtp); await page.waitForTimeout(3000); } }); test('1. Beneficiary list page loads', async ({ page }) => { // Navigate to beneficiaries await page.goto(BASE_URL); await page.waitForLoadState('networkidle'); await page.waitForTimeout(2000); // Should see beneficiaries or dashboard const hasBeneficiaries = await page.getByText('My Loved Ones').isVisible({ timeout: 5000 }).catch(() => false); const hasDashboard = await page.getByText('Dashboard').isVisible({ timeout: 5000 }).catch(() => false); expect(hasBeneficiaries || hasDashboard).toBe(true); console.log('✅ Beneficiary list/dashboard loaded'); }); test('2. Beneficiary cards display correctly', async ({ page }) => { await page.goto(BASE_URL); await page.waitForLoadState('networkidle'); await page.waitForTimeout(3000); // Find beneficiary cards const beneficiaryCards = page.locator('[data-testid="beneficiary-card"]'); const cardsCount = await beneficiaryCards.count(); // If no beneficiaries, should show add option if (cardsCount === 0) { const addButton = await page.getByText(/Add.*Loved One|Add Beneficiary/i).isVisible({ timeout: 2000 }); console.log(`No beneficiaries found, add button visible: ${addButton}`); } else { console.log(`Found ${cardsCount} beneficiary cards`); } console.log('✅ Beneficiary cards displayed'); }); test('3. Navigate to beneficiary detail', async ({ page }) => { await page.goto(BASE_URL); await page.waitForLoadState('networkidle'); await page.waitForTimeout(3000); // Find and click on a beneficiary const beneficiaryCards = page.locator('[data-testid="beneficiary-card"]'); const cardsCount = await beneficiaryCards.count(); if (cardsCount > 0) { await beneficiaryCards.first().click(); await page.waitForTimeout(2000); // Should be on detail page const detailPage = new BeneficiaryDetailPage(page); await detailPage.expectLoaded(); console.log('✅ Beneficiary detail page loaded'); } else { // Try clicking on beneficiary name directly const firstBeneficiary = page.locator('div').filter({ hasText: /Grandma|Mom|Dad|Test/i }).first(); if (await firstBeneficiary.isVisible({ timeout: 2000 })) { await firstBeneficiary.click(); await page.waitForTimeout(2000); } console.log('⚠️ No beneficiary cards found with testid'); } }); test('4. Beneficiary detail shows menu options', async ({ page }) => { await page.goto(BASE_URL); await page.waitForLoadState('networkidle'); await page.waitForTimeout(3000); // Navigate to a beneficiary const firstCard = page.locator('[data-testid="beneficiary-card"]').first(); if (await firstCard.isVisible({ timeout: 3000 })) { await firstCard.click(); await page.waitForTimeout(2000); const detailPage = new BeneficiaryDetailPage(page); // Check for key menu options const hasSubscription = await detailPage.subscriptionButton.isVisible({ timeout: 2000 }).catch(() => false); const hasEquipment = await detailPage.equipmentButton.isVisible({ timeout: 2000 }).catch(() => false); console.log(`Subscription visible: ${hasSubscription}, Equipment visible: ${hasEquipment}`); expect(hasSubscription || hasEquipment).toBe(true); console.log('✅ Beneficiary menu options displayed'); } else { console.log('⚠️ No beneficiary to test'); } }); test('5. Navigate to equipment/sensors page', async ({ page }) => { await page.goto(BASE_URL); await page.waitForLoadState('networkidle'); await page.waitForTimeout(3000); // Navigate to a beneficiary const firstCard = page.locator('[data-testid="beneficiary-card"]').first(); if (await firstCard.isVisible({ timeout: 3000 })) { await firstCard.click(); await page.waitForTimeout(2000); const detailPage = new BeneficiaryDetailPage(page); // Go to equipment if (await detailPage.equipmentButton.isVisible({ timeout: 2000 })) { await detailPage.goToEquipment(); await page.waitForTimeout(2000); const equipmentPage = new EquipmentPage(page); await equipmentPage.expectLoaded(); console.log('✅ Equipment page loaded'); } else { console.log('⚠️ Equipment button not visible'); } } else { console.log('⚠️ No beneficiary to test'); } }); test('6. Navigate to subscription page', async ({ page }) => { await page.goto(BASE_URL); await page.waitForLoadState('networkidle'); await page.waitForTimeout(3000); // Navigate to a beneficiary const firstCard = page.locator('[data-testid="beneficiary-card"]').first(); if (await firstCard.isVisible({ timeout: 3000 })) { await firstCard.click(); await page.waitForTimeout(2000); const detailPage = new BeneficiaryDetailPage(page); // Go to subscription if (await detailPage.subscriptionButton.isVisible({ timeout: 2000 })) { await detailPage.goToSubscription(); await page.waitForTimeout(2000); const subscriptionPage = new SubscriptionPage(page); await subscriptionPage.expectLoaded(); console.log('✅ Subscription page loaded'); } else { console.log('⚠️ Subscription button not visible'); } } else { console.log('⚠️ No beneficiary to test'); } }); test('7. Equipment page shows sensor summary', async ({ page }) => { await page.goto(BASE_URL); await page.waitForLoadState('networkidle'); await page.waitForTimeout(3000); // Navigate to beneficiary -> equipment const firstCard = page.locator('[data-testid="beneficiary-card"]').first(); if (await firstCard.isVisible({ timeout: 3000 })) { await firstCard.click(); await page.waitForTimeout(2000); const detailPage = new BeneficiaryDetailPage(page); if (await detailPage.equipmentButton.isVisible({ timeout: 2000 })) { await detailPage.goToEquipment(); await page.waitForTimeout(2000); const equipmentPage = new EquipmentPage(page); // Check for summary elements const hasTotal = await equipmentPage.totalSensors.isVisible({ timeout: 2000 }).catch(() => false); const hasEmpty = await equipmentPage.emptySensorState.isVisible({ timeout: 2000 }).catch(() => false); expect(hasTotal || hasEmpty).toBe(true); console.log('✅ Equipment summary displayed'); } } }); test('8. Add sensor button is visible on equipment page', async ({ page }) => { await page.goto(BASE_URL); await page.waitForLoadState('networkidle'); await page.waitForTimeout(3000); // Navigate to beneficiary -> equipment const firstCard = page.locator('[data-testid="beneficiary-card"]').first(); if (await firstCard.isVisible({ timeout: 3000 })) { await firstCard.click(); await page.waitForTimeout(2000); const detailPage = new BeneficiaryDetailPage(page); if (await detailPage.equipmentButton.isVisible({ timeout: 2000 })) { await detailPage.goToEquipment(); await page.waitForTimeout(2000); const equipmentPage = new EquipmentPage(page); // Add sensor button should be visible const hasAddButton = await equipmentPage.addSensorsButton.isVisible({ timeout: 2000 }).catch(() => false); console.log(`Add sensors button visible: ${hasAddButton}`); console.log('✅ Add sensor functionality accessible'); } } }); }); test.describe('Add Beneficiary Flow', () => { test.beforeEach(async ({ page }) => { enableConsoleLogging(page); }); test('Add loved one screen loads for new users', async ({ page }) => { const loginPage = new LoginPage(page); await loginPage.goto(); await loginPage.expectLoaded(); // Use new unique email const newEmail = `add.beneficiary.${Date.now()}@test.com`; await loginPage.loginWithEmail(newEmail); const otpPage = new OtpPage(page); await otpPage.expectLoaded(); await otpPage.enterCode(TEST_CREDENTIALS.newUser.bypassOtp); await page.waitForTimeout(5000); // Should eventually reach add-loved-one screen for new users const addLovedOnePage = new AddLovedOnePage(page); const isOnAddPage = await addLovedOnePage.headerText.isVisible({ timeout: 5000 }).catch(() => false); console.log(`Add loved one screen visible: ${isOnAddPage}`); console.log('✅ Add beneficiary flow accessible'); }); }); test.describe('Beneficiary Status Display', () => { test.beforeEach(async ({ page }) => { enableConsoleLogging(page); // Login const loginPage = new LoginPage(page); await loginPage.goto(); const isOnLogin = await loginPage.welcomeText.isVisible({ timeout: 2000 }).catch(() => false); if (isOnLogin) { await loginPage.loginWithEmail(TEST_CREDENTIALS.existingUser.email); const otpPage = new OtpPage(page); await otpPage.expectLoaded(); await otpPage.enterCode(TEST_CREDENTIALS.existingUser.bypassOtp); await page.waitForTimeout(3000); } }); test('Subscription status is displayed on detail page', async ({ page }) => { await page.goto(BASE_URL); await page.waitForLoadState('networkidle'); await page.waitForTimeout(3000); const firstCard = page.locator('[data-testid="beneficiary-card"]').first(); if (await firstCard.isVisible({ timeout: 3000 })) { await firstCard.click(); await page.waitForTimeout(2000); // Check for subscription status indicator const hasActiveStatus = await page.getByText(/Active|Demo|Trial|Expired/i).isVisible({ timeout: 2000 }).catch(() => false); const hasSubscriptionButton = await page.getByText('Subscription').isVisible({ timeout: 2000 }).catch(() => false); expect(hasActiveStatus || hasSubscriptionButton).toBe(true); console.log('✅ Subscription status displayed'); } }); test('Equipment status is displayed correctly', async ({ page }) => { await page.goto(BASE_URL); await page.waitForLoadState('networkidle'); await page.waitForTimeout(3000); const firstCard = page.locator('[data-testid="beneficiary-card"]').first(); if (await firstCard.isVisible({ timeout: 3000 })) { await firstCard.click(); await page.waitForTimeout(2000); // Navigate to equipment const equipmentButton = page.getByText(/Equipment|Sensors/i); if (await equipmentButton.isVisible({ timeout: 2000 })) { await equipmentButton.click(); await page.waitForTimeout(2000); // Check for status displays const hasOnline = await page.getByText(/Online/i).isVisible({ timeout: 2000 }).catch(() => false); const hasOffline = await page.getByText(/Offline/i).isVisible({ timeout: 2000 }).catch(() => false); const hasTotal = await page.getByText(/Total/i).isVisible({ timeout: 2000 }).catch(() => false); const hasEmpty = await page.getByText('No Sensors Connected').isVisible({ timeout: 2000 }).catch(() => false); expect(hasOnline || hasOffline || hasTotal || hasEmpty).toBe(true); console.log('✅ Equipment status displayed correctly'); } } }); });