From 2e105967834e98ce020890260edcd8398219c83a Mon Sep 17 00:00:00 2001 From: Nemo Date: Fri, 24 Jun 2022 11:44:02 +0530 Subject: [PATCH] Add tests and CI --- .github/workflows/tests.yml | 18 +++++++++++++ index.js | 25 ++++++++++-------- package.json | 2 +- server.js | 52 +++++++++++++++++++------------------ test.js | 12 +++++++++ 5 files changed, 72 insertions(+), 37 deletions(-) create mode 100644 .github/workflows/tests.yml create mode 100644 test.js diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 0000000..a811abc --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,18 @@ +on: push +name: Tests +jobs: + tests: + runs-on: [self-hosted] + strategy: + matrix: + node: ['16'] + name: Node Tests + steps: + - uses: actions/checkout@v1 + - uses: actions/setup-node@v2 + with: + node-version: ${{matrix.node}} + - run: npm install + - run: npm test + env: + CHROME_BIN: /usr/bin/chromium diff --git a/index.js b/index.js index 7179675..0e9be64 100644 --- a/index.js +++ b/index.js @@ -28,12 +28,15 @@ async function getUsage() { }; try { - await page.goto(MY_ACCOUNT_URL, {timeout: 5000}); + await page.goto(MY_ACCOUNT_URL, {timeout: 10000}); + await page.waitForTimeout(5000); + await page.waitForSelector(MY_PACKAGE_SELECTOR_ID) await page.click(MY_PACKAGE_SELECTOR_ID); // Wait for the page to switch - await page.waitForFunction( - 'document.querySelector(".dtl-header-text").innerText === "My Package"' - ); + await page.waitForFunction(()=>{ + return document.querySelector(".dtl-header-text").innerText === "My Package" && + document.getElementById('_ACTMyAccount_WAR_ACTMyAccountportlet_:processingPanel').style.display === 'none' + }); dataUsage = await page.evaluate(sel => { let elements = document.getElementsByClassName(sel); @@ -71,6 +74,7 @@ async function getUsage() { metrics = dataUsage; return metrics } catch (e) { + console.log(e) throw new Error("Failed scraping data from ACT"); } finally { page.close(); @@ -106,12 +110,11 @@ function chromeLaunchConfig() { return options; } -// Async IIFE FTW -(async () => { - browser = await puppeteer.launch(chromeLaunchConfig()); - console.log("Browser Initialized"); -})(); - module.exports = { - getUsage: getUsage + getUsage: getUsage, + onReady: async (cb)=>{ + browser = await puppeteer.launch(chromeLaunchConfig()); + console.log("Browser Initialized"); + cb(browser) + } }; diff --git a/package.json b/package.json index f40a642..224ca44 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "Exports ACT Fibernet data usage as prometheus metrics", "main": "index.js", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "test": "node test.js" }, "keywords": [ "actcorp", diff --git a/server.js b/server.js index bee0381..39e8535 100644 --- a/server.js +++ b/server.js @@ -6,29 +6,12 @@ const promFormatter = require("./prom"); CACHE = {}; const requestHandler = async (req, res) => { - let date = new Date(Date.now()).toLocaleString(); - console.log(`${date}: ${req.url}`); switch (req.url) { case "/metrics": res.setHeader("Content-Type", promFormatter.contentType); - metrics.getUsage().then( - (data) => { - console.log(data); - console.log("Setting cache"); - CACHE = data; - promFormatter.format(data).then((data) => { - res.end(data); - }); - }, - (err) => { - console.log(err); - console.log("Got error, using cache"); - console.log(CACHE); - promFormatter.format(CACHE).then((data) => { - res.end(data); - }); - } - ); + promFormatter.format(CACHE).then((data) => { + res.end(data); + }); break; default: res.writeHead(302, { @@ -41,10 +24,29 @@ const requestHandler = async (req, res) => { const server = http.createServer(requestHandler); -server.listen(port, (err) => { - if (err) { - return console.log("could not initialize web server", err); - } +metrics.onReady((browser) => { + let t; + (function refreshCache() { + metrics.getUsage().then((data) => { + let date = new Date(Date.now()).toLocaleString(); + console.log(`${date}: Updated Cache`); + // Start server now if this is the first run + if (!CACHE) { + server.listen(port, (err) => { + if (err) { + return console.log("could not initialize web server", err); + } + console.log(`server is listening on ${port}`); + }); + } + CACHE = data; + }).finally(()=>{ + t = setTimeout(refreshCache, 15 * 60 * 1000); + }); + })(); - console.log(`server is listening on ${port}`); + process.on("exit", function () { + browser.close(); + clearTimeout(t) + }); }); diff --git a/test.js b/test.js new file mode 100644 index 0000000..01e7920 --- /dev/null +++ b/test.js @@ -0,0 +1,12 @@ +const act = require("./index"); +const assert = require('assert') +act.onReady(async (browser)=>{ + metrics = await act.getUsage(); + console.log(metrics); + for (i of ['live', 'aggregate', 'flexibytes']) { + console.log(i) + assert.ok(typeof metrics[i]['usedBytes'] === 'number') + assert.ok(typeof metrics[i]['totalBytes'] === 'number') + } + browser.close(); +});