import { test, expect } from '@playwright/test'; import { deleteContact, generateEthrUser, importUser } from './testUtils'; test('Check activity feed', async ({ page }) => { // Load app homepage await page.goto('./'); // Check that initial 10 activities have been loaded await page.locator('ul#listLatestActivity li:nth-child(10)'); // Scroll down a bit to trigger loading additional activities await page.locator('ul#listLatestActivity li:nth-child(50)').scrollIntoViewIfNeeded(); }); test('Check discover results', async ({ page }) => { // Load Discover view await page.goto('./discover'); // Check that initial 10 projects have been loaded await page.locator('ul#listDiscoverResults li.border-b:nth-child(10)'); // Scroll down a bit to trigger loading additional projects await page.locator('ul#listDiscoverResults li.border-b:nth-child(20)').scrollIntoViewIfNeeded(); }); test('Check no-ID messaging in account', async ({ page }) => { // Load account view await page.goto('./account'); // Check 'someone must register you' notice await expect(page.locator('#noticeBeforeShare')).toBeVisible(); // Check 'a friend needs to register you' notice await expect(page.locator('#noticeBeforeAnnounce')).toBeVisible(); // Check that there is no ID await expect(page.locator('#sectionIdentityDetails code.truncate')).toBeEmpty(); }); test('Check ability to share contact', async ({ page }) => { // Load Discover view await page.goto('./discover'); // Check that initial 10 projects have been loaded await page.locator('ul#listDiscoverResults li.border-b:nth-child(10)'); // Scroll down a bit to trigger loading additional projects await page.locator('ul#listDiscoverResults li.border-b:nth-child(20)').scrollIntoViewIfNeeded(); }); test('Check ID generation', async ({ page }) => { // Load Account view await page.goto('./account'); // Check that ID is empty await expect(page.locator('#sectionIdentityDetails code.truncate')).toBeEmpty(); // Load homepage to trigger ID generation (?) await page.goto('./'); // Wait for activity feed to start loading, as a delay await expect(page.locator('ul#listLatestActivity li:nth-child(10)')).toBeVisible(); // Check 'someone must register you' notice await expect(page.getByText('To share, someone must register you.')).toBeVisible(); // Go back to Account view await page.goto('./account'); // Check that ID is now generated await expect(page.locator('#sectionIdentityDetails code.truncate')).toContainText('did:ethr:'); }); test('Check setting name & sharing info', async ({ page }) => { // Load homepage to trigger ID generation (?) await page.goto('./'); // Check 'someone must register you' notice await expect(page.getByText('someone must register you.')).toBeVisible(); await page.getByRole('button', { name: /Show them/}).click(); // fill in a name await expect(page.getByText('Set Your Name')).toBeVisible(); await page.getByRole('textbox').fill('Me Test User'); await page.locator('button:has-text("Save")').click(); await expect(page.getByText('share another way')).toBeVisible(); await page.getByRole('button', { name: /share another way/ }).click(); await expect(page.getByRole('button', { name: 'copy to clipboard' })).toBeVisible(); await page.getByRole('button', { name: 'copy to clipboard' }).click(); await expect(page.getByText('contact info was copied')).toBeVisible(); // dismiss alert and wait for it to go away await page.locator('div[role="alert"] button > svg.fa-xmark').click(); await expect(page.getByText('contact info was copied')).toBeHidden(); // check that they're on the Contacts screen await expect(page.getByText('your contacts')).toBeVisible(); }); test('Confirm test API setting (may fail if you are running your own Time Safari)', async ({ page }, testInfo) => { // Load account view await page.goto('./account'); await page.getByRole('heading', { name: 'Advanced' }).click(); // look into the config file: if it starts Time Safari, it might say which server it should set by default const webServer = testInfo.config.webServer; const endorserWords = webServer?.command.split(' '); const ENDORSER_ENV_NAME = 'VITE_DEFAULT_ENDORSER_API_SERVER'; const endorserTerm = endorserWords?.find(word => word.startsWith(ENDORSER_ENV_NAME + '=')); const endorserTermInConfig = endorserTerm?.substring(ENDORSER_ENV_NAME.length + 1); const endorserServer = endorserTermInConfig || 'https://test-api.endorser.ch'; await expect(page.getByRole('textbox').nth(1)).toHaveValue(endorserServer); }); test('Check User 0 can register a random person', async ({ page }) => { await importUser(page, '00'); const newDid = await generateEthrUser(page); expect(newDid).toContain('did:ethr:'); await page.goto('./'); await page.getByRole('heading', { name: 'Unnamed/Unknown' }).click(); await page.getByPlaceholder('What was given').fill('Access!'); await page.getByRole('button', { name: 'Sign & Send' }).click(); await expect(page.getByText('That gift was recorded.')).toBeVisible(); // now ensure that alert goes away await page.locator('div[role="alert"] button > svg.fa-xmark').click(); // dismiss alert await expect(page.getByText('That gift was recorded.')).toBeHidden(); // now delete the contact to test that pages still do reasonable things await deleteContact(page, newDid); // go the activity page for this new person await page.goto('./did/' + encodeURIComponent(newDid)); let error; try { await page.waitForSelector('div[role="alert"]', { timeout: 2000 }); error = new Error('Error alert should not show.'); } catch (error) { // success } finally { if (error) { throw error; } } });