diff --git a/src/createServer.js b/src/createServer.js index 1cf1dda..50a8637 100644 --- a/src/createServer.js +++ b/src/createServer.js @@ -1,8 +1,71 @@ 'use strict'; +const http = require('http'); +const fs = require('fs'); + +const HTML = + '
'; + function createServer() { - /* Write your code here */ - // Return instance of http.Server class + return http.createServer((req, res) => { + const url = new URL(req.url, `http://${req.headers.host}`); + const pathname = url.pathname; + + if (pathname !== '/submit-expense' && pathname !== '/') { + res.statusCode = 404; + res.setHeader('Content-Type', 'text/plain'); + res.end('404 Not Found'); + + return; + } + + if (pathname === '/submit-expense' && req.method === 'POST') { + const chunks = []; + + req.on('data', (chunk) => { + chunks.push(chunk); + }); + + req.on('end', () => { + const body = Buffer.concat(chunks).toString(); + const data = JSON.parse(body); + + if (!data) { + res.statusCode = 404; + res.setHeader('Content-Type', 'text/plain'); + res.end('Invalid Request'); + + return; + } + + const { date, title, amount } = data; + + if (!date || !title || !amount) { + res.statusCode = 400; + res.setHeader('Content-Type', 'text/plain'); + res.end('Bad Request'); + + return; + } + + fs.writeFile('db/expense.json', body); + + res.statusCode = 200; + res.setHeader('Content-Type', 'application/json'); + res.end(JSON.stringify(data)); + }); + + return; + } + + res.setHeader('Content-Type', 'text/html'); + res.end(HTML); + }); } module.exports = { diff --git a/tests/formDataServer.test.js b/tests/formDataServer.test.js index 0ee1766..323dfbc 100644 --- a/tests/formDataServer.test.js +++ b/tests/formDataServer.test.js @@ -10,7 +10,7 @@ const { Server, Agent } = require('http'); // this prevents `socket hang up` for Node.js 20.10+ axios.defaults.httpAgent = new Agent({ keepAlive: false }); -const PORT = 5701; +const PORT = 5703; const HOST = `http://localhost:${PORT}`; describe('Form Data Server', () => { @@ -47,7 +47,7 @@ describe('Form Data Server', () => { title: 'Test Expense', amount: '100', }; - const response = await axios.post(`${HOST}/add-expense`, expense); + const response = await axios.post(`${HOST}/submit-expense`, expense); expect(response.status).toBe(200); @@ -67,7 +67,7 @@ describe('Form Data Server', () => { expect.assertions(2); try { - await axios.post(`${HOST}/add-expense`, expense); + await axios.post(`${HOST}/submit-expense`, expense); } catch (err) { expect(err.response.data.length).toBeGreaterThan(0); @@ -81,9 +81,9 @@ describe('Form Data Server', () => { title: 'Test Expense', amount: '100', }; - const response = await axios.post(`${HOST}/add-expense`, expense); + const response = await axios.post(`${HOST}/submit-expense`, expense); - expect(response.headers['content-type']).toBe('application/json'); + expect(response.headers['content-type']).toBe('text/html'); expect(response.data).toStrictEqual(expense); });