summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--server.mjs20
-rw-r--r--server.test.mjs87
2 files changed, 97 insertions, 10 deletions
diff --git a/server.mjs b/server.mjs
index e9300d7..6baa679 100644
--- a/server.mjs
+++ b/server.mjs
@@ -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}`)
+ })
+})