Add tests and CI

This commit is contained in:
Nemo 2022-06-24 11:44:02 +05:30
parent 4bd0bad2af
commit 2e10596783
5 changed files with 72 additions and 37 deletions

18
.github/workflows/tests.yml vendored Normal file
View File

@ -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

View File

@ -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)
}
};

View File

@ -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",

View File

@ -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)
});
});

12
test.js Normal file
View File

@ -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();
});