const assert = require('node:assert'); const { spawn } = require('node:child_process'); const fs = require('node:fs'); const { Browser, Builder, By } = require('selenium-webdriver'); const firefox = require('selenium-webdriver/firefox'); async function test() { const generate_env_var = process.env.OSM_MAP_GENERATE_DATA || 'false'; const generete_data = generate_env_var === '1' || generate_env_var.toLowerCase() === 'true'; const server = spawn('node', ['scripts/server.js'], {stdio: [null, null, 'inherit']}); // show stderr (stdout is read) console.log('Creating selenium driver'); const options = new firefox.Options(); options.addArguments('--headless'); const driver = await new Builder().forBrowser(Browser.FIREFOX).setFirefoxOptions(options).build(); try { const max_try = 5; let read_try = 0; for(; read_try < max_try; read_try +=1) { const server_out = server.stdout.read(); if(server_out != null) { assert.equal('Server is listening on port 8080\n', server_out.toString(), 'Server not starting properly'); break; } await driver.sleep(50); } assert.notEqual(read_try, max_try, 'Timeout waiting for server starting'); const test_name = 'test'; console.log('Fetching test html'); await driver.get('http://localhost:8080/build/packages/osm-map-nano/dist/test.html'); assert.equal(`OSM Map Test : ${test_name}`, await driver.getTitle(), 'Wrong HTML title'); let canvas = await driver.findElement(By.id('canvas-test')); const image_url_prefix = 'data:image/png;base64,'; const image_data = Buffer.from( (await driver.executeScript('return arguments[0].toDataURL()', canvas)).substring(image_url_prefix.length), 'base64'); const expected_data = fs.readFileSync('data/test.png'); if(generete_data) { if(!expected_data.equals(image_data)) { console.log(`Generating image for test ${test_name}`); fs.writeFileSync('data/test.png', image_data); } } else assert.ok(expected_data.equals(image_data)); } catch (error) { console.error('TEST FAILED'); console.error(error); } finally { console.log('Exiting selenium driver'); await driver.quit(); server.kill('SIGINT'); } } test();