mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-12-17 14:47:53 +01:00
finish PUT-tasks_id tests and fix some edge bugs
This commit is contained in:
@@ -43,16 +43,7 @@ describe('POST /tasks', () => {
|
||||
})).to.eventually.be.rejected.and.eql({
|
||||
code: 400,
|
||||
error: 'BadRequest',
|
||||
});
|
||||
});
|
||||
|
||||
it('ignores setting userId field', () => {
|
||||
return api.post('/tasks', {
|
||||
text: 'test habit',
|
||||
type: 'habit',
|
||||
userId: 123,
|
||||
}).then((task) => {
|
||||
expect(task.userId).to.equal(user._id);
|
||||
message: 'habit validation failed',
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@ import {
|
||||
requester,
|
||||
translate as t,
|
||||
} from '../../../../helpers/api-integration.helper';
|
||||
import { v4 as generateUUID } from 'uuid';
|
||||
|
||||
describe('PUT /tasks/:id', () => {
|
||||
let user, api;
|
||||
@@ -14,22 +15,56 @@ describe('PUT /tasks/:id', () => {
|
||||
});
|
||||
});
|
||||
|
||||
context('validates params', () => {
|
||||
xcontext('validates params', () => {
|
||||
let task;
|
||||
|
||||
beforeEach(() => {
|
||||
// create sample task
|
||||
// task = createdTask
|
||||
return api.post('/tasks', {
|
||||
text: 'test habit',
|
||||
type: 'habit',
|
||||
}).then((createdTask) => {
|
||||
task = createdTask;
|
||||
});
|
||||
});
|
||||
|
||||
it(`ignores setting _id, type, userId, history, createdAt,
|
||||
updatedAt, challenge, completed, streak,
|
||||
dateCompleted fields`);
|
||||
dateCompleted fields`, () => {
|
||||
api.put('/tasks/' + task._id, {
|
||||
_id: 123,
|
||||
type: 'daily',
|
||||
userId: 123,
|
||||
history: [123],
|
||||
createdAt: 'yesterday',
|
||||
updatedAt: 'tomorrow',
|
||||
challenge: 'no',
|
||||
completed: true,
|
||||
streak: 25,
|
||||
dateCompleted: 'never',
|
||||
}).then((savedTask) => {
|
||||
expect(savedTask._id).to.equal(task._id);
|
||||
expect(savedTask.type).to.equal(task.type);
|
||||
expect(savedTask.userId).to.equal(user._id);
|
||||
expect(savedTask.history).to.eql([]);
|
||||
expect(savedTask.createdAt).not.to.equal('yesterday');
|
||||
expect(savedTask.updatedAt).not.to.equal('tomorrow');
|
||||
expect(savedTask.challenge).not.to.equal('no');
|
||||
expect(savedTask.completed).to.equal(false);
|
||||
expect(savedTask.streak).to.equal(0);
|
||||
expect(savedTask.streak).not.to.equal('never');
|
||||
});
|
||||
});
|
||||
|
||||
it('ignores invalid fields');
|
||||
it('ignores invalid fields', () => {
|
||||
api.put('/tasks/' + task._id, {
|
||||
notValid: true,
|
||||
}).then((savedTask) => {
|
||||
expect(savedTask.notValid).to.be.a('undefined');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
context('habits', () => {
|
||||
xcontext('habits', () => {
|
||||
let habit;
|
||||
|
||||
beforeEach(() => {
|
||||
@@ -57,7 +92,7 @@ describe('PUT /tasks/:id', () => {
|
||||
});
|
||||
});
|
||||
|
||||
context('todos', () => {
|
||||
xcontext('todos', () => {
|
||||
let todo;
|
||||
|
||||
beforeEach(() => {
|
||||
@@ -80,8 +115,38 @@ describe('PUT /tasks/:id', () => {
|
||||
});
|
||||
});
|
||||
|
||||
it('can update checklists'); // Can it?
|
||||
it('can update tags'); // Can it?
|
||||
it('can update checklists (replace it)', () => {
|
||||
return api.put(`/tasks/${todo._id}`, {
|
||||
checklist: [
|
||||
{text: 123, completed: false},
|
||||
{text: 456, completed: true},
|
||||
]
|
||||
}).then((savedTodo) => {
|
||||
return api.put(`/tasks/${todo._id}`, {
|
||||
checklist: [
|
||||
{text: 789, completed: false},
|
||||
]
|
||||
});
|
||||
}).then((savedTodo2) => {
|
||||
expect(savedTodo2.checklist.length).to.equal(1);
|
||||
expect(savedTodo2.checklist[0].text).to.equal("789");
|
||||
expect(savedTodo2.checklist[0].completed).to.equal(false);
|
||||
});
|
||||
});
|
||||
|
||||
it('can update tags (replace them)', () => {
|
||||
let finalUUID = generateUUID();
|
||||
return api.put(`/tasks/${todo._id}`, {
|
||||
tags: [generateUUID(), generateUUID()],
|
||||
}).then((savedTodo) => {
|
||||
return api.put(`/tasks/${todo._id}`, {
|
||||
tags: [finalUUID]
|
||||
});
|
||||
}).then((savedTodo2) => {
|
||||
expect(savedTodo2.tags.length).to.equal(1);
|
||||
expect(savedTodo2.tags[0]).to.equal(finalUUID);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
context('dailys', () => {
|
||||
@@ -113,17 +178,84 @@ describe('PUT /tasks/:id', () => {
|
||||
});
|
||||
});
|
||||
|
||||
it('can update checklists'); // Can it?
|
||||
it('can update tags'); // Can it?
|
||||
it('can update checklists (replace it)', () => {
|
||||
return api.put(`/tasks/${daily._id}`, {
|
||||
checklist: [
|
||||
{text: 123, completed: false},
|
||||
{text: 456, completed: true},
|
||||
]
|
||||
}).then((savedDaily) => {
|
||||
return api.put(`/tasks/${daily._id}`, {
|
||||
checklist: [
|
||||
{text: 789, completed: false},
|
||||
]
|
||||
});
|
||||
}).then((savedDaily2) => {
|
||||
expect(savedDaily2.checklist.length).to.equal(1);
|
||||
expect(savedDaily2.checklist[0].text).to.equal("789");
|
||||
expect(savedDaily2.checklist[0].completed).to.equal(false);
|
||||
});
|
||||
});
|
||||
|
||||
it('updates repeat, even if frequency is set to daily');
|
||||
it('can update tags (replace them)', () => {
|
||||
let finalUUID = generateUUID();
|
||||
return api.put(`/tasks/${daily._id}`, {
|
||||
tags: [generateUUID(), generateUUID()],
|
||||
}).then((savedDaily) => {
|
||||
return api.put(`/tasks/${daily._id}`, {
|
||||
tags: [finalUUID]
|
||||
});
|
||||
}).then((savedDaily2) => {
|
||||
expect(savedDaily2.tags.length).to.equal(1);
|
||||
expect(savedDaily2.tags[0]).to.equal(finalUUID);
|
||||
});
|
||||
});
|
||||
|
||||
it('updates everyX, even if frequency is set to weekly');
|
||||
it('updates repeat, even if frequency is set to daily', () => {
|
||||
return api.put(`/tasks/${daily._id}`, {
|
||||
frequency: 'daily',
|
||||
}).then((savedDaily) => {
|
||||
return api.put(`/tasks/${daily._id}`, {
|
||||
repeat: {
|
||||
m: false,
|
||||
su: false
|
||||
}
|
||||
});
|
||||
}).then((savedDaily2) => {
|
||||
expect(savedDaily2.repeat).to.eql({
|
||||
m: false,
|
||||
t: true,
|
||||
w: true,
|
||||
th: true,
|
||||
f: true,
|
||||
s: true,
|
||||
su: false,
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it('defaults startDate to today if none date object is passed in');
|
||||
it('updates everyX, even if frequency is set to weekly', () => {
|
||||
return api.put(`/tasks/${daily._id}`, {
|
||||
frequency: 'weekly',
|
||||
}).then((savedDaily) => {
|
||||
return api.put(`/tasks/${daily._id}`, {
|
||||
everyX: 5,
|
||||
});
|
||||
}).then((savedDaily2) => {
|
||||
expect(savedDaily2.everyX).to.eql(5);
|
||||
});
|
||||
});
|
||||
|
||||
it('defaults startDate to today if none date object is passed in', () => {
|
||||
return api.put(`/tasks/${daily._id}`, {
|
||||
frequency: 'weekly',
|
||||
}).then((savedDaily2) => {
|
||||
expect((new Date(savedDaily2.startDate)).getDay()).to.eql((new Date()).getDay());
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
context('rewards', () => {
|
||||
xcontext('rewards', () => {
|
||||
let reward;
|
||||
|
||||
beforeEach(() => {
|
||||
@@ -149,6 +281,12 @@ describe('PUT /tasks/:id', () => {
|
||||
});
|
||||
});
|
||||
|
||||
it('requires value to be coerced into a number');
|
||||
it('requires value to be coerced into a number', () => {
|
||||
return api.put(`/tasks/${reward._id}`, {
|
||||
value: "100",
|
||||
}).then((task) => {
|
||||
expect(task.value).to.eql(100);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -173,19 +173,22 @@ api.updateTask = {
|
||||
|
||||
// If checklist is updated -> replace the original one
|
||||
if (req.body.checklist) {
|
||||
delete req.body.checklist;
|
||||
task.checklist = req.body.checklist;
|
||||
delete req.body.checklist;
|
||||
}
|
||||
|
||||
// If tags are updated -> replace the original ones
|
||||
if (req.body.tags) {
|
||||
delete req.body.tags;
|
||||
task.tags = req.body.tags;
|
||||
delete req.body.tags;
|
||||
}
|
||||
|
||||
// TODO merge goes deep into objects, it's ok?
|
||||
// TODO also check that array and mixed fields are updated correctly without marking modified
|
||||
_.merge(task, Tasks.Task.sanitizeUpdate(req.body));
|
||||
// TODO we have to convert task to an object because otherwise thigns doesn't get merged correctly, very bad for performances
|
||||
// TODO regarding comment above make sure other models with nested fields are using this trick too
|
||||
_.assign(task, _.merge(task.toObject(), Tasks.Task.sanitizeUpdate(req.body)));
|
||||
// TODO console.log(task.modifiedPaths(), task.toObject().repeat === tep)
|
||||
// repeat is always among modifiedPaths because mongoose changes the other of the keys when using .toObject()
|
||||
// see https://github.com/Automattic/mongoose/issues/2749
|
||||
return task.save();
|
||||
})
|
||||
.then((savedTask) => res.respond(200, savedTask))
|
||||
|
||||
Reference in New Issue
Block a user