diff --git a/src/constants/constants.ts b/src/constants/constants.ts index 246c852..0281e7c 100644 --- a/src/constants/constants.ts +++ b/src/constants/constants.ts @@ -1,44 +1,71 @@ -/*Constants for TEMPLATES testing*/ - -//JSON_SCHEMA_FVC: A string representing the filename of the financial vulnerability JSON schema. -export const JSON_SCHEMA_FVC = "financial-vulnerability.json" - -//JSON_SCHEMA_ID_FVC: A URL pointing to the online location of the financial vulnerability JSON schema. -export const JSON_SCHEMA_ID_FVC = "https://idhub.pangea.org/vc_schemas/financial-vulnerability.json" - -/*Files used in DATA IMPORT testing*/ - //PATH_FILES_TO_IMPORT: A string representing the path to the directory where Excel files are located for data import testing. export const PATH_FILES_TO_IMPORT = '/vc_excel/' -//Financial Vulnerability Credential +//JSON_SCHEMA: A string representing the filename of the credential JSON schema. +export const JSON_SCHEMA_FVC = "financial-vulnerability.json" +export const JSON_SCHEMA_MC = "membership-card.json" +export const JSON_SCHEMA_NGO_FM = "federation-membership.json" +export const JSON_SCHEMA_CC = "course-credential.json" +export const JSON_SCHEMA_EOC = "e-operator-claim.json" + + +//JSON_SCHEMA_ID: A URL pointing to the online location of the financial vulnerability JSON schema. +export const JSON_SCHEMA_ID_FVC = "https://idhub.pangea.org/vc_schemas/financial-vulnerability.json" +export const JSON_SCHEMA_ID_MC = "https://idhub.pangea.org/vc_schemas/membership-card.json" +export const JSON_SCHEMA_ID_NGO_FM = "https://idhub.pangea.org/vc_schemas/federation-membership.json" +export const JSON_SCHEMA_ID_CC = "https://idhub.pangea.org/vc_schemas/course-credential.json" +export const JSON_SCHEMA_ID_EOC = "https://idhub.pangea.org/vc_schemas/e-operator-claim.json" + +//Excel testing files +//FVC export const FILE_TO_IMPORT_FVC = 'financial-vulnerability.xlsx' export const FILE_TO_IMPORT_FVC_EMPTY = 'financial-vulnerability-empty.xlsx' export const FILE_TO_IMPORT_FVC_WITHOUT_REQUIRED_COLUMNS = 'financial-vulnerability-without-required-columns.xlsx' export const FILE_TO_IMPORT_FVC_WITH_ALIEN_COLUMNS = 'financial-vulnerability-with-alien-columns.xlsx' +export const FILE_TO_IMPORT_FVC_WITH_REQUIRED_EMPTY = 'financial-vulnerability-with-required-empty.xlsx' -//"Schema name" as appears in the Idhub User interface for FVC +//MC +export const FILE_TO_IMPORT_MC = 'membership-card.xlsx' +export const FILE_TO_IMPORT_MC_2 = 'membership-card2.xlsx' +export const FILE_TO_IMPORT_MC_EMPTY = 'membership-card-empty.xlsx' +export const FILE_TO_IMPORT_MC_WITHOUT_REQUIRED_COLUMNS = 'membership-card-without-required-columns.xlsx' +export const FILE_TO_IMPORT_MC_WITH_ALIEN_COLUMNS = 'membership-card-with-alien-columns.xlsx' +export const FILE_TO_IMPORT_MC_WITH_REQUIRED_EMPTY = 'membership-card-with-required-empty.xlsx' + +//NGO FEDERATION MEMBERSHIP +export const FILE_TO_IMPORT_NGO_FM = 'federation-membership.xlsx' +export const FILE_TO_IMPORT_NGO_FM_EMPTY = 'federation-membership-empty.xlsx' +export const FILE_TO_IMPORT_NGO_FM_WITHOUT_REQUIRED_COLUMNS = 'federation-membership-without-required-columns.xlsx' +export const FILE_TO_IMPORT_NGO_FM_WITH_ALIEN_COLUMNS = 'federation-membership-with-alien-columns.xlsx' +export const FILE_TO_IMPORT_NGO_FM_WITH_REQUIRED_EMPTY = 'federation-membership-with-required-empty.xlsx' + +//CC +export const FILE_TO_IMPORT_CC = 'course-credential.xlsx' +export const FILE_TO_IMPORT_CC_EMPTY = 'course-credential-empty.xlsx' +export const FILE_TO_IMPORT_CC_WITHOUT_REQUIRED_COLUMNS = 'course-credential-without-required-columns.xlsx' +export const FILE_TO_IMPORT_CC_WITH_ALIEN_COLUMNS = 'course-credential-with-alien-columns.xlsx' +export const FILE_TO_IMPORT_CC_WITH_REQUIRED_EMPTY = 'course-credential-with-required-empty.xlsx' + +//E-OPERATOR-CLAIM +export const FILE_TO_IMPORT_EOC = 'e-operator-claim.xlsx' +export const FILE_TO_IMPORT_EOC_EMPTY = 'e-operator-claim-empty.xlsx' +export const FILE_TO_IMPORT_EOC_WITHOUT_REQUIRED_COLUMNS = 'e-operator-claim-without-required-columns.xlsx' +export const FILE_TO_IMPORT_EOC_WITH_ALIEN_COLUMNS = 'e-operator-claim-with-alien-columns.xlsx' +export const FILE_TO_IMPORT_EOC_WITH_REQUIRED_EMPTY = 'e-operator-claim-with-required-empty.xlsx' + +//"Schema name" as appears in the Idhub Admin interface Data->Import->combo schema export const SCHEMA_FVC = 'Financial Vulnerability Credential' - -//"Schema type" as appears in the Idhub User interface for FVC -export const SCHEMA_TYPE_FVC = 'FinancialVulnerabilityCredential' - - -//Membership Card -export const FILE_TO_IMPORT_MC = 'membership-card.xlsx'; export const SCHEMA_MC = 'Membership Card' -export const SCHEMA_TYPE_MC = 'MembershipCardCredential' //Revisar este valor en la interfaz - -//NGOFederationMembership -export const FILE_TO_IMPORT_FM = 'federation-membership.xlsx'; -export const SCHEMA_FM = 'Federation Membership' -export const SCHEMA_TYPE_FM = 'FederationMembership' //Revisar este valor en la interfaz (en Type) - -//Course Credential -export const FILE_TO_IMPORT_CC = 'course-credential.xlsx'; -export const SCHEMA_CC = 'Course Credential' -export const SCHEMA_TYPE_CC = 'CourseCredential' //Revisar este valor en la interfaz +export const SCHEMA_NGO_FM = 'NGO federation membership' +export const SCHEMA_CC = 'NGO Course Credential for participants' +export const SCHEMA_EOC = 'Product and waste electronics operator claim' +//"Schema type" as appears in the Idhub My wallet->My Credentials-> value on column 'type' +export const SCHEMA_TYPE_FVC = 'FinancialVulnerabilityCredential' +export const SCHEMA_TYPE_MC = 'MembershipCard' +export const SCHEMA_TYPE_NGO_FM = 'FederationMembership' +export const SCHEMA_TYPE_CC = 'CourseCredential' +export const SCHEMA_TYPE_EOC = 'EOperatorClaim' //Messages export const ALERT_FILE_IMPORTED_SUCCESSFULLY = "The file was imported successfully!" @@ -47,9 +74,17 @@ export const ALERT_FILE_TO_IMPORT_IS_EMPTY = "The file you try to import is empt export const ALERT_FILE_NOT_CORRESPOND_SCHEMA = "This File does not correspond to this scheme!" export const ALERT_FILE_IS_BADLY_FORMATTED = "This file is badly formatted!" export const ALERT_FILE_TO_IMPORT_WITHOUT_REQUIRED_COLUMS = "line 2: 'email' is a required property" +export const ALERT_FILE_TO_IMPORT_WITHOUT_REQUIRED_COLUMS_MC = "line 2: 'affiliatedSince' is a required property" +export const ALERT_FILE_TO_IMPORT_WITHOUT_REQUIRED_COLUMS_NGO_FM = "line 2: 'legalName' is a required property" +export const ALERT_FILE_TO_IMPORT_WITHOUT_REQUIRED_COLUMS_CC = "line 2: 'firstName' is a required property" +export const ALERT_FILE_TO_IMPORT_WITHOUT_REQUIRED_COLUMS_EOC = "line 2: 'legalName' is a required property" export const ALERT_FILE_TO_IMPORT_WITH_ALIEN_COLUMS = "line 2: Additional properties are not allowed ('alien1', 'alien2' were unexpected)" -export const ALERT_USER_CREATED_SUCESSFULLY_MESSAGE = 'The account was created successfully' +export const ALERT_FILE_TO_IMPORT_WITH_REQUIRED_COLUMS_EMPTY = "line 3: 'firstName' is a required property" +export const ALERT_FILE_TO_IMPORT_WITH_REQUIRED_COLUMS_EMPTY_NGO_FM = "line 5: 'postCode' is a required property" +export const ALERT_FILE_TO_IMPORT_WITH_REQUIRED_COLUMS_EMPTY_EOC = "line 3: 'legalName' is a required property" + +export const ALERT_USER_CREATED_SUCESSFULLY_MESSAGE = 'The account was created successfully' export const ERROR_INCORRECT_EMAIL_PASSWORD = 'Please enter a correct Email address and password. Note that both fields may be case-sensitive.' diff --git a/src/constants/credential_fields.ts b/src/constants/credential_fields.ts index 39aa91e..55fcf7c 100644 --- a/src/constants/credential_fields.ts +++ b/src/constants/credential_fields.ts @@ -16,26 +16,71 @@ export const CREDENTIAL_TYPES_FIELDS_LIST = { 'assessmentDate' ] as string[], - - // TODO Add other type credentials... -}; - -export const CREDENTIAL_TYPES_REQUIRED_FIELDS_LIST = { - "FinancialVulnerabilityCredential": [ - "id", - "firstName", - "lastName", - "email", - "identityDocType", - "identityNumber", - "streetAddress", - "socialWorkerName", - "socialWorkerSurname", - "financialVulnerabilityScore", - "amountCoveredByOtherAids", - "assessmentDate" + "MembershipCard": [ + 'organisation', + 'membershipType', + 'membershipId', + 'affiliatedSince', + 'affiliatedUntil', + 'typeOfPerson', + 'identityDocType', + 'identityNumber', + 'firstName', + 'lastName', + 'role', + 'email' ] as string[], + "FederationMembership": [ + 'federation', + 'legalName', + 'shortName', + 'registrationIdentifier', + 'publicRegistry', + 'streetAddress', + 'postCode', + 'city', + 'taxReference', + 'membershipType', + 'membershipStatus', + 'membershipId', + 'membershipSince', + 'email', + 'phone', + 'website', + 'evidence', + 'certificationDate', + ] as string[], + + "CourseCredential": [ + 'firstName', + 'lastName', + 'email', + 'personalIdentifier', + 'issuedDate', + 'modeOfInstruction', + 'courseDuration', + 'courseDays', + 'courseName', + 'courseDescription', + 'gradingScheme', + 'scoreAwarded', + 'qualificationAwarded', + 'courseLevel', + 'courseFramework', + 'courseCredits', + 'dateOfAssessment', + 'evidenceAssessment' + ] as string[], + + "EOperatorClaim": [ + 'legalName', + 'role', + 'email', + 'accreditedBy', + 'operatorNumber', + 'limitJurisdiction', + 'accreditedFor' + ] as string[], +}; - // TODO Add other type credentials... -}; \ No newline at end of file diff --git a/src/constants/env_constants.ts b/src/constants/env_constants.ts index c294edb..b292c87 100644 --- a/src/constants/env_constants.ts +++ b/src/constants/env_constants.ts @@ -3,9 +3,15 @@ export const ENCRYPTION_KEY = "1234" export const ADMIN_EMAIL = "idhub_admin@pangea.org" export const ADMIN_K = "1234" export const KO_ADMIN_K = "876" + +//export const URL_IDHUB = "https://idhub-autotest.demo.pangea.org" export const URL_IDHUB = "https://idhub1-autotest.demo.pangea.org" //export const URL_IDHUB = "https://idhub1-nightly.demo.pangea.org" +//2fa enabled +//export const URL_IDHUB = "https://idhub-nightly.demo.pangea.org" + + export const USER1_EMAIL = "user1@example.org" export const USER2_EMAIL = "user2@example.org" export const USER3_EMAIL = "user3@example.org" diff --git a/src/data_stores/credentials_data_store.ts b/src/data_stores/credentials_data_store.ts index 122e21f..20a3ddd 100644 --- a/src/data_stores/credentials_data_store.ts +++ b/src/data_stores/credentials_data_store.ts @@ -1,12 +1,11 @@ -import { CourseCredential_fields, FinancialVulnerabilityCredential_fields, MembershipCard_fields, NGOFederationMembership_fields } from "../interfaces/credential_interfaces"; // List of entries in data store for the different types of credentials export const CREDENTIAL_TYPES_DATA_STORE = { - FinancialVulnerabilityCredential_data: [] as FinancialVulnerabilityCredential_fields[], - MembershipCard_data: [] as MembershipCard_fields[], - NGOFederationMembership_data: [] as NGOFederationMembership_fields[], - CourseCredential_data: [] as CourseCredential_fields[], - //TODO añadir otros tipos de credenciales + FinancialVulnerabilityCredential_data: [] as Record, + MembershipCard_data: [] as Record, + FederationMembership_data: [] as Record, + CourseCredential_data: [] as Record, + EOperatorClaim_data: [] as Record }; //Testing data for financialVulnerabilityCredential @@ -72,21 +71,252 @@ CREDENTIAL_TYPES_DATA_STORE.FinancialVulnerabilityCredential_data = [{ } ]; +//Testing data for Membership Card + CREDENTIAL_TYPES_DATA_STORE.MembershipCard_data = [ - //TODO: fill with data + { + organisation: "Pangea", + membershipType: "Employee", + membershipId: "1234", + affiliatedSince: "2019-01-01", + affiliatedUntil: "2025-01-01", + typeOfPerson: "natural", + identityDocType: "DNI", + identityNumber: "89898987A", + firstName: "Wolfgang Amadeus", + lastName: "Mozart", + role: "Conductor", + email: "user1@example.org" + }, + { + organisation: "Pangea", + membershipType: "Employee", + membershipId: "2345", + affiliatedSince: "2020-01-01", + typeOfPerson: "natural", + identityDocType: "NIE", + identityNumber: "23456789P", + firstName: "Ludwing Van", + lastName: "Beethoven", + role: "Composer", + email: "user2@example.org" + }, + { + organisation: "Pangea", + membershipType: "Employee", + membershipId: "2312", + affiliatedSince: "2021-01-01", + affiliatedUntil: "2026-01-01", + typeOfPerson: "natural", + identityDocType: "DNI", + identityNumber: "87665566D", + firstName: "Franz", + lastName: "Schubert", + role: "Chamber musician", + email: "user3@example.org" + }, + { + organisation: "Pangea", + membershipType: "Employee", + membershipId: "3212", + affiliatedSince: "2021-01-01", + affiliatedUntil: "2026-01-01", + typeOfPerson: "natural", + identityDocType: "NIE", + identityNumber: "87654567", + firstName: "Barbara", + lastName: "Strozzi", + role: "Composer and Singer", + email: "user4@example.org" + }, + { + organisation: "Pangea", + membershipType: "Employee", + membershipId: "4544", + affiliatedSince: "2021-01-02", + affiliatedUntil: "2026-01-01", + typeOfPerson: "natural", + identityDocType: "DNI", + identityNumber: "98765432", + firstName: "Clara", + lastName: "Schumann", + role: "Composer and Pianist", + email: "user5@example.org" + } ]; -CREDENTIAL_TYPES_DATA_STORE.NGOFederationMembership_data = [ - //TODO: fill with data +CREDENTIAL_TYPES_DATA_STORE.FederationMembership_data = [ + { + federation: "Lafede", + legalName: "ACCIÓ CONTRA LA FAM", + shortName: "ACCIÓ CONTRA LA FAM", + registrationIdentifier: "28-0968", + publicRegistry: "Registro del Protectorado de Fundaciones del Ministerio de Asuntos Sociales", + streetAddress: "c/Diputació, 180, 3B", + postCode: "08011", + city: "Barcelona", + taxReference: "G-81164105", + membershipType: "full", + membershipStatus: "active", + membershipId: "1234", + membershipSince: "2010-01-01", + email: "user1@example.org", + phone: "93 254 03 81", + website: "https://www.acciocontralafam.org", + certificationDate: "2024-02-02", + }, + { + federation: "Lafede", + legalName: "ACNUR CATALUNYA – COMITÈ CATALÀ PER ALS REFUGIATS", + shortName: "UNHCR ACNUR", + registrationIdentifier: "130.446", + publicRegistry: "Registro del Protectorado de Fundaciones del Ministerio de Asuntos Sociales", + streetAddress: "c/ Trafalgar, 6. Principal 3ª", + postCode: "08001", + city: "Barcelona", + taxReference: "G80757560", + membershipType: "observer", + membershipStatus: "active", + membershipId: "2345", + membershipSince: "2010-01-01", + email: "user2@example.org", + website: "https://www.eacnur.org", + certificationDate: "2024-02-02", + }, + { + federation: "Lafede", + legalName: "AMNISTIA INTERNACIONAL CATALUNYA", + shortName: "AMNISTIA INTERNACIONAL", + registrationIdentifier: "22729", + publicRegistry: "Registro del Protectorado de Fundaciones del Ministerio de Asuntos Sociales", + streetAddress: "Alfons XII, 19-21, pral. 1A", + postCode: "08006", + city: "Barcelona", + membershipType: "observer", + membershipStatus: "active", + membershipId: "2345", + membershipSince: "2010-01-01", + email: "user3@example.org", + website: "https://www.amnistiacatalunya.org", + certificationDate: "2024-02-02", + }, + { + federation: "Lafede", + legalName: "ASSOCIACIÓ CATALANA D’ENGINYERIA SENSE FRONTERES", + shortName: "ENGINYERIA SENSE FRONTERES", + publicRegistry: "Registro del Protectorado de Fundaciones del Ministerio de Asuntos Sociales", + streetAddress: "Mandoni 4, Baixos,", + postCode: "08004", + city: "Barcelona", + membershipType: "full", + membershipStatus: "active", + membershipId: "4567", + membershipSince: "2010-01-01", + email: "user4@example.ort", + phone: "93 302 27 53", + website: "https://www.esf-cat.org", + certificationDate: "2024-02-02", + }, ]; + CREDENTIAL_TYPES_DATA_STORE.CourseCredential_data = [ - //TODO: fill with data + { + firstName: "Wolfgang Amadeus", + lastName: "Mozart", + email: "user1@example.org", + personalIdentifier: "1234", + issuedDate: "2022-09-22", + modeOfInstruction: "online", + courseDuration: "20", + courseDays: "5", + courseName: "How to write a great sonata", + courseDescription: "This course provides an in-depth exploration of sonata form, a structural framework that has been central to the development of Western classical music, particularly in the first movements of sonatas, symphonies, and string quartets.", + gradingScheme: "Grade Point Average (GPA)", + scoreAwarded: "10", + qualificationAwarded: "A+", + courseLevel: "Postgraduate", + courseFramework: "European Qualifications Framework (EQF) Level 6", + courseCredits: "5", + dateOfAssessment: "2020-12-20", + evidenceAssessment: "final exam" + }, + { + firstName: "Ludwing Van", + lastName: "Beethoven", + email: "user2@example.org", + personalIdentifier: "44334", + issuedDate: "2021-10-10", + modeOfInstruction: "onsite", + courseDuration: "10", + courseDays: "3", + courseName: "Modern piano", + courseDescription: "The Modern Piano course offers a comprehensive exploration of various styles of modern piano music, from the early 20th century to contemporary times.", + gradingScheme: "Grade Point Average (GPA)", + scoreAwarded: "9", + qualificationAwarded: "A", + courseLevel: "Undergraduate", + courseCredits: "7", + dateOfAssessment: "2020-12-20", + evidenceAssessment: "presence" + }, + { + firstName: "Barbara", + lastName: "Strozzi", + email: "user4@example.org", + personalIdentifier: "45454K", + issuedDate: "2019-05-05", + modeOfInstruction: "online", + courseDuration: "20", + courseDays: "5", + courseName: "Opera", + courseDescription: "The Opera course offers a comprehensive exploration of opera as an art form, from its historical origins to its contemporary expressions.", + scoreAwarded: "9", + qualificationAwarded: "A", + courseLevel: "Postgraduate", + courseFramework: "Classical music", + courseCredits: "10", + dateOfAssessment: "2020-12-20", + evidenceAssessment: "presence" + } ]; - +CREDENTIAL_TYPES_DATA_STORE.EOperatorClaim_data = [ + { + legalName: "Recicladors associats", + role: "Gestor de residus RAEE", + email: "user1@example.org", + accreditedBy: "Agència de residus de Catalunya", + operatorNumber: "E-1111.22", + limitJurisdiction: "Catalunya", + accreditedFor: "CLASSIFICACIÓ DE FERRALLA, RES. VOLUMINOSOS, DESMUNTATGE DE RAEE I PREPARACIÓ PER A LA REUTILITZACIÓ DE RESIDUS DE ROBA I DE RAEE. TRANSFERÈNCIA DE RESIDUS P I NP (INCLÒS RAEE)", + }, + { + legalName: "GSP", + role: "Gestor de residus RAEE", + email: "user2@example.org", + accreditedBy: "Agència de residus de Catalunya", + operatorNumber: "E-1555.14", + limitJurisdiction: "Catalunya", + accreditedFor: "CLASSIF. FERRALLA, CARTRÓ PLÀSTIC I FUSTA, CLASSIF., TRITURACIÓ DE CABLE, CLASSIFICACIÓ, DESMUNTATGE RAEE (FR 2,3,4,5,6), PREPARACIO PER A LA REUTILITZACIÓ DE RAEE (FR 1,2,4,5,6,7) ALTRES ACTIVITATS SEGONS LLIC. AMBIENTAL DE 25/02/16 I DE 28/1/2022", + }, + { + legalName: "Reutilitza", + role: "Gestor de residus RAEE", + email: "user3@example.org", + accreditedBy: "Agència de residus de Catalunya", + operatorNumber: "E-0000.12", + limitJurisdiction: "Catalunya", + accreditedFor: "RECUPERACIÓ DE RAEE NO PERILLOSOS MITJANÇANT CLASSIFICACIÓ I REPARACIÓ (PREPARACIÓ PER LA REUTILITZACIÓ) I TRANSFERÈNCIA DE RAEE PERILLOSOS I NO PERILLOSOS I ALTRES SEGONS RELACIÓ.", + } +]; export const CREDENTIAL_TYPE_DATASTORE_UNDEFINED = { - FinancialVulnerabilityCredential_data_undefined: {} as FinancialVulnerabilityCredential_fields + FinancialVulnerabilityCredential_data_undefined: {} as Record, + MembershipCard_data_undefined: {} as Record, + FederationMembership_data_undefined: {} as Record, + CourseCredential_data_undefined: {} as Record, + EOperatorClaim_data_undefined: {} as Record + //TODO añadir otros tipos de credenciales } @@ -104,6 +334,73 @@ CREDENTIAL_TYPE_DATASTORE_UNDEFINED.FinancialVulnerabilityCredential_data_undefi financialVulnerabilityScore: 'undefined_data', amountCoveredByOtherAids: 'undefined_data', connectivityOptionList: 'undefined_data', - assessmentDate: 'undefined_data', + assessmentDate: 'undefined_data' +} + +CREDENTIAL_TYPE_DATASTORE_UNDEFINED.MembershipCard_data_undefined = { + organisation: 'undefined_data', + membershipType: 'undefined_data', + membershipId: 'undefined_data', + affiliatedSince: 'undefined_data', + affiliatedUntil: 'undefined_data', + typeOfPerson: 'undefined_data', + identityDocType: 'undefined_data', + identityNumber: 'undefined_data', + firstName: 'undefined_data', + lastName: 'undefined_data', + role: 'undefined_data', + email: 'undefined_data' +} + +CREDENTIAL_TYPE_DATASTORE_UNDEFINED.FederationMembership_data_undefined = { + federation: 'undefined_data', + legalName: 'undefined_data', + shortName: 'undefined_data', + registrationIdentifier: 'undefined_data', + publicRegistry: 'undefined_data', + streetAddress: 'undefined_data', + postCode: 'undefined_data', + city: 'undefined_data', + taxReference: 'undefined_data', + membershipType: 'undefined_data', + membershipStatus: 'undefined_data', + membershipId: 'undefined_data', + membershipSince: 'undefined_data', + email: 'undefined_data', + phone: 'undefined_data', + website: 'undefined_data', + evidence: 'undefined_data', + certificationDate: 'undefined_data' +} + +CREDENTIAL_TYPE_DATASTORE_UNDEFINED.CourseCredential_data_undefined = { + firstName: 'undefined_data', + lastName: 'undefined_data', + email: 'undefined_data', + personalIdentifier: 'undefined_data', + issuedDate: 'undefined_data', + modeOfInstruction: 'undefined_data', + courseDuration: 'undefined_data', + courseDays: 'undefined_data', + courseName: 'undefined_data', + courseDescription: 'undefined_data', + gradingScheme: 'undefined_data', + scoreAwarded: 'undefined_data', + qualificationAwarded: 'undefined_data', + courseLevel: 'undefined_data', + courseFramework: 'undefined_data', + courseCredits: 'undefined_data', + dateOfAssessment: 'undefined_data', + evidenceAssessment: 'undefined_data', +} + +CREDENTIAL_TYPE_DATASTORE_UNDEFINED.EOperatorClaim_data_undefined = { + legalName: 'undefined_data', + role: 'undefined_data', + email: 'undefined_data', + accreditedBy: 'undefined_data', + operatorNumber: 'undefined_data', + limitJurisdiction: 'undefined_data', + accreditedFor: 'undefined_data' } diff --git a/src/data_stores/jsons/_actual_financial_vulnerability_credential.json b/src/data_stores/jsons/_actual_financial_vulnerability_credential.json deleted file mode 100644 index ae26c3a..0000000 --- a/src/data_stores/jsons/_actual_financial_vulnerability_credential.json +++ /dev/null @@ -1,80 +0,0 @@ -{ - "@context": [ - "https://www.w3.org/2018/credentials/v1", - "https://idhub.pangea.org/credentials/base/v1", - "https://idhub.pangea.org/credentials/financial-vulnerability/v1" - ], - "id": "https://http://idhub-autotest.demo.pangea.org/credentials/1", - "type": [ - "VerifiableCredential", - "VerifiableAttestation", - "FinancialVulnerabilityCredential" - ], - "credentialSubject": { - "id": "did:web:idhub-autotest.demo.pangea.org:did-registry:z6Mkr4s4CSK3t52CXaw9inx2cxUhB8BNT7P5Dj3kK5ySz758", - "connectivityOptionList": "Fibra", - "identityNumber": "45678900V", - "assessmentDate": "2024-01-01", - "phoneNumber": "678567456", - "streetAddress": "C/ Tallers 1", - "lastName": "Mozart", - "email": "user1@example.org", - "identityDocType": "DNI", - "socialWorkerName": "Ana", - "socialWorkerSurname": "Fernández", - "amountCoveredByOtherAids": "0", - "firstName": "Wolfgang Amadeus", - "financialVulnerabilityScore": "4" - }, - "issuer": { - "id": "did:web:idhub-autotest.demo.pangea.org:did-registry:z6MktKKrgWJne5ZQkj5uVyHkdrPfRZGC7HEiaR9LrfjPhEP8", - "name": "idhub-autotest.demo.pangea.org" - }, - "issuanceDate": "2024-03-06T22:15:20Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:web:idhub-autotest.demo.pangea.org:did-registry:z6MktKKrgWJne5ZQkj5uVyHkdrPfRZGC7HEiaR9LrfjPhEP8#owner", - "created": "2024-03-06T22:15:20.778Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..HiLXLoMlwkhfHd5Ha20AP8Mgtgna_JaTpg-UZvobYEZcGJLrWEY-MntnCglHyQ6oXCNRlc-DCpG9JdsWf8boDg" - }, - "credentialStatus": { - "id": "did:web:idhub-autotest.demo.pangea.org:did-registry:z6MktKKrgWJne5ZQkj5uVyHkdrPfRZGC7HEiaR9LrfjPhEP8", - "type": "RevocationBitmap2022", - "revocationBitmapIndex": "1" - }, - "credentialSchema": { - "id": "https://idhub.pangea.org/vc_schemas/financial-vulnerability.json", - "type": "FullJsonSchemaValidator2021" - }, - "validFrom": "2024-03-06T22:15:20Z", - "description": [ - { - "lang": "en", - "value": "The Financial Vulnerability Credential is issued to individuals or families to prove their financial vulnerability based on various factors, with the objective of presenting it to a third party to receive benefits or services." - }, - { - "lang": "ca_ES", - "value": "La Credencial de Vulnerabilitat Financera és emesa a persones o famílies per acreditar la seva vulnerabilitat financera sobre la base de diversos factors, amb l'objectiu que la presentin a una tercera part per rebre beneficis o serveis." - }, - { - "lang": "es", - "value": "La Credencial de Vulnerabilidad Financiera es emitida a personas o familias para acreditar su vulnerabilidad financiera con base en diversos factores, con el objetivo de que la presenten a una tercera parte para recibir beneficios o servicios." - } - ], - "issued": "2024-03-06T22:15:20Z", - "name": [ - { - "lang": "en", - "value": "Financial Vulnerability Credential" - }, - { - "lang": "ca_ES", - "value": "Credencial de Vulnerabilitat Financera" - }, - { - "lang": "es", - "value": "Credencial de Vulnerabilidad Financiera" - } - ] -} \ No newline at end of file diff --git a/src/data_stores/jsons/_expected_financial_vulnerability_credential-json b/src/data_stores/jsons/_expected_financial_vulnerability_credential-json deleted file mode 100644 index 9738e9d..0000000 --- a/src/data_stores/jsons/_expected_financial_vulnerability_credential-json +++ /dev/null @@ -1,69 +0,0 @@ -{ - "@context": [ - "https://www.w3.org/2018/credentials/v1", - "https://idhub.pangea.org/credentials/base/v1", - "https://idhub.pangea.org/credentials/financial-vulnerability/v1" - ], - "id": "https://idhub.pangea.org/credentials/987654321", - "type": [ - "VerifiableCredential", - "VerifiableAttestation", - "FinancialVulnerabilityCredential" - ], - "issuer": { - "id": "did:example:5678", - "name": "Fundació Pare Manel" - }, - "issuanceDate": "2023-12-06T19:23:24Z", - "issued": "2023-12-06T19:23:24Z", - "validFrom": "2023-12-06T19:23:24Z", - "validUntil": "2024-12-06T19:23:24Z", - "name": [ - { - "value": "Financial Vulnerability Credential", - "lang": "en" - }, - { - "value": "Credencial de Vulnerabilitat Financera", - "lang": "ca_ES" - }, - { - "value": "Credencial de Vulnerabilidad Financiera", - "lang": "es" - } - ], - "description": [ - { - "value": "The Financial Vulnerability Credential is issued to individuals or families to prove their financial vulnerability based on various factors, with the objective of presenting it to a third party to receive benefits or services.", - "lang": "en" - }, - { - "value": "La Credencial de Vulnerabilitat Financera és emesa a persones o famílies per acreditar la seva vulnerabilitat financera sobre la base de diversos factors, amb l'objectiu que la presentin a una tercera part per rebre beneficis o serveis.", - "lang": "ca_ES" - }, - { - "value": "La Credencial de Vulnerabilidad Financiera es emitida a personas o familias para acreditar su vulnerabilidad financiera con base en diversos factores, con el objetivo de que la presenten a una tercera parte para recibir beneficios o servicios.", - "lang": "es" - } - ], - "credentialSubject": { - "id": "did:example:1234", - "firstName": "Joan", - "lastName": "Pera", - "email": "joan.pera@pangea.org", - "identityDocType": "DNI", - "identityNumber": "12345678A", - "phoneNumber": "1234567890", - "streetAddress": "Tallers 19 2-1 Barcelona", - "socialWorkerName": "Mireia", - "socialWorkerSurname": "Pujol", - "financialVulnerabilityScore": "5", - "amountCoveredByOtherAids": "20", - "connectivityOptionList": "fibre, mobile", - "assessmentDate": "2023-12-06" - }, - "credentialSchema": { - "id": "https://idhub.pangea.org/vc_schemas/financial-vulnerability.json", - "type": "FullJsonSchemaValidator2021" - } -} \ No newline at end of file diff --git a/src/data_stores/usersDataInitialization.ts b/src/data_stores/users_data_store.ts similarity index 100% rename from src/data_stores/usersDataInitialization.ts rename to src/data_stores/users_data_store.ts diff --git a/src/interfaces/credential_interfaces.ts b/src/interfaces/credential_interfaces.ts index c82ed90..33dfe89 100644 --- a/src/interfaces/credential_interfaces.ts +++ b/src/interfaces/credential_interfaces.ts @@ -71,4 +71,14 @@ export interface FinancialVulnerabilityCredential_fields { evidenceAssessment: string; } - //TODO complete \ No newline at end of file + export interface EOperatorClaim_fields{ + legalName: string; + role: string; + email: string; + accreditedBy: string; + operatorNumber: string; + limitJurisdiction: string; + accreditedFor: string; + } + + \ No newline at end of file diff --git a/src/page-objects/AD_BasicUserInfoSectionInPage.ts b/src/page-objects/AD_BasicUserInfoSectionInPage.ts index 9e3d220..2e4730b 100644 --- a/src/page-objects/AD_BasicUserInfoSectionInPage.ts +++ b/src/page-objects/AD_BasicUserInfoSectionInPage.ts @@ -89,7 +89,6 @@ export class BasicUserInfoSectionPage { async addUserBasicInfo(newFirstname: string, newLastname: string, newEmail: string, isAdmin: boolean) { try { - console.log("Adding user with email: ", newEmail); await this.firstName.fill(newFirstname); await this.lastName.fill(newLastname); await this.email.fill(newEmail); @@ -107,7 +106,6 @@ export class BasicUserInfoSectionPage { async updateUserBasicInfo(newFirstname: string, newLastname: string, newEmail: string, isAdmin: boolean) { try { - console.log("Modifying user with email: ", newEmail); await this.firstName.fill(newFirstname); await this.lastName.fill(newLastname); await this.email.fill(newEmail); diff --git a/src/page-objects/AD_ImportDataPage.ts b/src/page-objects/AD_ImportDataPage.ts index 5a788d6..1343b6b 100644 --- a/src/page-objects/AD_ImportDataPage.ts +++ b/src/page-objects/AD_ImportDataPage.ts @@ -88,7 +88,6 @@ export class ImportDataPage { } async importFile(schema: string, fileToImport: string, did: string) { try { - console.log('Importing the file from the current working directory: ${process.cwd()}'); await (await this.getDropdownDID()).selectOption({ label: did }); await (await this.getDropdownSchema()).selectOption({ label: schema }); await (await this.getFileToImport()).click(); diff --git a/src/page-objects/AD_ImportTemplatePage.ts b/src/page-objects/AD_ImportTemplatePage.ts index 0d7edb6..28e6a09 100644 --- a/src/page-objects/AD_ImportTemplatePage.ts +++ b/src/page-objects/AD_ImportTemplatePage.ts @@ -45,7 +45,6 @@ export class ImportTemplatePage { async schemaIsAvailableToImport(schemaName: string): Promise { try { - console.log(`Checking if template ${schemaName} exists`); // Wait for the table to appear and contain at least one row await this.page.waitForFunction(() => document.querySelectorAll('tr').length > 0, { timeout: 10000 }); diff --git a/src/page-objects/AD_TemplatesPage.ts b/src/page-objects/AD_TemplatesPage.ts index e027e6a..4819464 100644 --- a/src/page-objects/AD_TemplatesPage.ts +++ b/src/page-objects/AD_TemplatesPage.ts @@ -98,13 +98,9 @@ export class TemplatesPage { for (let i = 0; i < rowCount; i++) { // Get the second cell (file schema name) of the current row - console.log("Checking schema name against JSON for element: ", i); const fileSchemaCell = page.locator(`table tbody tr:nth-child(${i + 1}) td:nth-child(2)`); const fileSchemaValue = await fileSchemaCell.innerText(); - // Print the value of the second cell - console.log('Name of the schema: ' + fileSchemaValue); - // Click the corresponding element in the fifth cell (eye icon) await clickViewSchemaOnLeftMenu(page, fileSchemaValue) @@ -114,7 +110,6 @@ export class TemplatesPage { // Extract the last component of the $id path const idUrl = new URL(jsonContent["$id"]); const lastPathSegment = idUrl.pathname.split("/").pop(); - console.log('lastPathSegment', lastPathSegment); // Check if the last component of the $id path matches the second cell value (File schema) expect(lastPathSegment).toBe(fileSchemaValue); @@ -129,8 +124,6 @@ export class TemplatesPage { async schemaIsAvailableInView(schemaName: string): Promise { try { - console.log('Checking if template ${schemaName} exists'); - // Wait for the table to appear and contain at least one row await this.page.waitForFunction(() => document.querySelectorAll('tr').length > 0, { timeout: 10000 }); diff --git a/src/page-objects/AD_UserPersonalInformationPage.ts b/src/page-objects/AD_UserPersonalInformationPage.ts index f3ef16b..3f8bb35 100644 --- a/src/page-objects/AD_UserPersonalInformationPage.ts +++ b/src/page-objects/AD_UserPersonalInformationPage.ts @@ -60,9 +60,6 @@ export class UserPersonalInformationPage { const toDateElement = await this.page.$$eval('tr > td:nth-of-type(3)', elements => elements.map(el => el.textContent ? el.textContent.trim() : '')); const toDate = toDateElement[0]; - console.log(fn, ' ', ln, ' ', em, ' ', mst, ' ', fromDate, ' ', toDate); - console.log(user.firstName, ' ', user.lastName, ' ', user.email, ' ', getMembershipTypeById(user.membershipType), ' ', formatDate(user.startDate), ' ', formatDate(user.endDate)); - if (user.firstName === fn && user.lastName === ln && user.email === em && getMembershipTypeById(user.membershipType) === mst && formatDate(user.startDate) === fromDate && formatDate(user.endDate) === toDate) { return true } diff --git a/src/page-objects/AD_ViewImportedDataPage.ts b/src/page-objects/AD_ViewImportedDataPage.ts index 50a8737..ed31b13 100644 --- a/src/page-objects/AD_ViewImportedDataPage.ts +++ b/src/page-objects/AD_ViewImportedDataPage.ts @@ -93,7 +93,6 @@ export class ViewImportedDataPage { async fileIsAvailableInView(fileName: string): Promise { try { - console.log(`Checking if file ${fileName} was previously loaded`); // Wait for the table to appear and contain at least one row await this.page.waitForFunction(() => document.querySelectorAll('tr').length > 0, { timeout: 10000 }); diff --git a/src/page-objects/AD_ViewUsersPage.ts b/src/page-objects/AD_ViewUsersPage.ts index bb50bc6..bf1ff2a 100644 --- a/src/page-objects/AD_ViewUsersPage.ts +++ b/src/page-objects/AD_ViewUsersPage.ts @@ -43,7 +43,6 @@ export class ViewUsersPage { async userExists(email: string): Promise { try { - console.log('Checking the user with email', email); // Wait for the table to appear and contain at least one row await this.page.waitForFunction(() => document.querySelectorAll('tr').length > 0, { timeout: 10000 }); diff --git a/src/page-objects/US_ViewCredentialPage.ts b/src/page-objects/US_ViewCredentialPage.ts index e010da9..168624f 100644 --- a/src/page-objects/US_ViewCredentialPage.ts +++ b/src/page-objects/US_ViewCredentialPage.ts @@ -3,56 +3,63 @@ import { initialize_with_undefined_values, setCredentialValues } from "../steps" export class ViewCredentialPage { - readonly page: Page - readonly primaryTitle: Locator - readonly secondaryTitle: Locator + readonly page: Page + readonly primaryTitle: Locator + readonly secondaryTitle: Locator - constructor(page: Page) { - this.page = page; - this.primaryTitle = page.getByRole('heading', { name: 'My wallet' }); - this.secondaryTitle = page.getByRole('heading', { name: ' Credential' }); + constructor(page: Page) { + this.page = page; + this.primaryTitle = page.getByRole('heading', { name: 'My wallet' }); + this.secondaryTitle = page.getByRole('heading', { name: ' Credential' }); + } + async getPrimaryTitle() { + try { + return await this.primaryTitle.innerText(); + } catch (error) { + console.error("Failed to get primary title:", error); + throw error; } - async getPrimaryTitle() { - try { - return await this.primaryTitle.innerText(); - } catch (error) { - console.error("Failed to get primary title:", error); - throw error; - } - } - - async getSecondaryTitle() { - try { - return await this.secondaryTitle.innerText(); - } catch (error) { - console.error("Failed to get secondary title:", error); - throw error; + } + + async getSecondaryTitle() { + try { + return await this.secondaryTitle.innerText(); + } catch (error) { + console.error("Failed to get secondary title:", error); + throw error; + } + } + + async buildACredentialFromInputValues(credentialType: string) { + + try { + const elementsWithLabel = await this.page.locator('.col-3 strong').all(); + const elementsWithValue = await this.page.locator('.col.bg-light.text-secondary').all(); + let credential = initialize_with_undefined_values(credentialType); + + let labels: string[] = []; + let values: string[] = []; + + for (let i = 0; i < elementsWithLabel.length; i++) { + let label = await elementsWithLabel[i].textContent() + if (label) label = label.trim().replace(/:$/, ''); + let value = await elementsWithValue[i].textContent() + if (value) value = value.trim(); + if (value != null && label != null && label != 'Id' && label != "Issuance date" && label != "Status") { + labels.push(label); + values.push(value); } } - async buildACredentialFromInputValues(credentialType: string) { - - const elementsWithLabel = await this.page.locator('.col-3 strong').all(); - const elementsWithValue = await this.page.locator('.col.bg-light.text-secondary').all(); - let credential = initialize_with_undefined_values(credentialType); - - let labels: string[] = []; - let values: string[] = []; - - for (let i = 0; i < elementsWithLabel.length; i++) { - let label = await elementsWithLabel[i].textContent() - if (label) label = label.trim().replace(/:$/, ''); - let value = await elementsWithValue[i].textContent() - if (value) value = value.trim(); - if (value != null && label != null && label != 'Id' && label != "Issuance date" && label != "Status") { - labels.push(label); - values.push(value); - } - } - - credential = setCredentialValues(labels, values, credentialType); - return credential; - + credential = setCredentialValues(labels, values, credentialType); + return credential; + } catch (error) { + console.error("Failed to build the credential from input values:", error); + throw error; } + + }//end function + + } diff --git a/src/steps.ts b/src/steps.ts index 8735b1c..774da39 100644 --- a/src/steps.ts +++ b/src/steps.ts @@ -1,10 +1,9 @@ import { expect, Page } from '@playwright/test' -import { appendRandomNumberToFilename, copyFile } from './utils' +import { appendRandomNumberToFilename, copyFile, deleteFile } from './utils' import { CREDENTIAL_TYPE_DATASTORE_UNDEFINED, CREDENTIAL_TYPES_DATA_STORE } from './data_stores/credentials_data_store' -import { FinancialVulnerabilityCredential_fields } from './interfaces/credential_interfaces' -import { CREDENTIAL_TYPES_FIELDS_LIST, CREDENTIAL_TYPES_REQUIRED_FIELDS_LIST } from './constants/credential_fields' +import { CREDENTIAL_TYPES_FIELDS_LIST} from './constants/credential_fields' import { LogInPage } from './page-objects/COMM_LoginPage' import { ADMIN_EMAIL, ADMIN_K, ENCRYPTION_KEY, USER_K } from './constants/env_constants' import { LeftMenuAdminPage } from './page-objects/AD_LeftMenuAdminPage' @@ -18,6 +17,9 @@ import { ViewImportedDataPage } from './page-objects/AD_ViewImportedDataPage' import { User } from './interfaces/User' import { EncryptionKeyPage } from './page-objects/AD_EncryptionKeyPage' import { DataProtectionPage } from './page-objects/COMM_DataProtectionPage' +import { ImportDataPage } from './page-objects/AD_ImportDataPage' +import { PATH_FILES_TO_IMPORT } from './constants/constants' +import { fail } from 'assert' export async function loginAsAdmin(page: Page, url: string) { @@ -30,7 +32,6 @@ export async function loginAsAdmin(page: Page, url: string) { await loginPage.login(ADMIN_EMAIL, ADMIN_K); let currentTitle = await page.title(); - console.log("current title: ", currentTitle); if (currentTitle === 'Encryption Key – IdHub') { //code to set Encription Key @@ -253,7 +254,6 @@ export async function gotoViewEnabledCredential(page: Page, credentialType: stri } export async function checkIfTheInformationIsValid(page: Page, user: User) { - console.log(user.firstName, "membership: ", user.membershipType, "sd: ", user.startDate) const userPersonalInformationPage = new UserPersonalInformationPage(page) try { @@ -264,16 +264,17 @@ export async function checkIfTheInformationIsValid(page: Page, user: User) { } -export function expectedCredentialSubjectForUser(email: string, credentialType: string): FinancialVulnerabilityCredential_fields | MembershipCard_fields | undefined { +export function expectedCredentialSubjectForUser(email: string, credentialType: string){ + +//export function expectedCredentialSubjectForUser(email: string, credentialType: string): FinancialVulnerabilityCredential_fields | MembershipCard_fields | NGOFederationMembership_fields | undefined { try { - const testingDataForCredential = CREDENTIAL_TYPES_DATA_STORE[credentialType + '_data'] as T[]; + const testingDataForCredential = CREDENTIAL_TYPES_DATA_STORE[credentialType + '_data']; if (!testingDataForCredential) { console.error(`No testing data found for credential type: ${credentialType}`); return undefined; } - console.log("testing Data: ", testingDataForCredential); let credentialSubject = testingDataForCredential.find(user => user.email.toLowerCase() === email.toLowerCase()); return credentialSubject; } catch (error) { @@ -324,20 +325,19 @@ export async function loadIfJsonSchemaNotAvailable(page: Page, jsonSchema: strin } export function setCredentialValues(labels: string[], values: string[], credentialType: string): any { - // Get the interface type associated with the credentialType - + + try { const listOfFields = CREDENTIAL_TYPES_FIELDS_LIST[credentialType]; - const listOfRequiredFields = CREDENTIAL_TYPES_REQUIRED_FIELDS_LIST[credentialType]; // Initialize an empty object to store the credential let credential: any = {}; - try { + // Iterate over labels and values for (let i = 0; i < labels.length; i++) { let label = labels[i]; let value = values[i]; - // Check if the label exists in the interface type + // Check if the label exists in the list of fields label = label.charAt(0).toLowerCase() + label.slice(1); if (listOfFields.includes(label)) { credential[label] = value; @@ -355,4 +355,103 @@ export function setCredentialValues(labels: string[], values: string[], credenti export function initialize_with_undefined_values(credentialType: string) { return (CREDENTIAL_TYPE_DATASTORE_UNDEFINED[credentialType + '_data_undefined']) -} \ No newline at end of file +} + + +/* Load of an excel file - Happy Path: + * Check if file was loaded before. If yes, copy the original file (ie., financial-vulnerability-credential.xlxs) with a new valid with a random name + * If the template schema (associated with the type of credential to be enabled) is not available, import it and verify the operation + * Load the associated data file (xls) and check that appears in the list of imported data files + * Expected behavior: the file is loaded, the message:"The file was imported successfully!" is displayed, + * and the file appears in the imported files view. + */ + +export async function testImportDataFile_HappyPath(page: Page, fileToImport: string, jsonSchema: string, schema: string) { + + const viewImportedDataPage = new ViewImportedDataPage(page); + const importDataPage = new ImportDataPage(page); + + await clickDataOnLeftMenu(page); + + // If a file with a FILE_TO_IMPORT was previouly loaded, rename it + let fileName = fileToImport; + fileName = await checkFileName(page, fileName); + + // Check if the json schema associated with the file is loaded to be used + // If not, load it in templates + await loadIfJsonSchemaNotAvailable(page, jsonSchema); + + //Go to the Data option on leftmenu + await clickDataOnLeftMenu(page); + + //Select the import button and go to the import data page + await viewImportedDataPage.gotoImportDataPage(); + + //Import excel file to enable a 'Financial vulnerability credential'for testing users + await importDataPage.importFile(schema, PATH_FILES_TO_IMPORT + fileName, "Default"); + let actual = await viewImportedDataPage.alertFileImportedSuccessfully(); + + //Rename the default excel file with the original name FILE_TO_IMPORT in the directoy PATH_FILES_TO_IMPORT + if (fileName != fileToImport) { + await deleteFile(fileName); + } + if (actual) { + //Check if the file is in the list of imported files sucessfully + await clickDataOnLeftMenu(page); + await page.getByRole('link', { name: 'Date' }).click(); + await page.getByRole('link', { name: 'Date' }).click(); + + expect(await viewImportedDataPage.fileIsAvailableInView(fileName)).toBeTruthy(); + expect(await viewImportedDataPage.isFileSuccessfullyLoaded(fileName)).toBeTruthy(); + } else { + console.log("Unexpected result loading the file. Test failed.") + fail(); + } + +} + +/** + * Load of an excel file - Sad Path: + * Check if file was loaded before. If yes, copy the original to the new one with random name. + * If the template schema (associated with the type of credential to be enabled) is not available, import it and verify the operation + */ +export async function testImportDataFile_SadPath(page: Page, fileToImport: string, jsonSchema: string, schema: string, unsuccessAlertMessage: string) { + const viewImportedDataPage = new ViewImportedDataPage(page); + const importDataPage = new ImportDataPage(page); + + await clickDataOnLeftMenu(page); + + // If a file with a FILE_TO_IMPORT was previously loaded, rename it + let fileName = await checkFileName(page, fileToImport); + + // Check if the json schema associated with the file is loaded to be used + // If not, load it in templates + await loadIfJsonSchemaNotAvailable(page, jsonSchema); + + //Go to the Data option on leftmenu + await clickDataOnLeftMenu(page); + + //Select the import button and go to the import data page + await viewImportedDataPage.gotoImportDataPage(); + + //Import excel file to enable a 'Financial vulnerability credential'. The file has no data. + await importDataPage.importFile(schema, PATH_FILES_TO_IMPORT + fileName, "Default"); + let actual = await importDataPage.alertFileImportedUnsuccessfully(unsuccessAlertMessage); + + //Rename the default excel file with the original name FILE_TO_IMPORT in the directoy PATH_FILES_TO_IMPORT + if (fileName != fileToImport) { + await deleteFile(fileName); + } + if (actual) { + //Check if the file is in the list of imported files as failed + await clickDataOnLeftMenu(page); + await page.getByRole('link', { name: 'Date' }).click(); + await page.getByRole('link', { name: 'Date' }).click(); + + expect(await viewImportedDataPage.fileIsAvailableInView(fileName)).toBeTruthy(); + expect(await viewImportedDataPage.isFileSuccessfullyLoaded(fileName)).toBeFalsy(); + } else { + console.log("Unexpected result loading an empty file. Test failed."); + fail(); + } +} diff --git a/tests/01-AD-leftmenuNavigation.spec.ts b/tests/01-AD-leftmenuNavigation.spec.ts index b668b6e..8acb557 100644 --- a/tests/01-AD-leftmenuNavigation.spec.ts +++ b/tests/01-AD-leftmenuNavigation.spec.ts @@ -14,6 +14,10 @@ test.describe('Leftside Menu navigation test', () => { test.beforeEach(async ({ page }) => { await loginAsAdmin(page, URL_IDHUB); }) + test.afterEach(async ({ page }) => { //este se ejecutará despues de cada test + await page.click('.logout'); + await page.close(); + }) test('LEFTMENU -> Dashboard', async ({ page }) => { await clickDashboardOnLeftMenu(page) diff --git a/tests/02-AD-manageUsers.spec.ts b/tests/02-AD-manageUsers.spec.ts index 54599cf..72b3ae7 100644 --- a/tests/02-AD-manageUsers.spec.ts +++ b/tests/02-AD-manageUsers.spec.ts @@ -5,7 +5,7 @@ import { ViewUsersPage } from '../src/page-objects/AD_ViewUsersPage' import { AddMembershipPage } from '../src/page-objects/AD_AddMembershipPage' import { UserPersonalInformationPage } from '../src/page-objects/AD_UserPersonalInformationPage' import { MembershipSectionPage } from '../src/page-objects/AD_MembershipSectionPage' -import { testingUsers, users } from '../src/data_stores/usersDataInitialization' +import { testingUsers, users } from '../src/data_stores/users_data_store' import { createUsersRandomList } from '../src/utils' import { URL_IDHUB } from '../src/constants/env_constants' import { checkIfTheInformationIsValid, clickAddUserOnLeftMenu, clickViewUsersOnLeftMenu, gotoBasicInfoPageOfTheUser, loginAsAdmin } from '../src/steps' @@ -21,6 +21,10 @@ test.describe('USER Section Tests', () => { await loginAsAdmin(page, URL_IDHUB); (await leftMenu.getUsersLink()).click() }) + test.afterEach(async ({ page }) => { //este se ejecutará despues de cada test + await page.click('.logout'); + await page.close(); + }) /** * UPDATE the basic data for default testing users user1..user5 */ diff --git a/tests/03-AD-templates.spec.ts b/tests/03-AD-templates.spec.ts index 27e5c96..4e23c7a 100644 --- a/tests/03-AD-templates.spec.ts +++ b/tests/03-AD-templates.spec.ts @@ -1,7 +1,7 @@ import { test, expect } from '@playwright/test' import { TemplatesPage } from '../src/page-objects/AD_TemplatesPage' import { clickTemplatesOnLeftMenu, loadIfJsonSchemaNotAvailable, loginAsAdmin } from '../src/steps'; -import { URL_IDHUB } from '../src/constants/env_constants'; +import { URL_IDHUB, URL_SCHEMAS } from '../src/constants/env_constants'; import { JSON_SCHEMA_FVC, JSON_SCHEMA_ID_FVC } from '../src/constants/constants'; /** @@ -12,6 +12,10 @@ test.describe('TEMPLATES Section Tests ', () => { test.beforeEach(async ({ page }) => { //este se ejecutará antes de cada test await loginAsAdmin(page, URL_IDHUB); }) + test.afterEach(async ({ page }) => { //este se ejecutará despues de cada test + await page.click('.logout'); + await page.close(); + }) /** * For every row in the templates view, @@ -41,6 +45,8 @@ test.describe('TEMPLATES Section Tests ', () => { const jsonContent = await page.evaluate(() => JSON.parse(document.body.innerText)); // Check if the JSON elements exist expect(jsonContent["$id"]).toBe(JSON_SCHEMA_ID_FVC); + await page.goto(URL_SCHEMAS); + }) /** diff --git a/tests/04-COMM-EnabledAndIssueFVC_Credential.spec.ts b/tests/04-COMM-EnabledAndIssueFVC_Credential.spec.ts index aa9a3dc..f96c873 100644 --- a/tests/04-COMM-EnabledAndIssueFVC_Credential.spec.ts +++ b/tests/04-COMM-EnabledAndIssueFVC_Credential.spec.ts @@ -1,214 +1,102 @@ -import { test, expect } from '@playwright/test' -import { ViewImportedDataPage } from '../src/page-objects/AD_ViewImportedDataPage' -import { ImportDataPage } from '../src/page-objects/AD_ImportDataPage' -import { checkFileName, clickDataOnLeftMenu, loadIfJsonSchemaNotAvailable, loginAsAdmin, loginAsUser, gotoViewEnabledCredential, expectedCredentialSubjectForUser } from '../src/steps'; +import { test, expect} from '@playwright/test' +import { loginAsAdmin, loginAsUser, gotoViewEnabledCredential, expectedCredentialSubjectForUser, testImportDataFile_SadPath, testImportDataFile_HappyPath } from '../src/steps'; import { ViewCredentialPage } from '../src/page-objects/US_ViewCredentialPage.js' -import { fail } from 'assert' -import { URL_IDHUB, USER1_EMAIL, USER2_EMAIL } from '../src/constants/env_constants'; -import { ALERT_FILE_TO_IMPORT_IS_EMPTY, ALERT_FILE_TO_IMPORT_WITHOUT_REQUIRED_COLUMS, ALERT_FILE_TO_IMPORT_WITH_ALIEN_COLUMS, FILE_TO_IMPORT_FVC, FILE_TO_IMPORT_FVC_EMPTY, FILE_TO_IMPORT_FVC_WITHOUT_REQUIRED_COLUMNS, FILE_TO_IMPORT_FVC_WITH_ALIEN_COLUMNS, JSON_SCHEMA_FVC, PATH_FILES_TO_IMPORT, SCHEMA_FVC, SCHEMA_TYPE_FVC } from '../src/constants/constants'; -import { deleteFile } from '../src/utils'; +import { URL_IDHUB, USER1_EMAIL } from '../src/constants/env_constants'; +import { ALERT_FILE_TO_IMPORT_IS_EMPTY, ALERT_FILE_TO_IMPORT_WITHOUT_REQUIRED_COLUMS, ALERT_FILE_TO_IMPORT_WITH_ALIEN_COLUMS, ALERT_FILE_TO_IMPORT_WITH_REQUIRED_COLUMS_EMPTY, FILE_TO_IMPORT_FVC, FILE_TO_IMPORT_FVC_EMPTY, FILE_TO_IMPORT_FVC_WITHOUT_REQUIRED_COLUMNS, FILE_TO_IMPORT_FVC_WITH_ALIEN_COLUMNS, FILE_TO_IMPORT_FVC_WITH_REQUIRED_EMPTY, JSON_SCHEMA_FVC, SCHEMA_FVC, SCHEMA_TYPE_FVC } from '../src/constants/constants'; /** -* Checking data section: view the lists of files imported, import data, delete... +* Checking Admin Data Section: view the lists of files imported, import data, ... */ test.describe('ADMIN-> DATA Section Tests - Testing with Financial Vulnerability Credential', () => { - test.beforeEach(async ({ page }) => { //este se ejecutará antes de cada test + test.beforeEach(async ({ page }) => { await loginAsAdmin(page, URL_IDHUB); }) + test.afterEach(async ({ page }) => { + await page.click('.logout'); + await page.close(); - + }) /** - * Load of an excel file - Happy Path: - * Check if file was loaded before. If yes, copy the original file (financial-vulnerability-credential.xlxs) to a new valid with random name - * If the template schema (associated with the type of credential to be enabled) is not available, import it and verify the operation - * Load the associated data file (xls) and check that appears in the list of imported data files + * Load an excel file - Happy Path * Expected behavior: the file is loaded, the message:"The file was imported successfully!" is displayed, * and the file appears in the imported files view. */ test('DATA -> Import data file - Happy path - Financial Vulnerability Credential ', async ({ page }) => { - const viewImportedDataPage = new ViewImportedDataPage(page); - const importDataPage = new ImportDataPage(page); + const fileToImport = FILE_TO_IMPORT_FVC; + const jsonSchema = JSON_SCHEMA_FVC; + const schema = SCHEMA_FVC; - await clickDataOnLeftMenu(page); - - // If a file with a FILE_TO_IMPORT was previouly loaded, rename it - let fileName = FILE_TO_IMPORT_FVC; - fileName = await checkFileName(page, fileName); - - // Check if the json schema associated with the file is loaded to be used - // If not, load it in templates - await loadIfJsonSchemaNotAvailable(page, JSON_SCHEMA_FVC); - - //Go to the Data option on leftmenu - await clickDataOnLeftMenu(page); - - //Select the import button and go to the import data page - await viewImportedDataPage.gotoImportDataPage(); - - //Import excel file to enable a 'Financial vulnerability credential'for testing users - console.log("File to import: ", fileName, " with schema: ", SCHEMA_FVC); - await importDataPage.importFile(SCHEMA_FVC, PATH_FILES_TO_IMPORT + fileName, "Default"); - let actual = await viewImportedDataPage.alertFileImportedSuccessfully(); - - //Rename the default excel file with the original name FILE_TO_IMPORT in the directoy PATH_FILES_TO_IMPORT - if (fileName != FILE_TO_IMPORT_FVC) { - await deleteFile(fileName); - } - if (actual) { - //Check if the file is in the list of imported files sucessfully - await clickDataOnLeftMenu(page); - await page.getByRole('link', { name: 'Date' }).click(); - await page.getByRole('link', { name: 'Date' }).click(); - - expect(await viewImportedDataPage.fileIsAvailableInView(fileName)).toBeTruthy(); - expect(await viewImportedDataPage.isFileSuccessfullyLoaded(fileName)).toBeTruthy(); - } else { - console.log("Unexpected result loading the file. Test failed.") - fail(); - } + await testImportDataFile_HappyPath(page, fileToImport, jsonSchema, schema); }); - /** - * Load of an excel file - Sad Path: - * Check if file was loaded before. If yes, copy the original to the new one with random name. - * If the template schema (associated with the type of credential to be enabled) is not available, import it and verify the operation + /** + * Load an excel file - Sad Path: * Try to load a well-formatted excel file but without data. * Expected behavior: The error message: "The file you try to import is empty" */ test('DATA -> Import data file - Sad path (file well formatted but empty) - Financial Vulnerability Credential ', async ({ page }) => { - const viewImportedDataPage = new ViewImportedDataPage(page); - const importDataPage = new ImportDataPage(page); + const fileToImport = FILE_TO_IMPORT_FVC_EMPTY; + const jsonSchema = JSON_SCHEMA_FVC; + const schema = SCHEMA_FVC; + const unsuccessAlertMessage = ALERT_FILE_TO_IMPORT_IS_EMPTY; - await clickDataOnLeftMenu(page); - - // If a file with a FILE_TO_IMPORT was previously loaded, rename it - let fileName = await checkFileName(page, FILE_TO_IMPORT_FVC_EMPTY); - - // Check if the json schema associated with the file is loaded to be used - // If not, load it in templates - await loadIfJsonSchemaNotAvailable(page, JSON_SCHEMA_FVC); - - //Go to the Data option on leftmenu - await clickDataOnLeftMenu(page); - - //Select the import button and go to the import data page - await viewImportedDataPage.gotoImportDataPage(); - - //Import excel file to enable a 'Financial vulnerability credential'. The file has no data. - console.log("File to import: ", fileName, " with schema: ", SCHEMA_FVC); - await importDataPage.importFile(SCHEMA_FVC, PATH_FILES_TO_IMPORT + fileName, "Default"); - let actual = await importDataPage.alertFileImportedUnsuccessfully(ALERT_FILE_TO_IMPORT_IS_EMPTY); - - //Rename the default excel file with the original name FILE_TO_IMPORT in the directoy PATH_FILES_TO_IMPORT - if (fileName != FILE_TO_IMPORT_FVC_EMPTY) { - await deleteFile(fileName); - } - if (actual) { - //Check if the file is in the list of imported files as failed - await clickDataOnLeftMenu(page); - await page.getByRole('link', { name: 'Date' }).click(); - await page.getByRole('link', { name: 'Date' }).click(); - - expect(await viewImportedDataPage.fileIsAvailableInView(fileName)).toBeTruthy(); - expect(await viewImportedDataPage.isFileSuccessfullyLoaded(fileName)).toBeFalsy(); - } else { - console.log("Unexpected result loading an empty file. Test failed."); - fail(); - } - }); - - test('DATA -> Import data file - Sad path (file bad formatted, without required columns) - Financial Vulnerability Credential ', async ({ page }) => { - - const viewImportedDataPage = new ViewImportedDataPage(page); - const importDataPage = new ImportDataPage(page); - - await clickDataOnLeftMenu(page); - - // If a file with a FILE_TO_IMPORT was previously loaded, rename it - let fileName = await checkFileName(page, FILE_TO_IMPORT_FVC_WITHOUT_REQUIRED_COLUMNS); - - // Check if the json schema associated with the file is loaded to be used - // If not, load it in templates - await loadIfJsonSchemaNotAvailable(page, JSON_SCHEMA_FVC); - - //Go to the Data option on leftmenu - await clickDataOnLeftMenu(page); - - //Select the import button and go to the import data page - await viewImportedDataPage.gotoImportDataPage(); - - //Import excel file to enable a 'Financial vulnerability credential'. The file has no data. - console.log("File to import: ", fileName, " with schema: ", SCHEMA_FVC); - await importDataPage.importFile(SCHEMA_FVC, PATH_FILES_TO_IMPORT + fileName, "Default"); - let actual = await importDataPage.alertFileImportedUnsuccessfully(ALERT_FILE_TO_IMPORT_WITHOUT_REQUIRED_COLUMS); - - //Rename the default excel file with the original name FILE_TO_IMPORT in the directoy PATH_FILES_TO_IMPORT - if (fileName != FILE_TO_IMPORT_FVC_WITHOUT_REQUIRED_COLUMNS) { - await deleteFile(fileName); - } - if (actual) { - //Check if the file is in the list of imported files as failed - await clickDataOnLeftMenu(page); - await page.getByRole('link', { name: 'Date' }).click(); - await page.getByRole('link', { name: 'Date' }).click(); - - expect(await viewImportedDataPage.fileIsAvailableInView(fileName)).toBeTruthy(); - expect(await viewImportedDataPage.isFileSuccessfullyLoaded(fileName)).toBeFalsy(); - } else { - console.log("Unexpected result loading an empty file. Test failed."); - fail(); - } + await testImportDataFile_SadPath(page, fileToImport, jsonSchema, schema, unsuccessAlertMessage); }); - test('DATA -> Import data file - Sad path (file bad formatted, with alien columns) - Financial Vulnerability Credential ', async ({ page }) => { + /** + * Load an excel file - Sad Path: + * Try to load a bad formatted file, without required data. + */ - const viewImportedDataPage = new ViewImportedDataPage(page); - const importDataPage = new ImportDataPage(page); + test('DATA -> Import data file - Sad path (bad formatted file, without required columns) - Financial Vulnerability Credential ', async ({ page }) => { - await clickDataOnLeftMenu(page); + const fileToImport = FILE_TO_IMPORT_FVC_WITHOUT_REQUIRED_COLUMNS; + const jsonSchema = JSON_SCHEMA_FVC; + const schema = SCHEMA_FVC; + const unsuccessAlertMessage = ALERT_FILE_TO_IMPORT_WITHOUT_REQUIRED_COLUMS; - // If a file with a FILE_TO_IMPORT was previously loaded, rename it - let fileName = await checkFileName(page, FILE_TO_IMPORT_FVC_WITH_ALIEN_COLUMNS); + await testImportDataFile_SadPath(page, fileToImport, jsonSchema, schema, unsuccessAlertMessage); - // Check if the json schema associated with the file is loaded to be used - // If not, load it in templates - await loadIfJsonSchemaNotAvailable(page, JSON_SCHEMA_FVC); + }); - //Go to the Data option on leftmenu - await clickDataOnLeftMenu(page); + /** + * Load an excel file - Sad Path: + * Try to load a bad formatted file, with alien columns. + * Expected behavior: The error message: "line 2: Additional properties are not allowed ('alien1', 'alien2' were unexpected)" + */ - //Select the import button and go to the import data page - await viewImportedDataPage.gotoImportDataPage(); + test('DATA -> Import data file - Sad path (bad formatted file, with alien columns) - Financial Vulnerability Credential ', async ({ page }) => { + const fileToImport = FILE_TO_IMPORT_FVC_WITH_ALIEN_COLUMNS; + const jsonSchema = JSON_SCHEMA_FVC; + const schema = SCHEMA_FVC; + const unsuccessAlertMessage = ALERT_FILE_TO_IMPORT_WITH_ALIEN_COLUMS; - //Import excel file to enable a 'Financial vulnerability credential'. The file has no data. - console.log("File to import: ", fileName, " with schema: ", SCHEMA_FVC); - await importDataPage.importFile(SCHEMA_FVC, PATH_FILES_TO_IMPORT + fileName, "Default"); - let actual = await importDataPage.alertFileImportedUnsuccessfully(ALERT_FILE_TO_IMPORT_WITH_ALIEN_COLUMS); + await testImportDataFile_SadPath(page, fileToImport, jsonSchema, schema, unsuccessAlertMessage); - //Rename the default excel file with the original name FILE_TO_IMPORT in the directoy PATH_FILES_TO_IMPORT - if (fileName != FILE_TO_IMPORT_FVC_WITH_ALIEN_COLUMNS) { - await deleteFile(fileName); - } - if (actual) { - //Check if the file is in the list of imported files as failed - await clickDataOnLeftMenu(page); - await page.getByRole('link', { name: 'Date' }).click(); - await page.getByRole('link', { name: 'Date' }).click(); + }); - expect(await viewImportedDataPage.fileIsAvailableInView(fileName)).toBeTruthy(); - expect(await viewImportedDataPage.isFileSuccessfullyLoaded(fileName)).toBeFalsy(); - } else { - console.log("Unexpected result loading an empty file. Test failed."); - fail(); - } + /** + * Load an excel file - Sad Path: + * Try to load a file bad formatted, with alien columns. + * Expected behavior: The error message: "line 3: 'firstName' is a required property" + */ + + test('DATA -> Import data file - Sad path (file with required columns present but empty) - Financial Vulnerability Credential ', async ({ page }) => { + + const fileToImport = FILE_TO_IMPORT_FVC_WITH_REQUIRED_EMPTY; + const jsonSchema = JSON_SCHEMA_FVC; + const schema = SCHEMA_FVC; + const unsuccessAlertMessage = ALERT_FILE_TO_IMPORT_WITH_REQUIRED_COLUMS_EMPTY; + + await testImportDataFile_SadPath(page, fileToImport, jsonSchema, schema, unsuccessAlertMessage); }); @@ -216,9 +104,14 @@ test.describe('ADMIN-> DATA Section Tests - Testing with Financial Vulnerability test.describe('USER -> Credentials Section Tests - testing with USER1_EMAIL AND FINANCIAL VULNERABILITY CRED', () => { - test.beforeEach(async ({ page }) => { //este se ejecutará antes de cada test + test.beforeEach(async ({ page }) => { await loginAsUser(page, USER1_EMAIL, URL_IDHUB); }) + test.afterEach(async ({ page }) => { + await page.click('.logout'); + await page.close(); + + }) /** * PRE-CONDITIONS: the admin has enabled a credential of type 'Financial Vulnerabitity' for USER1_EMAIL @@ -234,12 +127,11 @@ test.describe('USER -> Credentials Section Tests - testing with USER1_EMAIL AND const enabledCredentialView = new ViewCredentialPage(page); //Check that required fields exist and have a valid value in the current enabled credential - //Get the credential subject values of the credential visualized in the screen and compare to the model + //Get the credential subject values of the credential visualized on the screen and compare to the model let actualCredential = await enabledCredentialView.buildACredentialFromInputValues(SCHEMA_TYPE_FVC); let expectedCredential = await expectedCredentialSubjectForUser(USER1_EMAIL, SCHEMA_TYPE_FVC); expect(actualCredential).toEqual(expectedCredential); }); -}) //end describe - +}) diff --git a/tests/05-COMM-EnabledAndIssueMC_Credential.spec.ts b/tests/05-COMM-EnabledAndIssueMC_Credential.spec.ts new file mode 100644 index 0000000..3d6830c --- /dev/null +++ b/tests/05-COMM-EnabledAndIssueMC_Credential.spec.ts @@ -0,0 +1,140 @@ +import { test, expect } from '@playwright/test' +import { ViewCredentialPage } from '../src/page-objects/US_ViewCredentialPage.js' +import { URL_IDHUB, USER1_EMAIL, USER2_EMAIL } from '../src/constants/env_constants'; +import { ALERT_FILE_TO_IMPORT_IS_EMPTY, ALERT_FILE_TO_IMPORT_WITHOUT_REQUIRED_COLUMS_MC, ALERT_FILE_TO_IMPORT_WITH_ALIEN_COLUMS, ALERT_FILE_TO_IMPORT_WITH_REQUIRED_COLUMS_EMPTY, FILE_TO_IMPORT_MC, FILE_TO_IMPORT_MC_2, FILE_TO_IMPORT_MC_EMPTY, FILE_TO_IMPORT_MC_WITHOUT_REQUIRED_COLUMNS, FILE_TO_IMPORT_MC_WITH_ALIEN_COLUMNS, FILE_TO_IMPORT_MC_WITH_REQUIRED_EMPTY, JSON_SCHEMA_MC, SCHEMA_MC, SCHEMA_TYPE_MC } from '../src/constants/constants'; +import { expectedCredentialSubjectForUser, gotoViewEnabledCredential, loginAsAdmin, loginAsUser, testImportDataFile_HappyPath, testImportDataFile_SadPath } from '../src/steps.js'; + +/** +* Checking data section: view the lists of files imported, import data, delete... +*/ + +test.describe('ADMIN-> DATA Section Tests - Testing with Membership Credential', () => { + + test.beforeEach(async ({ page }) => { + await loginAsAdmin(page, URL_IDHUB); + }) + test.afterEach(async ({ page }) => { + await page.click('.logout'); + await page.close(); + }) + + /** + * Load of an excel file - Happy Path: + * Expected behavior: the file is loaded, the message:"The file was imported successfully!" is displayed, + * and the file appears in the imported files view. + */ + + test('DATA -> Import data file - Happy path - Membership Card Credential - membership_card.xlsx ', async ({ page }) => { + + const fileToImport = FILE_TO_IMPORT_MC; + const jsonSchema = JSON_SCHEMA_MC; + const schema = SCHEMA_MC; + + await testImportDataFile_HappyPath(page, fileToImport, jsonSchema, schema); + + }); + + test('DATA -> Import data file - Happy path - Membership Card Credential - membership_card2.xlsx ', async ({ page }) => { + //test with a second excel file + + const fileToImport = FILE_TO_IMPORT_MC_2; + const jsonSchema = JSON_SCHEMA_MC; + const schema = SCHEMA_MC; + + await testImportDataFile_HappyPath(page, fileToImport, jsonSchema, schema); + + }); + + /** + * Load of an excel file - Sad Path: + * Try to load a well-formatted excel file but without data. + * Expected behavior: The error message: "The file you try to import is empty" + */ + + test('DATA -> Import data file - Sad path (file well formatted but empty) - Membership Card Credential ', async ({ page }) => { + + const fileToImport = FILE_TO_IMPORT_MC_EMPTY; + const jsonSchema = JSON_SCHEMA_MC; + const schema = SCHEMA_MC; + const unsuccessAlertMessage = ALERT_FILE_TO_IMPORT_IS_EMPTY; + + await testImportDataFile_SadPath(page, fileToImport, jsonSchema, schema, unsuccessAlertMessage); + + }); + + test('DATA -> Import data file - Sad path (bad formatted file, without required columns) - Membership Card Credential ', async ({ page }) => { + + const fileToImport = FILE_TO_IMPORT_MC_WITHOUT_REQUIRED_COLUMNS; + const jsonSchema = JSON_SCHEMA_MC; + const schema = SCHEMA_MC; + const unsuccessAlertMessage = ALERT_FILE_TO_IMPORT_WITHOUT_REQUIRED_COLUMS_MC; + + await testImportDataFile_SadPath(page, fileToImport, jsonSchema, schema, unsuccessAlertMessage); + + }); + + test('DATA -> Import data file - Sad path (bad formatted file, with alien columns) - Membership Card Credential ', async ({ page }) => { + + const fileToImport = FILE_TO_IMPORT_MC_WITH_ALIEN_COLUMNS; + const jsonSchema = JSON_SCHEMA_MC; + const schema = SCHEMA_MC; + const unsuccessAlertMessage = ALERT_FILE_TO_IMPORT_WITH_ALIEN_COLUMS; + + await testImportDataFile_SadPath(page, fileToImport, jsonSchema, schema, unsuccessAlertMessage); + + }); + + test('DATA -> Import data file - Sad path (file with required columns present but empty) - Membership Card Credential ', async ({ page }) => { + + const fileToImport = FILE_TO_IMPORT_MC_WITH_REQUIRED_EMPTY; + const jsonSchema = JSON_SCHEMA_MC; + const schema = SCHEMA_MC; + const unsuccessAlertMessage = ALERT_FILE_TO_IMPORT_WITH_REQUIRED_COLUMS_EMPTY; + + await testImportDataFile_SadPath(page, fileToImport, jsonSchema, schema, unsuccessAlertMessage); + + }); + +}) + +test.describe('USER -> Credentials Section Tests - testing with USER1_EMAIL AND Membership Card Credential', () => { + + test.afterEach(async ({ page }) => { + await page.click('.logout'); + await page.close(); + }) + + /** + * PRE-CONDITIONS: the admin has enabled a credential of type 'Membership Card' for USER1_EMAIL + * This is true, if the before test (DATA -> Import data- HAPPY PATH has been passed sucessfully) + * SUMMARY: + * - Check if the user1 can visualize the credentials that has been enabled in "My Credentials" + * - Check the fields displayed when user click "View" Credential + */ + + test('USER Credentials -> My Credentials -> View enabled Membership Card - for user1@example.org', async ({ page }) => { + // View the Membership Card Credential in status 'Enabled' for the user + await loginAsUser(page, USER1_EMAIL, URL_IDHUB); + await gotoViewEnabledCredential(page, SCHEMA_TYPE_MC); + const enabledCredentialView = new ViewCredentialPage(page); + //Check that required fields exist and have a valid value in the current enabled credential + + //Get the credential subject values of the credential visualized in the screen and compare to the model + let actualCredential = await enabledCredentialView.buildACredentialFromInputValues(SCHEMA_TYPE_MC); + let expectedCredential = await expectedCredentialSubjectForUser(USER1_EMAIL, SCHEMA_TYPE_MC); + expect(actualCredential).toEqual(expectedCredential); + }); + + test('USER Credentials -> My Credentials -> View enabled Membership Card - for user2@example.org', async ({ page }) => { + // View the Membership Card Credential in status 'Enabled' for the user + await loginAsUser(page, USER2_EMAIL, URL_IDHUB); + await gotoViewEnabledCredential(page, SCHEMA_TYPE_MC); + const enabledCredentialView = new ViewCredentialPage(page); + //Check that required fields exist and have a valid value in the current enabled credential + + //Get the credential subject values of the credential visualized in the screen and compare to the model + let actualCredential = await enabledCredentialView.buildACredentialFromInputValues(SCHEMA_TYPE_MC); + let expectedCredential = await expectedCredentialSubjectForUser(USER2_EMAIL, SCHEMA_TYPE_MC); + expect(actualCredential).toEqual(expectedCredential); + }); +}) diff --git a/tests/06-COMM-EnabledAndIssueNGO_FED.spec.ts b/tests/06-COMM-EnabledAndIssueNGO_FED.spec.ts new file mode 100644 index 0000000..b92c03b --- /dev/null +++ b/tests/06-COMM-EnabledAndIssueNGO_FED.spec.ts @@ -0,0 +1,133 @@ +import { test, expect } from '@playwright/test' +import { loginAsAdmin, loginAsUser, gotoViewEnabledCredential, expectedCredentialSubjectForUser, testImportDataFile_HappyPath, testImportDataFile_SadPath } from '../src/steps'; +import { ViewCredentialPage } from '../src/page-objects/US_ViewCredentialPage.js' +import { URL_IDHUB, USER1_EMAIL, USER2_EMAIL } from '../src/constants/env_constants'; +import { ALERT_FILE_TO_IMPORT_IS_EMPTY, ALERT_FILE_TO_IMPORT_WITHOUT_REQUIRED_COLUMS_NGO_FM, ALERT_FILE_TO_IMPORT_WITH_ALIEN_COLUMS, ALERT_FILE_TO_IMPORT_WITH_REQUIRED_COLUMS_EMPTY_NGO_FM, FILE_TO_IMPORT_NGO_FM, FILE_TO_IMPORT_NGO_FM_EMPTY, FILE_TO_IMPORT_NGO_FM_WITHOUT_REQUIRED_COLUMNS, FILE_TO_IMPORT_NGO_FM_WITH_ALIEN_COLUMNS, FILE_TO_IMPORT_NGO_FM_WITH_REQUIRED_EMPTY, JSON_SCHEMA_NGO_FM, SCHEMA_NGO_FM, SCHEMA_TYPE_NGO_FM } from '../src/constants/constants'; + +/** +* Checking data section: view the lists of files imported, import data, delete... +*/ + +test.describe('ADMIN-> DATA Section Tests - Testing with NGO Federation Membership', () => { + + test.beforeEach(async ({ page }) => { + await loginAsAdmin(page, URL_IDHUB); + }) + test.afterEach(async ({ page }) => { + await page.click('.logout'); + await page.close(); + }) + + + /** + * Load an excel file - Happy Path + * Expected behavior: the file is loaded, the message:"The file was imported successfully!" is displayed, + * and the file appears in the imported files view. + */ + + test('DATA -> Import data file - Happy path - NGO Federation Membership Credential - federation-membership.xlsx ', async ({ page }) => { + + const fileToImport = FILE_TO_IMPORT_NGO_FM; + const jsonSchema = JSON_SCHEMA_NGO_FM; + const schema = SCHEMA_NGO_FM; + + await testImportDataFile_HappyPath(page, fileToImport, jsonSchema, schema); + + }); + + + /** + * Load an excel file - Sad Path: + * Try to load a well-formatted excel file but without data. + * Expected behavior: The error message: "The file you try to import is empty" + */ + + test('DATA -> Import data file - Sad path (file well formatted but empty) - NGO Federation Membership Credential ', async ({ page }) => { + + const fileToImport = FILE_TO_IMPORT_NGO_FM_EMPTY; + const jsonSchema = JSON_SCHEMA_NGO_FM; + const schema = SCHEMA_NGO_FM; + const unsuccessAlertMessage = ALERT_FILE_TO_IMPORT_IS_EMPTY; + + await testImportDataFile_SadPath(page, fileToImport, jsonSchema, schema, unsuccessAlertMessage); + + }); + + test('DATA -> Import data file - Sad path (file bad formatted, without required columns) - NGO Federation Membership Credential ', async ({ page }) => { + + const fileToImport = FILE_TO_IMPORT_NGO_FM_WITHOUT_REQUIRED_COLUMNS; + const jsonSchema = JSON_SCHEMA_NGO_FM; + const schema = SCHEMA_NGO_FM; + const unsuccessAlertMessage = ALERT_FILE_TO_IMPORT_WITHOUT_REQUIRED_COLUMS_NGO_FM; + + await testImportDataFile_SadPath(page, fileToImport, jsonSchema, schema, unsuccessAlertMessage); + + }); + + test('DATA -> Import data file - Sad path (file bad formatted, with alien columns) - NGO Federation Membership Credential ', async ({ page }) => { + + const fileToImport = FILE_TO_IMPORT_NGO_FM_WITH_ALIEN_COLUMNS; + const jsonSchema = JSON_SCHEMA_NGO_FM; + const schema = SCHEMA_NGO_FM; + const unsuccessAlertMessage = ALERT_FILE_TO_IMPORT_WITH_ALIEN_COLUMS; + + await testImportDataFile_SadPath(page, fileToImport, jsonSchema, schema, unsuccessAlertMessage); + + }); + + test('DATA -> Import data file - Sad path (file with required columns present but empty) - NGO Federation Membership Credential ', async ({ page }) => { + + const fileToImport = FILE_TO_IMPORT_NGO_FM_WITH_REQUIRED_EMPTY; + const jsonSchema = JSON_SCHEMA_NGO_FM; + const schema = SCHEMA_NGO_FM; + const unsuccessAlertMessage = ALERT_FILE_TO_IMPORT_WITH_REQUIRED_COLUMS_EMPTY_NGO_FM; + + await testImportDataFile_SadPath(page, fileToImport, jsonSchema, schema, unsuccessAlertMessage); + + }); + +}) //end describe + +test.describe('USER -> Credentials Section Tests - testing with USER1_EMAIL AND NGO Federation Membership Credential', () => { + + test.afterEach(async ({ page }) => { //este se ejecutará despues de cada test + await page.click('.logout'); + await page.close(); + }) + + /** + * PRE-CONDITIONS: the admin has enabled a credential of type 'NGO Federation Membership' for USER1_EMAIL + * This is true, if the before test (DATA -> Import data- HAPPY PATH has been passed sucessfully) + * SUMMARY: + * - Check if the user1 can visualize the credentials that has been enabled in "My Credentials" + * - Check the fields displayed when user click "View" Credential + */ + + test('USER Credentials -> My Credentials -> View enabled NGO Federation Membership Credential - for user1@example.org', async ({ page }) => { + // View the NGO Federation Membership Credential in status 'Enabled' for the user + await loginAsUser(page, USER1_EMAIL, URL_IDHUB); + await gotoViewEnabledCredential(page, SCHEMA_TYPE_NGO_FM); + const enabledCredentialView = new ViewCredentialPage(page); + //Check that required fields exist and have a valid value in the current enabled credential + + //Get the credential subject values of the credential visualized in the screen and compare to the model + let actualCredential = await enabledCredentialView.buildACredentialFromInputValues(SCHEMA_TYPE_NGO_FM); + let expectedCredential = await expectedCredentialSubjectForUser(USER1_EMAIL, SCHEMA_TYPE_NGO_FM); + expect(actualCredential).toEqual(expectedCredential); + }); + + test('USER Credentials -> My Credentials -> View enabled NGO Federation Membership Credential - for user2@example.org', async ({ page }) => { + // View the NGO Federation Membership Credential in status 'Enabled' for the user + await loginAsUser(page, USER2_EMAIL, URL_IDHUB); + await gotoViewEnabledCredential(page, SCHEMA_TYPE_NGO_FM); + const enabledCredentialView = new ViewCredentialPage(page); + //Check that required fields exist and have a valid value in the current enabled credential + + //Get the credential subject values of the credential visualized in the screen and compare to the model + let actualCredential = await enabledCredentialView.buildACredentialFromInputValues(SCHEMA_TYPE_NGO_FM); + let expectedCredential = await expectedCredentialSubjectForUser(USER2_EMAIL, SCHEMA_TYPE_NGO_FM); + expect(actualCredential).toEqual(expectedCredential); + }); + +}) + diff --git a/tests/07-COMM-EnabledAndIssueCC_Credential.spec.ts b/tests/07-COMM-EnabledAndIssueCC_Credential.spec.ts new file mode 100644 index 0000000..2e73544 --- /dev/null +++ b/tests/07-COMM-EnabledAndIssueCC_Credential.spec.ts @@ -0,0 +1,133 @@ +import { test, expect } from '@playwright/test' +import { loginAsAdmin, loginAsUser, gotoViewEnabledCredential, expectedCredentialSubjectForUser, testImportDataFile_HappyPath, testImportDataFile_SadPath } from '../src/steps'; +import { ViewCredentialPage } from '../src/page-objects/US_ViewCredentialPage.js' +import { URL_IDHUB, USER1_EMAIL, USER2_EMAIL } from '../src/constants/env_constants'; +import { ALERT_FILE_TO_IMPORT_IS_EMPTY, ALERT_FILE_TO_IMPORT_WITHOUT_REQUIRED_COLUMS_CC, ALERT_FILE_TO_IMPORT_WITH_ALIEN_COLUMS, ALERT_FILE_TO_IMPORT_WITH_REQUIRED_COLUMS_EMPTY, FILE_TO_IMPORT_CC, FILE_TO_IMPORT_CC_EMPTY, FILE_TO_IMPORT_CC_WITHOUT_REQUIRED_COLUMNS, FILE_TO_IMPORT_CC_WITH_ALIEN_COLUMNS, FILE_TO_IMPORT_CC_WITH_REQUIRED_EMPTY, JSON_SCHEMA_CC, SCHEMA_CC, SCHEMA_TYPE_CC } from '../src/constants/constants'; + +/** +* Checking data section: view the lists of files imported, import data, delete... +*/ + +test.describe('ADMIN-> DATA Section Tests - Testing with Course Credential', () => { + + test.beforeEach(async ({ page }) => { + await loginAsAdmin(page, URL_IDHUB); + }) + test.afterEach(async ({ page }) => { + await page.click('.logout'); + await page.close(); + }) + + /** + * Load of an excel file - Happy Path: + * Expected behavior: the file is loaded, the message:"The file was imported successfully!" is displayed, + * and the file appears in the imported files view. + */ + + test('DATA -> Import data file - Happy path - Course Credential - course-credential.xlsx ', async ({ page }) => { + + const fileToImport = FILE_TO_IMPORT_CC; + const jsonSchema = JSON_SCHEMA_CC; + const schema = SCHEMA_CC; + + await testImportDataFile_HappyPath(page, fileToImport, jsonSchema, schema); + + }); + + /** + * Load of an excel file - Sad Path: + * Try to load a well-formatted excel file but without data. + * Expected behavior: The error message: "The file you try to import is empty" + */ + + test('DATA -> Import data file - Sad path (file well formatted but empty) - Course Credential ', async ({ page }) => { + + const fileToImport = FILE_TO_IMPORT_CC_EMPTY; + const jsonSchema = JSON_SCHEMA_CC; + const schema = SCHEMA_CC; + const unsuccessAlertMessage = ALERT_FILE_TO_IMPORT_IS_EMPTY; + + await testImportDataFile_SadPath(page, fileToImport, jsonSchema, schema, unsuccessAlertMessage); + + }); + + test('DATA -> Import data file - Sad path (bad formatted file, without required columns) - Course Credential ', async ({ page }) => { + + const fileToImport = FILE_TO_IMPORT_CC_WITHOUT_REQUIRED_COLUMNS; + const jsonSchema = JSON_SCHEMA_CC; + const schema = SCHEMA_CC; + const unsuccessAlertMessage = ALERT_FILE_TO_IMPORT_WITHOUT_REQUIRED_COLUMS_CC; + + await testImportDataFile_SadPath(page, fileToImport, jsonSchema, schema, unsuccessAlertMessage); + + }); + + test('DATA -> Import data file - Sad path (bad formatted file, with alien columns) - Course Credential ', async ({ page }) => { + + + const fileToImport = FILE_TO_IMPORT_CC_WITH_ALIEN_COLUMNS; + const jsonSchema = JSON_SCHEMA_CC; + const schema = SCHEMA_CC; + const unsuccessAlertMessage = ALERT_FILE_TO_IMPORT_WITH_ALIEN_COLUMS; + + await testImportDataFile_SadPath(page, fileToImport, jsonSchema, schema, unsuccessAlertMessage); + + + }); + + test('DATA -> Import data file - Sad path (file with required columns present but empty) - Course Credential ', async ({ page }) => { + + const fileToImport = FILE_TO_IMPORT_CC_WITH_REQUIRED_EMPTY; + const jsonSchema = JSON_SCHEMA_CC; + const schema = SCHEMA_CC; + const unsuccessAlertMessage = ALERT_FILE_TO_IMPORT_WITH_REQUIRED_COLUMS_EMPTY; + + await testImportDataFile_SadPath(page, fileToImport, jsonSchema, schema, unsuccessAlertMessage); + + }); + +}) + +test.describe('USER -> Credentials Section Tests - testing with USER1_EMAIL AND Course Credential', () => { + + test.afterEach(async ({ page }) => { + await page.click('.logout'); + await page.close(); + }) + + /** + * PRE-CONDITIONS: the admin has enabled a credential of type 'Course' for USER1_EMAIL + * This is true, if the before test (DATA -> Import data- HAPPY PATH has been passed sucessfully) + * SUMMARY: + * - Check if the user1 can visualize the credentials that has been enabled in "My Credentials" + * - Check the fields displayed when user click "View" Credential + */ + + test('USER Credentials -> My Credentials -> View enabled Course Credential - for user1@example.org', async ({ page }) => { + // View the Course Credential in status 'Enabled' for the user + await loginAsUser(page, USER1_EMAIL, URL_IDHUB); + await gotoViewEnabledCredential(page, SCHEMA_TYPE_CC); + const enabledCredentialView = new ViewCredentialPage(page); + //Check that required fields exist and have a valid value in the current enabled credential + + //Get the credential subject values of the credential visualized in the screen and compare to the model + let actualCredential = await enabledCredentialView.buildACredentialFromInputValues(SCHEMA_TYPE_CC); + let expectedCredential = await expectedCredentialSubjectForUser(USER1_EMAIL, SCHEMA_TYPE_CC); + expect(actualCredential).toEqual(expectedCredential); + }); + + test('USER Credentials -> My Credentials -> View enabled Course Credential - for user2@example.org', async ({ page }) => { + // View the Course Credential in status 'Enabled' for the user + await loginAsUser(page, USER2_EMAIL, URL_IDHUB); + await gotoViewEnabledCredential(page, SCHEMA_TYPE_CC); + const enabledCredentialView = new ViewCredentialPage(page); + //Check that required fields exist and have a valid value in the current enabled credential + + //Get the credential subject values of the credential visualized in the screen and compare to the model + let actualCredential = await enabledCredentialView.buildACredentialFromInputValues(SCHEMA_TYPE_CC); + let expectedCredential = await expectedCredentialSubjectForUser(USER2_EMAIL, SCHEMA_TYPE_CC); + expect(actualCredential).toEqual(expectedCredential); + }); + +}) + diff --git a/tests/08-COMM-EnabledAndIssue_EOC_Credential.spec.ts b/tests/08-COMM-EnabledAndIssue_EOC_Credential.spec.ts new file mode 100644 index 0000000..eaf7bfe --- /dev/null +++ b/tests/08-COMM-EnabledAndIssue_EOC_Credential.spec.ts @@ -0,0 +1,136 @@ +import { test, expect } from '@playwright/test' +import { loginAsAdmin, loginAsUser, gotoViewEnabledCredential, expectedCredentialSubjectForUser, testImportDataFile_HappyPath, testImportDataFile_SadPath } from '../src/steps'; +import { ViewCredentialPage } from '../src/page-objects/US_ViewCredentialPage.js' +import { URL_IDHUB, USER1_EMAIL, USER2_EMAIL } from '../src/constants/env_constants'; +import { ALERT_FILE_TO_IMPORT_IS_EMPTY, ALERT_FILE_TO_IMPORT_WITHOUT_REQUIRED_COLUMS_EOC, ALERT_FILE_TO_IMPORT_WITH_ALIEN_COLUMS, ALERT_FILE_TO_IMPORT_WITH_REQUIRED_COLUMS_EMPTY_EOC, FILE_TO_IMPORT_EOC, FILE_TO_IMPORT_EOC_EMPTY, FILE_TO_IMPORT_EOC_WITHOUT_REQUIRED_COLUMNS, FILE_TO_IMPORT_EOC_WITH_ALIEN_COLUMNS, FILE_TO_IMPORT_EOC_WITH_REQUIRED_EMPTY, JSON_SCHEMA_EOC, SCHEMA_EOC, SCHEMA_TYPE_EOC } from '../src/constants/constants'; + +/** +* Checking data section: view the lists of files imported, import data, delete... +*/ + +test.describe('ADMIN-> DATA Section Tests - Testing with E-Operator Claim Credential', () => { + + test.beforeEach(async ({ page }) => { + await loginAsAdmin(page, URL_IDHUB); + }) + test.afterEach(async ({ page }) => { + await page.click('.logout'); + await page.close(); + }) + + + /** + * Load an excel file - Happy Path + * Expected behavior: the file is loaded, the message:"The file was imported successfully!" is displayed, + * and the file appears in the imported files view. + */ + + test('DATA -> Import data file - Happy path - E-Operator Claim Credential - e-operator-claim.xlsx ', async ({ page }) => { + + const fileToImport = FILE_TO_IMPORT_EOC; + const jsonSchema = JSON_SCHEMA_EOC; + const schema = SCHEMA_EOC; + + await testImportDataFile_HappyPath(page, fileToImport, jsonSchema, schema); + + }); + + /** + * Load an excel file - Sad Path: + * Expected behavior: The error message: "The file you try to import is empty" + */ + + test('DATA -> Import data file - Sad path (file well formatted but empty) - E-Operator Claim Credential ', async ({ page }) => { + + const fileToImport = FILE_TO_IMPORT_EOC_EMPTY; + const jsonSchema = JSON_SCHEMA_EOC; + const schema = SCHEMA_EOC; + const unsuccessAlertMessage = ALERT_FILE_TO_IMPORT_IS_EMPTY; + + await testImportDataFile_SadPath(page, fileToImport, jsonSchema, schema, unsuccessAlertMessage); + + }); + + /** + * Load an excel file - Sad Path: + * Try to load a bad formatted file, without required data. + */ + + test('DATA -> Import data file - Sad path (bad formatted file, without required columns) - E-Operator Claim Credential ', async ({ page }) => { + + const fileToImport = FILE_TO_IMPORT_EOC_WITHOUT_REQUIRED_COLUMNS; + const jsonSchema = JSON_SCHEMA_EOC; + const schema = SCHEMA_EOC; + const unsuccessAlertMessage = ALERT_FILE_TO_IMPORT_WITHOUT_REQUIRED_COLUMS_EOC; + + await testImportDataFile_SadPath(page, fileToImport, jsonSchema, schema, unsuccessAlertMessage); + + }); + + test('DATA -> Import data file - Sad path (file bad formatted, with alien columns) - E-Operator Claim Credential ', async ({ page }) => { + + const fileToImport = FILE_TO_IMPORT_EOC_WITH_ALIEN_COLUMNS; + const jsonSchema = JSON_SCHEMA_EOC; + const schema = SCHEMA_EOC; + const unsuccessAlertMessage = ALERT_FILE_TO_IMPORT_WITH_ALIEN_COLUMS; + + await testImportDataFile_SadPath(page, fileToImport, jsonSchema, schema, unsuccessAlertMessage); + + }); + + test('DATA -> Import data file - Sad path (file with required columns present but empty) - E-Operator Claim Credential ', async ({ page }) => { + + const fileToImport = FILE_TO_IMPORT_EOC_WITH_REQUIRED_EMPTY; + const jsonSchema = JSON_SCHEMA_EOC; + const schema = SCHEMA_EOC; + const unsuccessAlertMessage = ALERT_FILE_TO_IMPORT_WITH_REQUIRED_COLUMS_EMPTY_EOC; + + await testImportDataFile_SadPath(page, fileToImport, jsonSchema, schema, unsuccessAlertMessage); + + }); + +}) + +test.describe('USER -> Credentials Section Tests - testing with USER1_EMAIL AND E-Operator Claim Credential', () => { + + test.afterEach(async ({ page }) => { //este se ejecutará despues de cada test + await page.click('.logout'); + await page.close(); + }) + + /** + * PRE-CONDITIONS: the admin has enabled a credential of type 'E-Operator Claim' for USER1_EMAIL + * This is true, if the before test (DATA -> Import data- HAPPY PATH has been passed sucessfully) + * SUMMARY: + * - Check if the user1 can visualize the credentials that has been enabled in "My Credentials" + * - Check the fields displayed when user click "View" Credential + */ + + test('USER Credentials -> My Credentials -> View enabled E-Operator Claim Credential - for user1@example.org' , async ({ page }) => { + // View the E-Operator Claim Credential in status 'Enabled' for the user + await loginAsUser(page, USER1_EMAIL, URL_IDHUB); + await gotoViewEnabledCredential(page, SCHEMA_TYPE_EOC); + const enabledCredentialView = new ViewCredentialPage(page); + //Check that required fields exist and have a valid value in the current enabled credential + + //Get the credential subject values of the credential visualized in the screen and compare to the model + let actualCredential = await enabledCredentialView.buildACredentialFromInputValues(SCHEMA_TYPE_EOC); + let expectedCredential = await expectedCredentialSubjectForUser(USER1_EMAIL, SCHEMA_TYPE_EOC); + expect(actualCredential).toEqual(expectedCredential); + }); + + test('USER Credentials -> My Credentials -> View enabled E-Operator Claim Credential - for user2@example.org' , async ({ page }) => { + // View the E-Operator Claim Credential in status 'Enabled' for the user + await loginAsUser(page, USER2_EMAIL, URL_IDHUB); + await gotoViewEnabledCredential(page, SCHEMA_TYPE_EOC); + const enabledCredentialView = new ViewCredentialPage(page); + //Check that required fields exist and have a valid value in the current enabled credential + + //Get the credential subject values of the credential visualized in the screen and compare to the model + let actualCredential = await enabledCredentialView.buildACredentialFromInputValues(SCHEMA_TYPE_EOC); + let expectedCredential = await expectedCredentialSubjectForUser(USER2_EMAIL, SCHEMA_TYPE_EOC); + expect(actualCredential).toEqual(expectedCredential); + }); + +}) + diff --git a/vc_excel/course-credential-with-alien-columns.xlsx b/vc_excel/course-credential-with-alien-columns.xlsx new file mode 100644 index 0000000..e360929 Binary files /dev/null and b/vc_excel/course-credential-with-alien-columns.xlsx differ diff --git a/vc_excel/course-credential-with-required-empty.xlsx b/vc_excel/course-credential-with-required-empty.xlsx new file mode 100644 index 0000000..4680b9e Binary files /dev/null and b/vc_excel/course-credential-with-required-empty.xlsx differ diff --git a/vc_excel/course-credential-without-required-columns.xlsx b/vc_excel/course-credential-without-required-columns.xlsx new file mode 100644 index 0000000..388cd00 Binary files /dev/null and b/vc_excel/course-credential-without-required-columns.xlsx differ diff --git a/vc_excel/course-credential.xlsx b/vc_excel/course-credential.xlsx index 8ffea58..e1ec19f 100644 Binary files a/vc_excel/course-credential.xlsx and b/vc_excel/course-credential.xlsx differ diff --git a/vc_excel/e-operator-claim-with-alien-columns.xlsx b/vc_excel/e-operator-claim-with-alien-columns.xlsx new file mode 100644 index 0000000..dbe1253 Binary files /dev/null and b/vc_excel/e-operator-claim-with-alien-columns.xlsx differ diff --git a/vc_excel/e-operator-claim-with-required-empty.xlsx b/vc_excel/e-operator-claim-with-required-empty.xlsx new file mode 100644 index 0000000..60e59ee Binary files /dev/null and b/vc_excel/e-operator-claim-with-required-empty.xlsx differ diff --git a/vc_excel/e-operator-claim-without-required-columns.xlsx b/vc_excel/e-operator-claim-without-required-columns.xlsx new file mode 100644 index 0000000..332e01d Binary files /dev/null and b/vc_excel/e-operator-claim-without-required-columns.xlsx differ diff --git a/vc_excel/e-operator-claim.xlsx b/vc_excel/e-operator-claim.xlsx index 2909e10..d7e9f4a 100644 Binary files a/vc_excel/e-operator-claim.xlsx and b/vc_excel/e-operator-claim.xlsx differ diff --git a/vc_excel/federation-membership-empty.xlsx b/vc_excel/federation-membership-empty.xlsx index e2cc7b5..aec4a00 100644 Binary files a/vc_excel/federation-membership-empty.xlsx and b/vc_excel/federation-membership-empty.xlsx differ diff --git a/vc_excel/federation-membership-with-alien-columns.xlsx b/vc_excel/federation-membership-with-alien-columns.xlsx new file mode 100644 index 0000000..ae06383 Binary files /dev/null and b/vc_excel/federation-membership-with-alien-columns.xlsx differ diff --git a/vc_excel/federation-membership-with-required-empty.xlsx b/vc_excel/federation-membership-with-required-empty.xlsx new file mode 100644 index 0000000..5d09910 Binary files /dev/null and b/vc_excel/federation-membership-with-required-empty.xlsx differ diff --git a/vc_excel/federation-membership-with-some-optional-empty.xlsx b/vc_excel/federation-membership-with-some-optional-empty.xlsx new file mode 100644 index 0000000..d4ec9b0 Binary files /dev/null and b/vc_excel/federation-membership-with-some-optional-empty.xlsx differ diff --git a/vc_excel/federation-membership-without-required-columns.xlsx b/vc_excel/federation-membership-without-required-columns.xlsx new file mode 100644 index 0000000..829ec13 Binary files /dev/null and b/vc_excel/federation-membership-without-required-columns.xlsx differ diff --git a/vc_excel/federation-membership.xlsx b/vc_excel/federation-membership.xlsx index e2cc7b5..4d6ffa9 100644 Binary files a/vc_excel/federation-membership.xlsx and b/vc_excel/federation-membership.xlsx differ diff --git a/vc_excel/federation-membership2.xlsx b/vc_excel/federation-membership2.xlsx new file mode 100644 index 0000000..9d5acd8 Binary files /dev/null and b/vc_excel/federation-membership2.xlsx differ diff --git a/vc_excel/financial-vulnerability-empty887.xlsx b/vc_excel/financial-vulnerability-empty887.xlsx new file mode 100644 index 0000000..ed6c91a Binary files /dev/null and b/vc_excel/financial-vulnerability-empty887.xlsx differ diff --git a/vc_excel/financial-vulnerability-with-required-empty.xlsx b/vc_excel/financial-vulnerability-with-required-empty.xlsx index f8f6cda..70ac4ef 100644 Binary files a/vc_excel/financial-vulnerability-with-required-empty.xlsx and b/vc_excel/financial-vulnerability-with-required-empty.xlsx differ diff --git a/vc_excel/financial-vulnerability-without-required-columns684.xlsx b/vc_excel/financial-vulnerability-without-required-columns684.xlsx new file mode 100644 index 0000000..5b3a358 Binary files /dev/null and b/vc_excel/financial-vulnerability-without-required-columns684.xlsx differ diff --git a/vc_excel/membership-card-with-alien-columns.xlsx b/vc_excel/membership-card-with-alien-columns.xlsx new file mode 100644 index 0000000..ded2752 Binary files /dev/null and b/vc_excel/membership-card-with-alien-columns.xlsx differ diff --git a/vc_excel/membership-card-with-required-empty.xlsx b/vc_excel/membership-card-with-required-empty.xlsx new file mode 100644 index 0000000..5d34d8b Binary files /dev/null and b/vc_excel/membership-card-with-required-empty.xlsx differ diff --git a/vc_excel/membership-card-with-some-optional-empty.xlsx b/vc_excel/membership-card-with-some-optional-empty.xlsx new file mode 100644 index 0000000..095c9d5 Binary files /dev/null and b/vc_excel/membership-card-with-some-optional-empty.xlsx differ diff --git a/vc_excel/membership-card-without-required-columns.xlsx b/vc_excel/membership-card-without-required-columns.xlsx new file mode 100644 index 0000000..6191cf1 Binary files /dev/null and b/vc_excel/membership-card-without-required-columns.xlsx differ diff --git a/vc_excel/membership-card.xlsx b/vc_excel/membership-card.xlsx index 4531ffe..ee72da6 100644 Binary files a/vc_excel/membership-card.xlsx and b/vc_excel/membership-card.xlsx differ diff --git a/vc_excel/membership-card2.xlsx b/vc_excel/membership-card2.xlsx new file mode 100644 index 0000000..0ed0137 Binary files /dev/null and b/vc_excel/membership-card2.xlsx differ