diff --git a/start/routes.ts b/start/routes.ts
index 20078b7..2a7b6b0 100644
--- a/start/routes.ts
+++ b/start/routes.ts
@@ -8,6 +8,7 @@
*/
const SessionController = () => import('#controllers/session_controller')
+const HealthController = () => import('#controllers/health_controller')
import router from '@adonisjs/core/services/router'
import { middleware } from './kernel.js'
const RegisteredUsersController = () => import('#controllers/registered_users_controller')
@@ -36,6 +37,9 @@ router
// API routes
// router.any('/api/*', [TrpcController, 'handle']).as('api')
+
+router.get('/health', [HealthController, 'index']).prefix('api')
+
router
.group(() => {
router.post('/login', [SessionController, 'store']).as('login')
diff --git a/tests/functional/health.spec.ts b/tests/functional/health.spec.ts
new file mode 100644
index 0000000..f9fd4f7
--- /dev/null
+++ b/tests/functional/health.spec.ts
@@ -0,0 +1,16 @@
+import { test } from '@japa/runner'
+
+test.group('Health check', () => {
+ test('should return server health status', async ({ assert }) => {
+ const response = await fetch('http://localhost:3333/api/health')
+ const body = (await response.json()) as { status: string; timestamp: string }
+
+ assert.equal(response.status, 200)
+ assert.equal(body.status, 'ok')
+ assert.isString(body.timestamp)
+
+ // Verify timestamp is in ISO format
+ const timestamp = new Date(body.timestamp)
+ assert.isFalse(Number.isNaN(timestamp.getTime()))
+ })
+})