Latest Activity
-
-
+
+
Creating...
-
-
+
+
Created!
-
-
+
+
diff --git a/src/views/ProjectsView.vue b/src/views/ProjectsView.vue
index d9394775c..4c3dea13c 100644
--- a/src/views/ProjectsView.vue
+++ b/src/views/ProjectsView.vue
@@ -1,15 +1,13 @@
-
+
-
- Your Ideas
-
+ Your Ideas
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Share Your Contact Info
+
+
+
+
+
+
+
+
Click to copy your info, then send it to them.
+
+ They will paste it in the input box on the Contacts
+ screen.
+
+
+
+
+
+
diff --git a/src/views/StartView.vue b/src/views/StartView.vue
index 5190f5b58..373741a1b 100644
--- a/src/views/StartView.vue
+++ b/src/views/StartView.vue
@@ -58,6 +58,7 @@
Generate one with a new seed
diff --git a/test-playwright/00-noid-tests.spec.ts b/test-playwright/00-noid-tests.spec.ts
index 12746ff39..977525e74 100644
--- a/test-playwright/00-noid-tests.spec.ts
+++ b/test-playwright/00-noid-tests.spec.ts
@@ -1,20 +1,5 @@
import { test, expect } from '@playwright/test';
-
-test('Confirm usage of test API (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);
-});
+import { generateEthrUser, importUser } from './testUtils';
test('Check activity feed', async ({ page }) => {
// Load app homepage
@@ -38,14 +23,6 @@ test('Check discover results', async ({ page }) => {
await page.locator('ul#listDiscoverResults li.border-b:nth-child(20)').scrollIntoViewIfNeeded();
});
-test('Check no-ID messaging in homepage', async ({ page }) => {
- // Load app homepage
- await page.goto('./');
-
- // Check 'someone must register you' notice
- await expect(page.getByText('To share, someone must register you.')).toBeVisible();
-});
-
test('Check no-ID messaging in account', async ({ page }) => {
// Load account view
await page.goto('./account');
@@ -73,9 +50,66 @@ test('Check ID generation', async ({ page }) => {
// 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:');
-});
\ No newline at end of file
+});
+
+
+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 usage of test API (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();
+});
diff --git a/test-playwright/10-check-usage-limits.spec.ts b/test-playwright/10-check-usage-limits.spec.ts
index 0a4a7e5ae..7669af740 100644
--- a/test-playwright/10-check-usage-limits.spec.ts
+++ b/test-playwright/10-check-usage-limits.spec.ts
@@ -7,12 +7,22 @@ test('Check usage limits', async ({ page }) => {
await expect(page.locator('div.bg-slate-100.rounded-md').filter({ hasText: 'Usage Limits' })).toBeHidden();
// Import user 01
- await importUser(page, '01');
+ const did = await importUser(page, '01');
// Verify that "Usage Limits" section is visible
await expect(page.locator('#sectionUsageLimits')).toBeVisible();
+ await expect(page.locator('#sectionUsageLimits')).toContainText('You have done');
+ await expect(page.locator('#sectionUsageLimits')).toContainText('You have uploaded');
+
await expect(page.getByText('Your claims counter resets')).toBeVisible();
await expect(page.getByText('Your registration counter resets')).toBeVisible();
await expect(page.getByText('Your image counter resets')).toBeVisible();
await expect(page.getByRole('button', { name: 'Recheck Limits' })).toBeVisible();
+
+ // Set name
+ await page.getByRole('button', { name: 'Set Your Name' }).click();
+ const name = 'User ' + did.slice(11, 14);
+ await page.getByPlaceholder('Name').fill(name);
+ await page.getByRole('button', { name: 'Save' }).click();
+
});
\ No newline at end of file
diff --git a/test-playwright/40-add-contact.spec.ts b/test-playwright/40-add-contact.spec.ts
index c344c7c6f..270be342e 100644
--- a/test-playwright/40-add-contact.spec.ts
+++ b/test-playwright/40-add-contact.spec.ts
@@ -2,6 +2,7 @@ import { test, expect } from '@playwright/test';
import { importUser } from './testUtils';
test('Add contact, record gift, confirm gift', async ({ page }) => {
+
// Generate a random string of 16 characters
let randomString = Math.random().toString(36).substring(2, 18);
@@ -31,8 +32,9 @@ test('Add contact, record gift, confirm gift', async ({ page }) => {
await page.getByPlaceholder('URL or DID, Name, Public Key').fill('did:ethr:0x0000694B58C2cC69658993A90D3840C560f2F51F, User #000');
await page.locator('button > svg.fa-plus').click();
await expect(page.locator('div[role="alert"]')).toBeVisible();
-
- await page.locator('div[role="alert"] button:has-text("Yes")').click();
+ await page.locator('div[role="alert"] button:has-text("No")').click(); // don't register
+ await page.locator('div[role="alert"] button > svg.fa-xmark').click(); // dismiss info alert
+ await expect(page.locator('div[role="alert"] button > svg.fa-xmark')).toBeHidden(); // ensure alert is gone
// Verify added contact
await expect(page.locator('li.border-b')).toContainText('User #000');
@@ -94,8 +96,8 @@ test('Add contact, copy details, delete, and import various ways', async ({ page
await page.getByPlaceholder('URL or DID, Name, Public Key').fill('did:ethr:0x111d15564f824D56C7a07b913aA7aDd03382aA39, User #111');
await page.locator('button > svg.fa-plus').click();
await expect(page.locator('div[role="alert"]')).toBeVisible();
- await page.locator('div[role="alert"] button:has-text("No")').click();
- await page.locator('div[role="alert"] button > svg.fa-xmark').click();
+ await page.locator('div[role="alert"] button:has-text("No")').click(); // don't register
+ await page.locator('div[role="alert"] button > svg.fa-xmark').click(); // dismiss info alert
// wait for the alert to disappear
await expect(page.locator('div[role="alert"]')).toBeHidden();
@@ -103,8 +105,8 @@ test('Add contact, copy details, delete, and import various ways', async ({ page
await page.getByPlaceholder('URL or DID, Name, Public Key').fill('did:ethr:0x222BB77E6Ff3774d34c751f3c1260866357B677b, User #222, asdf1234');
await page.locator('button > svg.fa-plus').click();
await expect(page.locator('div[role="alert"]')).toBeVisible();
- await page.locator('div[role="alert"] button:has-text("No")').click();
- await page.locator('div[role="alert"] button > svg.fa-xmark').click();
+ await page.locator('div[role="alert"] button:has-text("No")').click(); // don't register
+ await page.locator('div[role="alert"] button > svg.fa-xmark').click(); // dismiss info alert
await expect(page.locator('div[role="alert"]')).toBeHidden();
await expect(page.getByTestId('contactListItem')).toHaveCount(2);
diff --git a/test-playwright/testUtils.ts b/test-playwright/testUtils.ts
index 7d8d52c79..82a1d8ca7 100644
--- a/test-playwright/testUtils.ts
+++ b/test-playwright/testUtils.ts
@@ -1,6 +1,9 @@
import { expect, Page } from '@playwright/test';
-export async function importUser(page: Page, id?: string): Promise {
+// Import the seed and switch to the user based on the ID.
+// '01' -> 111
+// otherwise -> 000
+export async function importUser(page: Page, id?: string): Promise {
let seedPhrase, userName, did;
// Set seed phrase and DID based on user ID
@@ -21,14 +24,45 @@ export async function importUser(page: Page, id?: string): Promise {
await page.getByText('You have a seed').click();
await page.getByPlaceholder('Seed Phrase').fill(seedPhrase);
await page.getByRole('button', { name: 'Import' }).click();
- await expect(page.locator('#sectionUsageLimits')).toContainText('You have done');
- await expect(page.locator('#sectionUsageLimits')).toContainText('You have uploaded');
-
- // Set name
- await page.getByRole('link', { name: 'Set Your Name' }).click();
- await page.getByPlaceholder('Name').fill(userName);
- await page.getByRole('button', { name: 'Save Changes' }).click();
// Check DID
await expect(page.getByRole('code')).toContainText(did);
+ // ... and ensure the app retrieves the registration status
+ await expect(page.getByText('Your claims counter resets')).toBeVisible();
+ return did;
+}
+
+// This is to switch to someone already in the identity table. It doesn't include registration.
+export async function switchToUser(page: Page, did: string): Promise {
+ await page.goto('./account');
+ await page.getByRole('heading', { name: 'Advanced' }).click();
+ await page.getByRole('link', { name: 'Switch Identifier' }).click();
+ await page.getByRole('code', { name: did }).click();
+}
+
+// Generate a new random user and register them.
+// Note that this makes 000 the active user. Use switchToUser to switch to this DID.
+export async function generateEthrUser(page: Page): Promise {
+ await page.goto('./start');
+ await page.getByTestId('newSeed').click();
+ await expect(page.locator('span:has-text("Created")')).toBeVisible();
+
+ await page.goto('./account');
+ // wait until the DID shows on the page in the 'did' element
+ const didElem = await page.getByTestId('didWrapper').locator('code:has-text("did:")');
+ const newDid = await didElem.innerText();
+
+ await importUser(page, '000'); // switch to user 000
+
+ await page.goto('./contacts');
+ const threeChars = newDid.slice(11, 14);
+ await page.getByPlaceholder('URL or DID, Name, Public Key').fill(`${newDid}, User ${threeChars}`);
+ await page.locator('button > svg.fa-plus').click();
+ await page.locator('li', { hasText: threeChars }).click();
+ // register them
+ await page.locator('div[role="alert"] button:has-text("Yes")').click();
+ // wait for it to disappear because the next steps may depend on alerts being gone
+ await expect(page.locator('div[role="alert"] button:has-text("Yes")')).toBeHidden();
+
+ return newDid;
}
\ No newline at end of file