1
0
mirror of https://github.com/laurent22/joplin.git synced 2025-01-26 18:58:21 +02:00

Server: Moved session tests to route

This commit is contained in:
Laurent Cozic 2021-01-13 22:06:47 +00:00
parent fc58db5d1a
commit 247bd9bfd9
6 changed files with 58 additions and 72 deletions

View File

@ -1,38 +0,0 @@
import { createUser, checkThrowAsync, beforeAllDb, afterAllTests, beforeEachDb, controllers } from '../../utils/testing/testUtils';
import { ErrorForbidden } from '../../utils/errors';
describe('SessionController', function() {
beforeAll(async () => {
await beforeAllDb('SessionController');
});
afterAll(async () => {
await afterAllTests();
});
beforeEach(async () => {
await beforeEachDb();
});
it('should authenticate a user and give back a session', async function() {
const user = await createUser(1);
const controller = controllers().apiSession();
const session = await controller.authenticate(user.email, '123456');
expect(!!session).toBe(true);
expect(!!session.id).toBe(true);
expect(!!session.user_id).toBe(true);
});
it('should not give a session for invalid login', async function() {
const user = await createUser(1);
const controller = controllers().apiSession();
let error = await checkThrowAsync(async () => controller.authenticate(user.email, 'wrong'));
expect(error instanceof ErrorForbidden).toBe(true);
error = await checkThrowAsync(async () => controller.authenticate('wrong@wrong.com', '123456'));
expect(error instanceof ErrorForbidden).toBe(true);
});
});

View File

@ -17,7 +17,7 @@ describe('notificationHandler', function() {
}); });
test('should check admin password', async function() { test('should check admin password', async function() {
const { user } = await createUserAndSession(1, true); const { user, session } = await createUserAndSession(1, true);
const admin = await models().user({ userId: user.id }).save({ const admin = await models().user({ userId: user.id }).save({
email: defaultAdminEmail, email: defaultAdminEmail,
@ -26,7 +26,7 @@ describe('notificationHandler', function() {
}); });
{ {
const context = await koaAppContext({ owner: user }); const context = await koaAppContext({ sessionId: session.id });
await notificationHandler(context, koaNext); await notificationHandler(context, koaNext);
const notifications: Notification[] = await models().notification().all(); const notifications: Notification[] = await models().notification().all();
@ -43,7 +43,7 @@ describe('notificationHandler', function() {
password: 'changed!', password: 'changed!',
}); });
const context = await koaAppContext({ owner: user }); const context = await koaAppContext({ sessionId: session.id });
await notificationHandler(context, koaNext); await notificationHandler(context, koaNext);
const notifications: Notification[] = await models().notification().all(); const notifications: Notification[] = await models().notification().all();

View File

@ -22,7 +22,7 @@ describe('ownerHandler', function() {
sessionId: session.id, sessionId: session.id,
}); });
expect(!!context.owner).toBe(false); context.owner = null;
await ownerHandler(context, koaNext); await ownerHandler(context, koaNext);
@ -37,7 +37,7 @@ describe('ownerHandler', function() {
sessionId: 'ihack', sessionId: 'ihack',
}); });
expect(!!context.owner).toBe(false); context.owner = null;
await ownerHandler(context, koaNext); await ownerHandler(context, koaNext);

View File

@ -1,5 +1,6 @@
import BaseModel from './BaseModel'; import BaseModel from './BaseModel';
import { User, Session } from '../db'; import { User, Session } from '../db';
import uuidgen from '../utils/uuidgen';
export default class SessionModel extends BaseModel { export default class SessionModel extends BaseModel {
@ -14,4 +15,11 @@ export default class SessionModel extends BaseModel {
return userModel.load(session.user_id); return userModel.load(session.user_id);
} }
public async createUserSession(userId: string): Promise<Session> {
return this.save({
id: uuidgen(),
user_id: userId,
}, { isNew: true });
}
} }

View File

@ -1,6 +1,24 @@
import { Session } from '../../db'; import { Session } from '../../db';
import routeHandler from '../../middleware/routeHandler'; import routeHandler from '../../middleware/routeHandler';
import { beforeAllDb, afterAllTests, beforeEachDb, koaAppContext, createUserAndSession, models } from '../../utils/testing/testUtils'; import { beforeAllDb, afterAllTests, beforeEachDb, koaAppContext, createUserAndSession, models } from '../../utils/testing/testUtils';
import { AppContext } from '../../utils/types';
async function postSession(email: string, password: string): Promise<AppContext> {
const context = await koaAppContext({
request: {
method: 'POST',
url: '/api/sessions',
body: {
email: email,
password: password,
},
},
});
await routeHandler(context);
return context;
}
describe('api_sessions', function() { describe('api_sessions', function() {
@ -19,19 +37,7 @@ describe('api_sessions', function() {
test('should login user', async function() { test('should login user', async function() {
const { user } = await createUserAndSession(1, false); const { user } = await createUserAndSession(1, false);
const context = await koaAppContext({ const context = await postSession(user.email, '123456');
request: {
method: 'POST',
url: '/api/sessions',
body: {
email: user.email,
password: '123456',
},
},
});
await routeHandler(context);
expect(context.response.status).toBe(200); expect(context.response.status).toBe(200);
expect(!!context.response.body.id).toBe(true); expect(!!context.response.body.id).toBe(true);
@ -42,20 +48,20 @@ describe('api_sessions', function() {
test('should not login user with wrong password', async function() { test('should not login user with wrong password', async function() {
const { user } = await createUserAndSession(1, false); const { user } = await createUserAndSession(1, false);
const context = await koaAppContext({ {
request: { const context = await postSession(user.email, 'wrong');
method: 'POST',
url: '/api/sessions',
body: {
email: user.email,
password: 'wrong',
},
},
});
await routeHandler(context);
expect(context.response.status).toBe(403); expect(context.response.status).toBe(403);
}
{
const context = await postSession('wrong@wrong.com', '123456');
expect(context.response.status).toBe(403);
}
{
const context = await postSession('', '');
expect(context.response.status).toBe(403);
}
}); });
}); });

View File

@ -1,18 +1,28 @@
import { SubPath, Route } from '../../utils/routeUtils'; import { SubPath, Route } from '../../utils/routeUtils';
import { ErrorNotFound } from '../../utils/errors'; import { ErrorForbidden, ErrorMethodNotAllowed, ErrorNotFound } from '../../utils/errors';
import { AppContext } from '../../utils/types'; import { AppContext } from '../../utils/types';
import { bodyFields } from '../../utils/requestUtils'; import { bodyFields } from '../../utils/requestUtils';
import { User } from '../../db';
const route: Route = { const route: Route = {
exec: async function(path: SubPath, ctx: AppContext) { exec: async function(path: SubPath, ctx: AppContext) {
// -------------------------------------------
// ROUTE api/sessions
// -------------------------------------------
if (!path.link) { if (!path.link) {
if (ctx.method === 'POST') { if (ctx.method === 'POST') {
const user = await bodyFields(ctx.req); const fields: User = await bodyFields(ctx.req);
const sessionController = ctx.controllers.apiSession(); const user = await ctx.models.user().login(fields.email, fields.password);
const session = await sessionController.authenticate(user.email, user.password); if (!user) throw new ErrorForbidden('Invalid username or password');
const session = await ctx.models.session().createUserSession(user.id);
return { id: session.id }; return { id: session.id };
} }
throw new ErrorMethodNotAllowed();
} }
throw new ErrorNotFound(`Invalid link: ${path.link}`); throw new ErrorNotFound(`Invalid link: ${path.link}`);