2024-03-26 02:12:04 +00:00
import { IDHUB_WALLET , IDHUB_VERIFIER } from '../src/constants/env_constants' ;
2024-03-18 20:48:06 +00:00
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 ( ) ;
}
}
2024-03-26 02:12:04 +00:00
async function login ( page ) {
2024-03-18 20:48:06 +00:00
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 ( ) ;
2024-03-26 02:12:04 +00:00
}
2024-03-18 20:48:06 +00:00
2024-03-26 02:12:04 +00:00
// optional flow (only first time per idhub service start)
async function set_org_key ( page ) {
2024-03-18 20:48:06 +00:00
//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 ( ) ;
}
2024-03-26 02:12:04 +00:00
}
// useful for DEBUG
// await page.pause();
2024-04-03 17:07:22 +00:00
async function oidc_flow ( page ) {
2024-03-26 02:12:04 +00:00
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)
2024-04-03 17:07:22 +00:00
// TODO change hardcoded paths
2024-03-26 02:12:04 +00:00
if ( /setem/ . test ( hostname ) ) {
vcred_schema = 'Membership Card'
vcred_file = '/home/music/trustchain-oc1-orchestral-docker/IdHub/examples/excel_examples/membership-card.xlsx'
2024-04-03 17:07:22 +00:00
} else if ( /xo9b/ . test ( hostname ) ) {
2024-03-26 02:12:04 +00:00
vcred_schema = 'Financial Vulnerability Credential'
vcred_file = '/home/music/trustchain-oc1-orchestral-docker/IdHub/examples/excel_examples/financial-vulnerability.xlsx'
2024-04-03 17:07:22 +00:00
} 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'
2024-03-26 02:12:04 +00:00
}
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 ( ) ;
2024-04-03 17:07:22 +00:00
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)
2024-03-26 02:12:04 +00:00
// TODO averiguar si hace redirección a 2 es final 2 (OIDC_REDIRECT=true)
2024-04-03 17:07:22 +00:00
}
2024-03-26 02:12:04 +00:00
// 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 ( 'sign_pdf' , async ( { page } ) = > {
await login ( page ) ;
await set_org_key ( page ) ;
2024-03-18 20:48:06 +00:00
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!!)
2024-03-26 02:12:04 +00:00
// src https://www.programsbuzz.com/article/playwright-select-first-or-last-element
// not tested
await page . getByRole ( 'link' , { name : '' } ) . last ( ) . click ( ) ;
2024-03-18 20:48:06 +00:00
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 ;
2024-04-02 11:47:19 +00:00
await page . pause ( ) ;
2024-03-18 20:48:06 +00:00
} ) ;
2024-03-26 02:12:04 +00:00
2024-04-03 17:07:22 +00:00
test ( 'oidc_flow' , async ( { page } ) = > {
await oidc_flow ( page ) ;
await page . pause ( ) ;
} ) ;
2024-03-26 02:12:04 +00:00
test ( 'login' , async ( { page } ) = > {
await login ( page ) ;
await page . pause ( ) ;
} ) ;
2024-04-03 17:07:22 +00:00
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
await page . locator ( '#snapshot' ) . setInputFiles ( '/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' ) ;
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 ( ) ;
} ) ;