"use strict";
/**
* Various test helpers for the server-side puavo-ticket tests. This should be
* the first module loaded in each *_test.js file because it setups the proper
* environment.
*
* @namespace test
* @class helpers
*/
// Ensure testing env
process.env.NODE_ENV = "test";
process.env.BLUEBIRD_DEBUG = "true";
var assert = require("assert");
var Promise = require("bluebird");
Promise.longStackTraces();
require("../utils/superagentPromise");
var request = require("supertest");
var jwt = require("jwt-simple");
var DB = require("../db");
var app = require("../server");
var Ticket = require("../models/server/Ticket");
var Comment = require("../models/server/Comment");
var User = require("../models/server/User");
/**
* Create a stateful supertest request object (aka agent) which is logged into
* the puavo-ticket test server. It can access the puavo-ticket rest apis using
* the permissions it has.
*
* See <https://github.com/visionmedia/supertest>
*
* @method loginAsUser
* @static
* @param {Object} userData
* @return {Bluebird.Promise} supertest agent instance wrapped in a promise
*/
function loginAsUser(userData){
userData.iat = Math.round(Date.now() / 1000);
var jwtToken = jwt.encode(userData, "secret");
var agent = request.agent(app);
agent.logout = function() {
return new Promise(function(resolve, reject){
agent
.get("/logout")
.end(function(err, res) {
if (err) return reject(err);
assert.equal(res.headers.location, "/");
assert.equal(res.status, 302);
return resolve(agent);
});
});
};
return new Promise(function(resolve, reject){
agent
.get("/?jwt=" + jwtToken)
.end(function(err, res) {
if (err) return reject(err);
assert.equal(res.status, 302, "should get redirect after login");
assert.equal(
res.headers.location, "/",
"should have been redirected to front-page after login"
);
return resolve(agent);
});
});
}
/**
* Create two test tickets
*
* @static
* @method insertTestTickets
* @param {models.server.User} user User who creates the tickets
* @return {Object}
*/
function insertTestTickets(user) {
var ticket;
return Ticket.create(
"Test ticket title",
"Test ticket with comments, related users etc.",
user
).then(function(_ticket) {
ticket = _ticket;
return ticket;
})
.then(function addComment() {
return Comment.forge({
createdById: user.get("id"),
ticketId: ticket.id,
updatedAt: new Date(),
comment: "First comment to test ticket"
})
.save();
})
.then(function addAnotherComment() {
return Comment.forge({
createdById: user.get("id"),
ticketId: ticket.id,
updatedAt: new Date(),
comment: "Second comment to test ticket"
})
.save();
})
.then(function addAnotherTicket() {
return Ticket.create(
"An another ticket",
"Other test tickets",
user
);
})
.then(function addCommentToAnotherTicket(otherTicket) {
return Comment.forge({
createdById: user.get("id"),
ticketId: otherTicket.id,
comment: "First comment to the other ticket"
})
.save()
.then(function() {
return otherTicket;
});
})
.then(function returnTicketsObject(otherTicket) {
return { ticket: ticket, otherTicket: otherTicket };
});
}
/**
* Delete all rows from given tables in series.
*
* The rows must have an id sequence which will be restarted
*
* @static
* @private
* @method deleteAndReset
* @param {Array} tables Tables names
*/
function deleteAndReset(tables) {
if (tables.length === 0) return;
var tableName = tables[0];
return DB.knex(tableName).del()
.then(function() {
return DB.knex.raw("ALTER SEQUENCE \"" + tableName + "_id_seq\" RESTART");
})
.then(function() {
return deleteAndReset(tables.slice(1));
});
}
/**
* Ensure empty database for testing
*
* @static
* @method clearTestDatabase
* @return {Bluebird.Promise}
*/
function clearTestDatabase() {
// the chunks table has no incrementing id column
return DB.knex("chunks").del()
.then(function() {
return deleteAndReset([
"attachments",
"emailArchive",
"comments",
"visibilities",
"followers",
"tags",
"handlers",
"notifications",
"titles",
"tickets",
"users"
]);
});
}
/**
* Fetch test user
*
*
* @method fetchTestUser
* @static
* @return {Object}
*/
function fetchTestUser() {
return User.collection()
.query('where', 'externalId', '=', testUser.teacher.id)
.fetchOne();
}
/**
* Various Opinsys SSO user JWT tokens
*
* @property user
* @type Object
*/
var testUser = {
/**
* User with teacher permissions in `testing.opinsys.fi` organisation
*
* @property user.teacher
* @type {Object}
*/
teacher: {
"id": "9324",
"username": "olli.opettaja",
"first_name": "Olli",
"last_name": "Opettaja",
"email": "olli.opettaja@testing.opinsys.fi",
"organisation_name": "Testing",
"organisation_domain": "testing.opinsys.fi",
"primary_school_id": "329",
"schools": [
{
"id": "234",
"dn": "puavoId=1384,ou=Groups,dc=edu,dc=testing,dc=fi",
"name": "Jyskä",
"abbreviation": "osjys",
"roles": [
"teacher"
],
"groups": [
{
"id": "79470",
"dn": "puavoId=79470,ou=Groups,dc=edu,dc=testing,dc=fi",
"name": "Opettajat",
"abbreviation": "osjys-opettajat"
}
]
}
]
},
/**
* Another user with teacher permissions in `testing.opinsys.fi` organisation
*
* @property user.teacher2
* @type {Object}
*/
teacher2: {
"id": "400",
"username": "matti.meikalainen",
"first_name": "Matti",
"last_name": "Meikäläinen",
"email": "matti.meikalainen@testing.opinsys.fi",
"organisation_name": "Testing",
"organisation_domain": "testing.opinsys.fi",
"primary_school_id": "329",
"schools": [
{
"id": "234",
"dn": "puavoId=1384,ou=Groups,dc=edu,dc=testing,dc=fi",
"name": "Jyskä",
"abbreviation": "osjys",
"roles": [
"teacher"
],
"groups": [
{
"id": "79470",
"dn": "puavoId=79470,ou=Groups,dc=edu,dc=testing,dc=fi",
"name": "Opettajat",
"abbreviation": "osjys-opettajat"
}
]
}
]
},
/**
* Third user with teacher permissions in `testing.opinsys.fi` organisation
*
* @property user.teacher3
* @type {Object}
*/
teacher3: {
"id": "403",
"username": "maija.meikalainen",
"first_name": "Maija",
"last_name": "Meikäläinen",
"email": "maija.meikalainen@testing.opinsys.fi",
"organisation_name": "Testing",
"organisation_domain": "testing.opinsys.fi",
"primary_school_id": "329",
"schools": [
{
"id": "234",
"dn": "puavoId=1384,ou=Groups,dc=edu,dc=testing,dc=fi",
"name": "Jyskä",
"abbreviation": "osjys",
"roles": [
"teacher"
],
"groups": [
{
"id": "79470",
"dn": "puavoId=79470,ou=Groups,dc=edu,dc=testing,dc=fi",
"name": "Opettajat",
"abbreviation": "osjys-opettajat"
}
]
}
]
},
/**
* Manager user from managertesting.opinsys.net organisation
*
* @property user.manager
* @type {Object}
*/
manager: {
"id": "599",
"username": "pointyhair",
"first_name": "Pointy-haired",
"last_name": "Boss",
"email": "pointyhair@testing.opinsys.fi",
"organisation_name": "Manager Testing",
"organisation_domain": "managertesting.opinsys.net",
"primary_school_id": "349",
"schools": [
{
"id": "249",
"dn": "puavoId=249,ou=Groups,dc=edu,dc=managertesting,dc=fi",
"name": "Administration",
"abbreviation": "admin",
"roles": [
"manager"
],
"groups": [
{
"id": "325",
"dn": "puavoId=325,ou=Groups,dc=edu,dc=managertesting,dc=fi",
"name": "Managers",
"abbreviation": "managers"
}
]
}
]
}
};
module.exports = {
loginAsUser: loginAsUser,
clearTestDatabase: clearTestDatabase,
insertTestTickets: insertTestTickets,
fetchTestUser: fetchTestUser,
user: testUser
};