From 42ee86ca5e75b1d8093ead7c76d58cdfae4b0852 Mon Sep 17 00:00:00 2001
From: Roland Bernard <rolbernard@unibz.it>
Date: Tue, 25 May 2021 23:12:52 +0200
Subject: [PATCH] Added tests for the task endpoint

---
 server/src/v1/task.test.ts | 519 +++++++++++++++++++++++++++++++++++++
 1 file changed, 519 insertions(+)
 create mode 100644 server/src/v1/task.test.ts

diff --git a/server/src/v1/task.test.ts b/server/src/v1/task.test.ts
new file mode 100644
index 0000000..7561db6
--- /dev/null
+++ b/server/src/v1/task.test.ts
@@ -0,0 +1,519 @@
+
+import supertest from 'supertest';
+
+import { api } from '../api';
+import { generateAuthToken } from './auth';
+
+const request = supertest(api);
+
+describe('GET /task', () => {
+    test('returns all tasks the user can see', async () => {
+        const resp = await request
+            .get('/v1/task')
+            .set('Authorization', `Bearer ${await generateAuthToken('00000000-0000-4000-8000-000000000000')}`);
+        expect(resp.status).toEqual(200);
+        expect(resp.body.status).toEqual('success');
+        expect(resp.body.tasks.length).toEqual(6);
+    });
+
+    test('includes tasks of project 0', async () => {
+        const resp = await request
+            .get('/v1/task')
+            .set('Authorization', `Bearer ${await generateAuthToken('00000000-0000-4000-8000-000000000000')}`);
+        expect(resp.status).toEqual(200);
+        expect(resp.body.status).toEqual('success');
+        expect(resp.body.tasks).toContainEqual({
+            id: '00000000-0000-4000-8000-000000000000',
+            project: '00000000-0000-4000-8000-000000000000',
+            name: 'Task0',
+            text: 'Task0 Text',
+            icon: '0',
+            status: 'open',
+            priority: 'medium',
+            created: Date.parse('2020-10-05'),
+            edited: Date.parse('2020-10-10'),
+            assigned: [ ],
+            dependencies: [ ],
+            requirements: [
+                { role: '00000000-0000-4000-8000-000000000000', time: 30 },
+            ],
+        });
+    });
+
+    test('includes tasks of project 1', async () => {
+        const resp = await request
+            .get('/v1/task')
+            .set('Authorization', `Bearer ${await generateAuthToken('00000000-0000-4000-8000-000000000000')}`);
+        expect(resp.status).toEqual(200);
+        expect(resp.body.status).toEqual('success');
+        expect(resp.body.tasks).toContainEqual({
+            id: '00000000-0000-4000-8000-000000000001',
+            project: '00000000-0000-4000-8000-000000000001',
+            name: 'Task1',
+            text: 'Task1 Text',
+            icon: '1',
+            status: 'closed',
+            priority: 'high',
+            created: Date.parse('2020-10-10'),
+            edited: Date.parse('2020-10-15'),
+            assigned: [ ],
+            dependencies: [ ],
+            requirements: [
+                { role: '00000000-0000-4000-8000-000000000001', time: 30 },
+            ],
+        });
+    });
+
+    test('includes tasks of project 2', async () => {
+        const resp = await request
+            .get('/v1/task')
+            .set('Authorization', `Bearer ${await generateAuthToken('00000000-0000-4000-8000-000000000000')}`);
+        expect(resp.status).toEqual(200);
+        expect(resp.body.status).toEqual('success');
+        expect(resp.body.tasks).toContainEqual({
+            id: '00000000-0000-4000-8000-000000000002',
+            project: '00000000-0000-4000-8000-000000000002',
+            name: 'Task2',
+            text: 'Task2 Text',
+            icon: '2',
+            status: 'open',
+            priority: 'low',
+            created: Date.parse('2020-10-15'),
+            edited: Date.parse('2020-10-20'),
+            assigned: [],
+            dependencies: [ '00000000-0000-4000-8000-000000000005' ],
+            requirements: [],
+        });
+        expect(resp.body.tasks).toContainEqual({
+            id: '00000000-0000-4000-8000-000000000005',
+            project: '00000000-0000-4000-8000-000000000002',
+            name: 'Task5',
+            text: 'Task5 Text',
+            icon: '5',
+            status: 'open',
+            priority: 'urgent',
+            created: Date.parse('2020-10-15'),
+            edited: Date.parse('2020-11-20'),
+            assigned: [ { user: '00000000-0000-4000-8000-000000000000', time: 120, finished: false } ],
+            dependencies: [ ],
+            requirements: [
+                { role: '00000000-0000-4000-8000-000000000000', time: 60 },
+                { role: '00000000-0000-4000-8000-000000000001', time: 30 },
+            ],
+        });
+        expect(resp.body.tasks).toContainEqual({
+            id: '00000000-0000-4000-8000-000000000003',
+            project: '00000000-0000-4000-8000-000000000002',
+            name: 'Task3',
+            text: 'Task3 Text',
+            icon: '3',
+            status: 'closed',
+            priority: 'urgent',
+            created: Date.parse('2020-10-15'),
+            edited: Date.parse('2020-10-20'),
+            assigned: [ ],
+            dependencies: [ ],
+            requirements: [ ],
+        });
+        expect(resp.body.tasks).toContainEqual({
+            id: '00000000-0000-4000-8000-000000000004',
+            project: '00000000-0000-4000-8000-000000000002',
+            name: 'Task4',
+            text: 'Task4 Text',
+            icon: '4',
+            status: 'suspended',
+            priority: 'urgent',
+            created: Date.parse('2020-10-15'),
+            edited: Date.parse('2020-10-20'),
+            assigned: [ ],
+            dependencies: [ ],
+            requirements: [ ],
+        });
+    });
+});
+
+describe('GET /task/open', () => {
+    test('returns all open tasks the user can see', async () => {
+        const resp = await request
+            .get('/v1/task/open')
+            .set('Authorization', `Bearer ${await generateAuthToken('00000000-0000-4000-8000-000000000000')}`);
+        expect(resp.status).toEqual(200);
+        expect(resp.body.status).toEqual('success');
+        expect(resp.body.tasks.length).toEqual(3);
+    });
+
+    test('includes tasks of project 0', async () => {
+        const resp = await request
+            .get('/v1/task/open')
+            .set('Authorization', `Bearer ${await generateAuthToken('00000000-0000-4000-8000-000000000000')}`);
+        expect(resp.status).toEqual(200);
+        expect(resp.body.status).toEqual('success');
+        expect(resp.body.tasks).toContainEqual({
+            id: '00000000-0000-4000-8000-000000000000',
+            project: '00000000-0000-4000-8000-000000000000',
+            name: 'Task0',
+            text: 'Task0 Text',
+            icon: '0',
+            status: 'open',
+            priority: 'medium',
+            created: Date.parse('2020-10-05'),
+            edited: Date.parse('2020-10-10'),
+            assigned: [ ],
+            dependencies: [ ],
+            requirements: [
+                { role: '00000000-0000-4000-8000-000000000000', time: 30 },
+            ],
+        });
+    });
+
+    test('includes tasks of project 2', async () => {
+        const resp = await request
+            .get('/v1/task/open')
+            .set('Authorization', `Bearer ${await generateAuthToken('00000000-0000-4000-8000-000000000000')}`);
+        expect(resp.status).toEqual(200);
+        expect(resp.body.status).toEqual('success');
+        expect(resp.body.tasks).toContainEqual({
+            id: '00000000-0000-4000-8000-000000000002',
+            project: '00000000-0000-4000-8000-000000000002',
+            name: 'Task2',
+            text: 'Task2 Text',
+            icon: '2',
+            status: 'open',
+            priority: 'low',
+            created: Date.parse('2020-10-15'),
+            edited: Date.parse('2020-10-20'),
+            assigned: [],
+            dependencies: [ '00000000-0000-4000-8000-000000000005' ],
+            requirements: [],
+        });
+        expect(resp.body.tasks).toContainEqual({
+            id: '00000000-0000-4000-8000-000000000005',
+            project: '00000000-0000-4000-8000-000000000002',
+            name: 'Task5',
+            text: 'Task5 Text',
+            icon: '5',
+            status: 'open',
+            priority: 'urgent',
+            created: Date.parse('2020-10-15'),
+            edited: Date.parse('2020-11-20'),
+            assigned: [ { user: '00000000-0000-4000-8000-000000000000', time: 120, finished: false } ],
+            dependencies: [ ],
+            requirements: [
+                { role: '00000000-0000-4000-8000-000000000000', time: 60 },
+                { role: '00000000-0000-4000-8000-000000000001', time: 30 },
+            ],
+        });
+    });
+});
+
+describe('GET /task/closed', () => {
+    test('returns all closed tasks the user can see', async () => {
+        const resp = await request
+            .get('/v1/task/closed')
+            .set('Authorization', `Bearer ${await generateAuthToken('00000000-0000-4000-8000-000000000000')}`);
+        expect(resp.status).toEqual(200);
+        expect(resp.body.status).toEqual('success');
+        expect(resp.body.tasks.length).toEqual(2);
+    });
+
+    test('includes tasks of project 1', async () => {
+        const resp = await request
+            .get('/v1/task/closed')
+            .set('Authorization', `Bearer ${await generateAuthToken('00000000-0000-4000-8000-000000000000')}`);
+        expect(resp.status).toEqual(200);
+        expect(resp.body.status).toEqual('success');
+        expect(resp.body.tasks).toContainEqual({
+            id: '00000000-0000-4000-8000-000000000001',
+            project: '00000000-0000-4000-8000-000000000001',
+            name: 'Task1',
+            text: 'Task1 Text',
+            icon: '1',
+            status: 'closed',
+            priority: 'high',
+            created: Date.parse('2020-10-10'),
+            edited: Date.parse('2020-10-15'),
+            assigned: [ ],
+            dependencies: [ ],
+            requirements: [
+                { role: '00000000-0000-4000-8000-000000000001', time: 30 },
+            ],
+        });
+    });
+
+    test('includes tasks of project 2', async () => {
+        const resp = await request
+            .get('/v1/task/closed')
+            .set('Authorization', `Bearer ${await generateAuthToken('00000000-0000-4000-8000-000000000000')}`);
+        expect(resp.status).toEqual(200);
+        expect(resp.body.status).toEqual('success');
+        expect(resp.body.tasks).toContainEqual({
+            id: '00000000-0000-4000-8000-000000000003',
+            project: '00000000-0000-4000-8000-000000000002',
+            name: 'Task3',
+            text: 'Task3 Text',
+            icon: '3',
+            status: 'closed',
+            priority: 'urgent',
+            created: Date.parse('2020-10-15'),
+            edited: Date.parse('2020-10-20'),
+            assigned: [ ],
+            dependencies: [ ],
+            requirements: [ ],
+        });
+    });
+});
+
+describe('GET /task/suspended', () => {
+    test('returns all suspended tasks the user can see', async () => {
+        const resp = await request
+            .get('/v1/task/suspended')
+            .set('Authorization', `Bearer ${await generateAuthToken('00000000-0000-4000-8000-000000000000')}`);
+        expect(resp.status).toEqual(200);
+        expect(resp.body.status).toEqual('success');
+        expect(resp.body.tasks.length).toEqual(1);
+    });
+
+    test('includes tasks of project 2', async () => {
+        const resp = await request
+            .get('/v1/task/suspended')
+            .set('Authorization', `Bearer ${await generateAuthToken('00000000-0000-4000-8000-000000000000')}`);
+        expect(resp.status).toEqual(200);
+        expect(resp.body.status).toEqual('success');
+        expect(resp.body.tasks).toContainEqual({
+            id: '00000000-0000-4000-8000-000000000004',
+            project: '00000000-0000-4000-8000-000000000002',
+            name: 'Task4',
+            text: 'Task4 Text',
+            icon: '4',
+            status: 'suspended',
+            priority: 'urgent',
+            created: Date.parse('2020-10-15'),
+            edited: Date.parse('2020-10-20'),
+            assigned: [ ],
+            dependencies: [ ],
+            requirements: [ ],
+        });
+    });
+});
+
+describe('GET /task/possible', () => {
+    test('returns all open tasks without dependencies the user can see', async () => {
+        const resp = await request
+            .get('/v1/task/possible')
+            .set('Authorization', `Bearer ${await generateAuthToken('00000000-0000-4000-8000-000000000000')}`);
+        expect(resp.status).toEqual(200);
+        expect(resp.body.status).toEqual('success');
+        expect(resp.body.tasks.length).toEqual(2);
+    });
+
+    test('includes tasks of project 0', async () => {
+        const resp = await request
+            .get('/v1/task/possible')
+            .set('Authorization', `Bearer ${await generateAuthToken('00000000-0000-4000-8000-000000000000')}`);
+        expect(resp.status).toEqual(200);
+        expect(resp.body.status).toEqual('success');
+        expect(resp.body.tasks).toContainEqual({
+            id: '00000000-0000-4000-8000-000000000000',
+            project: '00000000-0000-4000-8000-000000000000',
+            name: 'Task0',
+            text: 'Task0 Text',
+            icon: '0',
+            status: 'open',
+            priority: 'medium',
+            created: Date.parse('2020-10-05'),
+            edited: Date.parse('2020-10-10'),
+            assigned: [ ],
+            dependencies: [ ],
+            requirements: [
+                { role: '00000000-0000-4000-8000-000000000000', time: 30 },
+            ],
+        });
+    });
+
+    test('includes tasks of project 2', async () => {
+        const resp = await request
+            .get('/v1/task/possible')
+            .set('Authorization', `Bearer ${await generateAuthToken('00000000-0000-4000-8000-000000000000')}`);
+        expect(resp.status).toEqual(200);
+        expect(resp.body.status).toEqual('success');
+        expect(resp.body.tasks).toContainEqual({
+            id: '00000000-0000-4000-8000-000000000005',
+            project: '00000000-0000-4000-8000-000000000002',
+            name: 'Task5',
+            text: 'Task5 Text',
+            icon: '5',
+            status: 'open',
+            priority: 'urgent',
+            created: Date.parse('2020-10-15'),
+            edited: Date.parse('2020-11-20'),
+            assigned: [ { user: '00000000-0000-4000-8000-000000000000', time: 120, finished: false } ],
+            dependencies: [ ],
+            requirements: [
+                { role: '00000000-0000-4000-8000-000000000000', time: 60 },
+                { role: '00000000-0000-4000-8000-000000000001', time: 30 },
+            ],
+        });
+    });
+});
+
+describe('GET /task/:uuid', () => {
+    test('returns the information for a task', async () => {
+        const resp = await request
+            .get('/v1/task/00000000-0000-4000-8000-000000000000')
+            .set('Authorization', `Bearer ${await generateAuthToken('00000000-0000-4000-8000-000000000000')}`);
+        expect(resp.status).toEqual(200);
+        expect(resp.body.status).toEqual('success');
+        expect(resp.body.task).toEqual({
+            id: '00000000-0000-4000-8000-000000000000',
+            project: '00000000-0000-4000-8000-000000000000',
+            name: 'Task0',
+            text: 'Task0 Text',
+            icon: '0',
+            status: 'open',
+            priority: 'medium',
+            created: Date.parse('2020-10-05'),
+            edited: Date.parse('2020-10-10'),
+            assigned: [ ],
+            dependencies: [ ],
+            requirements: [
+                { role: '00000000-0000-4000-8000-000000000000', time: 30 },
+            ],
+        });
+    });
+});
+
+describe('GET /task/:uuid/comments', () => {
+    test('returns all the comments for a task', async () => {
+        const resp = await request
+            .get('/v1/task/00000000-0000-4000-8000-000000000005/comments')
+            .set('Authorization', `Bearer ${await generateAuthToken('00000000-0000-4000-8000-000000000000')}`);
+        expect(resp.status).toEqual(200);
+        expect(resp.body.status).toEqual('success');
+        expect(resp.body.comments.length).toEqual(3);
+    });
+
+    test('contains the information for the comments', async () => {
+        const resp = await request
+            .get('/v1/task/00000000-0000-4000-8000-000000000005/comments')
+            .set('Authorization', `Bearer ${await generateAuthToken('00000000-0000-4000-8000-000000000000')}`);
+        expect(resp.status).toEqual(200);
+        expect(resp.body.status).toEqual('success');
+        expect(resp.body.comments).toContainEqual({
+            id: '00000000-0000-4000-8000-000000000000',
+            task: '00000000-0000-4000-8000-000000000005',
+            user: '00000000-0000-4000-8000-000000000000',
+            text: 'Comment0',
+            created: Date.parse('2020-10-10T00:00:00'),
+            edited: Date.parse('2020-10-10T01:00:00'),
+        });
+        expect(resp.body.comments).toContainEqual({
+            id: '00000000-0000-4000-8000-000000000001',
+            task: '00000000-0000-4000-8000-000000000005',
+            user: '00000000-0000-4000-8000-000000000001',
+            text: 'Comment1',
+            created: Date.parse('2020-10-10T03:00:00'),
+            edited: Date.parse('2020-10-10T04:00:00'),
+        });
+        expect(resp.body.comments).toContainEqual({
+            id: '00000000-0000-4000-8000-000000000002',
+            task: '00000000-0000-4000-8000-000000000005',
+            user: '00000000-0000-4000-8000-000000000001',
+            text: 'Comment2',
+            created: Date.parse('2020-10-10T05:00:00'),
+            edited: Date.parse('2020-10-10T05:00:00'),
+        });
+    });
+});
+
+describe('GET /task/:uuid/work', () => {
+    test('returns all the work items done for the tasks', async () => {
+        const resp = await request
+            .get('/v1/task/00000000-0000-4000-8000-000000000005/work')
+            .set('Authorization', `Bearer ${await generateAuthToken('00000000-0000-4000-8000-000000000000')}`);
+        expect(resp.status).toEqual(200);
+        expect(resp.body.status).toEqual('success');
+        expect(resp.body.work.length).toEqual(3);
+    });
+
+    test('containt all finished work information', async () => {
+        const resp = await request
+            .get('/v1/task/00000000-0000-4000-8000-000000000005/work')
+            .set('Authorization', `Bearer ${await generateAuthToken('00000000-0000-4000-8000-000000000000')}`);
+        expect(resp.status).toEqual(200);
+        expect(resp.body.status).toEqual('success');
+        expect(resp.body.work).toContainEqual({
+            id: '00000000-0000-4000-8000-000000000000',
+            task: '00000000-0000-4000-8000-000000000005',
+            user: '00000000-0000-4000-8000-000000000000',
+            started: Date.parse('2020-10-10T12:00:00'),
+            finished: Date.parse('2020-10-10T13:00:00'),
+        });
+        expect(resp.body.work).toContainEqual({
+            id: '00000000-0000-4000-8000-000000000001',
+            task: '00000000-0000-4000-8000-000000000005',
+            user: '00000000-0000-4000-8000-000000000000',
+            started: Date.parse('2020-10-10T13:00:00'),
+            finished: Date.parse('2020-10-10T14:00:00'),
+        });
+    });
+
+    test('containt all unfinished work information', async () => {
+        const resp = await request
+            .get('/v1/task/00000000-0000-4000-8000-000000000005/work')
+            .set('Authorization', `Bearer ${await generateAuthToken('00000000-0000-4000-8000-000000000000')}`);
+        expect(resp.status).toEqual(200);
+        expect(resp.body.status).toEqual('success');
+        expect(resp.body.work).toContainEqual({
+            id: '00000000-0000-4000-8000-000000000002',
+            task: '00000000-0000-4000-8000-000000000005',
+            user: '00000000-0000-4000-8000-000000000000',
+            started: Date.parse('2020-10-11T12:00:00'),
+            finished: null,
+        });
+    });
+
+    test('can be limited in time with from date', async () => {
+        const resp = await request
+            .get(`/v1/task/00000000-0000-4000-8000-000000000005/work?since=${Date.parse('2020-10-10T20:00:00')}`)
+            .set('Authorization', `Bearer ${await generateAuthToken('00000000-0000-4000-8000-000000000000')}`);
+        expect(resp.status).toEqual(200);
+        expect(resp.body.status).toEqual('success');
+        expect(resp.body.work.length).toEqual(1);
+    });
+
+    test('can be limited in time with to date', async () => {
+        const resp = await request
+            .get(`/v1/task/00000000-0000-4000-8000-000000000005/work?to=${Date.parse('2020-10-10T20:00:00')}`)
+            .set('Authorization', `Bearer ${await generateAuthToken('00000000-0000-4000-8000-000000000000')}`);
+        expect(resp.status).toEqual(200);
+        expect(resp.body.status).toEqual('success');
+        expect(resp.body.work.length).toEqual(2);
+    });
+});
+
+describe('GET /task/:uuid/assigned', () => {
+    test('returns all users that are assigned to the tasks', async () => {
+        const resp = await request
+            .get('/v1/task/00000000-0000-4000-8000-000000000005/assigned')
+            .set('Authorization', `Bearer ${await generateAuthToken('00000000-0000-4000-8000-000000000000')}`);
+        expect(resp.status).toEqual(200);
+        expect(resp.body.status).toEqual('success');
+        expect(resp.body.assigned.length).toEqual(1);
+    });
+
+    test('contains the user information', async () => {
+        const resp = await request
+            .get('/v1/task/00000000-0000-4000-8000-000000000005/assigned')
+            .set('Authorization', `Bearer ${await generateAuthToken('00000000-0000-4000-8000-000000000000')}`);
+        expect(resp.status).toEqual(200);
+        expect(resp.body.status).toEqual('success');
+        expect(resp.body.assigned).toContainEqual({
+            id: '00000000-0000-4000-8000-000000000000',
+            username: 'user0',
+            email: 'test0@example.com',
+            realname: 'Testing Tester',
+            time: 120,
+        });
+    });
+});
+
-- 
GitLab