From 2ed2fb5d06910617d49e4c381177b9b461e11a99 Mon Sep 17 00:00:00 2001 From: Matteo Pagliazzi Date: Sat, 20 Feb 2016 10:46:11 +0100 Subject: [PATCH] tests for user data export --- package.json | 3 +- .../dataexport/GET-export_history.csv.test.js | 2 +- .../GET-export_userdata.json.test.js | 29 +++++++++++++- .../GET-export_userdata.xml.test.js | 40 ++++++++++++++++++- 4 files changed, 70 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index dc268a8f77..1768b04c4c 100644 --- a/package.json +++ b/package.json @@ -151,7 +151,8 @@ "superagent-defaults": "^0.1.13", "uuid": "^2.0.1", "vinyl-source-stream": "^1.0.0", - "vinyl-transform": "^1.0.0" + "vinyl-transform": "^1.0.0", + "xml2js": "^0.4.16" }, "apidoc": { "name": "habitica", diff --git a/test/api/v3/integration/dataexport/GET-export_history.csv.test.js b/test/api/v3/integration/dataexport/GET-export_history.csv.test.js index 03b0a06832..f11762332b 100644 --- a/test/api/v3/integration/dataexport/GET-export_history.csv.test.js +++ b/test/api/v3/integration/dataexport/GET-export_history.csv.test.js @@ -7,7 +7,7 @@ import { } from '../../../../helpers/mongo'; import moment from 'moment'; -describe.only('GET /export/history.csv', () => { +describe('GET /export/history.csv', () => { it('should return a valid CSV file with tasks history data', async () => { let user = await generateUser(); let tasks = await user.post('/tasks/user', [ diff --git a/test/api/v3/integration/dataexport/GET-export_userdata.json.test.js b/test/api/v3/integration/dataexport/GET-export_userdata.json.test.js index 8eb6466916..dac3a6fac0 100644 --- a/test/api/v3/integration/dataexport/GET-export_userdata.json.test.js +++ b/test/api/v3/integration/dataexport/GET-export_userdata.json.test.js @@ -1,3 +1,30 @@ // TODO how to test this route since it uses session authentication? +import { + generateUser, +} from '../../../../helpers/api-v3-integration.helper'; -describe('GET /export/userdata.json', () => {}); +describe('GET /export/userdata.json', () => { + it('should return a valid JSON file with user data', async () => { + let user = await generateUser(); + let tasks = await user.post('/tasks/user', [ + {type: 'habit', text: 'habit 1'}, + {type: 'daily', text: 'daily 1'}, + {type: 'reward', text: 'reward 1'}, + {type: 'todo', text: 'todo 1'}, + ]); + + let res = await user.get(`/export/userdata.json`); + expect(res._id).to.equal(user._id); + expect(res).to.contain.all.keys(['tasks', 'flags', 'tasksOrder', 'auth']); + expect(res.auth.local).not.to.have.keys(['salt', 'hashed_password']); + expect(res.tasks).to.have.all.keys(['dailys', 'habits', 'todos', 'rewards']); + expect(res.tasks.habits.length).to.equal(1); + expect(res.tasks.habits[0]._id).to.equal(tasks[0]._id); + expect(res.tasks.dailys.length).to.equal(1); + expect(res.tasks.dailys[0]._id).to.equal(tasks[1]._id); + expect(res.tasks.rewards.length).to.equal(1); + expect(res.tasks.rewards[0]._id).to.equal(tasks[2]._id); + expect(res.tasks.todos.length).to.equal(2); + expect(res.tasks.todos[1]._id).to.equal(tasks[3]._id); + }); +}); diff --git a/test/api/v3/integration/dataexport/GET-export_userdata.xml.test.js b/test/api/v3/integration/dataexport/GET-export_userdata.xml.test.js index 5534c6f625..198509e533 100644 --- a/test/api/v3/integration/dataexport/GET-export_userdata.xml.test.js +++ b/test/api/v3/integration/dataexport/GET-export_userdata.xml.test.js @@ -1,3 +1,41 @@ // TODO how to test this route since it uses session authentication? +import { + generateUser, +} from '../../../../helpers/api-v3-integration.helper'; +import xml2js from 'xml2js'; +import Q from 'q'; -describe('GET /export/userdata.xml', () => {}); +describe('GET /export/userdata.xml', () => { + it('should return a valid XML file with user data', async () => { + let user = await generateUser(); + let tasks = await user.post('/tasks/user', [ + {type: 'habit', text: 'habit 1'}, + {type: 'daily', text: 'daily 1'}, + {type: 'reward', text: 'reward 1'}, + {type: 'todo', text: 'todo 1'}, + // due to how the xml parser works an array is returned only if there's more than one children + // so we create two tasks for each type + {type: 'habit', text: 'habit 2'}, + {type: 'daily', text: 'daily 2'}, + {type: 'reward', text: 'reward 2'}, + {type: 'todo', text: 'todo 2'}, + + ]); + + let response = await user.get(`/export/userdata.xml`); + let {user: res} = await Q.npost(xml2js, 'parseString', [response, {explicitArray: false}]); + + expect(res._id).to.equal(user._id); + expect(res).to.contain.all.keys(['tasks', 'flags', 'tasksOrder', 'auth']); + expect(res.auth.local).not.to.have.keys(['salt', 'hashed_password']); + expect(res.tasks).to.have.all.keys(['dailys', 'habits', 'todos', 'rewards']); + expect(res.tasks.habits.length).to.equal(2); + expect(res.tasks.habits[0]._id).to.equal(tasks[0]._id); + expect(res.tasks.dailys.length).to.equal(2); + expect(res.tasks.dailys[0]._id).to.equal(tasks[1]._id); + expect(res.tasks.rewards.length).to.equal(2); + expect(res.tasks.rewards[0]._id).to.equal(tasks[2]._id); + expect(res.tasks.todos.length).to.equal(3); + expect(res.tasks.todos[1]._id).to.equal(tasks[3]._id); + }); +});