1
0
Fork 0
mirror of https://github.com/documize/community.git synced 2025-08-08 06:55:28 +02:00

Merge pull request #3 from documize/acceptance-tests

Acceptance tests and Ember-Ajax
This commit is contained in:
Lennex Zinyando 2016-06-14 19:27:05 +02:00 committed by GitHub
commit b04f1ea0f6
59 changed files with 1745 additions and 1212 deletions

423
app/app/mirage/config.js Normal file
View file

@ -0,0 +1,423 @@
export default function() {
this.passthrough('https://widget.intercom.io/widget/%7Bapp_id%7D');
this.urlPrefix = 'https://localhost:5001'; // make this `http://localhost:8080`, for example, if your API is on a different server
this.namespace = 'api'; // make this `api`, for example, if your API is namespaced
// this.timing = 400; // delay for each request, automatically set to 0 during testing
this.get('/public/meta', function(db) {
return db.meta[0];
});
this.get('/public/validate', function(db, request) {
let serverToken = request.queryParams.token;
let token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkb21haW4iOiIiLCJleHAiOjE0NjQwMjM2NjcsImlzcyI6IkRvY3VtaXplIiwib3JnIjoiVnpNdXlFd18zV3FpYWZjRCIsInN1YiI6IndlYmFwcCIsInVzZXIiOiJWek11eUV3XzNXcWlhZmNFIn0.NXZ6bo8mtvdZF_b9HavbidVUJqhmBA1zr0fSAPvbah0";
if (token = serverToken) {
return {
"id": "VzMuyEw_3WqiafcE",
"created": "2016-05-11T15:08:24Z",
"revised": "2016-05-11T15:08:24Z",
"firstname": "Lennex",
"lastname": "Zinyando",
"email": "brizdigital@gmail.com",
"initials": "LZ",
"active": true,
"editor": true,
"admin": true,
"accounts": [{
"id": "VzMuyEw_3WqiafcF",
"created": "2016-05-11T15:08:24Z",
"revised": "2016-05-11T15:08:24Z",
"admin": true,
"editor": true,
"userId": "VzMuyEw_3WqiafcE",
"orgId": "VzMuyEw_3WqiafcD",
"company": "EmberSherpa",
"title": "EmberSherpa",
"message": "This Documize instance contains all our team documentation",
"domain": ""
}]
};
}
});
this.get('/users/0/permissions', function() {
return [{
"folderId": "VzMygEw_3WrtFzto",
"userId": "",
"canView": true,
"canEdit": false
}];
});
this.get('/templates', function() {
return [];
});
this.get('/documents', function(db, request) {
let folder_id = request.queryParams.folder;
if (folder_id = "VzMuyEw_3WqiafcG") {
return [{
"id": "VzMwX0w_3WrtFztd",
"created": "2016-05-11T13:15:11Z",
"revised": "2016-05-11T13:22:16Z",
"orgId": "VzMuyEw_3WqiafcD",
"folderId": "VzMuyEw_3WqiafcG",
"userId": "VzMuyEw_3WqiafcE",
"job": "",
"location": "template-0",
"name": "Empty Document",
"excerpt": "My test document",
"tags": "",
"template": false
}, {
"id": "VzMvJEw_3WqiafcI",
"created": "2016-05-11T13:09:56Z",
"revised": "2016-05-11T13:09:56Z",
"orgId": "VzMuyEw_3WqiafcD",
"folderId": "VzMuyEw_3WqiafcG",
"userId": "VzMuyEw_3WqiafcE",
"job": "0bf9b076-cb74-4e8e-75be-8ee2d24a8171",
"location": "/var/folders/d6/kr81d2fs5bsbm8rz2p092fy80000gn/T/documize/_uploads/0bf9b076-cb74-4e8e-75be-8ee2d24a8171/README.md",
"name": "README",
"excerpt": "To Document/ Instructions. GO. go- bindata- assetsfs. SSL.",
"tags": "",
"template": false
}];
} else if (folder_id = "VzMygEw_3WrtFzto") {
return {
"id": "VzMygEw_3WrtFzto",
"created": "2016-05-11T13:24:17Z",
"revised": "2016-05-11T13:25:51Z",
"name": "Test",
"orgId": "VzMuyEw_3WqiafcD",
"userId": "VzMuyEw_3WqiafcE",
"folderType": 1
};
} else if (folder_id = 'V0Vy5Uw_3QeDAMW9'){
return null;
}
});
this.get('/folders', function(db) {
return db.folders;
});
this.post('/folders', function(db, request) {
var name = JSON.parse(request.requestBody).name;
let newFolder = {
"id":"V0Vy5Uw_3QeDAMW9",
"created":"2016-05-25T09:39:49Z",
"revised":"2016-05-25T09:39:49Z",
"name":name,
"orgId":"VzMuyEw_3WqiafcD",
"userId":"VzMuyEw_3WqiafcE",
"folderType":2
};
let folder = db.folders.insert(newFolder);
console.log(newFolder);
return folder;
});
this.post('/public/authenticate', () => {
return {
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkb21haW4iOiIiLCJleHAiOjE0NjQwMjM2NjcsImlzcyI6IkRvY3VtaXplIiwib3JnIjoiVnpNdXlFd18zV3FpYWZjRCIsInN1YiI6IndlYmFwcCIsInVzZXIiOiJWek11eUV3XzNXcWlhZmNFIn0.NXZ6bo8mtvdZF_b9HavbidVUJqhmBA1zr0fSAPvbah0",
"user": {
"id": "VzMuyEw_3WqiafcE",
"created": "2016-05-11T15:08:24Z",
"revised": "2016-05-11T15:08:24Z",
"firstname": "Lennex",
"lastname": "Zinyando",
"email": "brizdigital@gmail.com",
"initials": "LZ",
"active": true,
"editor": true,
"admin": true,
"accounts": [{
"id": "VzMuyEw_3WqiafcF",
"created": "2016-05-11T15:08:24Z",
"revised": "2016-05-11T15:08:24Z",
"admin": true,
"editor": true,
"userId": "VzMuyEw_3WqiafcE",
"orgId": "VzMuyEw_3WqiafcD",
"company": "EmberSherpa",
"title": "EmberSherpa",
"message": "This Documize instance contains all our team documentation",
"domain": ""
}]
}
};
});
this.get('/users/VzMuyEw_3WqiafcE/permissions', (db) => {
return db.permissions;
});
this.get('/folders/VzMuyEw_3WqiafcG/permissions', () => {
return [
{
"folderId":"VzMuyEw_3WqiafcG",
"userId":"VzMuyEw_3WqiafcE",
"canView":true,
"canEdit":true
}
];
});
this.put('/folders/VzMygEw_3WrtFzto/permissions', () => {
return [
{
"orgId":"VzMuyEw_3WqiafcD",
"folderId":"VzMygEw_3WrtFzto",
"userId":"",
"canEdit":true,
"canView":true
},{
"orgId":"VzMuyEw_3WqiafcD",
"folderId":"VzMygEw_3WrtFzto",
"userId":"VzMyp0w_3WrtFztq",
"canEdit":false,
"canView":false
},{
"orgId":"",
"folderId":"VzMygEw_3WrtFzto",
"userId":"VzMuyEw_3WqiafcE",
"canEdit":true,
"canView":true
}
];
});
this.get('/folders/VzMygEw_3WrtFzto/permissions', () => {
return [
{
"folderId":"VzMygEw_3WrtFzto",
"userId":"VzMuyEw_3WqiafcE",
"canView":true,
"canEdit":true
}
];
});
this.put('/folders/:id', (db, request) => {
let id = request.params.id;
let attrs = JSON.parse(request.requestBody);
let folder = db.folders.update(id, attrs);
console.log(folder);
return folder;
});
this.put('/folders/V0Vy5Uw_3QeDAMW9', () => {
return {
"id":"V0Vy5Uw_3QeDAMW9",
"created":"2016-05-25T09:39:49Z",
"revised":"2016-05-25T09:39:49Z",
"name":"Test Folder",
"orgId":"VzMuyEw_3WqiafcD",
"userId":"VzMuyEw_3WqiafcE",
"folderType":2
};
});
this.get('folders/:id', (db, request) => {
let id = request.params.id;
return db.folders.find(id);
});
this.get('/organizations/VzMuyEw_3WqiafcD', () => {
return {
"id": "VzMuyEw_3WqiafcD",
"created": "2016-05-11T15:08:24Z",
"revised": "2016-05-23T11:23:20Z",
"title": "EmberSherpa",
"message": "This Documize instance contains all our team documentation",
"url": "",
"domain": "",
"email": "brizdigital@gmail.com",
"allowAnonymousAccess": false
};
});
this.put('/organizations/VzMuyEw_3WqiafcD', (db, request) => {
let title = JSON.parse(request.requestBody).title;
let message = JSON.parse(request.requestBody).title;
let allowAnonymousAccess = JSON.parse(request.requestBody).allowAnonymousAccess;
return {
"id": "VzMuyEw_3WqiafcD",
"created": "2016-05-11T15:08:24Z",
"revised": "2016-05-23T11:23:20Z",
"title": `${title}`,
"message": `${message}`,
"url": "",
"domain": "",
"email": "brizdigital@gmail.com",
"allowAnonymousAccess": `${allowAnonymousAccess}`
};
});
this.get('/users', () => {
return [{
"id": "VzMyp0w_3WrtFztq",
"created": "2016-05-11T13:24:55Z",
"revised": "2016-05-11T13:33:47Z",
"firstname": "Len",
"lastname": "Random",
"email": "zinyando@gmail.com",
"initials": "LR",
"active": true,
"editor": true,
"admin": false,
"accounts": [{
"id": "VzMyp0w_3WrtFztr",
"created": "2016-05-11T13:24:55Z",
"revised": "2016-05-11T13:24:55Z",
"admin": false,
"editor": true,
"userId": "VzMyp0w_3WrtFztq",
"orgId": "VzMuyEw_3WqiafcD",
"company": "EmberSherpa",
"title": "EmberSherpa",
"message": "This Documize instance contains all our team documentation",
"domain": ""
}]
}, {
"id": "VzMuyEw_3WqiafcE",
"created": "2016-05-11T15:08:24Z",
"revised": "2016-05-11T15:08:24Z",
"firstname": "Lennex",
"lastname": "Zinyando",
"email": "brizdigital@gmail.com",
"initials": "LZ",
"active": true,
"editor": true,
"admin": true,
"accounts": [{
"id": "VzMuyEw_3WqiafcF",
"created": "2016-05-11T15:08:24Z",
"revised": "2016-05-11T15:08:24Z",
"admin": true,
"editor": true,
"userId": "VzMuyEw_3WqiafcE",
"orgId": "VzMuyEw_3WqiafcD",
"company": "EmberSherpa",
"title": "EmberSherpa",
"message": "This Documize instance contains all our team documentation",
"domain": ""
}]
}];
});
this.post('/users', (db, request) => {
let firstname = JSON.parse(request.requestBody).firstname;
let lastname = JSON.parse(request.requestBody).lastname;
let email = JSON.parse(request.requestBody).email;
return {
"id":"V0RmtUw_3QeDAMW7",
"created":"2016-05-24T14:35:33Z",
"revised":"2016-05-24T14:35:33Z",
"firstname":`${firstname}`,
"lastname":`${lastname}`,
"email":`${email}`,
"initials":"TU",
"active":true,
"editor":true,
"admin":false,
"accounts":[{
"id":"V0RmtUw_3QeDAMW8",
"created":"2016-05-24T14:35:34Z",
"revised":"2016-05-24T14:35:34Z",
"admin":false,
"editor":true,
"userId":"V0RmtUw_3QeDAMW7",
"orgId":"VzMuyEw_3WqiafcD",
"company":"EmberSherpa",
"title":"EmberSherpa",
"message":"This Documize instance contains all our team documentation",
"domain":""
}
]};
});
this.get('/users/VzMuyEw_3WqiafcE', () => {
return {
"id":"VzMuyEw_3WqiafcE",
"created":"2016-05-11T15:08:24Z",
"revised":"2016-05-11T15:08:24Z",
"firstname":"Lennex",
"lastname":"Zinyando",
"email":"brizdigital@gmail.com",
"initials":"LZ",
"active":true,
"editor":true,
"admin":true,
"accounts":[{
"id":"VzMuyEw_3WqiafcF",
"created":"2016-05-11T15:08:24Z",
"revised":"2016-05-11T15:08:24Z",
"admin":true,
"editor":true,
"userId":"VzMuyEw_3WqiafcE",
"orgId":"VzMuyEw_3WqiafcD",
"company":"EmberSherpa",
"title":"EmberSherpa",
"message":"This Documize instance contains all our team documentation",
"domain":""
}
]};
});
this.put('/users/VzMuyEw_3WqiafcE', (db, request) => {
let firstname = JSON.parse(request.requestBody).firstname;
let lastname = JSON.parse(request.requestBody).lastname;
let email = JSON.parse(request.requestBody).email;
return {
"id":"VzMuyEw_3WqiafcE",
"created":"2016-05-11T15:08:24Z",
"revised":"2016-05-11T15:08:24Z",
"firstname":`${firstname}`,
"lastname":`${lastname}`,
"email":`${email}`,
"initials":"LZ",
"active":true,
"editor":true,
"admin":true,
"accounts":[{
"id":"VzMuyEw_3WqiafcF",
"created":"2016-05-11T15:08:24Z",
"revised":"2016-05-11T15:08:24Z",
"admin":true,
"editor":true,
"userId":"VzMuyEw_3WqiafcE",
"orgId":"VzMuyEw_3WqiafcD",
"company":"EmberSherpa",
"title":"EmberSherpa",
"message":"This Documize instance contains all our team documentation",
"domain":""
}
]};
});
this.post('/folders/VzMuyEw_3WqiafcG/invitation', () => {
return {};
});
/**
very helpful for debugging
*/
this.handledRequest = function(verb, path) {
console.log(`👊${verb} ${path}`);
};
this.unhandledRequest = function(verb, path) {
console.log(`🔥${verb} ${path}`);
};
}

View file

@ -0,0 +1,20 @@
/*
This is an example factory definition.
Create more files in this directory to define additional factories.
*/
import Mirage/*, {faker} */ from 'ember-cli-mirage';
export default Mirage.Factory.extend({
// name: 'Pete', // strings
// age: 20, // numbers
// tall: true, // booleans
// email: function(i) { // and functions
// return 'person' + i + '@test.com';
// },
// firstName: faker.name.firstName, // using faker
// lastName: faker.name.firstName,
// zipCode: faker.address.zipCode
});

View file

@ -0,0 +1,11 @@
import Mirage, {faker} from 'ember-cli-mirage';
export default Mirage.Factory.extend({
"id": faker.list.cycle('VzMuyEw_3WqiafcG', 'VzMygEw_3WrtFzto'),
"created": "2016-05-11T15:08:24Z",
"revised": "2016-05-11T15:08:24Z",
"name": faker.list.cycle('My Project', 'Test'),
"orgId": "VzMuyEw_3WqiafcD",
"userId": "VzMuyEw_3WqiafcE",
"folderType": faker.list.cycle(1, 2)
});

View file

@ -0,0 +1,10 @@
import Mirage from 'ember-cli-mirage';
export default Mirage.Factory.extend({
"orgId": "VzMuyEw_3WqiafcD",
"title": "EmberSherpa",
"message": "This Documize instance contains all our team documentation",
"url": "",
"allowAnonymousAccess": false,
"version": "11.2"
});

View file

@ -0,0 +1,8 @@
import Mirage, {faker} from 'ember-cli-mirage';
export default Mirage.Factory.extend({
"folderId": faker.list.cycle('V0Vy5Uw_3QeDAMW9', 'VzMuyEw_3WqiafcG', 'VzMygEw_3WrtFzto', 'VzMygEw_3WrtFzto'),
"userId": faker.list.cycle('VzMuyEw_3WqiafcE', 'VzMuyEw_3WqiafcE', 'VzMuyEw_3WqiafcE', ''),
"canView":true,
"canEdit": faker.list.cycle(true, true, true, false)
});

View file

@ -0,0 +1,7 @@
export default function(/* server */) {
// Seed your development database using your factories. This
// data will not be loaded in your tests.
// server.createList('contact', 10);
}

View file

@ -1,10 +1,15 @@
import Ember from 'ember'; import Ember from 'ember';
import config from 'documize/config/environment';
export default Ember.Route.extend({ export default Ember.Route.extend({
activate: function(){ activate: function(){
this.session.logout(); this.session.logout();
this.audit.record("logged-in"); this.audit.record("logged-in");
this.audit.stop(); this.audit.stop();
if (config.environment === 'test') {
this.transitionTo('auth.login');
}else{
window.document.location = this.session.appMeta.allowAnonymousAccess ? "/" : "/auth/login"; window.document.location = this.session.appMeta.allowAnonymousAccess ? "/" : "/auth/login";
} }
}
}); });

View file

@ -20,22 +20,21 @@ export default Ember.Controller.extend(NotifierMixin, {
return; return;
} }
var self = this;
$("#newUserFirstname").removeClass("error"); $("#newUserFirstname").removeClass("error");
$("#newUserLastname").removeClass("error"); $("#newUserLastname").removeClass("error");
$("#newUserEmail").removeClass("error"); $("#newUserEmail").removeClass("error");
this.get('userService').add(this.get('newUser')).then(function(/*user*/) { this.get('userService')
self.showNotification('Added'); .add(this.get('newUser'))
self.set('newUser', { firstname: "", lastname: "", email: "", active: true }); .then((user) => {
this.showNotification('Added');
this.set('newUser', { firstname: "", lastname: "", email: "", active: true });
$("#newUserFirstname").focus(); $("#newUserFirstname").focus();
this.get('model').pushObject(user);
self.get('userService').getAll().then(function(users) { })
self.set('model', users); .catch(function(error){
});
}, function(error) {
let msg = error.status === 409 ? 'Unable to add duplicate user' : 'Unable to add user'; let msg = error.status === 409 ? 'Unable to add duplicate user' : 'Unable to add user';
self.showNotification(msg); this.showNotification(msg);
}); });
}, },

View file

@ -3,6 +3,9 @@ import NotifierMixin from "../../mixins/notifier";
import Encoding from "../../utils/encoding"; import Encoding from "../../utils/encoding";
export default Ember.Controller.extend(NotifierMixin, { export default Ember.Controller.extend(NotifierMixin, {
ajax: Ember.inject.service(),
actions: { actions: {
save() { save() {
if (is.empty(this.model.title)) { if (is.empty(this.model.title)) {
@ -37,21 +40,16 @@ export default Ember.Controller.extend(NotifierMixin, {
this.model.allowAnonymousAccess = Ember.$("#allowAnonymousAccess").prop('checked'); this.model.allowAnonymousAccess = Ember.$("#allowAnonymousAccess").prop('checked');
let self = this; this.get('ajax').request("/setup", {
method: 'POST',
$.ajax({ data: this.model,
type: 'POST',
url: "/setup",
data: self.model,
dataType: "text", dataType: "text",
success: function() { }).then(() => {
var credentials = Encoding.Base64.encode(":" + self.model.email + ":" + self.model.password); var credentials = Encoding.Base64.encode(":" + this.model.email + ":" + this.model.password);
window.location.href = "/auth/sso/" + encodeURIComponent(credentials); window.location.href = "/auth/sso/" + encodeURIComponent(credentials);
}, }).catch((error) => {
error: function(x) {
// TODO notify user of the error within the GUI // TODO notify user of the error within the GUI
console.log("Something went wrong attempting database creation, see server log: " + x); console.log("Something went wrong attempting database creation, see server log: " + error);
}
}); });
} }
} }

View file

@ -23,7 +23,7 @@ export default Ember.Route.extend({
// Session ready? // Session ready?
return session.boot().then(function() { return session.boot().then(function() {
// Need to authenticate? // Need to authenticate?
if (!session.appMeta.allowAnonymousAccess && !session.authenticated && if (!session.get("appMeta.allowAnonymousAccess") && !session.get("authenticated") &&
is.not.startWith(transition.targetName, 'auth.')) { is.not.startWith(transition.targetName, 'auth.')) {
if (!self.transitioning) { if (!self.transitioning) {
session.set('previousTransition', transition); session.set('previousTransition', transition);

View file

@ -16,7 +16,7 @@ import config from '../config/environment';
export default Ember.Service.extend({ export default Ember.Service.extend({
sessionService: Ember.inject.service('session'), sessionService: Ember.inject.service('session'),
ready: false, ready: false,
enabled: true, enabled: config.APP.auditEnabled,
init() { init() {
this.start(); this.start();

View file

@ -19,15 +19,15 @@ export default Ember.Service.extend({
}, },
setTitle(title) { setTitle(title) {
document.title = title + " | " + this.get('sessionService').appMeta.title; document.title = title + " | " + this.get('sessionService.appMeta.title');
}, },
setTitleReverse(title) { setTitleReverse(title) {
document.title = this.get('sessionService').appMeta.title + " | " + title; document.title = this.get('sessionService.appMeta.title') + " | " + title;
}, },
setTitleAsPhrase(title) { setTitleAsPhrase(title) {
document.title = this.get('sessionService').appMeta.title + " " + title; document.title = this.get('sessionService.appMeta.title') + " " + title;
}, },
setTitleWithoutSuffix(title) { setTitleWithoutSuffix(title) {
@ -38,7 +38,7 @@ export default Ember.Service.extend({
$('meta[name=description]').remove(); $('meta[name=description]').remove();
if (is.null(description) || is.undefined(description)) { if (is.null(description) || is.undefined(description)) {
description = this.get('sessionService').appMeta.message; description = this.get('sessionService.appMeta.message');
} }
$('head').append('<meta name="description" content="' + description + '">'); $('head').append('<meta name="description" content="' + description + '">');

View file

@ -14,35 +14,27 @@ import models from '../utils/model';
export default Ember.Service.extend({ export default Ember.Service.extend({
sessionService: Ember.inject.service('session'), sessionService: Ember.inject.service('session'),
ajax: Ember.inject.service(),
// Returns document model for specified document id. // Returns document model for specified document id.
getDocument(documentId) { getDocument(documentId) {
let url = this.get('sessionService').appMeta.getUrl(`documents/${documentId}`); let url = this.get('sessionService').appMeta.getUrl(`documents/${documentId}`);
return new Ember.RSVP.Promise(function(resolve, reject) { return this.get('ajax').request(url, {
$.ajax({ method: "GET"
url: url, }).then((response) => {
type: 'GET', return models.DocumentModel.create(response);
success: function(response) {
let doc = models.DocumentModel.create(response);
resolve(doc);
},
error: function(reason) {
reject(reason);
}
});
}); });
}, },
// Returns all documents for specified folder. // Returns all documents for specified folder.
getAllByFolder(folderId) { getAllByFolder(folderId) {
let url = this.get('sessionService').appMeta.getUrl(`documents?folder=${folderId}`); let appMeta = this.get('sessionService.appMeta');
let url = appMeta.getUrl(`documents?folder=${folderId}`);
return new Ember.RSVP.Promise(function(resolve, reject) { return this.get('ajax').request(url, {
$.ajax({ method: "GET"
url: url, }).then((response) => {
type: 'GET',
success: function(response) {
let documents = Ember.ArrayProxy.create({ let documents = Ember.ArrayProxy.create({
content: Ember.A([]) content: Ember.A([])
}); });
@ -52,12 +44,7 @@ export default Ember.Service.extend({
documents.pushObject(documentModel); documents.pushObject(documentModel);
}); });
resolve(documents); return documents;
},
error: function(reason) {
reject(reason);
}
});
}); });
}, },
@ -65,11 +52,9 @@ export default Ember.Service.extend({
getAllByTag(tag) { getAllByTag(tag) {
let url = this.get('sessionService').appMeta.getUrl(`documents?filter=tag&tag=${tag}`); let url = this.get('sessionService').appMeta.getUrl(`documents?filter=tag&tag=${tag}`);
return new Ember.RSVP.Promise(function(resolve, reject) { return this.get('ajax').request(url, {
$.ajax({ method: "GET"
url: url, }).then((response) => {
type: 'GET',
success: function(response) {
let documents = Ember.ArrayProxy.create({ let documents = Ember.ArrayProxy.create({
content: Ember.A([]) content: Ember.A([])
}); });
@ -79,12 +64,7 @@ export default Ember.Service.extend({
documents.pushObject(documentModel); documents.pushObject(documentModel);
}); });
resolve(documents); return documents;
},
error: function(reason) {
reject(reason);
}
});
}); });
}, },
@ -93,277 +73,150 @@ export default Ember.Service.extend({
let id = doc.get('id'); let id = doc.get('id');
let url = this.get('sessionService').appMeta.getUrl(`documents/${id}`); let url = this.get('sessionService').appMeta.getUrl(`documents/${id}`);
return new Ember.RSVP.Promise(function(resolve, reject) { return this.get('ajax').request(url, {
$.ajax({ method: 'PUT',
url: url, data: JSON.stringify(doc)
type: 'PUT',
data: JSON.stringify(doc),
contentType: 'json',
success: function(response) {
resolve(response);
},
error: function(reason) {
reject(reason);
}
});
}); });
}, },
getBatchedPages: function(documentId, payload) { getBatchedPages: function(documentId, payload) {
var self = this; let url = this.get('sessionService').appMeta.getUrl("documents/" + documentId + "/pages/batch");
return new Ember.RSVP.Promise(function(resolve, reject) { return this.get('ajax').request(url, {
$.ajax({ method: 'POST',
url: self.get('sessionService').appMeta.getUrl("documents/" + documentId + "/pages/batch"), data: payload
type: 'POST', }).then((pages) => {
data: payload,
success: function(pages) {
if (is.not.array(pages)) { if (is.not.array(pages)) {
pages = []; pages = [];
} }
resolve(pages); return pages;
},
error: function(reason) {
reject(reason);
}
});
}); });
}, },
changePageSequence: function(documentId, payload) { changePageSequence: function(documentId, payload) {
var self = this; var url = this.get('sessionService').appMeta.getUrl("documents/" + documentId + "/pages/sequence");
return new Ember.RSVP.Promise(function(resolve, reject) { return this.get('ajax').post(url, {
$.ajax({
url: self.get('sessionService').appMeta.getUrl("documents/" + documentId + "/pages/sequence"),
type: 'POST',
data: JSON.stringify(payload), data: JSON.stringify(payload),
contentType: 'json', contentType: 'json'
success: function(response) {
resolve(response);
},
error: function(reason) {
reject(reason);
}
});
}); });
}, },
changePageLevel(documentId, payload) { changePageLevel(documentId, payload) {
var self = this; let url = this.get('sessionService').appMeta.getUrl("documents/" + documentId + "/pages/level");
return new Ember.RSVP.Promise(function(resolve, reject) { return this.get('ajax').post(url, {
$.ajax({
url: self.get('sessionService').appMeta.getUrl("documents/" + documentId + "/pages/level"),
type: 'POST',
data: JSON.stringify(payload), data: JSON.stringify(payload),
contentType: 'json', contentType: 'json'
success: function(response) {
resolve(response);
},
error: function(reason) {
reject(reason);
}
});
}); });
}, },
deleteDocument: function(documentId) { deleteDocument: function(documentId) {
var self = this; let url = this.get('sessionService').appMeta.getUrl("documents/" + documentId);
return new Ember.RSVP.Promise(function(resolve, reject) { return this.get('ajax').request(url, {
$.ajax({ method: 'DELETE'
url: self.get('sessionService').appMeta.getUrl("documents/" + documentId),
type: 'DELETE',
success: function(response) {
resolve(response);
},
error: function(reason) {
reject(reason);
}
});
}); });
}, },
updatePage: function(documentId, pageId, payload, skipRevision) { updatePage: function(documentId, pageId, payload, skipRevision) {
var self = this;
var revision = skipRevision ? "?r=true" : "?r=false"; var revision = skipRevision ? "?r=true" : "?r=false";
let url = this.get('sessionService').appMeta.getUrl("documents/" + documentId + "/pages/" + pageId + revision);
return new Ember.RSVP.Promise(function(resolve, reject) { return this.get('ajax').request(url, {
$.ajax({ method: 'PUT',
url: self.get('sessionService').appMeta.getUrl("documents/" + documentId + "/pages/" + pageId + revision),
type: 'PUT',
data: JSON.stringify(payload), data: JSON.stringify(payload),
contentType: 'json', contentType: 'json'
success: function(response) {
resolve(response);
},
error: function(reason) {
reject(reason);
}
});
}); });
}, },
// addPage inserts new page to an existing document. // addPage inserts new page to an existing document.
addPage: function(documentId, payload) { addPage: function(documentId, payload) {
var self = this; let url = this.get('sessionService').appMeta.getUrl("documents/" + documentId + "/pages");
return new Ember.RSVP.Promise(function(resolve, reject) { return this.get('ajax').post(url, {
$.ajax({
url: self.get('sessionService').appMeta.getUrl("documents/" + documentId + "/pages"),
type: 'POST',
data: JSON.stringify(payload), data: JSON.stringify(payload),
contentType: 'json', contentType: 'json'
success: function(response) {
resolve(response);
},
error: function(reason) {
reject(reason);
}
});
}); });
}, },
// Nukes multiple pages from the document. // Nukes multiple pages from the document.
deletePages: function(documentId, pageId, payload) { deletePages: function(documentId, pageId, payload) {
var self = this; let url = this.get('sessionService').appMeta.getUrl("documents/" + documentId + "/pages/" + pageId);
return new Ember.RSVP.Promise(function(resolve, reject) { return this.get('ajax').post(url, {
$.ajax({
url: self.get('sessionService').appMeta.getUrl("documents/" + documentId + "/pages/" + pageId),
type: 'POST',
data: JSON.stringify(payload), data: JSON.stringify(payload),
success: function(response) { contentType: 'json'
resolve(response);
},
error: function(reason) {
reject(reason);
}
});
}); });
}, },
// Nukes a single page from the document. // Nukes a single page from the document.
deletePage: function(documentId, pageId) { deletePage: function(documentId, pageId) {
var self = this; let url = this.get('sessionService').appMeta.getUrl("documents/" + documentId + "/pages/" + pageId);
return new Ember.RSVP.Promise(function(resolve, reject) { return this.get('ajax').request(url, {
$.ajax({ method: 'DELETE'
url: self.get('sessionService').appMeta.getUrl("documents/" + documentId + "/pages/" + pageId),
type: 'DELETE',
success: function(response) {
resolve(response);
},
error: function(reason) {
reject(reason);
}
});
}); });
}, },
getPageRevisions(documentId, pageId) { getPageRevisions(documentId, pageId) {
let self = this; let url = this.get('sessionService').appMeta.getUrl("documents/" + documentId + "/pages/" + pageId + "/revisions");
return new Ember.RSVP.Promise(function(resolve, reject) { return this.get('ajax').request(url, {
$.ajax({ method: "GET"
url: self.get('sessionService').appMeta.getUrl("documents/" + documentId + "/pages/" + pageId + "/revisions"),
type: 'GET',
success: function(response) {
resolve(response);
},
error: function(reason) {
reject(reason);
}
});
}); });
}, },
getPageRevisionDiff(documentId, pageId, revisionId) { getPageRevisionDiff(documentId, pageId, revisionId) {
let self = this; let url = this.get('sessionService').appMeta.getUrl("documents/" + documentId + "/pages/" + pageId + "/revisions/" + revisionId);
return new Ember.RSVP.Promise(function(resolve, reject) { return this.get('ajax').request(url, {
$.ajax({ method: "GET",
url: self.get('sessionService').appMeta.getUrl("documents/" + documentId + "/pages/" + pageId + "/revisions/" + revisionId), dataType: 'text'
type: 'GET',
dataType: 'text',
success: function(response) {
resolve(response);
},
error: function(reason) {
reject(reason);
}
});
}); });
}, },
rollbackPage(documentId, pageId, revisionId) { rollbackPage(documentId, pageId, revisionId) {
let self = this; let url = this.get('sessionService').appMeta.getUrl("documents/" + documentId + "/pages/" + pageId + "/revisions/" + revisionId);
return new Ember.RSVP.Promise(function(resolve, reject) { return this.get('ajax').request(url, {
$.ajax({ method: "POST"
url: self.get('sessionService').appMeta.getUrl("documents/" + documentId + "/pages/" + pageId + "/revisions/" + revisionId),
type: 'POST',
success: function(response) {
resolve(response);
},
error: function(reason) {
reject(reason);
}
});
}); });
}, },
// document meta referes to number of views, edits, approvals, etc. // document meta referes to number of views, edits, approvals, etc.
getMeta(documentId) { getMeta(documentId) {
let self = this; let url = this.get('sessionService').appMeta.getUrl(`documents/${documentId}/meta`);
return new Ember.RSVP.Promise(function(resolve, reject) { return this.get('ajax').request(url, {
$.ajax({ method: "GET"
url: self.get('sessionService').appMeta.getUrl(`documents/${documentId}/meta`),
type: 'GET',
success: function(response) {
resolve(response);
},
error: function(reason) {
reject(reason);
}
});
}); });
}, },
// Returns all pages without the content // Returns all pages without the content
getTableOfContents(documentId) { getTableOfContents(documentId) {
let self = this; let url = this.get('sessionService').appMeta.getUrl(`documents/${documentId}/pages?content=0`);
return new Ember.RSVP.Promise(function(resolve, reject) { return this.get('ajax').request(url, {
$.ajax({ method: 'GET'
url: self.get('sessionService').appMeta.getUrl(`documents/${documentId}/pages?content=0`), }).then((response) => {
type: 'GET',
success: function(response) {
let data = []; let data = [];
_.each(response, function(obj) { _.each(response, function(obj) {
data.pushObject(models.PageModel.create(obj)); data.pushObject(models.PageModel.create(obj));
}); });
resolve(data);
}, return data;
error: function(reason) {
reject(reason);
}
});
}); });
}, },
// Returns all document pages with content // Returns all document pages with content
getPages(documentId) { getPages(documentId) {
let self = this; let url = this.get('sessionService').appMeta.getUrl(`documents/${documentId}/pages`);
return new Ember.RSVP.Promise(function(resolve, reject) { return this.get('ajax').request(url, {
$.ajax({ method: 'GET'
url: self.get('sessionService').appMeta.getUrl(`documents/${documentId}/pages`), }).then((response) => {
type: 'GET',
success: function(response) {
let pages = []; let pages = [];
_.each(response, function(page) { _.each(response, function(page) {
@ -374,90 +227,55 @@ export default Ember.Service.extend({
Ember.set(pages[0], 'firstPage', true); Ember.set(pages[0], 'firstPage', true);
} }
resolve(pages); return pages;
},
error: function(reason) {
reject(reason);
}
});
}); });
}, },
// Returns document page with content // Returns document page with content
getPage(documentId, pageId) { getPage(documentId, pageId) {
let self = this; let url = this.get('sessionService').appMeta.getUrl(`documents/${documentId}/pages/${pageId}`);
return new Ember.RSVP.Promise(function(resolve, reject) { return this.get('ajax').request(url, {
$.ajax({ method: 'GET'
url: self.get('sessionService').appMeta.getUrl(`documents/${documentId}/pages/${pageId}`), }).then((response) => {
type: 'GET',
success: function(response) {
let page = models.PageModel.create(response); let page = models.PageModel.create(response);
resolve(page); return page;
},
error: function(reason) {
reject(reason);
}
});
}); });
}, },
// Returns document page meta object // Returns document page meta object
getPageMeta(documentId, pageId) { getPageMeta(documentId, pageId) {
let self = this; let url = this.get('sessionService').appMeta.getUrl(`documents/${documentId}/pages/${pageId}/meta`);
return new Ember.RSVP.Promise(function(resolve, reject) { return this.get('ajax').request(url, {
$.ajax({ method: 'GET'
url: self.get('sessionService').appMeta.getUrl(`documents/${documentId}/pages/${pageId}/meta`), }).then((response) => {
type: 'GET',
success: function(response) {
let meta = models.PageMetaModel.create(response); let meta = models.PageMetaModel.create(response);
resolve(meta); return meta;
},
error: function(reason) {
reject(reason);
}
});
}); });
}, },
// document attachments without the actual content // document attachments without the actual content
getAttachments(documentId) { getAttachments(documentId) {
let self = this; let url = this.get('sessionService').appMeta.getUrl(`documents/${documentId}/attachments`);
return new Ember.RSVP.Promise(function(resolve, reject) { return this.get('ajax').request(url, {
$.ajax({ method: 'GET'
url: self.get('sessionService').appMeta.getUrl(`documents/${documentId}/attachments`), }).then((response) => {
type: 'GET',
success: function(response) {
let data = []; let data = [];
_.each(response, function(obj) { _.each(response, function(obj) {
data.pushObject(models.AttachmentModel.create(obj)); data.pushObject(models.AttachmentModel.create(obj));
}); });
resolve(data); return data;
},
error: function(reason) {
reject(reason);
}
});
}); });
}, },
// nuke an attachment // nuke an attachment
deleteAttachment(documentId, attachmentId) { deleteAttachment(documentId, attachmentId) {
let self = this; let url = this.get('sessionService').appMeta.getUrl(`documents/${documentId}/attachments/${attachmentId}`);
return new Ember.RSVP.Promise(function(resolve, reject) { return this.get('ajax').request(url, {
$.ajax({ method: 'DELETE'
url: self.get('sessionService').appMeta.getUrl(`documents/${documentId}/attachments/${attachmentId}`),
type: 'DELETE',
success: function(response) {
resolve(response);
},
error: function(reason) {
reject(reason);
}
});
}); });
}, },
}); });

View file

@ -15,6 +15,7 @@ import BaseService from '../services/base';
export default BaseService.extend({ export default BaseService.extend({
sessionService: Ember.inject.service('session'), sessionService: Ember.inject.service('session'),
ajax: Ember.inject.service(),
// selected folder // selected folder
currentFolder: null, currentFolder: null,
@ -22,41 +23,28 @@ export default BaseService.extend({
// Add a new folder. // Add a new folder.
add(folder) { add(folder) {
let url = this.get('sessionService').appMeta.getUrl(`folders`); let appMeta = this.get('sessionService.appMeta');
let url = appMeta.getUrl(`folders`);
return new Ember.RSVP.Promise(function(resolve, reject) { return this.get('ajax').post(url, {
$.ajax({
url: url,
type: 'POST',
data: JSON.stringify(folder),
contentType: 'json', contentType: 'json',
success: function(folder) { data: JSON.stringify(folder)
}).then((folder)=>{
let folderModel = models.FolderModel.create(folder); let folderModel = models.FolderModel.create(folder);
resolve(folderModel); return folderModel;
},
error: function(reason) {
reject(reason);
}
});
}); });
}, },
// Returns folder model for specified folder id. // Returns folder model for specified folder id.
getFolder(id) { getFolder(id) {
let url = this.get('sessionService').appMeta.getUrl(`folders/${id}`); let appMeta = this.get('sessionService.appMeta');
let url = appMeta.getUrl(`folders/${id}`);
return new Ember.RSVP.Promise(function(resolve, reject) { return this.get('ajax').request(url, {
$.ajax({ method: 'GET'
url: url, }).then((response)=>{
type: 'GET',
success: function(response) {
let folder = models.FolderModel.create(response); let folder = models.FolderModel.create(response);
resolve(folder); return folder;
},
error: function(reason) {
reject(reason);
}
});
}); });
}, },
@ -78,57 +66,27 @@ export default BaseService.extend({
let id = folder.get('id'); let id = folder.get('id');
let url = this.get('sessionService').appMeta.getUrl(`folders/${id}`); let url = this.get('sessionService').appMeta.getUrl(`folders/${id}`);
return new Ember.RSVP.Promise(function(resolve, reject) { return this.get('ajax').request(url, {
$.ajax({ method: 'PUT',
url: url,
type: 'PUT',
data: JSON.stringify(folder),
contentType: 'json', contentType: 'json',
success: function(response) { data: JSON.stringify(folder)
resolve(response);
},
error: function(reason) {
reject(reason);
}
});
}); });
}, },
remove: function(folderId, moveToId) { remove: function(folderId, moveToId) {
var self = this; var url = this.get('sessionService').appMeta.getUrl('folders/' + folderId + "/move/" + moveToId);
var url = self.get('sessionService').appMeta.getUrl('folders/' + folderId + "/move/" + moveToId);
return new Ember.RSVP.Promise(function(resolve, reject) { return this.get('ajax').request(url, {
$.ajax({ method: 'DELETE'
url: url,
type: 'DELETE',
success: function(response) {
resolve(response);
},
error: function(reason) {
reject(reason);
}
});
}); });
}, },
onboard: function(folderId, payload) { onboard: function(folderId, payload) {
var self = this; var url = this.get('sessionService').appMeta.getUrl('public/share/' + folderId);
var url = self.get('sessionService').appMeta.getUrl('public/share/' + folderId);
return new Ember.RSVP.Promise(function(resolve, reject) { return this.get('ajax').post(url, {
$.ajax({
url: url,
type: "POST",
data: payload,
contentType: "application/json", contentType: "application/json",
success: function(response) { data: payload
resolve(response);
},
error: function(reason) {
reject(reason);
}
});
}); });
}, },
@ -136,106 +94,69 @@ export default BaseService.extend({
getProtectedFolderInfo: function() { getProtectedFolderInfo: function() {
var url = this.get('sessionService').appMeta.getUrl('folders?filter=viewers'); var url = this.get('sessionService').appMeta.getUrl('folders?filter=viewers');
return new Ember.RSVP.Promise(function(resolve, reject) { return this.get('ajax').request(url, {
$.ajax({ method: "GET"
url: url, }).then((response)=>{
type: 'GET',
success: function(response) {
let data = []; let data = [];
_.each(response, function(obj) { _.each(response, function(obj) {
data.pushObject(models.ProtectedFolderParticipant.create(obj)); data.pushObject(models.ProtectedFolderParticipant.create(obj));
}); });
resolve(data); return data;
},
error: function(reason) {
reject(reason);
}
});
}); });
}, },
// reloads and caches folders. // reloads and caches folders.
reload() { reload() {
let url = this.get('sessionService').appMeta.getUrl(`folders`); let appMeta = this.get('sessionService.appMeta');
let url = appMeta.getUrl(`folders`);
return new Ember.RSVP.Promise(function(resolve, reject) { return this.get('ajax').request(url, {
$.ajax({ method: "GET"
url: url, }).then((response)=>{
type: 'GET',
success: function(response) {
let data = []; let data = [];
_.each(response, function(obj) { _.each(response, function(obj) {
data.pushObject(models.FolderModel.create(obj)); data.pushObject(models.FolderModel.create(obj));
}); });
resolve(data);
}, return data;
error: function(reason) {
reject(reason);
}
});
}); });
}, },
// so who can see/edit this folder? // so who can see/edit this folder?
getPermissions(folderId) { getPermissions(folderId) {
let self = this; let url = this.get('sessionService').appMeta.getUrl(`folders/${folderId}/permissions`);
return new Ember.RSVP.Promise(function(resolve, reject) { return this.get('ajax').request(url, {
$.ajax({ method: "GET"
url: self.get('sessionService').appMeta.getUrl(`folders/${folderId}/permissions`), }).then((response)=>{
type: 'GET',
success: function(response) {
let data = []; let data = [];
_.each(response, function(obj) { _.each(response, function(obj) {
data.pushObject(models.FolderPermissionModel.create(obj)); data.pushObject(models.FolderPermissionModel.create(obj));
}); });
resolve(data);
}, return data;
error: function(reason) {
reject(reason);
}
});
}); });
}, },
// persist folder permissions // persist folder permissions
savePermissions(folderId, payload) { savePermissions(folderId, payload) {
let self = this; let url = this.get('sessionService').appMeta.getUrl(`folders/${folderId}/permissions`);
return new Ember.RSVP.Promise(function(resolve, reject) { return this.get('ajax').request(url, {
$.ajax({ method: 'PUT',
url: self.get('sessionService').appMeta.getUrl(`folders/${folderId}/permissions`),
type: 'PUT',
contentType: 'json', contentType: 'json',
data: JSON.stringify(payload), data: JSON.stringify(payload)
success: function(response) {
resolve(response);
},
error: function(reason) {
reject(reason);
}
});
}); });
}, },
// share this folder with new users! // share this folder with new users!
share(folderId, invitation) { share(folderId, invitation) {
let self = this; let url = this.get('sessionService').appMeta.getUrl(`folders/${folderId}/invitation`);
return new Ember.RSVP.Promise(function(resolve, reject) { return this.get('ajax').post(url, {
$.ajax({
url: self.get('sessionService').appMeta.getUrl(`folders/${folderId}/invitation`),
type: 'POST',
contentType: 'json', contentType: 'json',
data: JSON.stringify(invitation), data: JSON.stringify(invitation)
success: function(response) {
resolve(response);
},
error: function(reason) {
reject(reason);
}
});
}); });
}, },
@ -255,14 +176,10 @@ export default BaseService.extend({
} }
let url = this.get('sessionService').appMeta.getUrl('users/' + userId + "/permissions"); let url = this.get('sessionService').appMeta.getUrl('users/' + userId + "/permissions");
let self = this;
$.ajax({ return this.get('ajax').request(url).then((folderPermissions) => {
url: url,
type: 'GET',
success: function(folderPermissions) {
// safety check // safety check
self.set('canEditCurrentFolder', false); this.set('canEditCurrentFolder', false);
if (folderPermissions.length === 0) { if (folderPermissions.length === 0) {
return; return;
@ -288,9 +205,9 @@ export default BaseService.extend({
canEdit = permission.canEdit; canEdit = permission.canEdit;
} }
}); });
Ember.run(() => {
self.set('canEditCurrentFolder', canEdit && self.get('sessionService').authenticated); this.set('canEditCurrentFolder', canEdit && this.get('sessionService').authenticated);
} });
}); });
}, },
}); });

View file

@ -14,23 +14,17 @@ import models from '../utils/model';
export default Ember.Service.extend({ export default Ember.Service.extend({
sessionService: Ember.inject.service('session'), sessionService: Ember.inject.service('session'),
ajax: Ember.inject.service(),
// Returns attributes for specified org id. // Returns attributes for specified org id.
getOrg(id) { getOrg(id) {
let url = this.get('sessionService').appMeta.getUrl(`organizations/${id}`); let url = this.get('sessionService').appMeta.getUrl(`organizations/${id}`);
return new Ember.RSVP.Promise(function(resolve, reject) { return this.get('ajax').request(url, {
$.ajax({ method: 'GET'
url: url, }).then((response) =>{
type: 'GET',
success: function(response) {
let org = models.OrganizationModel.create(response); let org = models.OrganizationModel.create(response);
resolve(org); return org;
},
error: function(reason) {
reject(reason);
}
});
}); });
}, },
@ -43,19 +37,9 @@ export default Ember.Service.extend({
this.get('sessionService').get('appMeta').setSafe('message', org.message); this.get('sessionService').get('appMeta').setSafe('message', org.message);
this.get('sessionService').get('appMeta').setSafe('title', org.title); this.get('sessionService').get('appMeta').setSafe('title', org.title);
return new Ember.RSVP.Promise(function(resolve, reject) { return this.get('ajax').request(url, {
$.ajax({ method: 'PUT',
url: url, data: JSON.stringify(org)
type: 'PUT',
data: JSON.stringify(org),
contentType: 'json',
success: function(response) {
resolve(response);
},
error: function(reason) {
reject(reason);
}
});
}); });
} }
}); });

View file

@ -13,22 +13,14 @@ import Ember from 'ember';
export default Ember.Service.extend({ export default Ember.Service.extend({
sessionService: Ember.inject.service('session'), sessionService: Ember.inject.service('session'),
ajax: Ember.inject.service(),
// getUsers returns all users for organization. // getUsers returns all users for organization.
find(keywords) { find(keywords) {
let url = this.get('sessionService').appMeta.getUrl("search?keywords=" + encodeURIComponent(keywords)); let url = this.get('sessionService').appMeta.getUrl("search?keywords=" + encodeURIComponent(keywords));
return new Ember.RSVP.Promise(function(resolve, reject) { return this.get('ajax').request(url, {
$.ajax({ method: "GET"
url: url,
type: 'GET',
success: function(response) {
resolve(response);
},
error: function(reason) {
reject(reason);
}
});
}); });
}, },
}); });

View file

@ -15,26 +15,21 @@ import BaseService from '../services/base';
export default BaseService.extend({ export default BaseService.extend({
sessionService: Ember.inject.service('session'), sessionService: Ember.inject.service('session'),
ajax: Ember.inject.service(),
// Returns all available sections. // Returns all available sections.
getAll() { getAll() {
let url = this.get('sessionService').appMeta.getUrl(`sections`); let url = this.get('sessionService').appMeta.getUrl(`sections`);
return new Ember.RSVP.Promise(function(resolve, reject) { return this.get('ajax').request(url,{
$.ajax({ method: 'GET'
url: url, }).then((response)=>{
type: 'GET',
success: function(response) {
let data = []; let data = [];
_.each(response, function(obj) { _.each(response, function(obj) {
data.pushObject(models.SectionModel.create(obj)); data.pushObject(models.SectionModel.create(obj));
}); });
resolve(data);
}, return data;
error: function(reason) {
reject(reason);
}
});
}); });
}, },
@ -46,19 +41,9 @@ export default BaseService.extend({
let endpoint = `sections?documentID=${documentId}&section=${section}&method=${method}`; let endpoint = `sections?documentID=${documentId}&section=${section}&method=${method}`;
let url = this.get('sessionService').appMeta.getUrl(endpoint); let url = this.get('sessionService').appMeta.getUrl(endpoint);
return new Ember.RSVP.Promise(function(resolve, reject) { return this.get('ajax').post(url, {
$.ajax({
url: url,
type: 'POST',
data: JSON.stringify(data), data: JSON.stringify(data),
contentType: "application/json", contentType: "application/json"
success: function(response) {
resolve(response);
},
error: function(reason) {
reject(reason);
}
});
}); });
}, },
@ -66,12 +51,9 @@ export default BaseService.extend({
refresh(documentId) { refresh(documentId) {
let url = this.get('sessionService').appMeta.getUrl(`sections/refresh?documentID=${documentId}`); let url = this.get('sessionService').appMeta.getUrl(`sections/refresh?documentID=${documentId}`);
return new Ember.RSVP.Promise(function(resolve, reject) { return this.get('ajax').request(url, {
$.ajax({ method: 'GET'
url: url, }).then((response)=>{
type: 'GET',
success: function(response) {
// resolve(response);
let pages = []; let pages = [];
if (is.not.null(response) && is.array(response) && response.length > 0) { if (is.not.null(response) && is.array(response) && response.length > 0) {
@ -80,12 +62,7 @@ export default BaseService.extend({
}); });
} }
resolve(pages); return pages;
},
error: function(reason) {
reject(reason);
}
});
}); });
} }
}); });

View file

@ -24,6 +24,7 @@ export default Ember.Service.extend({
authenticated: false, authenticated: false,
folderPermissions: null, folderPermissions: null,
currentFolder: null, currentFolder: null,
ajax: Ember.inject.service(),
isAdmin: function() { isAdmin: function() {
if (this.authenticated && is.not.null(this.user) && this.user.id !== "") { if (this.authenticated && is.not.null(this.user) && this.user.id !== "") {
@ -50,68 +51,48 @@ export default Ember.Service.extend({
// Authentication // Authentication
login: function(credentials) { login: function(credentials) {
var self = this; let url = this.appMeta.getUrl('public/authenticate');
var url = self.appMeta.getUrl('public/authenticate');
let domain = netUtil.getSubdomain(); let domain = netUtil.getSubdomain();
this.clearSession(); this.clearSession();
return new Ember.RSVP.Promise(function(resolve, reject) {
if (is.empty(credentials.email) || is.empty(credentials.password)) { if (is.empty(credentials.email) || is.empty(credentials.password)) {
reject("invalid"); return Ember.RSVP.reject("invalid");
return;
} }
var encoded = encodingUtil.Base64.encode(domain + ":" + credentials.email + ":" + credentials.password); var encoded = encodingUtil.Base64.encode(domain + ":" + credentials.email + ":" + credentials.password);
var header = { var headers = {
'Authorization': 'Basic ' + encoded 'Authorization': 'Basic ' + encoded
}; };
$.ajax({ return this.get('ajax').post(url, {
url: url, headers
type: 'POST', }).then((response)=>{
headers: header, this.setSession(response.token, models.UserModel.create(response.user));
success: function(response) { this.get('ready', true);
self.setSession(response.token, models.UserModel.create(response.user)); return response;
self.get('ready', true);
resolve(response);
},
error: function(reason) {
reject(reason);
}
});
}); });
}, },
// SSO in the form of 'domain:email:password' // SSO in the form of 'domain:email:password'
sso: function(credentials) { sso: function(credentials) {
var self = this; let url = this.appMeta.getUrl('public/authenticate');
var url = self.appMeta.getUrl('public/authenticate');
this.clearSession(); this.clearSession();
return new Ember.RSVP.Promise(function(resolve, reject) {
if (is.empty(credentials.email) || is.empty(credentials.password)) { if (is.empty(credentials.email) || is.empty(credentials.password)) {
reject("invalid"); return Ember.RSVP.reject("invalid");
return;
} }
var header = { var headers = {
'Authorization': 'Basic ' + credentials 'Authorization': 'Basic ' + credentials
}; };
$.ajax({ return this.get('ajax').post(url, {
url: url, headers
type: 'POST', }).then((response)=>{
headers: header, this.setSession(response.token, models.UserModel.create(response.user));
success: function(response) { this.get('ready', true);
self.setSession(response.token, models.UserModel.create(response.user)); return response;
self.get('ready', true);
resolve(response);
},
error: function(reason) {
reject(reason);
}
});
}); });
}, },
@ -192,51 +173,35 @@ export default Ember.Service.extend({
// this.set('popupBlocked', false); // this.set('popupBlocked', false);
// } // }
return new Ember.RSVP.Promise(function(resolve) { let url = this.get('appMeta').getUrl("public/meta");
$.ajax({
url: self.get('appMeta').getUrl("public/meta"),
type: 'GET',
contentType: 'json',
success: function(response) {
self.get('appMeta').set('orgId', response.orgId);
self.get('appMeta').setSafe('title', response.title);
self.get('appMeta').set('version', response.version);
self.get('appMeta').setSafe('message', response.message);
self.get('appMeta').set('allowAnonymousAccess', response.allowAnonymousAccess);
let token = self.getSessionItem('token'); return this.get('ajax').request(url)
.then((response) => {
this.get('appMeta').set('orgId', response.orgId);
this.get('appMeta').setSafe('title', response.title);
this.get('appMeta').set('version', response.version);
this.get('appMeta').setSafe('message', response.message);
this.get('appMeta').set('allowAnonymousAccess', response.allowAnonymousAccess);
let token = this.getSessionItem('token');
if (is.not.undefined(token)) { if (is.not.undefined(token)) {
// We now validate current token // We now validate current token
let tokenCheckUrl = self.get('appMeta').getUrl(`public/validate?token=${token}`); let tokenCheckUrl = this.get('appMeta').getUrl(`public/validate?token=${token}`);
$.ajax({ return this.get('ajax').request(tokenCheckUrl, {
url: tokenCheckUrl, method: 'GET',
type: 'GET', contentType: 'json'
contentType: 'json', }).then((user) => {
success: function(user) { this.setSession(token, models.UserModel.create(user));
self.setSession(token, models.UserModel.create(user)); this.set('ready', true);
self.set('ready', true); }).catch((reason) => {
resolve();
},
error: function(reason) {
if (reason.status === 401 || reason.status === 403) { if (reason.status === 401 || reason.status === 403) {
localStorage.clear(); localStorage.clear();
window.location.href = "/auth/login"; window.location.href = "/auth/login";
} }
}
}); });
} else {
self.set('ready', true);
resolve();
} }
},
error: function(reason) {
if (reason.status === 401 || reason.status === 403) {
window.location.href = "https://documize.com";
}
}
});
}); });
} }
}); });

View file

@ -14,50 +14,32 @@ import models from '../utils/model';
export default Ember.Service.extend({ export default Ember.Service.extend({
sessionService: Ember.inject.service('session'), sessionService: Ember.inject.service('session'),
ajax: Ember.inject.service(),
importStockTemplate: function(folderId, templateId) { importStockTemplate: function(folderId, templateId) {
let self = this;
return new Ember.RSVP.Promise(function(resolve, reject) { let url = this.get('sessionService').appMeta.getUrl("templates/" + templateId + "/folder/" + folderId + "?type=stock");
$.ajax({
url: self.get('sessionService').appMeta.getUrl("templates/" + templateId + "/folder/" + folderId + "?type=stock"), return this.get('ajax').request(url, {
type: 'POST', method: "POST"
success: function(response) {
resolve(response);
},
error: function(reason) {
reject(reason);
}
});
}); });
}, },
importSavedTemplate: function(folderId, templateId) { importSavedTemplate: function(folderId, templateId) {
let self = this; let url = this.get('sessionService').appMeta.getUrl("templates/" + templateId + "/folder/" + folderId + "?type=saved");
return new Ember.RSVP.Promise(function(resolve, reject) { return this.get('ajax').post(url).then((doc)=>{
$.ajax({
url: self.get('sessionService').appMeta.getUrl("templates/" + templateId + "/folder/" + folderId + "?type=saved"),
type: 'POST',
success: function(doc) {
let docModel = models.DocumentModel.create(doc); let docModel = models.DocumentModel.create(doc);
resolve(docModel); return docModel;
},
error: function(reason) {
reject(reason);
}
});
}); });
}, },
getSavedTemplates() { getSavedTemplates() {
let self = this; let url = this.get('sessionService').appMeta.getUrl("templates");
return new Ember.RSVP.Promise(function(resolve, reject) { return this.get('ajax').request(url, {
$.ajax({ method: 'GET'
url: self.get('sessionService').appMeta.getUrl("templates"), }).then((response) => {
type: 'GET',
success: function(response) {
if (is.not.array(response)) { if (is.not.array(response)) {
response = []; response = [];
} }
@ -70,29 +52,15 @@ export default Ember.Service.extend({
templates.pushObject(templateModel); templates.pushObject(templateModel);
}); });
resolve(templates); return templates;
},
error: function(reason) {
reject(reason);
}
});
}); });
}, },
getStockTemplates() { getStockTemplates() {
let self = this; let url = this.get('sessionService').appMeta.getUrl("templates/stock");
return new Ember.RSVP.Promise(function(resolve, reject) { return this.get('ajax').request(url, {
$.ajax({ method: 'GET'
url: self.get('sessionService').appMeta.getUrl("templates/stock"),
type: 'GET',
success: function(response) {
resolve(response);
},
error: function(reason) {
reject(reason);
}
});
}); });
} }
}); });

View file

@ -14,24 +14,18 @@ import models from '../utils/model';
export default Ember.Service.extend({ export default Ember.Service.extend({
sessionService: Ember.inject.service('session'), sessionService: Ember.inject.service('session'),
ajax: Ember.inject.service(),
// Adds a new user. // Adds a new user.
add(user) { add(user) {
let url = this.get('sessionService').appMeta.getUrl(`users`); let url = this.get('sessionService').appMeta.getUrl(`users`);
return new Ember.RSVP.Promise(function(resolve, reject) { return this.get('ajax').request(url, {
$.ajax({
url: url,
type: 'POST', type: 'POST',
data: JSON.stringify(user), data: JSON.stringify(user),
contentType: 'json', contentType: 'json'
success: function(response) { }).then(function(response){
resolve(models.UserModel.create(response)); return models.UserModel.create(response);
},
error: function(reason) {
reject(reason);
}
});
}); });
}, },
@ -39,17 +33,10 @@ export default Ember.Service.extend({
getUser(userId) { getUser(userId) {
let url = this.get('sessionService').appMeta.getUrl(`users/${userId}`); let url = this.get('sessionService').appMeta.getUrl(`users/${userId}`);
return new Ember.RSVP.Promise(function(resolve, reject) { return this.get('ajax').request(url, {
$.ajax({ type: 'GET'
url: url, }).then((response) => {
type: 'GET', return models.UserModel.create(response);
success: function(response) {
resolve(models.UserModel.create(response));
},
error: function(reason) {
reject(reason);
}
});
}); });
}, },
@ -57,21 +44,9 @@ export default Ember.Service.extend({
getAll() { getAll() {
let url = this.get('sessionService').appMeta.getUrl(`users`); let url = this.get('sessionService').appMeta.getUrl(`users`);
return new Ember.RSVP.Promise(function(resolve, reject) { return this.get('ajax').request(url).then((response) => {
$.ajax({ return response.map(function(obj){
url: url, return models.UserModel.create(obj);
type: 'GET',
success: function(response) {
let data = [];
_.each(response, function(obj) {
data.pushObject(models.UserModel.create(obj));
});
resolve(data);
},
error: function(reason) {
reject(reason);
}
}); });
}); });
}, },
@ -80,22 +55,15 @@ export default Ember.Service.extend({
getFolderUsers(folderId) { getFolderUsers(folderId) {
let url = this.get('sessionService').appMeta.getUrl(`users/folder/${folderId}`); let url = this.get('sessionService').appMeta.getUrl(`users/folder/${folderId}`);
return new Ember.RSVP.Promise(function(resolve, reject) { return this.get('ajax').request(url, {
$.ajax({ method: "GET"
url: url, }).then((response)=>{
type: 'GET',
success: function(response) {
let data = []; let data = [];
_.each(response, function(obj) { _.each(response, function(obj) {
data.pushObject(models.UserModel.create(obj)); data.pushObject(models.UserModel.create(obj));
}); });
resolve(data); return data;
},
error: function(reason) {
reject(reason);
}
});
}); });
}, },
@ -104,19 +72,10 @@ export default Ember.Service.extend({
let userId = user.get('id'); let userId = user.get('id');
let url = this.get('sessionService').appMeta.getUrl(`users/${userId}`); let url = this.get('sessionService').appMeta.getUrl(`users/${userId}`);
return new Ember.RSVP.Promise(function(resolve, reject) { return this.get('ajax').request(url, {
$.ajax({
url: url,
type: 'PUT', type: 'PUT',
data: JSON.stringify(user), data: JSON.stringify(user),
contentType: 'json', contentType: 'json'
success: function(response) {
resolve(response);
},
error: function(reason) {
reject(reason);
}
});
}); });
}, },
@ -124,18 +83,8 @@ export default Ember.Service.extend({
updatePassword(userId, password) { updatePassword(userId, password) {
let url = this.get('sessionService').appMeta.getUrl(`users/${userId}/password`); let url = this.get('sessionService').appMeta.getUrl(`users/${userId}/password`);
return new Ember.RSVP.Promise(function(resolve, reject) { return this.get('ajax').post(url, {
$.ajax({ data: password
url: url,
type: 'POST',
data: password,
success: function(response) {
resolve(response);
},
error: function(reason) {
reject(reason);
}
});
}); });
}, },
@ -143,46 +92,27 @@ export default Ember.Service.extend({
remove(userId) { remove(userId) {
let url = this.get('sessionService').appMeta.getUrl(`users/${userId}`); let url = this.get('sessionService').appMeta.getUrl(`users/${userId}`);
return new Ember.RSVP.Promise(function(resolve, reject) { return this.get('ajax').request(url, {
$.ajax({ method: 'DELETE'
url: url,
type: 'DELETE',
success: function(response) {
resolve(response);
},
error: function(reason) {
reject(reason);
}
});
}); });
}, },
// Request password reset. // Request password reset.
forgotPassword(email) { forgotPassword(email) {
var url = this.get('sessionService').appMeta.getUrl('public/forgot'); let url = this.get('sessionService').appMeta.getUrl('public/forgot');
return new Ember.RSVP.Promise(function(resolve, reject) {
if (is.empty(email)) { if (is.empty(email)) {
reject("invalid"); return Ember.RSVP.reject("invalid");
return;
} }
var data = JSON.stringify({ let data = JSON.stringify({
Email: email Email: email
}); });
$.ajax({ return this.get('ajax').request(url, {
url: url, method: 'POST',
type: 'POST',
dataType: 'json', dataType: 'json',
data: data, data: data
success: function(response) {
resolve(response);
},
error: function(reason) {
reject(reason);
}
});
}); });
}, },
@ -190,23 +120,13 @@ export default Ember.Service.extend({
resetPassword(token, password) { resetPassword(token, password) {
var url = this.get('sessionService').appMeta.getUrl('public/reset/' + token); var url = this.get('sessionService').appMeta.getUrl('public/reset/' + token);
return new Ember.RSVP.Promise(function(resolve, reject) {
if (is.empty(token) || is.empty(password)) { if (is.empty(token) || is.empty(password)) {
reject("invalid"); return Ember.RSVP.reject("invalid");
return;
} }
$.ajax({ return this.get('ajax').request(url, {
url: url, method: "POST",
type: 'POST', data: password
data: password,
success: function(response) {
resolve(response);
},
error: function(reason) {
reject(reason);
}
});
}); });
} }
}); });

View file

@ -8,7 +8,10 @@
"jquery": "*", "jquery": "*",
"loader.js": "^3.5.0", "loader.js": "^3.5.0",
"qunit": "~1.20.0", "qunit": "~1.20.0",
"install": "~1.0.4" "install": "~1.0.4",
"pretender": "~0.10.1",
"lodash": "~3.7.0",
"Faker": "~3.0.0"
}, },
"resolutions": { "resolutions": {
"jquery": ">=2.1.1", "jquery": ">=2.1.1",

View file

@ -15,7 +15,7 @@ module.exports = function(environment) {
var ENV = { var ENV = {
modulePrefix: 'documize', modulePrefix: 'documize',
podModulePrefix: 'documize/pods', podModulePrefix: 'documize/pods',
locationType: 'history', locationType: 'auto',
environment: environment, environment: environment,
baseURL: '/', baseURL: '/',
apiHost: '', apiHost: '',
@ -25,12 +25,21 @@ module.exports = function(environment) {
EmberENV: { EmberENV: {
FEATURES: {} FEATURES: {}
}, },
APP: {} "ember-cli-mirage": {
enabled: false
},
APP: {
// Allows to disable audit service in tests
auditEnabled: true
}
}; };
if (environment === 'development') { if (environment === 'development') {
ENV.APP.LOG_TRANSITIONS = true; ENV.APP.LOG_TRANSITIONS = true;
ENV.APP.LOG_TRANSITIONS_INTERNAL = true; ENV.APP.LOG_TRANSITIONS_INTERNAL = true;
ENV['ember-cli-mirage'] = {
enabled: false
};
ENV.apiHost = "https://localhost:5001"; ENV.apiHost = "https://localhost:5001";
// ENV.apiHost = "https://demo1.dev:5001"; // ENV.apiHost = "https://demo1.dev:5001";
@ -42,15 +51,16 @@ module.exports = function(environment) {
ENV.APP.LOG_VIEW_LOOKUPS = false; ENV.APP.LOG_VIEW_LOOKUPS = false;
// ENV.APP.LOG_TRANSITIONS = false; // ENV.APP.LOG_TRANSITIONS = false;
// ENV.APP.LOG_TRANSITIONS_INTERNAL = false; // ENV.APP.LOG_TRANSITIONS_INTERNAL = false;
ENV.APP.LOG_TRANSITIONS = true;
ENV.APP.LOG_TRANSITIONS_INTERNAL = true;
// ENV.baseURL = '/'; ENV.baseURL = '/';
// ENV.locationType = 'none'; ENV.locationType = 'none';
// ENV.APP.rootElement = '#ember-testing'; ENV.APP.rootElement = '#ember-testing';
ENV['ember-cli-mirage'] = {
enabled: true
};
ENV.APP.auditEnabled = false;
ENV.apiHost = "https://localhost:5001"; ENV.apiHost = "https://localhost:5001";
// ENV.apiHost = "https://demo1.dev:5001";
} }
if (environment === 'production') { if (environment === 'production') {

View file

@ -15,9 +15,6 @@ var isDevelopment = EmberApp.env() === 'development';
module.exports = function(defaults) { module.exports = function(defaults) {
var app = new EmberApp(defaults, { var app = new EmberApp(defaults, {
tests: true,
storeConfigInMeta: false,
fingerprint: { fingerprint: {
enabled: true, enabled: true,
extensions: ['js', 'css'], extensions: ['js', 'css'],

View file

@ -20,7 +20,7 @@
"license": "MIT", "license": "MIT",
"devDependencies": { "devDependencies": {
"broccoli-asset-rev": "^2.4.2", "broccoli-asset-rev": "^2.4.2",
"ember-ajax": "0.7.1", "ember-ajax": "2.3.2",
"ember-cli": "2.5.0", "ember-cli": "2.5.0",
"ember-cli-app-version": "^1.0.0", "ember-cli-app-version": "^1.0.0",
"ember-cli-babel": "^5.1.6", "ember-cli-babel": "^5.1.6",
@ -29,6 +29,7 @@
"ember-cli-htmlbars-inline-precompile": "^0.3.1", "ember-cli-htmlbars-inline-precompile": "^0.3.1",
"ember-cli-inject-live-reload": "^1.4.0", "ember-cli-inject-live-reload": "^1.4.0",
"ember-cli-jshint": "^1.0.0", "ember-cli-jshint": "^1.0.0",
"ember-cli-mirage": "0.1.13",
"ember-cli-qunit": "^1.4.0", "ember-cli-qunit": "^1.4.0",
"ember-cli-release": "0.2.8", "ember-cli-release": "0.2.8",
"ember-cli-sass": "5.3.1", "ember-cli-sass": "5.3.1",

View file

@ -22,7 +22,16 @@
"andThen", "andThen",
"currentURL", "currentURL",
"currentPath", "currentPath",
"currentRouteName" "currentRouteName",
"stubSession",
"stubAudit",
"pauseTest",
"userLogin",
"skip",
"waitToAppear",
"waitToAppear",
"stubUserNotification",
"is"
], ],
"node": false, "node": false,
"browser": false, "browser": false,

View file

@ -0,0 +1,18 @@
import { test } from 'qunit';
import moduleForAcceptance from 'documize/tests/helpers/module-for-acceptance';
moduleForAcceptance('Acceptance | Anon access disabled');
test('visiting / when not authenticated and with { allowAnonymousAccess: false } takes user to login', function(assert) {
server.create('meta', { allowAnonymousAccess: false });
server.createList('folder', 2);
visit('/');
andThen(function() {
assert.equal(currentURL(), '/auth/login');
findWithAssert('#authEmail');
findWithAssert('#authPassword');
findWithAssert('button');
});
});

View file

@ -0,0 +1,35 @@
import { test } from 'qunit';
import moduleForAcceptance from 'documize/tests/helpers/module-for-acceptance';
moduleForAcceptance('Acceptance | Anon access enabled');
test('visiting / when not authenticated and with { allowAnonymousAccess: true } takes user to folder view', function(assert) {
server.create('meta', { allowAnonymousAccess: true });
server.createList('folder', 2);
visit('/');
// return pauseTest();
andThen(function() {
assert.equal(find('.login').length, 1, 'Login button is displayed');
assert.equal(find('.documents-list .document').length, 2, '2 document displayed');
assert.equal(currentURL(), '/s/VzMuyEw_3WqiafcG/my-project', 'Dashboard and public spaces are displayed without being signed in');
});
});
test('visiting / when authenticated and with { allowAnonymousAccess: true } takes user to dashboard', function(assert) {
server.create('meta', { allowAnonymousAccess: true });
server.createList('folder', 2);
visit('/');
andThen(function() {
assert.equal(find('.login').length, 1, 'Login button is displayed');
assert.equal(currentURL(), '/s/VzMuyEw_3WqiafcG/my-project', 'Dashboard displayed without being signed in');
});
userLogin();
andThen(function() {
assert.equal(find('.login').length, 0, 'Login button is not displayed');
assert.equal(currentURL(), '/s/VzMuyEw_3WqiafcG/my-project', 'Dashboard is displayed after user is signed in');
});
});

View file

@ -0,0 +1,30 @@
import { test } from 'qunit';
import moduleForAcceptance from 'documize/tests/helpers/module-for-acceptance';
moduleForAcceptance('Acceptance | Authentication');
test('visiting /auth/login and logging in', function(assert) {
server.create('meta', { allowAnonymousAccess: false });
server.createList('folder', 2);
visit('/auth/login');
fillIn('#authEmail', 'brizdigital@gmail.com');
fillIn('#authPassword', 'zinyando123');
click('button');
andThen(function() {
assert.equal(currentURL(), '/s/VzMuyEw_3WqiafcG/my-project', 'Login successfull');
});
});
test('logging out a user', function(assert) {
server.create('meta', { allowAnonymousAccess: false });
server.createList('folder', 2);
userLogin();
visit('/auth/logout');
andThen(function() {
assert.equal(currentURL(), '/auth/login', 'Login successfull');
});
});

View file

@ -0,0 +1,188 @@
import { test } from 'qunit';
import moduleForAcceptance from 'documize/tests/helpers/module-for-acceptance';
moduleForAcceptance('Acceptance | Documents space');
// test('Adding a new folder space', function(assert) {
// server.create('meta', { allowAnonymousAccess: false });
// server.createList('folder', 2);
// server.createList('permission', 4);
// userLogin();
// visit('/s/VzMuyEw_3WqiafcG/my-project');
//
// andThen(function() {
// let personalSpaces = find('.section div:contains(PERSONAL)').length;
// assert.equal(currentURL(), '/s/VzMuyEw_3WqiafcG/my-project');
// assert.equal(personalSpaces, 1, '1 personal space is listed');
// });
//
// click('#add-folder-button');
//
// fillIn('#new-folder-name', 'body', 'Test Folder');
//
// click('.actions div:contains(Add)', 'body');
//
// andThen(function() {
// assert.equal(currentURL(), '/s/V0Vy5Uw_3QeDAMW9/test-folder');
// });
// });
// test('Adding a document to a space', function(assert) {
// server.create('meta', { allowAnonymousAccess: false });
// server.createList('folder', 2);
// server.createList('permission', 4);
// userLogin();
// visit('/s/VzMuyEw_3WqiafcG/my-project');
//
// andThen(function() {
//
// let numberOfDocuments = find('.documents-list li').length;
// assert.equal(currentURL(), '/s/VzMuyEw_3WqiafcG/my-project');
// assert.equal(numberOfDocuments, 2, '2 documents listed');
// });
//
// click('#start-document-button');
// click('.actions div:contains(Add)', 'body');
//
// andThen(function() {
// let numberOfDocuments = find('.documents-list li').length;
// assert.equal(numberOfDocuments, 3, '3 documents listed');
// assert.equal(currentURL(), '/s/VzMuyEw_3WqiafcG/my-project');
// // return pauseTest();
// });
// });
test('visiting space settings page', function(assert) {
server.create('meta', { allowAnonymousAccess: false });
server.createList('folder', 2);
server.createList('permission', 4);
userLogin();
visit('/s/VzMuyEw_3WqiafcG/my-project');
click('#folder-settings-button');
andThen(function() {
checkForCommonAsserts();
assert.equal(find('#folderName').val().trim(), 'My Project', 'Space name displayed in input box');
assert.equal(currentURL(), '/s/VzMuyEw_3WqiafcG/my-project/settings');
});
});
test('changing space name', function(assert) {
server.create('meta', { allowAnonymousAccess: false });
server.createList('folder', 2);
server.createList('permission', 4);
userLogin();
visit('/s/VzMuyEw_3WqiafcG/my-project/settings');
fillIn('#folderName', 'Test Space');
click('.button-blue');
andThen(function() {
let spaceName = find('.breadcrumb-menu .selected').text().trim();
checkForCommonAsserts();
assert.equal(spaceName, 'Test Space', 'Space name has been changed');
assert.equal(currentURL(), '/s/VzMuyEw_3WqiafcG/my-project/settings');
});
});
test('sharing a space', function(assert) {
server.create('meta', { allowAnonymousAccess: false });
server.createList('folder', 2);
server.createList('permission', 4);
userLogin();
visit('/s/VzMuyEw_3WqiafcG/my-project/settings');
click(('.sidebar-menu .options li:contains(Share)'));
fillIn('#inviteEmail', 'share-test@gmail.com');
click('.button-blue');
andThen(function() {
checkForCommonAsserts();
assert.equal(currentURL(), '/s/VzMuyEw_3WqiafcG/my-project/settings');
});
});
// Test will pass after moving to factories
test('changing space permissions', function(assert) {
server.create('meta', { allowAnonymousAccess: false });
server.createList('folder', 2);
server.createList('permission', 4);
userLogin();
andThen(function() {
let numberOfPublicFolders = find('.folders-list div:first .list a').length;
assert.equal(numberOfPublicFolders, 1, '1 folder listed as public');
assert.equal(currentURL(), '/s/VzMuyEw_3WqiafcG/my-project');
});
visit('/s/VzMygEw_3WrtFzto/test/settings');
click(('.sidebar-menu .options li:contains(Permissions)'));
click('tr:contains(Everyone) #canView-');
click('tr:contains(Everyone) #canEdit-');
click('.button-blue');
visit('/s/VzMuyEw_3WqiafcG/my-project');
andThen(function() {
let numberOfPublicFolders = find('.folders-list div:first .list a').length;
assert.equal(numberOfPublicFolders, 2, '2 folder listed as public');
assert.equal(currentURL(), '/s/VzMuyEw_3WqiafcG/my-project');
});
});
test('deleting a space', function(assert) {
server.create('meta', { allowAnonymousAccess: false });
server.createList('folder', 2);
server.createList('permission', 4);
userLogin();
visit('/s/VzMuyEw_3WqiafcG/my-project/settings');
click('.sidebar-menu .options li:contains(Delete)');
andThen(function() {
checkForCommonAsserts();
assert.equal(currentURL(), '/s/VzMuyEw_3WqiafcG/my-project/settings');
});
});
// test('deleting a document', function(assert) {
// server.create('meta', { allowAnonymousAccess: false });
// server.createList('folder', 2);
// server.createList('permission', 4);
// userLogin();
// visit('/s/VzMuyEw_3WqiafcG/my-project');
//
// andThen(function() {
// let deleteButton = find('#delete-documents-button');
// let numberOfDocuments = find('.documents-list li');
// assert.equal(numberOfDocuments.length, 2, '2 documents are displayed');
// assert.equal(deleteButton.length, 0, 'Delete button not displayed');
// });
//
// click('.documents-list li:first .checkbox');
//
// andThen(function() {
// let deleteButton = find('#delete-documents-button');
// assert.equal(deleteButton.length, 1, 'Delete button displayed after selecting document');
// });
//
// click('#delete-documents-button');
//
// waitToAppear('.drop-content');
// click('.actions div:contains(Delete)', 'body');
//
// andThen(function() {
// let numberOfDocuments = find('.documents-list li');
// assert.equal(numberOfDocuments.length, 1, '1 documents is displayed');
// });
// });
function checkForCommonAsserts() {
findWithAssert('.sidebar-menu');
findWithAssert('.options li:contains(General)');
findWithAssert('.options li:contains(Share)');
findWithAssert('.options li:contains(Permissions)');
findWithAssert('.options li:contains(Delete)');
}

View file

@ -1,35 +0,0 @@
import Ember from 'ember';
import {
module,
test
} from 'qunit';
import startApp from 'ember-testing/tests/helpers/start-app';
import moduleForAcceptance from 'documize/tests/helpers/module-for-acceptance';
moduleForAcceptance('Acceptance | login');
var application;
module('Acceptance | login', {
beforeEach: function() {
application = startApp();
window.localStorage.removeItem('token');
window.localStorage.removeItem('user');
window.localStorage.removeItem('folder');
},
afterEach: function() {
Ember.run(application, 'destroy');
}
});
test('visiting /auth/login', function(assert) {
visit('/auth/login');
// fillIn('#authEmail', 'harvey@kandola.com');
// fillIn('#authPassword', 'demo123');
// click('button');
andThen(function() {
assert.equal(currentURL(), '/auth/login');
});
});

View file

@ -1,12 +0,0 @@
import { test } from 'qunit';
import moduleForAcceptance from 'documize/tests/helpers/module-for-acceptance';
moduleForAcceptance('Acceptance | nologin');
test('visiting /', function(assert) {
visit('/');
andThen(function() {
assert.equal(currentURL().substring(0, 3), '/s/'); // NOTE because we do not know the correct uuid/space for the database being tested
});
});

View file

@ -0,0 +1,41 @@
import { test } from 'qunit';
import moduleForAcceptance from 'documize/tests/helpers/module-for-acceptance';
moduleForAcceptance('Acceptance | user profile');
test('visiting /profile', function(assert) {
server.createList('folder', 2);
userLogin();
visit('/profile');
andThen(function() {
assert.equal(currentURL(), '/profile');
assert.equal(find('#firstname').val(), 'Lennex', 'Firstaname input displays correct value');
assert.equal(find('#lastname').val(), 'Zinyando', 'Lastname input displays correct value');
assert.equal(find('#email').val(), 'brizdigital@gmail.com', 'Email input displays correct value');
});
});
test('changing user details and email ', function(assert) {
server.createList('folder', 2);
userLogin();
visit('/profile');
andThen(function() {
assert.equal(currentURL(), '/profile');
assert.equal(find('.name').text().trim(), 'Lennex Zinyando', 'Profile name displayed');
assert.equal(find('#firstname').val(), 'Lennex', 'Firstaname input displays correct value');
assert.equal(find('#lastname').val(), 'Zinyando', 'Lastname input displays correct value');
assert.equal(find('#email').val(), 'brizdigital@gmail.com', 'Email input displays correct value');
});
fillIn('#firstname', 'Test');
fillIn('#lastname', 'User');
fillIn('#email', 'test.user@domain.com');
click('.button-blue');
andThen(function() {
assert.equal(currentURL(), '/s/VzMuyEw_3WqiafcG/my-project');
assert.equal(find('.content .name').text().trim(), 'Test User', 'Profile name displayed');
});
});

View file

@ -0,0 +1,100 @@
import { test} from 'qunit';
import moduleForAcceptance from 'documize/tests/helpers/module-for-acceptance';
moduleForAcceptance('Acceptance | User Settings');
test('visiting /settings/general', function(assert) {
server.create('meta', { allowAnonymousAccess: false });
userLogin();
visit('/settings/general');
andThen(function() {
assert.equal(currentURL(), '/settings/general');
assert.equal(find('#siteTitle').val(), 'EmberSherpa', 'Website title input is filled in correctly');
assert.equal(find('textarea').val(), 'This Documize instance contains all our team documentation', 'Message is set correctly');
assert.equal(find('#allowAnonymousAccess').is(':checked'), false, 'Allow anonymouus checkbox is unchecked');
});
});
test('changing the Website title and description', function(assert) {
server.create('meta', { allowAnonymousAccess: false });
userLogin();
visit('/settings/general');
andThen(function() {
let websiteTitle = find('.content .title').text().trim();
let websiteTitleInput = find('#siteTitle').val();
assert.equal(websiteTitleInput, websiteTitle, 'Website title is set to EmberSherpa');
});
fillIn('#siteTitle', 'Documize Tests');
click('.button-blue');
andThen(function() {
let websiteTitle = find('.content .title').text().trim();
let websiteTitleInput = find('#siteTitle').val();
assert.equal(websiteTitleInput, websiteTitle, 'Website title is set to Documize Tests');
});
});
test('visiting /settings/folders', function(assert) {
server.create('meta', { allowAnonymousAccess: false });
userLogin();
visit('/settings/folders');
andThen(function() {
checkForCommonAsserts();
assert.equal(currentURL(), '/settings/folders');
});
});
test('visiting /settings/users', function(assert) {
server.create('meta', { allowAnonymousAccess: false });
userLogin();
visit('/settings/users');
andThen(function() {
checkForCommonAsserts();
findWithAssert('.user-list');
let numberOfUsers = find('.user-list tr').length;
assert.equal(numberOfUsers, 3, '2 Users listed');
assert.equal(currentURL(), '/settings/users');
});
});
test('add a new user', function(assert) {
server.create('meta', { allowAnonymousAccess: false });
userLogin();
visit('/settings/users');
andThen(function() {
checkForCommonAsserts();
findWithAssert('.user-list');
let numberOfUsers = find('.user-list tr').length;
assert.equal(numberOfUsers, 3, '2 Users listed');
assert.equal(currentURL(), '/settings/users');
});
fillIn('#newUserFirstname', 'Test');
fillIn('#newUserLastname', 'User');
fillIn('#newUserEmail', 'test.user@domain.com');
click('.button-blue');
// waitToAppear('.user-notification:contains(Added)');
// waitToDisappear('.user-notification:contains(Added)');
andThen(function() {
let numberOfUsers = find('.user-list tr').length;
assert.equal(numberOfUsers, 4, '3 Users listed');
assert.equal(currentURL(), '/settings/users');
});
});
function checkForCommonAsserts() {
findWithAssert('.sidebar-menu');
findWithAssert('#user-button');
findWithAssert('#accounts-button');
findWithAssert('a:contains(Dashboard)');
findWithAssert('a:contains(Settings)');
}

View file

@ -6,18 +6,28 @@ export default function(name, options = {}) {
module(name, { module(name, {
beforeEach() { beforeEach() {
this.application = startApp(); this.application = startApp();
stubAudit(this);
stubSession(this);
stubUserNotification(this);
if (options.beforeEach) { if (options.beforeEach) {
options.beforeEach.apply(this, arguments); options.beforeEach.apply(this, arguments);
} }
this.register = (fullName, Factory) => {
let instance = this.application.__deprecatedInstance__;
let registry = instance.register ? instance : instance.registry;
return registry.register(fullName, Factory);
};
}, },
afterEach() { afterEach() {
destroyApp(this.application);
if (options.afterEach) { if (options.afterEach) {
options.afterEach.apply(this, arguments); options.afterEach.apply(this, arguments);
} }
destroyApp(this.application);
} }
}); });
} }

View file

@ -1,6 +1,12 @@
import Ember from 'ember'; import Ember from 'ember';
import Application from '../../app'; import Application from '../../app';
import config from '../../config/environment'; import config from '../../config/environment';
import './stub-session';
import './stub-audit';
import './user-login';
import './wait-to-appear';
import './wait-to-disappear';
import './stub-user-notification';
export default function startApp(attrs) { export default function startApp(attrs) {
let application; let application;

View file

@ -0,0 +1,70 @@
import Ember from 'ember';
// import netUtil from 'documize/utils/net';
const Audit = Ember.Service.extend({
sessionService: Ember.inject.service('session'),
ready: false,
enabled: true,
init() {
this.start();
},
record(id) {
if (!this.get('enabled')) {
return;
}
if (!this.get('ready')) {
this.start();
}
return id;
// Intercom('trackEvent', id); //jshint ignore: line
// Intercom('update'); //jshint ignore: line
},
stop() {
// Intercom('shutdown'); //jshint ignore: line
},
start() {
let session = this.get('sessionService');
if (!this.get('enabled') || !session.authenticated || this.get('ready')) {
return;
}
this.set('ready', true);
// let appId = config.environment === 'production' ? 'c6cocn4z' : 'itgvb1vo';
// window.intercomSettings = {
// app_id: appId,
// name: session.user.firstname + " " + session.user.lastname,
// email: session.user.email,
// user_id: session.user.id,
// "administrator": session.user.admin,
// company:
// {
// id: session.get('appMeta.orgId'),
// name: session.get('appMeta.title').string,
// "domain": netUtil.getSubdomain(),
// "version": session.get('appMeta.version')
// }
// };
//
// if (!session.get('isMobile')) {
// window.intercomSettings.widget = {
// activator: "#IntercomDefaultWidget"
// };
// }
//
// window.Intercom('boot', window.intercomSettings);
},
});
export default Ember.Test.registerAsyncHelper('stubAudit', function(app, test, attrs = {}) {
test.register('service:audit', Audit.extend(attrs));
});

View file

@ -0,0 +1,200 @@
import Ember from 'ember';
import models from 'documize/utils/model';
import encodingUtil from 'documize/utils/encoding';
import netUtil from 'documize/utils/net';
const Session = Ember.Service.extend({
ready: false,
appMeta: null,
isMac: false,
isMobile: false,
previousTransition: null,
user: null,
authenticated: false,
folderPermissions: null,
currentFolder: null,
ajax: Ember.inject.service(),
isAdmin: function() {
if (this.authenticated && is.not.null(this.user) && this.user.id !== "") {
return this.user.admin;
}
return false;
}.property('user'),
isEditor: function() {
if (this.authenticated && is.not.null(this.user) && this.user.id !== "") {
return this.user.editor || this.user.admin;
}
return false;
}.property('user'),
// Boot up
init: function() {
this.set('user', models.UserModel.create());
this.appMeta = models.AppMeta.create();
this.set('isMac', is.mac());
this.set('isMobile', is.mobile());
},
login: function(credentials) {
let url = this.appMeta.getUrl('public/authenticate');
let domain = netUtil.getSubdomain();
this.clearSession();
if (is.empty(credentials.email) || is.empty(credentials.password)) {
return Ember.RSVP.reject("invalid");
}
var encoded = encodingUtil.Base64.encode(domain + ":" + credentials.email + ":" + credentials.password);
var headers = {
'Authorization': 'Basic ' + encoded
};
return this.get('ajax').post(url, {
headers
}).then((response)=>{
this.setSession(response.token, models.UserModel.create(response.user));
this.get('ready', true);
return response;
});
},
sso: function(credentials) {
let url = this.appMeta.getUrl('public/authenticate');
this.clearSession();
if (is.empty(credentials.email) || is.empty(credentials.password)) {
return Ember.RSVP.reject("invalid");
}
var headers = {
'Authorization': 'Basic ' + credentials
};
return this.get('ajax').post(url, {
headers
}).then((response)=>{
this.setSession(response.token, models.UserModel.create(response.user));
this.get('ready', true);
return response;
});
},
// Goodbye
logout: function() {
this.clearSession();
},
// Session management
setSession: function(token, user) {
this.set('user', user);
this.set('authenticated', true);
this.storeSessionItem('token', token);
this.storeSessionItem('user', JSON.stringify(user));
let self = this;
$.ajaxPrefilter(function(options, originalOptions, jqXHR) {
// We only tack on auth header for Documize API calls
if (is.startWith(options.url, self.get('appMeta.url'))) {
jqXHR.setRequestHeader('Authorization', 'Bearer ' + token);
}
});
},
clearSession: function() {
this.set('user', null);
this.set('authenticated', false);
// localStorage.clear();
},
storeSessionItem: function() {
// localStorage[key] = data;
// console.log(data);
},
getSessionItem: function() {
// return localStorage[key];
// console.log(data);
},
clearSessionItem: function() {
// delete localStorage[key];
},
boot() {
let self = this;
let dbhash = "";
if (is.not.null(document.head.querySelector("[property=dbhash]"))) {
dbhash = document.head.querySelector("[property=dbhash]").content;
}
if (dbhash.length > 0 && dbhash !== "{{.DBhash}}") {
self.get('appMeta').set('orgId', "response.orgId");
self.get('appMeta').setSafe('title', "Documize Setup");
self.get('appMeta').set('version', "response.version");
self.get('appMeta').setSafe('message', "response.message");
self.get('appMeta').set('allowAnonymousAccess', false);
self.set('ready', true);
return new Ember.RSVP.Promise(function(resolve) {
resolve();
});
}
if (this.get('ready')) {
return new Ember.RSVP.Promise(function(resolve) {
resolve();
});
}
// var blockedPopupTest = window.open("http://maintenance.documize.com", "directories=no,height=1,width=1,menubar=no,resizable=no,scrollbars=no,status=no,titlebar=no,top=0,location=no");
//
// if (!blockedPopupTest) {
// this.set('popupBlocked', true);
// } else {
// blockedPopupTest.close();
// this.set('popupBlocked', false);
// }
let url = this.get('appMeta').getUrl("public/meta");
return this.get('ajax').request(url)
.then((response) => {
this.get('appMeta').set('orgId', response.orgId);
this.get('appMeta').setSafe('title', response.title);
this.get('appMeta').set('version', response.version);
this.get('appMeta').setSafe('message', response.message);
this.get('appMeta').set('allowAnonymousAccess', response.allowAnonymousAccess);
let token = this.getSessionItem('token');
if (is.not.undefined(token)) {
// We now validate current token
let tokenCheckUrl = this.get('appMeta').getUrl(`public/validate?token=${token}`);
return this.get('ajax').request(tokenCheckUrl, {
method: 'GET',
contentType: 'json'
}).then((user) => {
this.setSession(token, models.UserModel.create(user));
this.set('ready', true);
}).catch((reason) => {
if (reason.status === 401 || reason.status === 403) {
// localStorage.clear();
window.location.href = "/auth/login";
}
});
}
});
}
});
export default Ember.Test.registerAsyncHelper('stubSession', function(app, test, attrs={}) {
test.register('service:session', Session.extend(attrs));
});

View file

@ -0,0 +1,22 @@
import Ember from 'ember';
const userNotification = Ember.Component.extend({
notifications: [],
didInsertElement() {
// this.eventBus.subscribe('notifyUser', this, 'notifyHandler');
},
willDestroyElement() {
// this.eventBus.unsubscribe('notifyUser');
},
showNotification(msg) {
return msg;
}
});
export default Ember.Test.registerAsyncHelper('stubUserNotification', function(app, test, attrs={}) {
test.register('component:userNotification', userNotification.extend(attrs));
});

View file

@ -0,0 +1,9 @@
import Ember from 'ember';
export default Ember.Test.registerAsyncHelper('userLogin', function() {
visit('/auth/login');
fillIn('#authEmail', 'brizdigital@gmail.com');
fillIn('#authPassword', 'zinyando123');
click('button');
});

View file

@ -0,0 +1,21 @@
import Ember from 'ember';
function isVisible(selector) {
return $(selector).length > 0;
}
function checkVisibility(selector, interval, resolve, visibility) {
if (isVisible(selector) === visibility) {
resolve($(selector));
} else {
Ember.run.later(null, function() {
checkVisibility(selector, interval, resolve, visibility);
}, interval);
}
}
export default Ember.Test.registerAsyncHelper('waitToAppear', function(app, selector, interval = 200) {
return new Ember.RSVP.Promise(function(resolve) {
checkVisibility(selector, interval, resolve, true);
});
});

View file

@ -0,0 +1,21 @@
import Ember from 'ember';
function isVisible(selector) {
return $(selector).length > 0;
}
function checkVisibility(selector, interval, resolve, visibility) {
if (isVisible(selector) === visibility) {
resolve($(selector));
} else {
Ember.run.later(null, function() {
checkVisibility(selector, interval, resolve, visibility);
}, interval);
}
}
export default Ember.Test.registerAsyncHelper('waitToDisappear', function(app, selector, interval = 200) {
return new Ember.RSVP.Promise(function(resolve) {
checkVisibility(selector, interval, resolve, false);
});
});

View file

@ -6,15 +6,25 @@
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Documize Tests</title> <title>Documize Tests</title>
<meta name="description" content=""> <meta name="description" content="">
<meta name="viewport" content="width=device-width, initial-scale=1"> {{content-for "head"}} {{content-for "test-head"}} <meta name="viewport" content="width=device-width, initial-scale=1">
<meta property="dbname" content="{{.DBname}}" />
<meta property="dbhash" content="{{.DBhash}}" />
<meta name="author" content="Documize" />
{{content-for "head"}}
{{content-for "test-head"}}
<link rel="stylesheet" href="assets/vendor.css"> <link rel="stylesheet" href="assets/vendor.css">
<link rel="stylesheet" href="assets/documize.css"> <link rel="stylesheet" href="assets/documize.css">
<link rel="stylesheet" href="assets/test-support.css" /> {{content-for "head-footer"}} {{content-for "test-head-footer"}} <link rel="stylesheet" href="assets/test-support.css" />
{{content-for "head-footer"}}
{{content-for "test-head-footer"}}
</head> </head>
<body> <body>
{{content-for "body"}} {{content-for "test-body"}} {{content-for "body"}}
{{content-for "test-body"}}
<script src="testem.js" integrity=""></script> <script src="testem.js" integrity=""></script>
<script src="assets/vendor.js"></script> <script src="assets/vendor.js"></script>
@ -23,7 +33,8 @@
<script src="assets/tests.js"></script> <script src="assets/tests.js"></script>
<script src="assets/test-loader.js"></script> <script src="assets/test-loader.js"></script>
{{content-for "body-footer"}} {{content-for "test-body-footer"}} {{content-for "body-footer"}}
{{content-for "test-body-footer"}}
</body> </body>
</html> </html>

View file

@ -1,24 +0,0 @@
import { moduleForComponent, test } from 'ember-qunit';
import hbs from 'htmlbars-inline-precompile';
moduleForComponent('section/gemini/type-editor', 'Integration | Component | section/gemini/type editor', {
integration: true
});
test('it renders', function(assert) {
// Set any properties with this.set('myProperty', 'value');
// Handle any actions with this.on('myAction', function(val) { ... });
this.render(hbs`{{section/gemini/type-editor}}`);
assert.equal(this.$().text().trim(), '');
// Template block usage:
this.render(hbs`
{{#section/gemini/type-editor}}
template block text
{{/section/gemini/type-editor}}
`);
assert.equal(this.$().text().trim(), 'template block text');
});

View file

@ -1,24 +0,0 @@
import { moduleForComponent, test } from 'ember-qunit';
import hbs from 'htmlbars-inline-precompile';
moduleForComponent('section/gemini/type-renderer', 'Integration | Component | section/gemini/type renderer', {
integration: true
});
test('it renders', function(assert) {
// Set any properties with this.set('myProperty', 'value');
// Handle any actions with this.on('myAction', function(val) { ... });
this.render(hbs`{{section/gemini/type-renderer}}`);
assert.equal(this.$().text().trim(), '');
// Template block usage:
this.render(hbs`
{{#section/gemini/type-renderer}}
template block text
{{/section/gemini/type-renderer}}
`);
assert.equal(this.$().text().trim(), 'template block text');
});

View file

@ -1,14 +0,0 @@
import { documentFileIcon } from '../../../../helpers/document/file-icon';
import { module, test } from 'qunit';
module('Unit | Helper | document/file icon');
test('should be file icon of ZIP', function(assert) {
let result = documentFileIcon(["zIp"]);
assert.equal(result, "zip.png");
});
test('should be file icon of ZIP (tar)', function(assert) {
let result = documentFileIcon(["TAR"]);
assert.equal(result, "zip.png");
});

View file

@ -1,19 +0,0 @@
import {
documentTocEntry
} from '../../../../helpers/document/toc-entry';
import {
module,
test
} from 'qunit';
module('Unit | Helper | document/toc entry');
test('toc entry should be not indented and not selected', function(assert) {
let result = documentTocEntry(['node-123', 'node-321', 1]);
assert.equal(result.toString(), "<span style='margin-left: 0px;'></span><span class=''></span>");
});
test('toc entry should be indented and selected', function(assert) {
let result = documentTocEntry(['node-123', 'node-123', 2]);
assert.equal(result.toString(), "<span style='margin-left: 20px;'></span><span class='selected'></span>");
});

View file

@ -1,9 +0,0 @@
import { formattedDate } from '../../../helpers/formatted-date';
import { module, test } from 'qunit';
module('Unit | Helper | formatted date');
test('should format date', function(assert) {
let result = formattedDate([new Date("1995-12-17T20:18:00"), "Do MMMM YYYY, HH:mm"]);
assert.equal(result, "17th December 1995, 20:18");
});

View file

@ -1,9 +0,0 @@
import { timeAgo } from '../../../helpers/time-ago';
import { module, test } from 'qunit';
module('Unit | Helper | time ago');
test('should format date as time ago', function(assert) {
let result = timeAgo([new Date()]);
assert.equal(result, "a few seconds ago");
});

View file

@ -1,9 +0,0 @@
import { userInitials } from '../../../helpers/user-initials';
import { module, test } from 'qunit';
module('Unit | Helper | user initials');
test('should uppercase initials from firstname lastname', function(assert) {
let result = userInitials(["Some", "name"]);
assert.equal(result, "SN");
});

View file

@ -1,22 +0,0 @@
import Ember from 'ember';
import AuditInitializer from '../../../initializers/audit';
import { module, test } from 'qunit';
let application;
module('Unit | Initializer | audit', {
beforeEach() {
Ember.run(function() {
application = Ember.Application.create();
application.deferReadiness();
});
}
});
// Replace this with your real tests.
test('it works', function(assert) {
AuditInitializer.initialize(application);
// you would normally confirm the results of the initializer here
assert.ok(true);
});

View file

@ -1,12 +0,0 @@
import Ember from 'ember';
import NotifierMixin from '../../../mixins/notifier';
import { module, test } from 'qunit';
module('Unit | Mixin | notifier');
// Replace this with your real tests.
test('it works', function(assert) {
let NotifierObject = Ember.Object.extend(NotifierMixin);
let subject = NotifierObject.create();
assert.ok(subject);
});

View file

@ -1,12 +0,0 @@
import Ember from 'ember';
import TooltipMixin from '../../../mixins/tooltip';
import { module, test } from 'qunit';
module('Unit | Mixin | tooltip');
// Replace this with your real tests.
test('it works', function(assert) {
let TooltipObject = Ember.Object.extend(TooltipMixin);
let subject = TooltipObject.create();
assert.ok(subject);
});

View file

@ -1,11 +0,0 @@
import { moduleFor, test } from 'ember-qunit';
moduleFor('route:document/wizard', 'Unit | Route | document/wizard', {
// Specify the other units that are required for this test.
// needs: ['controller:foo']
});
test('it exists', function(assert) {
let route = this.subject();
assert.ok(route);
});

View file

@ -1,11 +0,0 @@
import { moduleFor, test } from 'ember-qunit';
moduleFor('route:document/wizard', 'Unit | Route | document/wizard', {
// Specify the other units that are required for this test.
// needs: ['controller:foo']
});
test('it exists', function(assert) {
let route = this.subject();
assert.ok(route);
});

View file

@ -1,12 +0,0 @@
import { moduleFor, test } from 'ember-qunit';
moduleFor('service:section', 'Unit | Service | section', {
// Specify the other units that are required for this test.
// needs: ['service:foo']
});
// Replace this with your real tests.
test('it exists', function(assert) {
let service = this.subject();
assert.ok(service);
});

View file

@ -1,33 +0,0 @@
import dateUtil from '../../../utils/date';
import { module, test } from 'qunit';
module('Unit | Utility | date helpers');
test("should calculate time ago of a few seconds", function(assert) {
let result = dateUtil.timeAgo(new Date());
assert.equal(result, "a few seconds ago");
});
test("should calculate time ago of a day", function(assert) {
var temp = new Date();
temp.setDate(temp.getDate()-1);
let result = dateUtil.timeAgo(temp);
assert.equal(result, "a day ago");
});
test("should calculate time ago of 2 days", function(assert) {
var temp = new Date();
temp.setDate(temp.getDate()-2);
let result = dateUtil.timeAgo(temp);
assert.equal(result, "2 days ago");
});
test("should handle ISO date", function(assert) {
let result = dateUtil.toIsoDate(new Date("1995, 12, 17"));
assert.equal(result, "1995-12-17T00:00:00+00:00");
});
test("should format short date", function(assert) {
let result = dateUtil.toShortDate(new Date("1995, 12, 17"));
assert.equal(result, "1995/12/17");
});

View file

@ -1,9 +0,0 @@
import encodingUtil from '../../../utils/encoding';
import { module, test } from 'qunit';
module('Unit | Utility | encoding helpers');
test("should correctly Base64 encode", function(assert) {
let result = encodingUtil.Base64.encode("test");
assert.equal(result, "dGVzdA==");
});

View file

@ -1,14 +0,0 @@
import stringUtil from '../../../utils/string';
import { module, test } from 'qunit';
module('Unit | Utility | string');
test("should find string suffix", function(assert) {
let result = stringUtil.endsWith("some words", "words");
assert.ok(result);
});
test("should generate slug", function(assert) {
let result = stringUtil.makeSlug("something to slug");
assert.equal(result, "something-to-slug");
});