Compare commits
13 Commits
fixme_conc
...
master
Author | SHA1 | Date |
---|---|---|
pedro | ba87a54d5e | |
pedro | b61858f559 | |
pedro | f9b0e141a6 | |
pedro | f09e5b4e65 | |
pedro | 16c612762c | |
pedro | d8b025c2e3 | |
pedro | f06ace29b2 | |
pedro | aacfc290d4 | |
pedro | ea2023fc0e | |
pedro | 5639bfcfaf | |
pedro | 57b055daa5 | |
pedro | 6185da96c8 | |
pedro | c6b79a8742 |
|
@ -18,7 +18,9 @@ export default defineConfig({
|
||||||
/* Retry on CI only */
|
/* Retry on CI only */
|
||||||
retries: process.env.CI ? 2 : 0,
|
retries: process.env.CI ? 2 : 0,
|
||||||
/* Opt out of parallel tests on CI. */
|
/* Opt out of parallel tests on CI. */
|
||||||
workers: process.env.CI ? 1 : undefined,
|
// TODO fix more than 1 worker/concurrency situation
|
||||||
|
//workers: process.env.CI ? 1 : undefined,
|
||||||
|
workers: 1,
|
||||||
/* Reporter to use. See https://playwright.dev/docs/test-reporters */
|
/* Reporter to use. See https://playwright.dev/docs/test-reporters */
|
||||||
reporter: 'html',
|
reporter: 'html',
|
||||||
/* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */
|
/* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */
|
||||||
|
|
|
@ -135,7 +135,7 @@ test.describe('USER -> My Credentials - enable and issue credentials', () => {
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
test('USER -> My Credentials -> Request the issuance of a FVC for user3', async ({ page }) => {
|
test.fixme('USER -> My Credentials -> Request the issuance of a FVC for user3', async ({ page }) => {
|
||||||
|
|
||||||
let schemaType = SCHEMA_TYPE_FVC;
|
let schemaType = SCHEMA_TYPE_FVC;
|
||||||
let user = USER3_EMAIL;
|
let user = USER3_EMAIL;
|
||||||
|
|
|
@ -121,7 +121,7 @@ test.describe('USER -> My Credentials - enable and issue credentials', () => {
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
test('USER -> My Credentials -> Request the issuance of a MC for user3', async ({ page }) => {
|
test.fixme('USER -> My Credentials -> Request the issuance of a MC for user3', async ({ page }) => {
|
||||||
|
|
||||||
let schemaType = SCHEMA_TYPE_MC;
|
let schemaType = SCHEMA_TYPE_MC;
|
||||||
let user = USER3_EMAIL;
|
let user = USER3_EMAIL;
|
||||||
|
|
|
@ -120,7 +120,7 @@ test.describe('USER -> My Credentials - enable and issue credentials', () => {
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
test('USER -> My Credentials -> Request the issuance of a NGO_FM for user2', async ({ page }) => {
|
test.fixme('USER -> My Credentials -> Request the issuance of a NGO_FM for user2', async ({ page }) => {
|
||||||
|
|
||||||
let schemaType = SCHEMA_TYPE_NGO_FM;
|
let schemaType = SCHEMA_TYPE_NGO_FM;
|
||||||
let user = USER2_EMAIL;
|
let user = USER2_EMAIL;
|
||||||
|
|
|
@ -120,7 +120,7 @@ test.describe('USER -> My Credentials - enable and issue credentials', () => {
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
test('USER -> My Credentials -> Request the issuance of a CC for user2', async ({ page }) => {
|
test.fixme('USER -> My Credentials -> Request the issuance of a CC for user2', async ({ page }) => {
|
||||||
|
|
||||||
let schemaType = SCHEMA_TYPE_CC;
|
let schemaType = SCHEMA_TYPE_CC;
|
||||||
let user = USER2_EMAIL;
|
let user = USER2_EMAIL;
|
||||||
|
@ -130,4 +130,4 @@ test.describe('USER -> My Credentials - enable and issue credentials', () => {
|
||||||
await test_RequestAndCheckIssuedCredentialByUser(page, schemaType, user);
|
await test_RequestAndCheckIssuedCredentialByUser(page, schemaType, user);
|
||||||
|
|
||||||
});
|
});
|
||||||
})
|
})
|
||||||
|
|
|
@ -66,7 +66,7 @@ test.describe('ADMIN-> DATA -> Import EOP excel files', () => {
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
test('ADMIN-> DATA -> Import EOC excel file - Sad path (bad formatted file, with alien columns)', async ({ page }) => {
|
test.fixme('ADMIN-> DATA -> Import EOC excel file - Sad path (bad formatted file, with alien columns)', async ({ page }) => {
|
||||||
|
|
||||||
const fileToImport = FILE_TO_IMPORT_EOC_WITH_ALIEN_COLUMNS;
|
const fileToImport = FILE_TO_IMPORT_EOC_WITH_ALIEN_COLUMNS;
|
||||||
const jsonSchema = JSON_SCHEMA_EOC;
|
const jsonSchema = JSON_SCHEMA_EOC;
|
||||||
|
@ -122,7 +122,7 @@ test.describe('USER -> My Credentials - enable and issue credentials', () => {
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
test('USER -> My Credentials -> Request the issuance of a EOC for user2', async ({ page }) => {
|
test.fixme('USER -> My Credentials -> Request the issuance of a EOC for user2', async ({ page }) => {
|
||||||
|
|
||||||
let schemaType = SCHEMA_TYPE_EOC;
|
let schemaType = SCHEMA_TYPE_EOC;
|
||||||
let user = USER2_EMAIL;
|
let user = USER2_EMAIL;
|
||||||
|
@ -132,4 +132,4 @@ test.describe('USER -> My Credentials - enable and issue credentials', () => {
|
||||||
await test_RequestAndCheckIssuedCredentialByUser(page, schemaType, user);
|
await test_RequestAndCheckIssuedCredentialByUser(page, schemaType, user);
|
||||||
|
|
||||||
});
|
});
|
||||||
})
|
})
|
||||||
|
|
|
@ -0,0 +1,240 @@
|
||||||
|
import { IDHUB_WALLET, IDHUB_VERIFIER } from '../src/constants/env_constants';
|
||||||
|
|
||||||
|
import { test, expect } from '@playwright/test';
|
||||||
|
// TODO import domain WALLET y VERIFIER
|
||||||
|
// TODO env var
|
||||||
|
|
||||||
|
// optional page (decrypt)
|
||||||
|
// src https://playwright.dev/docs/locators#matching-one-of-the-two-alternative-locators
|
||||||
|
async function accept_data_protection(page) {
|
||||||
|
// TODO cannot be, because of this inconsistency: Data Protection (user) vs Data protection (admin)
|
||||||
|
//const data_protection = await page.getByRole('heading', { name: 'Data protection', exact: true })
|
||||||
|
const data_protection = await page.getByRole('heading', { name: 'Data protection' })
|
||||||
|
if (await data_protection.isVisible()) {
|
||||||
|
await page.locator('#id_accept_privacy').check();
|
||||||
|
await page.locator('#id_accept_legal').check();
|
||||||
|
await page.locator('#id_accept_cookies').check();
|
||||||
|
await page.getByRole('link', { name: 'Confirm' }).click();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function login(page) {
|
||||||
|
await page.goto(IDHUB_WALLET + '/login/');
|
||||||
|
await page.getByPlaceholder('Email address').click();
|
||||||
|
await page.getByPlaceholder('Email address').fill('idhub_admin@pangea.org');
|
||||||
|
await page.getByPlaceholder('Password').fill('1234');
|
||||||
|
await page.getByRole('button', { name: 'Log in' }).click();
|
||||||
|
}
|
||||||
|
|
||||||
|
// optional flow (only first time per idhub service start)
|
||||||
|
async function set_org_key(page) {
|
||||||
|
//const encryption_key_page = page.getByText('Encryption Key')
|
||||||
|
const encryption_key_page_admin = await page.getByRole('heading', { name: 'Encryption Key', exact: true })
|
||||||
|
if (await encryption_key_page_admin.isVisible()) {
|
||||||
|
await page.getByPlaceholder('Key for encrypt the secrets').click();
|
||||||
|
await page.getByPlaceholder('Key for encrypt the secrets').fill('1234');
|
||||||
|
await page.getByRole('button', { name: 'Save' }).click();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// useful for DEBUG
|
||||||
|
// await page.pause();
|
||||||
|
|
||||||
|
async function oidc_flow(page) {
|
||||||
|
|
||||||
|
await login(page);
|
||||||
|
|
||||||
|
const url = page.url();
|
||||||
|
const hostname = new URL(url).hostname;
|
||||||
|
let vcred_schema;
|
||||||
|
let vcred_file;
|
||||||
|
// TODO vcred_file path is hardcoded:
|
||||||
|
// 1. make it relative
|
||||||
|
// 2. add file in e2e test directory (maybe already exists)
|
||||||
|
// see ./vc_excel/financial-vulnerability.xlsx (visto, no es el mismo)
|
||||||
|
// TODO change hardcoded paths
|
||||||
|
if (/setem/.test(hostname)) {
|
||||||
|
vcred_schema='Membership Card'
|
||||||
|
vcred_file='/home/music/trustchain-oc1-orchestral-docker/IdHub/examples/excel_examples/membership-card.xlsx'
|
||||||
|
} else if (/xo9b/.test(hostname)) {
|
||||||
|
vcred_schema='Financial Vulnerability Credential'
|
||||||
|
vcred_file='/home/music/trustchain-oc1-orchestral-docker/IdHub/examples/excel_examples/financial-vulnerability.xlsx'
|
||||||
|
} else if (/ereuse/.test(hostname)) {
|
||||||
|
vcred_schema='Product and waste electronics operator claim'
|
||||||
|
vcred_file='/home/music/trustchain-oc1-orchestral-docker/IdHub/examples/excel_examples/e-operator-claim.xlsx'
|
||||||
|
} else {
|
||||||
|
test.skip();
|
||||||
|
}
|
||||||
|
|
||||||
|
await set_org_key(page);
|
||||||
|
|
||||||
|
await accept_data_protection(page);
|
||||||
|
|
||||||
|
await page.getByRole('link', { name: ' Data' }).click();
|
||||||
|
await page.getByRole('link', { name: 'Import data ' }).click();
|
||||||
|
// src https://playwright.dev/docs/input#select-options
|
||||||
|
await page.getByLabel('Schema').selectOption(vcred_schema);
|
||||||
|
// src https://playwright.dev/docs/input#upload-files
|
||||||
|
// TODO hardcoded URL
|
||||||
|
await page.getByLabel('File to import').setInputFiles(vcred_file);
|
||||||
|
//await page.setInputFiles('input[type="file"]', '/home/music/trustchain-oc1-orchestral-docker/IdHub/examples/excel_examples/financial-vulnerability.xlsx');
|
||||||
|
await page.getByRole('button', { name: 'Save' }).click();
|
||||||
|
await page.getByRole('link', { name: '', exact: true }).click();
|
||||||
|
await page.getByPlaceholder('Email address').click();
|
||||||
|
await page.getByPlaceholder('Email address').fill('user1@example.org');
|
||||||
|
await page.getByPlaceholder('Password').click();
|
||||||
|
await page.getByPlaceholder('Password').fill('1234');
|
||||||
|
await page.getByRole('button', { name: 'Log in' }).click();
|
||||||
|
|
||||||
|
await accept_data_protection(page);
|
||||||
|
|
||||||
|
await page.getByRole('link', { name: 'Identities (DIDs)' }).click();
|
||||||
|
await page.getByRole('link', { name: 'Add Identity ' }).click();
|
||||||
|
await page.getByPlaceholder('Label').click();
|
||||||
|
await page.getByPlaceholder('Label').fill('default');
|
||||||
|
// TODO where?
|
||||||
|
// TODO report bug, if selected the wrong credential here, se queda colgado
|
||||||
|
await page.getByLabel('Type').selectOption('1');
|
||||||
|
await page.getByRole('button', { name: 'Save' }).click();
|
||||||
|
await page.getByRole('link', { name: 'Request a credential' }).click();
|
||||||
|
await page.getByRole('button', { name: 'Request' }).click();
|
||||||
|
|
||||||
|
if (/xo9b/.test(hostname)) {
|
||||||
|
await page.goto(IDHUB_VERIFIER + '/promotion/');
|
||||||
|
await page.getByRole('link', { name: 'Contractar amb credencial' }).click();
|
||||||
|
await page.getByRole('button', { name: 'Go' }).click();
|
||||||
|
await page.getByRole('radio').first().check();
|
||||||
|
await page.getByRole('checkbox').check();
|
||||||
|
await page.getByRole('button', { name: 'Present' }).click();
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO averiguar si devuelve código es final 1 (OIDC_REDIRECT=false)
|
||||||
|
// TODO averiguar si hace redirección a 2 es final 2 (OIDC_REDIRECT=true)
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO test que hace la presentación de la credencial al revés
|
||||||
|
|
||||||
|
// TODO test que hace la presentación de la credencial al revés
|
||||||
|
|
||||||
|
test.describe.skip('test-pilots', () => {
|
||||||
|
test('sign_pdf', async ({ page }) => {
|
||||||
|
await login(page);
|
||||||
|
|
||||||
|
await set_org_key(page);
|
||||||
|
|
||||||
|
await accept_data_protection(page);
|
||||||
|
|
||||||
|
await page.getByRole('link', { name: ' Credentials' }).click();
|
||||||
|
await page.getByRole('link', { name: 'Organization\'s wallet' }).click();
|
||||||
|
await page.getByRole('link', { name: 'Configure credential issuance' }).click();
|
||||||
|
await page.getByPlaceholder('Label').click();
|
||||||
|
await page.getByPlaceholder('Label').fill('dni');
|
||||||
|
await page.getByPlaceholder('Label').press('Tab');
|
||||||
|
await page.getByPlaceholder('Password of certificate').fill('123456');
|
||||||
|
//await page.getByLabel('File import').click();
|
||||||
|
await page.getByLabel('File import').setInputFiles('/home/music/trustchain-oc1-orchestral-docker/IdHub/examples/signerDNIe004.pfx');
|
||||||
|
await page.getByRole('button', { name: 'Upload' }).click();
|
||||||
|
await page.getByRole('link', { name: ' Data' }).click();
|
||||||
|
await page.getByRole('link', { name: 'Import data ' }).click();
|
||||||
|
await page.getByLabel('Signature with Eidas1').selectOption('signerDNIe004.pfx');
|
||||||
|
await page.getByLabel('Schema').selectOption('1');
|
||||||
|
await page.getByText('ID HUB PANGEA idhub_admin@pangea.org Dashboard Users View users Add user Roles').click();
|
||||||
|
//await page.getByLabel('File to import').click();
|
||||||
|
await page.getByLabel('File to import').setInputFiles('/home/music/trustchain-oc1-orchestral-docker/IdHub/examples/excel_examples/course-credential.xlsx');
|
||||||
|
await page.getByRole('button', { name: 'Save' }).click();
|
||||||
|
|
||||||
|
// await page.getByRole('link', { name: ' Data' }).click();
|
||||||
|
// await page.getByRole('link', { name: 'Import data ' }).click();
|
||||||
|
// // src https://playwright.dev/docs/input#select-options
|
||||||
|
// await page.getByLabel('Schema').selectOption('Financial Vulnerability Credential');
|
||||||
|
// // src https://playwright.dev/docs/input#upload-files
|
||||||
|
// // TODO hardcoded URL
|
||||||
|
// await page.getByLabel('File to import').setInputFiles('/home/music/trustchain-oc1-orchestral-docker/IdHub/examples/excel_examples/financial-vulnerability.xlsx');
|
||||||
|
// //await page.setInputFiles('input[type="file"]', '/home/music/trustchain-oc1-orchestral-docker/IdHub/examples/excel_examples/financial-vulnerability.xlsx');
|
||||||
|
// await page.getByRole('button', { name: 'Save' }).click();
|
||||||
|
|
||||||
|
await page.getByRole('link', { name: '', exact: true }).click();
|
||||||
|
await page.getByPlaceholder('Email address').click();
|
||||||
|
await page.getByPlaceholder('Email address').fill('user1@example.org');
|
||||||
|
await page.getByPlaceholder('Password').click();
|
||||||
|
await page.getByPlaceholder('Password').fill('1234');
|
||||||
|
await page.getByRole('button', { name: 'Log in' }).click();
|
||||||
|
|
||||||
|
await accept_data_protection(page);
|
||||||
|
|
||||||
|
await page.getByRole('link', { name: 'Identities (DIDs)' }).click();
|
||||||
|
await page.getByRole('link', { name: 'Add Identity ' }).click();
|
||||||
|
await page.getByPlaceholder('Label').click();
|
||||||
|
await page.getByPlaceholder('Label').fill('default');
|
||||||
|
await page.getByLabel('Type').selectOption('1');
|
||||||
|
await page.getByRole('button', { name: 'Save' }).click();
|
||||||
|
await page.getByRole('link', { name: 'Request a credential' }).click();
|
||||||
|
await page.getByRole('button', { name: 'Request' }).click();
|
||||||
|
// TODO take last (because is the latest!!)
|
||||||
|
// src https://www.programsbuzz.com/article/playwright-select-first-or-last-element
|
||||||
|
// not tested
|
||||||
|
await page.getByRole('link', { name: '' }).last().click();
|
||||||
|
const downloadPromise = page.waitForEvent('download');
|
||||||
|
await page.getByRole('link', { name: 'Download as PDF (Catalan)' }).click();
|
||||||
|
const download = await downloadPromise;
|
||||||
|
const download1Promise = page.waitForEvent('download');
|
||||||
|
await page.getByRole('link', { name: 'Download as JSON' }).click();
|
||||||
|
const download1 = await download1Promise;
|
||||||
|
const download2Promise = page.waitForEvent('download');
|
||||||
|
await page.getByRole('link', { name: 'Download as PDF (Spanish)' }).click();
|
||||||
|
const download2 = await download2Promise;
|
||||||
|
await page.pause();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('oidc_flow', async ({ page }) => {
|
||||||
|
await oidc_flow(page);
|
||||||
|
await page.pause();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('login', async ({ page }) => {
|
||||||
|
await login(page);
|
||||||
|
await page.pause();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('ereuse_pilot', async ({ page }) => {
|
||||||
|
// TEMP reenable
|
||||||
|
await oidc_flow(page);
|
||||||
|
|
||||||
|
// TODO hardcoded domain
|
||||||
|
await page.goto('https://devicehub.demo.pangea.org/');
|
||||||
|
await page.getByPlaceholder('Email').fill('manufacturer@hp.es');
|
||||||
|
await page.getByPlaceholder('Email').press('Tab');
|
||||||
|
await page.getByPlaceholder('Password').fill('1234');
|
||||||
|
await page.getByPlaceholder('Password').press('Enter');
|
||||||
|
|
||||||
|
await page.getByRole('button', { name: ' Snapshots' }).click();
|
||||||
|
await page.getByRole('link', { name: ' Upload files' }).click();
|
||||||
|
|
||||||
|
// TODO hardcoded URL
|
||||||
|
// TODO this was the first we tried and work
|
||||||
|
//const snapshot_file='/home/music/org-extra/projects-2024/2024_17_tchain/2024-04-02__piloto-ereuse/snapshot-2022-6-9-10-21_usody@pangea.org_7928afeb-e6a4-464a-a842-0c3de0d01677.json'
|
||||||
|
// TODO this comes from here: https://gitea.pangea.org/trustchain-oc1-orchestral/devicehub-teal/src/branch/idhub/examples/snapshots/snapshot01.json
|
||||||
|
//const snapshot_file='/home/music/trustchain-oc1-orchestral-docker/devicehub-teal/examples/snapshots/snapshot01.json'
|
||||||
|
await page.locator('#snapshot').setInputFiles(snapshot_file);
|
||||||
|
await page.getByRole('button', { name: 'Send' }).click();
|
||||||
|
await page.getByRole('link', { name: ' Unassigned devices' }).click();
|
||||||
|
|
||||||
|
await page.getByRole('link', { name: ' Laptop hewlett-packard hp' }).click();
|
||||||
|
await page.getByRole('button', { name: 'Digital Passports' }).click();
|
||||||
|
|
||||||
|
const page1Promise = page.waitForEvent('popup');
|
||||||
|
await page.getByRole('link', { name: '169f2c6c0b60a529fce65ba619b2fa5ddc02207e0cbe8b7d64afe39bb247e02f:' }).click();
|
||||||
|
const page1 = await page1Promise;
|
||||||
|
|
||||||
|
await page1.getByRole('link', { name: 'Logout' }).click();
|
||||||
|
await page1.getByRole('button', { name: 'Validate' }).click();
|
||||||
|
await page1.getByRole('link', { name: 'Use a wallet' }).click();
|
||||||
|
await page1.getByRole('button', { name: 'Go' }).click();
|
||||||
|
await page1.getByRole('radio').check();
|
||||||
|
await page1.getByRole('checkbox').check();
|
||||||
|
await page1.getByRole('button', { name: 'Present' }).click();
|
||||||
|
|
||||||
|
await page.pause();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
Reference in New Issue