diff options
| author | Li Zhineng <[email protected]> | 2025-07-01 11:33:02 +0800 |
|---|---|---|
| committer | Li Zhineng <[email protected]> | 2025-07-01 11:33:02 +0800 |
| commit | 9ece6a3b2ded2689e8de1719d4f7a4ef39bc6942 (patch) | |
| tree | f7cfdc629339a07fde4f9e441d6a48fc4f680eb5 | |
| parent | 0800e4a15238bb0f09d9befacc3ea01b0ae374f8 (diff) | |
| download | server-9ece6a3b2ded2689e8de1719d4f7a4ef39bc6942.tar.gz server-9ece6a3b2ded2689e8de1719d4f7a4ef39bc6942.zip | |
add tests
| -rw-r--r-- | server.mjs | 20 | ||||
| -rw-r--r-- | server.test.mjs | 87 |
2 files changed, 97 insertions, 10 deletions
@@ -1,18 +1,18 @@ import { createServer } from 'node:http' const server = createServer((req, res) => { - res.writeHead(200, { 'Content-Type': 'text/plain' }) - - if (req.method === 'GET' && req.url === '/gettime') { - res.end(JSON.stringify({ - time: Math.floor(Date.now() / 1000) - })) + if (req.method === 'GET' && req.url === '/') { + res.writeHead(200, { 'Content-Type': 'text/plain' }) + res.end('It works!\n') + } else if (req.method === 'GET' && req.url === '/gettime') { + res.writeHead(200, { 'Content-Type': 'application/json' }) + res.end(JSON.stringify({ time: Math.floor(Date.now() / 1000) })) } else if (req.method === 'GET' && req.url.startsWith('/eagle')) { - res.end(JSON.stringify({ - status: 200, data: { eagleId: 0 } - })) + res.writeHead(200, { 'Content-Type': 'application/json' }) + res.end(JSON.stringify({ status: 200, data: { eagleId: 0 } })) } else { - res.end('It works!\n') + res.writeHead(404) + res.end() } }) diff --git a/server.test.mjs b/server.test.mjs new file mode 100644 index 0000000..db6d33e --- /dev/null +++ b/server.test.mjs @@ -0,0 +1,87 @@ +import * as http from 'node:http' +import assert from 'node:assert' +import test, { after, before } from 'node:test' +import { spawn } from 'node:child_process' + +const hostname = '127.0.0.1' +const port = 8090 +const baseUrl = `http://${hostname}:${port}` +let server = null + +before(() => new Promise((resolve, reject) => { + const nodeBinary = process.argv[0] + server = spawn(nodeBinary, ['server.mjs'], { + env: { + HOSTNAME: hostname, + PORT: port + } + }) + + server.stdout.on('data', (data) => { + console.log(`server stdout: ${data}`) + if (data.toString().includes('Listening on')) { + resolve() + } + }) + + server.stderr.on('data', (data) => { + console.log(`server stderr: ${data}`) + }) + + server.on('error', (err) => { + reject(new Error(`Server failed to start: ${err}`)) + }) +})) + +after(() => { + if (server) { + server.kill() + server = null + } +}) + +test('current time endpoint', (t, done) => { + http.get(`${baseUrl}/gettime`, (res) => { + assert.strictEqual(res.statusCode, 200) + assert.strictEqual(res.headers['content-type'], 'application/json') + + let data = '' + + res.on('data', (chunk) => { + data += chunk + }) + + res.on('end', () => { + const decoded = JSON.parse(data) + const current = Math.floor(Date.now() / 1000) + assert.ok('time' in decoded) + assert.ok(typeof decoded.time === 'number') + assert.ok(current - decoded.time < 3) + done() + }) + }).on('error', (err) => { + assert.fail(`HTTP request failed: ${err.message}`) + }) +}) + +test('device registration endpoint', (t, done) => { + http.get(`${baseUrl}/eagle`, (res) => { + assert.strictEqual(res.statusCode, 200) + assert.strictEqual(res.headers['content-type'], 'application/json') + + let data = '' + + res.on('data', (chunk) => { + data += chunk + }) + + res.on('end', () => { + const decoded = JSON.parse(data) + assert.strictEqual(decoded.status, 200) + assert.ok(typeof decoded.data?.eagleId === 'number') + done() + }) + }).on('error', (err) => { + assert.fail(`HTTP request failed: ${err.message}`) + }) +}) |
