Add tests and CI
This commit is contained in:
parent
4bd0bad2af
commit
2e10596783
|
@ -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
|
25
index.js
25
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)
|
||||
}
|
||||
};
|
||||
|
|
|
@ -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",
|
||||
|
|
52
server.js
52
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)
|
||||
});
|
||||
});
|
||||
|
|
|
@ -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();
|
||||
});
|
Loading…
Reference in New Issue