-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
111 lines (105 loc) · 4.04 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
const {readFileSync} = require('fs');
const superagent = require('superagent');
const configSchema = require('./schema/config.schema');
const fetchResource = async (resource) => {
const p = new Promise((resolve, reject) => {
const handleResponse = (err, res) => {
const rawRes= err ? err.response : res;
if (rawRes) {
if (resource.expect) {
if (resource.expect.status && rawRes.statusCode !== resource.expect.status) {
reject(`Status code does not match for ${resource.url}, expected ${resource.expect.status} but got ${rawRes.statusCode}`);
} else if (resource.expect.headers) {
const headers = resource.expect.headers;
const headerNames = Object.keys(resource.expect.headers);
for (let i = 0; i < headerNames.length; i++) {
const headerName = headerNames[i];
const checkHeaderName = headerName.toLowerCase();
const expectedValue = headers[headerName];
if (rawRes.header[checkHeaderName] !== expectedValue) {
const actualHeader = rawRes.header[checkHeaderName];
reject(`Header "${headerName}" does not match for ${resource.url}, expected ${expectedValue} but got ${actualHeader}`);
}
}
resolve(`Fetched ${resource.url} with status code ${rawRes.statusCode}`);
} else if (resource.expect.body && rawRes.text !== resource.expect.body) {
reject(`Body does not match for ${resource.url}, expected ${resource.expect.body} but got ${rawRes.text}`);
} else {
resolve(`Fetched ${resource.url} with status code ${rawRes.statusCode}`);
}
} else {
resolve(`Fetched ${resource.url} with status code ${rawRes.statusCode}`);
}
} else {
reject(`Failed to fetch ${resource.url}`);
}
};
if (resource.method === 'POST' || resource.method === 'PUT' || resource.method === 'PATCH' || resource.method === 'DELETE') {
const method = resource.method.toLowerCase();
superagent[method](resource.url)
.send(resource.body)
.redirects(resource.redirects || 0)
.end(handleResponse);
} else if (resource.method === 'GET') {
superagent
.get(resource.url)
.redirects(resource.redirects || 0)
.end(handleResponse);
}
});
return p;
};
const args = process.argv.slice(2);
const agruments = {};
for (let i = 0; i < args.length; i++) {
if (args[i].startsWith('--config')) {
const config = args[i].split('=')[1];
agruments.config = config;
}
}
if (!agruments.config) {
throw new Error('Config file is required');
}
const configContents = readFileSync(agruments.config, 'utf8');
(async () => {
try {
const config = JSON.parse(configContents);
try {
await configSchema.validate(config, {strict: true});
const resources = config.resources;
let message = '';
for (let i = 0; i < resources.length; i++) {
const resource = resources[i];
try {
const r = await fetchResource(resource);
message += r + ' \u2705' + '\n';
} catch (e) {
message += e + ' \u2717' + '\n';
}
};
console.log(message);
if (config.telegramKey && config.chatId && message) {
try {
const telegramKey = config.telegramKey;
const chatId = config.chatId;
const formattedMessage = message.replace(/\u2705/g, '✅').replace(/\u2717/g, '❌');
const url = `https://api.telegram.org/bot${telegramKey}/sendMessage?chat_id=${chatId}`;
superagent
.post(url)
.send({text: formattedMessage})
.end((err) => {
if (err) {
console.error('Failed to send message to telegram');
}
});
} catch (e) {
console.error('Failed to send message to telegram');
}
}
} catch (e) {
console.error(e.message);
}
} catch (e) {
throw new Error('Config file is invalid');
}
})();