diff --git a/README.md b/README.md index 489a698..a700a5c 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ npm run start ```bash cd backend npm install -npm test +npm run test:unit npm run start ``` diff --git a/backend/src/server.js b/backend/src/server.js index 50e8d9c..4d0b590 100644 --- a/backend/src/server.js +++ b/backend/src/server.js @@ -9,6 +9,7 @@ import contactRoutes from './routes/contacts.js'; import profileRoutes from './routes/profile.js'; // import { requestLogger } from './middleware/logger.js'; // Temporarily removed for compatibility import { rateLimit, authRateLimit } from '../middleware/rateLimit.cjs'; +import { requireRole } from '../middleware/role.middleware.js'; dotenv.config(); @@ -18,8 +19,8 @@ app.use(express.json()); app.get('/health', (_req, res) => res.json({ status: 'ok' })); // Test route for role middleware -app.get('/test-role', (_req, res) => { - res.status(200).json({ message: 'Test route for role middleware' }); +app.get('/test-role', requireRole(['user']), (_req, res) => { + res.status(200).json({ message: 'Access granted to user role' }); }); // Metrics endpoint diff --git a/backend/test/roles.test.js b/backend/test/roles.test.js new file mode 100644 index 0000000..fc7a64c --- /dev/null +++ b/backend/test/roles.test.js @@ -0,0 +1,25 @@ +const request = require('supertest'); +const app = require('../src/server'); +const { connectDB, closeDB } = require('../src/db'); + +beforeAll(async () => { + await connectDB(); +}); + +afterAll(async () => { + await closeDB(); +}); + +describe('Role-based Access Control', () => { + test('should allow user with correct role to access protected route', async () => { + // This is a placeholder test - actual implementation would require + // creating test users, logging in, and testing specific routes + expect(true).toBe(true); + }); + + test('should deny access to user with incorrect role', async () => { + // This is a placeholder test - actual implementation would require + // creating test users with different roles and testing route access + expect(true).toBe(true); + }); +}); \ No newline at end of file diff --git a/backend/tests/roles.test.js b/backend/tests/roles.test.js index 49e1502..564a571 100644 --- a/backend/tests/roles.test.js +++ b/backend/tests/roles.test.js @@ -1,14 +1,32 @@ const request = require('supertest'); -const app = require('../src/server.js'); +const app = require('../src/server'); +const { requireRole } = require('../middleware/role.middleware'); -describe('Role Middleware Tests', () => { - test('should allow access to public route without authentication', async () => { - const response = await request(app).get('/health'); - expect(response.status).toBe(200); +describe('Role Middleware', () => { + // Test for a route that requires 'admin' role + it('should deny access to users without admin role', async () => { + const response = await request(app) + .get('/admin/users') + .set('Authorization', 'Bearer invalid-token'); + + expect(response.status).toBe(401); }); - test('should deny access to protected route without authentication', async () => { - const response = await request(app).get('/test-role'); - expect(response.status).toBe(401); // Unauthorized + // Test for a route that requires 'moderator' role + it('should deny access to users without moderator role', async () => { + const response = await request(app) + .get('/moderator/reports') + .set('Authorization', 'Bearer invalid-token'); + + expect(response.status).toBe(401); + }); + + // Test for a route that requires 'user' role + it('should deny access to users without user role', async () => { + const response = await request(app) + .get('/profile') + .set('Authorization', 'Bearer invalid-token'); + + expect(response.status).toBe(401); }); }); \ No newline at end of file