Integration tests for all JS-related projects (#97)

This commit is contained in:
Pavel
2022-02-22 23:20:45 +03:00
committed by GitHub
parent c991d0d153
commit 178cc42847
90 changed files with 254664 additions and 254316 deletions

View File

@ -0,0 +1,8 @@
module.exports = {
semi: true,
trailingComma: 'all',
singleQuote: true,
printWidth: 120,
tabWidth: 4,
useTabs: false,
};

View File

@ -0,0 +1,8 @@
module.exports = {
preset: 'jest-puppeteer',
testMatch: ['**/?(*.)+(spec|test).[t]s'],
testPathIgnorePatterns: ['/node_modules/', 'dist'],
transform: {
'^.+\\.ts?$': 'ts-jest',
},
};

File diff suppressed because it is too large Load Diff

View File

@ -1,54 +1,65 @@
{
"name": "getting-started-browser",
"version": "0.1.0",
"private": true,
"dependencies": {
"@fluencelabs/fluence": "^0.19.1",
"@fluencelabs/fluence-network-environment": "^1.0.13",
"@testing-library/jest-dom": "^5.14.1",
"@testing-library/react": "^11.2.7",
"@testing-library/user-event": "^12.8.3",
"@types/jest": "^26.0.24",
"@types/node": "^12.20.16",
"@types/react": "^17.0.14",
"@types/react-dom": "^17.0.9",
"react": "^17.0.2",
"react-dom": "^17.0.2",
"react-scripts": "4.0.3",
"typescript": "^4.3.5",
"web-vitals": "^1.1.2"
},
"scripts": {
"postinstall": "copy-avm-public public",
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject",
"compile-aqua": "aqua -i ./aqua/ -o ./src/_aqua",
"watch-aqua": "chokidar \"**/*.aqua\" -c \"npm run compile-aqua\""
},
"eslintConfig": {
"extends": [
"react-app",
"react-app/jest"
]
},
"browserslist": {
"production": [
">0.2%",
"not dead",
"not op_mini all"
],
"development": [
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version"
]
},
"devDependencies": {
"@fluencelabs/aqua": "^0.6.1-278",
"@fluencelabs/aqua-lib": "^0.4.0",
"chokidar-cli": "^2.1.0",
"node-sass": "^6.0.1"
}
"name": "getting-started-browser",
"version": "0.1.0",
"private": true,
"dependencies": {
"@fluencelabs/fluence": "0.19.2",
"@fluencelabs/fluence-network-environment": "^1.0.13",
"@testing-library/jest-dom": "^5.14.1",
"@testing-library/react": "^11.2.7",
"@testing-library/user-event": "^12.8.3",
"@types/jest": "^27.4.0",
"@types/node": "^12.20.16",
"@types/react": "^17.0.14",
"@types/react-dom": "^17.0.9",
"@types/serve-handler": "^6.1.1",
"react": "^17.0.2",
"react-dom": "^17.0.2",
"react-scripts": "^5.0.0",
"typescript": "^4.3.5",
"web-vitals": "^1.1.2"
},
"scripts": {
"postinstall": "copy-avm-public public",
"prestart": "npm run compile-aqua",
"prebuild": "npm run compile-aqua",
"start": "react-scripts start",
"build": "react-scripts build",
"test": "jest --config=jest.config.js",
"_test": "react-scripts test",
"eject": "react-scripts eject",
"compile-aqua": "aqua -i ./aqua/ -o ./src/_aqua",
"watch-aqua": "chokidar \"**/*.aqua\" -c \"npm run compile-aqua\""
},
"eslintConfig": {
"extends": [
"react-app",
"react-app/jest"
]
},
"browserslist": {
"production": [
">0.2%",
"not dead",
"not op_mini all",
"not ie 11",
"not android 4.4.3-4.4.4"
],
"development": [
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version"
]
},
"devDependencies": {
"@fluencelabs/aqua": "^0.6.0-275",
"@fluencelabs/aqua-lib": "^0.4.0",
"@types/jest-environment-puppeteer": "^4.4.1",
"@types/puppeteer": "^5.4.4",
"chokidar-cli": "^2.1.0",
"jest-puppeteer": "^6.0.2",
"node-sass": "^6.0.1",
"serve": "^13.0.2",
"ts-jest": "^27.1.3"
}
}

View File

@ -56,7 +56,9 @@ function App() {
<tbody>
<tr>
<td className="bold">Peer id:</td>
<td className="mono">{Fluence.getStatus().peerId!}</td>
<td className="mono">
<span id="peerId">{Fluence.getStatus().peerId!}</span>
</td>
<td>
<button
className="btn-clipboard"
@ -68,7 +70,11 @@ function App() {
</tr>
<tr>
<td className="bold">Relay peer id:</td>
<td className="mono">{Fluence.getStatus().relayPeerId}</td>
<td className="mono">
<span id="relayId">
{Fluence.getStatus().relayPeerId}
</span>
</td>
<td>
<button
className="btn-clipboard"
@ -90,6 +96,7 @@ function App() {
<div className="row">
<label className="label bold">Target peer id</label>
<input
id="targetPeerId"
className="input"
type="text"
onChange={(e) => setPeerIdInput(e.target.value)}
@ -99,6 +106,7 @@ function App() {
<div className="row">
<label className="label bold">Target relay</label>
<input
id="targetRelayId"
className="input"
type="text"
onChange={(e) => setRelayPeerIdInput(e.target.value)}
@ -132,7 +140,7 @@ function App() {
{helloMessage && (
<>
<h2>Message</h2>
<div> {helloMessage} </div>
<div id="message"> {helloMessage} </div>
</>
)}
</div>

View File

@ -0,0 +1,104 @@
import { Page } from 'puppeteer';
import handler from 'serve-handler';
import http from 'http';
import path from 'path';
const port = 3000;
const uri = `http://localhost:${port}/`;
const publicPath = path.join(__dirname, '../../build/');
console.log(publicPath);
const server = http.createServer((request, response) => {
return handler(request, response, {
public: publicPath,
});
});
const startServer = async () => {
return new Promise((resolve: any) => {
server.listen(port, resolve);
});
};
const stopServer = async () => {
return new Promise((resolve: any) => {
server.close(resolve);
});
};
const peerIdLength = '12D3KooWM2CYSHefG6KPKbYFAgsbPh8p6b8HYHc6VNkge2rPtYv5'.length;
const loadApp = async (page: Page) => {
console.log('opening page...');
await page.goto(uri);
console.log('clicking connect button...');
await page.click('.btn');
console.log('waiting for fluence to connect...');
await page.waitForTimeout(1000);
console.log('waiting for "say hello" button to appear...');
await page.waitForSelector('.btn-hello');
console.log('getting self peer id and relay...');
const peerId = await page.$eval('#peerId', (x) => x.textContent);
const relayId = await page.$eval('#relayId', (x) => x.textContent);
expect(peerId?.length).toBe(peerIdLength);
expect(relayId?.length).toBe(peerIdLength);
return {
peerId,
relayId,
};
};
const waitForSelectorAndGetText = async (page: Page, selector: string) => {
const page1Message = await page.waitForSelector('#message');
return await page1Message?.evaluate((x) => x.textContent?.trim().replace('\n', ''));
};
describe('smoke test', () => {
beforeAll(startServer);
afterAll(stopServer);
it('should work', async () => {
const page1 = await browser.newPage();
const page2 = await browser.newPage();
console.log('=== browser 1 ===');
const peerRelay1 = await loadApp(page1);
console.log('=== browser 2 ===');
const peerRelay2 = await loadApp(page2);
console.log('=== browser 1 ===');
console.log('filling form...');
await page1.focus('#targetPeerId');
await page1.keyboard.type(peerRelay2.peerId!);
await page1.focus('#targetRelayId');
await page1.keyboard.type(peerRelay2.relayId!);
console.log('clicking "say hello"...');
await page1.click('.btn-hello');
console.log('waiting for particle to execute...');
await page1.waitForTimeout(1000);
console.log('=== finale ===');
console.log('getting message from page1...');
const page1Message = await waitForSelectorAndGetText(page1, '#message');
console.log('getting message from page2...');
const page2Message = await waitForSelectorAndGetText(page2, '#message');
expect(page1Message).toBe('Hello back to you, ' + peerRelay1.peerId);
expect(page2Message).toBe('Hello from: ' + peerRelay1.peerId);
}, 15000);
});

View File

@ -16,7 +16,7 @@
"module": "esnext",
"moduleResolution": "node",
"resolveJsonModule": true,
"isolatedModules": true,
"isolatedModules": false,
"noEmit": true,
"jsx": "react-jsx"
},

View File

@ -0,0 +1,8 @@
module.exports = {
semi: true,
trailingComma: 'all',
singleQuote: true,
printWidth: 120,
tabWidth: 4,
useTabs: false,
};

View File

@ -0,0 +1,8 @@
module.exports = {
preset: 'jest-puppeteer',
testMatch: ['**/?(*.)+(spec|test).[t]s'],
testPathIgnorePatterns: ['/node_modules/', 'dist'],
transform: {
'^.+\\.ts?$': 'ts-jest',
},
};

File diff suppressed because it is too large Load Diff

View File

@ -1,54 +1,65 @@
{
"name": "getting-started-browser",
"version": "0.1.0",
"private": true,
"dependencies": {
"@fluencelabs/fluence": "^0.19.1",
"@fluencelabs/fluence-network-environment": "^1.0.13",
"@testing-library/jest-dom": "^5.14.1",
"@testing-library/react": "^11.2.7",
"@testing-library/user-event": "^12.8.3",
"@types/jest": "^26.0.24",
"@types/node": "^12.20.16",
"@types/react": "^17.0.14",
"@types/react-dom": "^17.0.9",
"react": "^17.0.2",
"react-dom": "^17.0.2",
"react-scripts": "4.0.3",
"typescript": "^4.3.5",
"web-vitals": "^1.1.2"
},
"scripts": {
"postinstall": "copy-avm-public public",
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject",
"compile-aqua": "aqua -i ./aqua/ -o ./src/_aqua",
"watch-aqua": "chokidar \"**/*.aqua\" -c \"npm run compile-aqua\""
},
"eslintConfig": {
"extends": [
"react-app",
"react-app/jest"
]
},
"browserslist": {
"production": [
">0.2%",
"not dead",
"not op_mini all"
],
"development": [
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version"
]
},
"devDependencies": {
"@fluencelabs/aqua": "^0.6.1-278",
"@fluencelabs/aqua-lib": "^0.4.0",
"chokidar-cli": "^2.1.0",
"node-sass": "^6.0.1"
}
"name": "getting-started-browser",
"version": "0.1.0",
"private": true,
"dependencies": {
"@fluencelabs/fluence": "0.19.2",
"@fluencelabs/fluence-network-environment": "^1.0.13",
"@testing-library/jest-dom": "^5.14.1",
"@testing-library/react": "^11.2.7",
"@testing-library/user-event": "^12.8.3",
"@types/jest": "^27.4.0",
"@types/node": "^12.20.16",
"@types/react": "^17.0.14",
"@types/react-dom": "^17.0.9",
"react": "^17.0.2",
"react-dom": "^17.0.2",
"react-scripts": "^5.0.0",
"typescript": "^4.3.5",
"web-vitals": "^1.1.2"
},
"scripts": {
"postinstall": "copy-avm-public public",
"prestart": "npm run compile-aqua",
"prebuild": "npm run compile-aqua",
"start": "react-scripts start",
"build": "react-scripts build",
"test": "jest --config=jest.config.js",
"_test": "react-scripts test",
"eject": "react-scripts eject",
"compile-aqua": "aqua -i ./aqua/ -o ./src/_aqua",
"watch-aqua": "chokidar \"**/*.aqua\" -c \"npm run compile-aqua\""
},
"eslintConfig": {
"extends": [
"react-app",
"react-app/jest"
]
},
"browserslist": {
"production": [
">0.2%",
"not dead",
"not op_mini all",
"not ie 11",
"not android 4.4.3-4.4.4"
],
"development": [
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version"
]
},
"devDependencies": {
"@fluencelabs/aqua": "^0.6.0-275",
"@fluencelabs/aqua-lib": "^0.4.0",
"@types/jest-environment-puppeteer": "^4.4.1",
"@types/puppeteer": "^5.4.4",
"@types/serve-handler": "^6.1.1",
"chokidar-cli": "^2.1.0",
"jest-puppeteer": "^6.0.2",
"node-sass": "^6.0.1",
"serve": "^13.0.2",
"ts-jest": "^27.1.3"
}
}

View File

@ -56,7 +56,11 @@ function App() {
<tbody>
<tr>
<td className="bold">Peer id:</td>
<td className="mono">{Fluence.getStatus().peerId!}</td>
<td className="mono">
<span id="peerId">
{Fluence.getStatus().peerId!}
</span>
</td>
<td>
<button
className="btn-clipboard"
@ -68,7 +72,11 @@ function App() {
</tr>
<tr>
<td className="bold">Relay peer id:</td>
<td className="mono">{Fluence.getStatus().relayPeerId!}</td>
<td className="mono">
<span id="relayId">
{Fluence.getStatus().relayPeerId!}
</span>
</td>
<td>
<button
className="btn-clipboard"
@ -90,6 +98,7 @@ function App() {
<div className="row">
<label className="label bold">Target peer id</label>
<input
id="targetPeerId"
className="input"
type="text"
onChange={(e) => setPeerIdInput(e.target.value)}
@ -99,6 +108,7 @@ function App() {
<div className="row">
<label className="label bold">Target relay</label>
<input
id="targetRelayId"
className="input"
type="text"
onChange={(e) => setRelayPeerIdInput(e.target.value)}
@ -132,7 +142,7 @@ function App() {
{helloMessage && (
<>
<h2>Message</h2>
<div> {helloMessage} </div>
<div id="message"> {helloMessage} </div>
</>
)}
</div>

View File

@ -0,0 +1,103 @@
import { Page } from 'puppeteer';
import handler from 'serve-handler';
import http from 'http';
import path from 'path';
const port = 3000;
const uri = `http://localhost:${port}/`;
const publicPath = path.join(__dirname, '../../build/');
console.log(publicPath);
const server = http.createServer((request, response) => {
return handler(request, response, {
public: publicPath,
});
});
const startServer = async () => {
return new Promise((resolve: any) => {
server.listen(port, resolve);
});
};
const stopServer = async () => {
return new Promise((resolve: any) => {
server.close(resolve);
});
};
const peerIdLength = '12D3KooWM2CYSHefG6KPKbYFAgsbPh8p6b8HYHc6VNkge2rPtYv5'.length;
const loadApp = async (page: Page) => {
console.log('opening page...');
await page.goto('http://localhost:3000/');
console.log('clicking connect button...');
await page.click('.btn');
console.log('waiting for fluence to connect...');
await page.waitForTimeout(1000);
console.log('waiting for "say hello" button to appear...');
await page.waitForSelector('.btn-hello');
console.log('getting self peer id and relay...');
const peerId = await page.$eval('#peerId', (x) => x.textContent);
const relayId = await page.$eval('#relayId', (x) => x.textContent);
expect(peerId?.length).toBe(peerIdLength);
expect(relayId?.length).toBe(peerIdLength);
return {
peerId,
relayId,
};
};
const waitForSelectorAndGetText = async (page: Page, selector: string) => {
const page1Message = await page.waitForSelector('#message');
return await page1Message?.evaluate((x) => x.textContent?.trim().replace('\n', ''));
};
describe('smoke test', () => {
beforeAll(startServer);
afterAll(stopServer);
it('should work', async () => {
const page1 = await browser.newPage();
const page2 = await browser.newPage();
console.log('=== browser 1 ===');
const peerRelay1 = await loadApp(page1);
console.log('=== browser 2 ===');
const peerRelay2 = await loadApp(page2);
console.log('=== browser 1 ===');
console.log('filling form...');
await page1.focus('#targetPeerId');
await page1.keyboard.type(peerRelay2.peerId!);
await page1.focus('#targetRelayId');
await page1.keyboard.type(peerRelay2.relayId!);
console.log('clicking "say hello"...');
await page1.click('.btn-hello');
console.log('waiting for particle to execute...');
await page1.waitForTimeout(1000);
console.log('=== finale ===');
console.log('getting message from page1...');
const page1Message = await waitForSelectorAndGetText(page1, '#message');
console.log('getting message from page2...');
const page2Message = await waitForSelectorAndGetText(page2, '#message');
expect(page1Message).toBe('Hello back to you, ' + peerRelay1.peerId);
expect(page2Message).toBe('Hello from: ' + peerRelay1.peerId);
}, 15000);
});

View File

@ -16,7 +16,7 @@
"module": "esnext",
"moduleResolution": "node",
"resolveJsonModule": true,
"isolatedModules": true,
"isolatedModules": false,
"noEmit": true,
"jsx": "react-jsx"
},