mirror of
https://github.com/UNITRONIX/BetterDesk.git
synced 2026-09-11 13:49:03 +00:00
d39110b2ae
Add unit tests and test helpers (5 suites, 41 tests) and test npm scripts; introduce deviceStatusPush service and WS real-time device status push integration. Fix chatRelay to acknowledge connections (send `welcome`), and apply multiple web remote/rdclient fixes (video ack/timing, keyframe refresh, SourceBuffer trimming, input focus handling) to improve FPS and control. Add new server route file (system.routes.js), new device-status service, update server.js and package.json, and modify various frontend CSS/JS/views. Update English and Polish locale files with many new widget/i18n keys and remove the Russian locale file (ru.json). Also include assorted UI/desktop-widget dashboard tweaks and documentation status updates in .github/copilot-instructions.md.
145 lines
4.7 KiB
JavaScript
145 lines
4.7 KiB
JavaScript
/**
|
|
* BetterDesk Console - Auth Middleware Tests
|
|
*/
|
|
|
|
const request = require('supertest');
|
|
const { createTestApp } = require('./helpers');
|
|
|
|
const { requireAuth, requireRole, guestOnly } = require('../middleware/auth');
|
|
|
|
describe('Auth Middleware', () => {
|
|
describe('requireAuth', () => {
|
|
it('should return 401 for unauthenticated API requests', async () => {
|
|
const app = createTestApp();
|
|
app.get('/api/test', requireAuth, (_req, res) => {
|
|
res.json({ success: true });
|
|
});
|
|
|
|
const res = await request(app).get('/api/test');
|
|
|
|
expect(res.status).toBe(401);
|
|
expect(res.body.success).toBe(false);
|
|
});
|
|
|
|
it('should redirect to login for unauthenticated HTML requests', async () => {
|
|
const app = createTestApp();
|
|
app.get('/dashboard', requireAuth, (_req, res) => {
|
|
res.send('OK');
|
|
});
|
|
|
|
const res = await request(app).get('/dashboard');
|
|
|
|
expect(res.status).toBe(302);
|
|
expect(res.headers.location).toBe('/login');
|
|
});
|
|
|
|
it('should pass through for authenticated requests', async () => {
|
|
const app = createTestApp();
|
|
app.use((req, _res, next) => {
|
|
req.session.userId = 1;
|
|
req.session.user = { id: 1, username: 'admin', role: 'admin' };
|
|
next();
|
|
});
|
|
app.get('/api/test', requireAuth, (_req, res) => {
|
|
res.json({ success: true });
|
|
});
|
|
|
|
const res = await request(app).get('/api/test');
|
|
|
|
expect(res.status).toBe(200);
|
|
expect(res.body.success).toBe(true);
|
|
});
|
|
});
|
|
|
|
describe('requireRole', () => {
|
|
it('should allow admin access to admin-only routes', async () => {
|
|
const app = createTestApp();
|
|
app.use((req, _res, next) => {
|
|
req.session.userId = 1;
|
|
req.session.user = { id: 1, username: 'admin', role: 'admin' };
|
|
next();
|
|
});
|
|
app.get('/api/admin', requireRole('admin'), (_req, res) => {
|
|
res.json({ success: true });
|
|
});
|
|
|
|
const res = await request(app).get('/api/admin');
|
|
|
|
expect(res.status).toBe(200);
|
|
});
|
|
|
|
it('should deny operator access to admin-only routes', async () => {
|
|
const app = createTestApp();
|
|
app.use((req, _res, next) => {
|
|
req.session.userId = 2;
|
|
req.session.user = { id: 2, username: 'operator1', role: 'operator' };
|
|
next();
|
|
});
|
|
app.get('/api/admin', requireRole('admin'), (_req, res) => {
|
|
res.json({ success: true });
|
|
});
|
|
|
|
const res = await request(app).get('/api/admin');
|
|
|
|
expect(res.status).toBe(403);
|
|
});
|
|
|
|
it('should allow admin to access operator routes', async () => {
|
|
const app = createTestApp();
|
|
app.use((req, _res, next) => {
|
|
req.session.userId = 1;
|
|
req.session.user = { id: 1, username: 'admin', role: 'admin' };
|
|
next();
|
|
});
|
|
app.get('/api/op', requireRole('operator'), (_req, res) => {
|
|
res.json({ success: true });
|
|
});
|
|
|
|
const res = await request(app).get('/api/op');
|
|
|
|
expect(res.status).toBe(200);
|
|
});
|
|
|
|
it('should return 401 for unauthenticated API requests', async () => {
|
|
const app = createTestApp();
|
|
app.get('/api/admin', requireRole('admin'), (_req, res) => {
|
|
res.json({ success: true });
|
|
});
|
|
|
|
const res = await request(app).get('/api/admin');
|
|
|
|
expect(res.status).toBe(401);
|
|
});
|
|
});
|
|
|
|
describe('guestOnly', () => {
|
|
it('should allow unauthenticated users', async () => {
|
|
const app = createTestApp();
|
|
app.get('/login', guestOnly, (_req, res) => {
|
|
res.send('login page');
|
|
});
|
|
|
|
const res = await request(app).get('/login');
|
|
|
|
expect(res.status).toBe(200);
|
|
});
|
|
|
|
it('should redirect authenticated users to dashboard', async () => {
|
|
const app = createTestApp();
|
|
app.use((req, _res, next) => {
|
|
req.session.userId = 1;
|
|
req.session.user = { id: 1, username: 'admin', role: 'admin' };
|
|
next();
|
|
});
|
|
app.get('/login', guestOnly, (_req, res) => {
|
|
res.send('login page');
|
|
});
|
|
|
|
const res = await request(app).get('/login');
|
|
|
|
expect(res.status).toBe(302);
|
|
expect(res.headers.location).toBe('/');
|
|
});
|
|
});
|
|
});
|