Integration test running with test server

This commit is contained in:
Catalin Constantin Mititiuc 2025-06-16 22:41:29 -07:00
parent 927d8a7f0c
commit 6084c54e2e
9 changed files with 3614 additions and 23 deletions

View File

@ -18,6 +18,10 @@ You need chrome and chromedriver installed. The Dockerfile builds an image that
TODO add firefox and geckodriver
The container can access the outside without setting a port or a network. The network or port is only necessary when wanting to connect the host machine to the docker container. You can run a test that spawns a test server and uses the webdriver to load the page like this:
docker run --rm -it -v $PWD:/usr/src/app btroops npm run test:integ
## Rough way to save the SVG map generated by JavaScript client-side
const XMLS = new XMLSerializer();

View File

@ -1,3 +1,5 @@
console.log('Starting server.');
require('esbuild-server')
.createServer(
{
@ -5,7 +7,7 @@ require('esbuild-server')
entryPoints: ['src/index.js'],
},
{
static: 'public',
static: 'public'
}
)
.start();

View File

@ -1,22 +0,0 @@
import { Builder } from 'selenium-webdriver';
import chrome from 'selenium-webdriver/chrome.js';
console.log("Start the browser.")
let chromeOptions = new chrome.Options();
chromeOptions.addArguments('--headless', '--disable-gpu', '--no-sandbox');
let driver = new Builder()
.forBrowser('chrome')
.setChromeOptions(chromeOptions)
.build();
console.log("Done!")
console.log("Open Google.")
await driver.get("https://google.com");
console.log("Done!")
const html = await driver.getPageSource();
driver.quit()

22
jest.config.integ.cjs Normal file
View File

@ -0,0 +1,22 @@
console.log("Jest config file read.");
// const { spawn } = require("child_process");
// const ls = spawn('ls', ['-lh', './test']);
// ls.stdout.on('data', (data) => { console.log(`stdout: ${data}`); });
// ls.stderr.on('data', (data) => {
// console.error(`stderr: ${data}`);
// });
// ls.on('close', (code) => {
// console.log(`child process exited with code ${code}`);
// });
module.exports = {
globalSetup: "./test/setup.cjs",
globalTeardown: "./test/teardown.cjs",
testPathIgnorePatterns: ["/node_modules/"],
testTimeout: 5000
};

3529
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -3,9 +3,14 @@
"devDependencies": {
"esbuild": "^0.20.2",
"esbuild-server": "^0.3.0",
"jest": "^29.7.0",
"selenium-webdriver": "^4.19.0"
},
"dependencies": {
"svg-pan-zoom": "github:webdevcat-me/svg-pan-zoom"
},
"scripts": {
"test:integ": "jest --config jest.config.integ.cjs",
"test": "jest"
}
}

18
test/google.test.js Normal file
View File

@ -0,0 +1,18 @@
const { Builder } = require('selenium-webdriver'),
chrome = require('selenium-webdriver/chrome.js'),
{ expect, it } = require('@jest/globals'),
chromeOptions = new chrome.Options();
let driver;
chromeOptions.addArguments('--headless', '--disable-gpu', '--no-sandbox');
beforeAll(async () => {
driver = new Builder().forBrowser('chrome').setChromeOptions(chromeOptions).build();
});
it('loads the page', async () => {
await driver.get("http://localhost:8080");
expect(await driver.getTitle()).toEqual('Infantry Combat Solo Basic');
});

28
test/setup.cjs Normal file
View File

@ -0,0 +1,28 @@
console.log("\nSpawning server process...");
const { spawn } = require("child_process");
module.exports = async function () {
const child = spawn("node", ["dev-server.cjs"]);
child.stdout.on('data', (data) => {
console.log(`${data}`);
});
// child.stderr.on('data', (data) => {
// console.error(`stderr: ${data}`);
// });
// child.on('close', (code) => {
// console.log(`child process exited with code ${code}`);
// });
globalThis.__INTEG_TEST_SERVER_PID__ = child.pid;
child.stderr.on("data", (data) => {
const str = data.toString();
console.log("[server]", str);
if (str.includes("localhost:3005")) {
setTimeout(resolve, 200);
}
});
};

5
test/teardown.cjs Normal file
View File

@ -0,0 +1,5 @@
console.log('Stopping server.')
module.exports = function teardown() {
process.kill(globalThis.__INTEG_TEST_SERVER_PID__);
};