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 {
|
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);
|
await page.click(MY_PACKAGE_SELECTOR_ID);
|
||||||
// Wait for the page to switch
|
// Wait for the page to switch
|
||||||
await page.waitForFunction(
|
await page.waitForFunction(()=>{
|
||||||
'document.querySelector(".dtl-header-text").innerText === "My Package"'
|
return document.querySelector(".dtl-header-text").innerText === "My Package" &&
|
||||||
);
|
document.getElementById('_ACTMyAccount_WAR_ACTMyAccountportlet_:processingPanel').style.display === 'none'
|
||||||
|
});
|
||||||
|
|
||||||
dataUsage = await page.evaluate(sel => {
|
dataUsage = await page.evaluate(sel => {
|
||||||
let elements = document.getElementsByClassName(sel);
|
let elements = document.getElementsByClassName(sel);
|
||||||
|
@ -71,6 +74,7 @@ async function getUsage() {
|
||||||
metrics = dataUsage;
|
metrics = dataUsage;
|
||||||
return metrics
|
return metrics
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
console.log(e)
|
||||||
throw new Error("Failed scraping data from ACT");
|
throw new Error("Failed scraping data from ACT");
|
||||||
} finally {
|
} finally {
|
||||||
page.close();
|
page.close();
|
||||||
|
@ -106,12 +110,11 @@ function chromeLaunchConfig() {
|
||||||
return options;
|
return options;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Async IIFE FTW
|
|
||||||
(async () => {
|
|
||||||
browser = await puppeteer.launch(chromeLaunchConfig());
|
|
||||||
console.log("Browser Initialized");
|
|
||||||
})();
|
|
||||||
|
|
||||||
module.exports = {
|
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",
|
"description": "Exports ACT Fibernet data usage as prometheus metrics",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "echo \"Error: no test specified\" && exit 1"
|
"test": "node test.js"
|
||||||
},
|
},
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"actcorp",
|
"actcorp",
|
||||||
|
|
52
server.js
52
server.js
|
@ -6,29 +6,12 @@ const promFormatter = require("./prom");
|
||||||
CACHE = {};
|
CACHE = {};
|
||||||
|
|
||||||
const requestHandler = async (req, res) => {
|
const requestHandler = async (req, res) => {
|
||||||
let date = new Date(Date.now()).toLocaleString();
|
|
||||||
console.log(`${date}: ${req.url}`);
|
|
||||||
switch (req.url) {
|
switch (req.url) {
|
||||||
case "/metrics":
|
case "/metrics":
|
||||||
res.setHeader("Content-Type", promFormatter.contentType);
|
res.setHeader("Content-Type", promFormatter.contentType);
|
||||||
metrics.getUsage().then(
|
promFormatter.format(CACHE).then((data) => {
|
||||||
(data) => {
|
res.end(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);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
);
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
res.writeHead(302, {
|
res.writeHead(302, {
|
||||||
|
@ -41,10 +24,29 @@ const requestHandler = async (req, res) => {
|
||||||
|
|
||||||
const server = http.createServer(requestHandler);
|
const server = http.createServer(requestHandler);
|
||||||
|
|
||||||
server.listen(port, (err) => {
|
metrics.onReady((browser) => {
|
||||||
if (err) {
|
let t;
|
||||||
return console.log("could not initialize web server", err);
|
(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