Skip to content
This repository was archived by the owner on Jan 18, 2024. It is now read-only.

Commit 8ef89c3

Browse files
Eike Haßeike-hass
authored andcommitted
feat: added cypress e2e testing
1 parent 895ffa3 commit 8ef89c3

17 files changed

Lines changed: 1164 additions & 32 deletions

File tree

.eslintrc

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
"airbnb-base",
55
"plugin:@typescript-eslint/recommended",
66
"prettier/@typescript-eslint",
7-
"plugin:prettier/recommended"
7+
"plugin:prettier/recommended",
8+
"plugin:cypress/recommended"
89
],
910
"parserOptions": {
1011
"ecmaVersion": 2018,
@@ -28,9 +29,9 @@
2829
"error",
2930
"ignorePackages",
3031
{
31-
"js": "never",
32-
"ts": "never"
32+
"js": "never",
33+
"ts": "never"
3334
}
34-
]
35+
]
3536
}
3637
}

.gitignore

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
node_modules
2+
build
3+
.build
4+
5+
# misc
6+
.DS_Store
7+
.env.local
8+
.env.development.local
9+
.env.test.local
10+
.env.production.local
11+
12+
yarn-debug.log*
13+
yarn-error.log*
14+
15+
.gradle/
16+
.idea/

android/app/src/main/assets/capacitor.config.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@
1212
"androidScaleType": "CENTER_CROP",
1313
"splashFullScreen": false,
1414
"splashImmersive": true
15+
},
16+
"Keyboard": {
17+
"resize": "none"
1518
}
1619
},
1720
"server": {}

cypress.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"video": false
3+
}

cypress/fixtures/account.json

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"localStorage": {
3+
"hasSetupAccount": true,
4+
"cap_sec_did": "eyJrZXlJZCI6InNlbHYiLCJzZWVkIjoiV1hHQ1VaTUlSQTk5V0pUUkRPVERHTERGVVJBRkVHRU9NWFhHSEdTT0ZQVU9LS05NR1JHVjlNSUZTSE9XQkFRSFNBWlk5Tk1YR1dPRFNBWU9BIiwicm9vdCI6IldYT1hBV01LQURTSEtOQUZMRVpJQlA5TVhHV0lGT0ROUVpOUFdSSkVLVFZYR1VNOUNQSUxLVFJITllSQkw5RVBUSlRXRE1DVUg5QUxGS1JVOSIsInByaXZhdGVLZXkiOiJ0ZEtvZDRib3N4L0xSRzRwNTA4OXBKaWZuWlo5NkVwYkMyQ1dLcnZhajNzPSIsIm1hbVN0YXRlIjp7InNlZWQiOiJXWEdDVVpNSVJBOTlXSlRSRE9UREdMREZVUkFGRUdFT01YWEdIR1NPRlBVT0tLTk1HUkdWOU1JRlNIT1dCQVFIU0FaWTlOTVhHV09EU0FZT0EiLCJtb2RlIjoicHJpdmF0ZSIsInNlY3VyaXR5IjoyLCJzdGFydCI6MSwiY291bnQiOjEsIm5leHRDb3VudCI6MSwiaW5kZXgiOjAsIm5leHRSb290IjoiTlBHQU9KUTlCRVNRQ0dFS1NUQkVTTkxEVlJBQkJVV085Q1RRRUlPRUVLRUJTVUtaTU9FSkdGSENLUElIRFRQSFpDVUVLRFlQWE5WSENZRkxHIn19",
5+
"cap_sec_Address": "eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSIsImlvdGEub3JnIl0sInR5cGUiOlsiVmVyaWZpYWJsZUNyZWRlbnRpYWwiLCJBZGRyZXNzIl0sImlzc3VlciI6ImRpZDpJT1RBOldYT1hBV01LQURTSEtOQUZMRVpJQlA5TVhHV0lGT0ROUVpOUFdSSkVLVFZYR1VNOUNQSUxLVFJITllSQkw5RVBUSlRXRE1DVUg5QUxGS1JVOSIsImlzc3VhbmNlRGF0ZSI6Ik1vbiwgMTkgT2N0IDIwMjAgMTk6MjQ6MzQgR01UIiwiY3JlZGVudGlhbFN1YmplY3QiOnsiRElEIjoiZGlkOklPVEE6V1hPWEFXTUtBRFNIS05BRkxFWklCUDlNWEdXSUZPRE5RWk5QV1JKRUtUVlhHVU05Q1BJTEtUUkhOWVJCTDlFUFRKVFdETUNVSDlBTEZLUlU5IiwiVXNlckFkZHJlc3MiOnsiQ2l0eSI6IldlaXNzbGluZ2VuIiwiQ291bnRyeSI6IlN3aXR6ZXJsYW5kIiwiSG91c2UiOiJSdWUgZGUgbGEgQ2hhcml06SIsIlBvc3Rjb2RlIjoiODkzNiIsIlN0YXRlIjoiRnJpYm91cmciLCJTdHJlZXQiOiI2MzQifX0sInByb29mIjp7InR5cGUiOiJFY2RzYVNlY3AyNTZrMVZlcmlmaWNhdGlvbktleTIwMTkiLCJ2ZXJpZmljYXRpb25NZXRob2QiOiJkaWQ6SU9UQTpXWE9YQVdNS0FEU0hLTkFGTEVaSUJQOU1YR1dJRk9ETlFaTlBXUkpFS1RWWEdVTTlDUElMS1RSSE5ZUkJMOUVQVEpUV0RNQ1VIOUFMRktSVTkjc2VsdiIsInNpZ25hdHVyZVZhbHVlIjoiam5MVS9JM3gydmVqT28xeVBjcVhySll2a015YzZ0QUdpazltbVZzcVIrOUJXTzArL2F5MUltRG8yRktJTzc0NDdRR3JKWlJWM3VMWmEyK0dmSHVOTnc9PSIsImNyZWF0ZWQiOiJNb24sIDE5IE9jdCAyMDIwIDE5OjI0OjM0IEdNVCIsImNyZWF0b3IiOiJkaWQ6SU9UQTpXWE9YQVdNS0FEU0hLTkFGTEVaSUJQOU1YR1dJRk9ETlFaTlBXUkpFS1RWWEdVTTlDUElMS1RSSE5ZUkJMOUVQVEpUV0RNQ1VIOUFMRktSVTkifX0=",
6+
"cap_sec_PersonalData": "eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSIsImlvdGEub3JnIl0sInR5cGUiOlsiVmVyaWZpYWJsZUNyZWRlbnRpYWwiLCJQZXJzb25hbERhdGEiXSwiaXNzdWVyIjoiZGlkOklPVEE6V1hPWEFXTUtBRFNIS05BRkxFWklCUDlNWEdXSUZPRE5RWk5QV1JKRUtUVlhHVU05Q1BJTEtUUkhOWVJCTDlFUFRKVFdETUNVSDlBTEZLUlU5IiwiaXNzdWFuY2VEYXRlIjoiTW9uLCAxOSBPY3QgMjAyMCAxOToyNDozNCBHTVQiLCJjcmVkZW50aWFsU3ViamVjdCI6eyJESUQiOiJkaWQ6SU9UQTpXWE9YQVdNS0FEU0hLTkFGTEVaSUJQOU1YR1dJRk9ETlFaTlBXUkpFS1RWWEdVTTlDUElMS1RSSE5ZUkJMOUVQVEpUV0RNQ1VIOUFMRktSVTkiLCJVc2VyUGVyc29uYWxEYXRhIjp7IkJpcnRocGxhY2UiOiJXZWlzc2xpbmdlbiIsIklkZW50aXR5Q2FyZE51bWJlciI6Ijc1Ni41Mzg1LjEyNjcuNDIiLCJOYXRpb25hbGl0eSI6IlN3aXR6ZXJsYW5kIiwiUGFzc3BvcnROdW1iZXIiOiI0Uk5RNU4iLCJVc2VyRE9CIjp7IkRhdGUiOiJTdW4gRGVjIDIzIDE5NTEifSwiVXNlck5hbWUiOnsiRmlyc3ROYW1lIjoiVGVzdGluZyIsIkxhc3ROYW1lIjoiTGF1cmVudCJ9fX0sInByb29mIjp7InR5cGUiOiJFY2RzYVNlY3AyNTZrMVZlcmlmaWNhdGlvbktleTIwMTkiLCJ2ZXJpZmljYXRpb25NZXRob2QiOiJkaWQ6SU9UQTpXWE9YQVdNS0FEU0hLTkFGTEVaSUJQOU1YR1dJRk9ETlFaTlBXUkpFS1RWWEdVTTlDUElMS1RSSE5ZUkJMOUVQVEpUV0RNQ1VIOUFMRktSVTkjc2VsdiIsInNpZ25hdHVyZVZhbHVlIjoiNW82MEhINS9LbG04WFNmSXI4RnFNWFd6dkZrNzVkeFFqa1FUV2sxZGVGY3lTczdLYXI2U2QwVmVERlJoYUk0ZmpvQmdJL1NZZVAvMWNQMmJuZGVidkE9PSIsImNyZWF0ZWQiOiJNb24sIDE5IE9jdCAyMDIwIDE5OjI0OjM0IEdNVCIsImNyZWF0b3IiOiJkaWQ6SU9UQTpXWE9YQVdNS0FEU0hLTkFGTEVaSUJQOU1YR1dJRk9ETlFaTlBXUkpFS1RWWEdVTTlDUElMS1RSSE5ZUkJMOUVQVEpUV0RNQ1VIOUFMRktSVTkifX0=",
7+
"cap_sec_ContactDetails": "eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSIsImlvdGEub3JnIl0sInR5cGUiOlsiVmVyaWZpYWJsZUNyZWRlbnRpYWwiLCJDb250YWN0RGV0YWlscyJdLCJpc3N1ZXIiOiJkaWQ6SU9UQTpXWE9YQVdNS0FEU0hLTkFGTEVaSUJQOU1YR1dJRk9ETlFaTlBXUkpFS1RWWEdVTTlDUElMS1RSSE5ZUkJMOUVQVEpUV0RNQ1VIOUFMRktSVTkiLCJpc3N1YW5jZURhdGUiOiJNb24sIDE5IE9jdCAyMDIwIDE5OjI0OjM0IEdNVCIsImNyZWRlbnRpYWxTdWJqZWN0Ijp7IkRJRCI6ImRpZDpJT1RBOldYT1hBV01LQURTSEtOQUZMRVpJQlA5TVhHV0lGT0ROUVpOUFdSSkVLVFZYR1VNOUNQSUxLVFJITllSQkw5RVBUSlRXRE1DVUg5QUxGS1JVOSIsIlVzZXJDb250YWN0cyI6eyJFbWFpbCI6Im1pcmNvLmxhdXJlbnRAZXhhbXBsZS5jb20iLCJQaG9uZSI6IjA3NyA2MTcgNjAgNjgifX0sInByb29mIjp7InR5cGUiOiJFY2RzYVNlY3AyNTZrMVZlcmlmaWNhdGlvbktleTIwMTkiLCJ2ZXJpZmljYXRpb25NZXRob2QiOiJkaWQ6SU9UQTpXWE9YQVdNS0FEU0hLTkFGTEVaSUJQOU1YR1dJRk9ETlFaTlBXUkpFS1RWWEdVTTlDUElMS1RSSE5ZUkJMOUVQVEpUV0RNQ1VIOUFMRktSVTkjc2VsdiIsInNpZ25hdHVyZVZhbHVlIjoiNEUzdTh0cG56RjlwWUZlT2NYN2cwblFvMEFOc0wyNjNpWVErYlAzTk9YOXkzRk5ESDZUWml5Z2dyVzhrUytXV0hUNEVvZ2hJbGpUU0lXVUpYN0JSSVE9PSIsImNyZWF0ZWQiOiJNb24sIDE5IE9jdCAyMDIwIDE5OjI0OjM0IEdNVCIsImNyZWF0b3IiOiJkaWQ6SU9UQTpXWE9YQVdNS0FEU0hLTkFGTEVaSUJQOU1YR1dJRk9ETlFaTlBXUkpFS1RWWEdVTTlDUElMS1RSSE5ZUkJMOUVQVEpUV0RNQ1VIOUFMRktSVTkifX0="
8+
}
9+
}

cypress/fixtures/bank.json

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
{
2+
"companyData": {
3+
"CompanyName": "CompanyName Test",
4+
"CompanyAddress": "CompanyAddress Test",
5+
"CompanyType": "CompanyType Test",
6+
"CompanyOwner": "CompanyOwner Test",
7+
"CompanyCapital": 45225,
8+
"CompanyBusiness": "CompanyBusiness Test",
9+
"CompanyCreationDate": "CompanyCreationDate Test",
10+
"CompanyStatus": "CompanyStatus Test",
11+
"CompanyNumber": 5416263362,
12+
"CompanyOwners": [
13+
{
14+
"CompanyOwner": "Multi CompanyOwner Test"
15+
}
16+
]
17+
},
18+
"companyDataFieldsToTest": ["CompanyName", "CompanyAddress", "CompanyType", "CompanyBusiness"],
19+
"bankData": {
20+
"AccountType": "Test",
21+
"AccountNumber": "Test",
22+
"AccountIBAN": "Test",
23+
"BankName": "Test"
24+
},
25+
"insuranceData": {
26+
"Name": "Test",
27+
"Address": "Test",
28+
"AccountNumber": "Test",
29+
"InsuranceType": "Test",
30+
"StartDate": "Test",
31+
"EndDate": "Test"
32+
}
33+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
// / <reference types="cypress" />
2+
const click = ($el) => $el.click();
3+
4+
context('Setup Account', () => {
5+
beforeEach(() => {
6+
cy.visit('http://localhost:3001');
7+
});
8+
9+
it('flow', () => {
10+
cy.contains('Next').click();
11+
cy.contains('Next').click();
12+
cy.contains('Continue').click();
13+
cy.get('[placeholder="First name"]').type('Testing');
14+
cy.contains('Save Name')
15+
.pipe(click, { timeout: 60000 })
16+
.should('not.exist', { timeout: 10000 });
17+
18+
cy.get('.list:contains("My Identity")').click();
19+
cy.contains('first Name')
20+
.siblings()
21+
.should('not.be.empty');
22+
cy.contains('last Name')
23+
.siblings()
24+
.should('not.be.empty');
25+
cy.contains('date Of Birth')
26+
.siblings()
27+
.should('not.be.empty');
28+
cy.contains('birth Place')
29+
.siblings()
30+
.should('not.be.empty');
31+
cy.contains('nationality')
32+
.siblings()
33+
.should('not.be.empty');
34+
cy.contains('country Of Residence')
35+
.siblings()
36+
.should('not.be.empty');
37+
cy.contains('address')
38+
.siblings()
39+
.should('not.be.empty');
40+
cy.contains('identity Card Number')
41+
.siblings()
42+
.should('not.be.empty');
43+
cy.contains('passport Number')
44+
.siblings()
45+
.should('not.be.empty');
46+
cy.contains('phone Number')
47+
.siblings()
48+
.should('not.be.empty');
49+
cy.contains('email')
50+
.siblings()
51+
.should('not.be.empty');
52+
cy.get('img[src="chevron-left.svg"]').click();
53+
});
54+
});

cypress/integration/bank.spec.js

Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
// / <reference types="cypress" />
2+
import { SocketIO, Server } from 'mock-socket';
3+
import { encrypt } from '../../ui/lib/helpers';
4+
5+
const fakeURL = 'http://internal.dev:8888';
6+
const fakePassword = 'TpL4apWPbpRgfF4iEue8W4Fu11r60tRf';
7+
8+
const scannerCompany = {
9+
detail: `{"channelId":"UWNd14u","challenge":"jofzk2syMF","password":"${fakePassword}","requestedCredentials":["Address","PersonalData","ContactDetails"],"shareWith":"company","url":"${fakeURL}"}`
10+
};
11+
const scannerBank = {
12+
detail: `{"channelId":"escaEww","challenge":"cyZChxcW4R","password":"${fakePassword}","requestedCredentials":["Address","PersonalData","ContactDetails","Company"],"shareWith":"bank","url":"${fakeURL}"}`
13+
};
14+
const scannerInsurance = {
15+
detail: `{"channelId":"qkTLSIC","challenge":"J8K6qDEcjW","password":"${fakePassword}","requestedCredentials":["Address","PersonalData","ContactDetails","Company","BankAccount"],"shareWith":"insurance","url":"${fakeURL}"}`
16+
};
17+
18+
context('Bank Flow', () => {
19+
beforeEach(() => {
20+
cy.fixture('bank').as('bankFixture');
21+
cy.fixture('account').as('accountFixture');
22+
23+
cy.get('@accountFixture').then((accountFixture) => {
24+
cy.window().then((win) => {
25+
Object.entries(accountFixture.localStorage).map((entry) => win.localStorage.setItem(entry[0], entry[1]));
26+
});
27+
});
28+
29+
cy.visit('http://localhost:3001');
30+
31+
cy.get('@bankFixture').then((bankFixture) => {
32+
const mockServer = new Server(fakeURL);
33+
mockServer.on('connection', (socket) => {
34+
// eslint-disable-next-line no-console
35+
console.debug('mock connection established');
36+
37+
socket.on('verifiablePresentation', (message) => {
38+
// eslint-disable-next-line no-console
39+
console.debug('verifiablePresentation', JSON.stringify(message));
40+
setTimeout(() => {
41+
if (message.channelId === 'UWNd14u') {
42+
mockServer.emit(
43+
'createCredential',
44+
JSON.stringify({
45+
schemaName: 'Company',
46+
data: encrypt(fakePassword, JSON.stringify(bankFixture.companyData)),
47+
url: fakeURL
48+
})
49+
);
50+
}
51+
if (message.channelId === 'escaEww') {
52+
mockServer.emit(
53+
'createCredential',
54+
JSON.stringify({
55+
schemaName: 'BankAccount',
56+
data: encrypt(fakePassword, JSON.stringify(bankFixture.bankData)),
57+
url: fakeURL
58+
})
59+
);
60+
}
61+
if (message.channelId === 'qkTLSIC') {
62+
mockServer.emit(
63+
'createCredential',
64+
JSON.stringify({
65+
schemaName: 'Insurance',
66+
data: encrypt(fakePassword, JSON.stringify(bankFixture.insuranceData)),
67+
url: fakeURL
68+
})
69+
);
70+
}
71+
}, 1000);
72+
});
73+
74+
socket.on('createCredential', (message) => {
75+
// eslint-disable-next-line no-console
76+
console.debug('createCredential', JSON.stringify(message));
77+
});
78+
79+
socket.on('error', (error) => {
80+
console.error(error);
81+
});
82+
});
83+
84+
cy.wrap(mockServer).as('mockServer');
85+
cy.window().then((win) => {
86+
// eslint-disable-next-line no-param-reassign
87+
win.io = SocketIO;
88+
});
89+
});
90+
});
91+
92+
it('flow', () => {
93+
cy.contains('Scan Code').click();
94+
cy.window().then((win) => {
95+
win.handleScannerData(scannerCompany);
96+
});
97+
cy.contains('Share credential').click();
98+
99+
cy.get('.list:contains("My Identity")');
100+
101+
cy.contains('Accept certificate?', { timeout: 10000 });
102+
cy.contains('Business Details');
103+
cy.get('button:contains("Accept certificate")').click();
104+
105+
cy.get('.list:contains("Business Details")', { timeout: 10000 }).click();
106+
107+
cy.get('@bankFixture').then((bankFixture) => {
108+
bankFixture.companyDataFieldsToTest.map((field) => cy.contains(bankFixture.companyData[field]));
109+
});
110+
111+
cy.get('img[src="chevron-left.svg"]').click();
112+
113+
cy.window().then((win) => {
114+
win.handleScannerData(scannerBank);
115+
});
116+
cy.contains('Share credential').click();
117+
118+
cy.contains('Accept certificate?', { timeout: 10000 });
119+
cy.contains('Bank Details');
120+
cy.get('button:contains("Accept certificate")').click();
121+
122+
// TODO: check document
123+
124+
cy.window().then((win) => {
125+
win.handleScannerData(scannerInsurance);
126+
});
127+
cy.contains('Share credential').click();
128+
129+
cy.contains('Accept certificate?', { timeout: 10000 });
130+
cy.contains('Liability Insurance');
131+
cy.get('button:contains("Accept certificate")').click();
132+
133+
// TODO: check document
134+
});
135+
136+
afterEach(() => {
137+
cy.get('@mockServer').then((mockServer) => mockServer.stop());
138+
});
139+
});

0 commit comments

Comments
 (0)