diff --git a/app/app/mirage/config.js b/app/app/mirage/config.js new file mode 100644 index 00000000..d95e6a4a --- /dev/null +++ b/app/app/mirage/config.js @@ -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}`); + }; + +} diff --git a/app/app/mirage/factories/contact.js b/app/app/mirage/factories/contact.js new file mode 100644 index 00000000..1b3a3eab --- /dev/null +++ b/app/app/mirage/factories/contact.js @@ -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 +}); diff --git a/app/app/mirage/factories/folder.js b/app/app/mirage/factories/folder.js new file mode 100644 index 00000000..aa4cdd4c --- /dev/null +++ b/app/app/mirage/factories/folder.js @@ -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) +}); diff --git a/app/app/mirage/factories/meta.js b/app/app/mirage/factories/meta.js new file mode 100644 index 00000000..eb824eff --- /dev/null +++ b/app/app/mirage/factories/meta.js @@ -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" +}); diff --git a/app/app/mirage/factories/permission.js b/app/app/mirage/factories/permission.js new file mode 100644 index 00000000..83ab4985 --- /dev/null +++ b/app/app/mirage/factories/permission.js @@ -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) +}); diff --git a/app/app/mirage/scenarios/default.js b/app/app/mirage/scenarios/default.js new file mode 100644 index 00000000..e07271cc --- /dev/null +++ b/app/app/mirage/scenarios/default.js @@ -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); +} diff --git a/app/app/pods/auth/logout/route.js b/app/app/pods/auth/logout/route.js index cb9c72d8..cb5e8ba3 100644 --- a/app/app/pods/auth/logout/route.js +++ b/app/app/pods/auth/logout/route.js @@ -1,10 +1,15 @@ import Ember from 'ember'; +import config from 'documize/config/environment'; export default Ember.Route.extend({ activate: function(){ this.session.logout(); this.audit.record("logged-in"); this.audit.stop(); - window.document.location = this.session.appMeta.allowAnonymousAccess ? "/" : "/auth/login"; + if (config.environment === 'test') { + this.transitionTo('auth.login'); + }else{ + window.document.location = this.session.appMeta.allowAnonymousAccess ? "/" : "/auth/login"; + } } }); diff --git a/app/app/pods/customize/users/controller.js b/app/app/pods/customize/users/controller.js index c788ea0c..16e71b9d 100644 --- a/app/app/pods/customize/users/controller.js +++ b/app/app/pods/customize/users/controller.js @@ -20,23 +20,22 @@ export default Ember.Controller.extend(NotifierMixin, { return; } - var self = this; $("#newUserFirstname").removeClass("error"); $("#newUserLastname").removeClass("error"); $("#newUserEmail").removeClass("error"); - this.get('userService').add(this.get('newUser')).then(function(/*user*/) { - self.showNotification('Added'); - self.set('newUser', { firstname: "", lastname: "", email: "", active: true }); - $("#newUserFirstname").focus(); - - self.get('userService').getAll().then(function(users) { - self.set('model', users); + this.get('userService') + .add(this.get('newUser')) + .then((user) => { + this.showNotification('Added'); + this.set('newUser', { firstname: "", lastname: "", email: "", active: true }); + $("#newUserFirstname").focus(); + this.get('model').pushObject(user); + }) + .catch(function(error){ + let msg = error.status === 409 ? 'Unable to add duplicate user' : 'Unable to add user'; + this.showNotification(msg); }); - }, function(error) { - let msg = error.status === 409 ? 'Unable to add duplicate user' : 'Unable to add user'; - self.showNotification(msg); - }); }, onDelete(user) { diff --git a/app/app/pods/setup/controller.js b/app/app/pods/setup/controller.js index f3ffca1d..c40b840c 100644 --- a/app/app/pods/setup/controller.js +++ b/app/app/pods/setup/controller.js @@ -3,6 +3,9 @@ import NotifierMixin from "../../mixins/notifier"; import Encoding from "../../utils/encoding"; export default Ember.Controller.extend(NotifierMixin, { + + ajax: Ember.inject.service(), + actions: { save() { if (is.empty(this.model.title)) { @@ -37,22 +40,17 @@ export default Ember.Controller.extend(NotifierMixin, { this.model.allowAnonymousAccess = Ember.$("#allowAnonymousAccess").prop('checked'); - let self = this; - - $.ajax({ - type: 'POST', - url: "/setup", - data: self.model, + this.get('ajax').request("/setup", { + method: 'POST', + data: this.model, dataType: "text", - success: function() { - var credentials = Encoding.Base64.encode(":" + self.model.email + ":" + self.model.password); - window.location.href = "/auth/sso/" + encodeURIComponent(credentials); - }, - error: function(x) { - // TODO notify user of the error within the GUI - console.log("Something went wrong attempting database creation, see server log: " + x); - } + }).then(() => { + var credentials = Encoding.Base64.encode(":" + this.model.email + ":" + this.model.password); + window.location.href = "/auth/sso/" + encodeURIComponent(credentials); + }).catch((error) => { + // TODO notify user of the error within the GUI + console.log("Something went wrong attempting database creation, see server log: " + error); }); } } -}); \ No newline at end of file +}); diff --git a/app/app/router.js b/app/app/router.js index dd9b740a..88bf5a71 100644 --- a/app/app/router.js +++ b/app/app/router.js @@ -1,11 +1,11 @@ // Copyright 2016 Documize Inc. . All rights reserved. // -// This software (Documize Community Edition) is licensed under +// This software (Documize Community Edition) is licensed under // GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html // // You can operate outside the AGPL restrictions by purchasing // Documize Enterprise Edition and obtaining a commercial license -// by contacting . +// by contacting . // // https://documize.com @@ -99,4 +99,4 @@ export default Router.map(function() { }); this.route('pods', function() {}); -}); \ No newline at end of file +}); diff --git a/app/app/routes/application.js b/app/app/routes/application.js index ade10ade..da384933 100644 --- a/app/app/routes/application.js +++ b/app/app/routes/application.js @@ -23,7 +23,7 @@ export default Ember.Route.extend({ // Session ready? return session.boot().then(function() { // Need to authenticate? - if (!session.appMeta.allowAnonymousAccess && !session.authenticated && + if (!session.get("appMeta.allowAnonymousAccess") && !session.get("authenticated") && is.not.startWith(transition.targetName, 'auth.')) { if (!self.transitioning) { session.set('previousTransition', transition); @@ -52,4 +52,4 @@ export default Ember.Route.extend({ return true; } }, -}); \ No newline at end of file +}); diff --git a/app/app/services/audit.js b/app/app/services/audit.js index 1bf39d6a..7bb98016 100644 --- a/app/app/services/audit.js +++ b/app/app/services/audit.js @@ -16,7 +16,7 @@ import config from '../config/environment'; export default Ember.Service.extend({ sessionService: Ember.inject.service('session'), ready: false, - enabled: true, + enabled: config.APP.auditEnabled, init() { this.start(); diff --git a/app/app/services/browser.js b/app/app/services/browser.js index c42bec2c..b390595c 100644 --- a/app/app/services/browser.js +++ b/app/app/services/browser.js @@ -19,15 +19,15 @@ export default Ember.Service.extend({ }, setTitle(title) { - document.title = title + " | " + this.get('sessionService').appMeta.title; + document.title = title + " | " + this.get('sessionService.appMeta.title'); }, setTitleReverse(title) { - document.title = this.get('sessionService').appMeta.title + " | " + title; + document.title = this.get('sessionService.appMeta.title') + " | " + title; }, setTitleAsPhrase(title) { - document.title = this.get('sessionService').appMeta.title + " " + title; + document.title = this.get('sessionService.appMeta.title') + " " + title; }, setTitleWithoutSuffix(title) { @@ -38,7 +38,7 @@ export default Ember.Service.extend({ $('meta[name=description]').remove(); if (is.null(description) || is.undefined(description)) { - description = this.get('sessionService').appMeta.message; + description = this.get('sessionService.appMeta.message'); } $('head').append(''); diff --git a/app/app/services/document.js b/app/app/services/document.js index dc230af9..f5c3c871 100644 --- a/app/app/services/document.js +++ b/app/app/services/document.js @@ -1,11 +1,11 @@ // Copyright 2016 Documize Inc. . All rights reserved. // -// This software (Documize Community Edition) is licensed under +// This software (Documize Community Edition) is licensed under // GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html // // You can operate outside the AGPL restrictions by purchasing // Documize Enterprise Edition and obtaining a commercial license -// by contacting . +// by contacting . // // https://documize.com @@ -14,50 +14,37 @@ import models from '../utils/model'; export default Ember.Service.extend({ sessionService: Ember.inject.service('session'), + ajax: Ember.inject.service(), // Returns document model for specified document id. getDocument(documentId) { let url = this.get('sessionService').appMeta.getUrl(`documents/${documentId}`); - return new Ember.RSVP.Promise(function(resolve, reject) { - $.ajax({ - url: url, - type: 'GET', - success: function(response) { - let doc = models.DocumentModel.create(response); - resolve(doc); - }, - error: function(reason) { - reject(reason); - } - }); + return this.get('ajax').request(url, { + method: "GET" + }).then((response) => { + return models.DocumentModel.create(response); }); }, // Returns all documents for specified folder. 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) { - $.ajax({ - url: url, - type: 'GET', - success: function(response) { - let documents = Ember.ArrayProxy.create({ - content: Ember.A([]) - }); - - _.each(response, function(doc) { - let documentModel = models.DocumentModel.create(doc); - documents.pushObject(documentModel); - }); - - resolve(documents); - }, - error: function(reason) { - reject(reason); - } + return this.get('ajax').request(url, { + method: "GET" + }).then((response) => { + let documents = Ember.ArrayProxy.create({ + content: Ember.A([]) }); + + _.each(response, function(doc) { + let documentModel = models.DocumentModel.create(doc); + documents.pushObject(documentModel); + }); + + return documents; }); }, @@ -65,26 +52,19 @@ export default Ember.Service.extend({ getAllByTag(tag) { let url = this.get('sessionService').appMeta.getUrl(`documents?filter=tag&tag=${tag}`); - return new Ember.RSVP.Promise(function(resolve, reject) { - $.ajax({ - url: url, - type: 'GET', - success: function(response) { - let documents = Ember.ArrayProxy.create({ - content: Ember.A([]) - }); - - _.each(response, function(doc) { - let documentModel = models.DocumentModel.create(doc); - documents.pushObject(documentModel); - }); - - resolve(documents); - }, - error: function(reason) { - reject(reason); - } + return this.get('ajax').request(url, { + method: "GET" + }).then((response) => { + let documents = Ember.ArrayProxy.create({ + content: Ember.A([]) }); + + _.each(response, function(doc) { + let documentModel = models.DocumentModel.create(doc); + documents.pushObject(documentModel); + }); + + return documents; }); }, @@ -93,371 +73,209 @@ export default Ember.Service.extend({ let id = doc.get('id'); let url = this.get('sessionService').appMeta.getUrl(`documents/${id}`); - return new Ember.RSVP.Promise(function(resolve, reject) { - $.ajax({ - url: url, - type: 'PUT', - data: JSON.stringify(doc), - contentType: 'json', - success: function(response) { - resolve(response); - }, - error: function(reason) { - reject(reason); - } - }); + return this.get('ajax').request(url, { + method: 'PUT', + data: JSON.stringify(doc) }); }, 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) { - $.ajax({ - url: self.get('sessionService').appMeta.getUrl("documents/" + documentId + "/pages/batch"), - type: 'POST', - data: payload, - success: function(pages) { - if (is.not.array(pages)) { - pages = []; - } + return this.get('ajax').request(url, { + method: 'POST', + data: payload + }).then((pages) => { + if (is.not.array(pages)) { + pages = []; + } - resolve(pages); - }, - error: function(reason) { - reject(reason); - } - }); + return pages; }); }, 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) { - $.ajax({ - url: self.get('sessionService').appMeta.getUrl("documents/" + documentId + "/pages/sequence"), - type: 'POST', - data: JSON.stringify(payload), - contentType: 'json', - success: function(response) { - resolve(response); - }, - error: function(reason) { - reject(reason); - } - }); + return this.get('ajax').post(url, { + data: JSON.stringify(payload), + contentType: 'json' }); }, 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) { - $.ajax({ - url: self.get('sessionService').appMeta.getUrl("documents/" + documentId + "/pages/level"), - type: 'POST', - data: JSON.stringify(payload), - contentType: 'json', - success: function(response) { - resolve(response); - }, - error: function(reason) { - reject(reason); - } - }); + return this.get('ajax').post(url, { + data: JSON.stringify(payload), + contentType: 'json' }); }, deleteDocument: function(documentId) { - var self = this; + let url = this.get('sessionService').appMeta.getUrl("documents/" + documentId); - return new Ember.RSVP.Promise(function(resolve, reject) { - $.ajax({ - url: self.get('sessionService').appMeta.getUrl("documents/" + documentId), - type: 'DELETE', - success: function(response) { - resolve(response); - }, - error: function(reason) { - reject(reason); - } - }); + return this.get('ajax').request(url, { + method: 'DELETE' }); }, updatePage: function(documentId, pageId, payload, skipRevision) { - var self = this; 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) { - $.ajax({ - url: self.get('sessionService').appMeta.getUrl("documents/" + documentId + "/pages/" + pageId + revision), - type: 'PUT', - data: JSON.stringify(payload), - contentType: 'json', - success: function(response) { - resolve(response); - }, - error: function(reason) { - reject(reason); - } - }); + return this.get('ajax').request(url, { + method: 'PUT', + data: JSON.stringify(payload), + contentType: 'json' }); }, // addPage inserts new page to an existing document. 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) { - $.ajax({ - url: self.get('sessionService').appMeta.getUrl("documents/" + documentId + "/pages"), - type: 'POST', - data: JSON.stringify(payload), - contentType: 'json', - success: function(response) { - resolve(response); - }, - error: function(reason) { - reject(reason); - } - }); + return this.get('ajax').post(url, { + data: JSON.stringify(payload), + contentType: 'json' }); }, // Nukes multiple pages from the document. 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) { - $.ajax({ - url: self.get('sessionService').appMeta.getUrl("documents/" + documentId + "/pages/" + pageId), - type: 'POST', - data: JSON.stringify(payload), - success: function(response) { - resolve(response); - }, - error: function(reason) { - reject(reason); - } - }); + return this.get('ajax').post(url, { + data: JSON.stringify(payload), + contentType: 'json' }); }, // Nukes a single page from the document. 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) { - $.ajax({ - url: self.get('sessionService').appMeta.getUrl("documents/" + documentId + "/pages/" + pageId), - type: 'DELETE', - success: function(response) { - resolve(response); - }, - error: function(reason) { - reject(reason); - } - }); + return this.get('ajax').request(url, { + method: 'DELETE' }); }, 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) { - $.ajax({ - url: self.get('sessionService').appMeta.getUrl("documents/" + documentId + "/pages/" + pageId + "/revisions"), - type: 'GET', - success: function(response) { - resolve(response); - }, - error: function(reason) { - reject(reason); - } - }); + return this.get('ajax').request(url, { + method: "GET" }); }, 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) { - $.ajax({ - url: self.get('sessionService').appMeta.getUrl("documents/" + documentId + "/pages/" + pageId + "/revisions/" + revisionId), - type: 'GET', - dataType: 'text', - success: function(response) { - resolve(response); - }, - error: function(reason) { - reject(reason); - } - }); + return this.get('ajax').request(url, { + method: "GET", + dataType: 'text' }); }, 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) { - $.ajax({ - url: self.get('sessionService').appMeta.getUrl("documents/" + documentId + "/pages/" + pageId + "/revisions/" + revisionId), - type: 'POST', - success: function(response) { - resolve(response); - }, - error: function(reason) { - reject(reason); - } - }); + return this.get('ajax').request(url, { + method: "POST" }); }, // document meta referes to number of views, edits, approvals, etc. getMeta(documentId) { - let self = this; + let url = this.get('sessionService').appMeta.getUrl(`documents/${documentId}/meta`); - return new Ember.RSVP.Promise(function(resolve, reject) { - $.ajax({ - url: self.get('sessionService').appMeta.getUrl(`documents/${documentId}/meta`), - type: 'GET', - success: function(response) { - resolve(response); - }, - error: function(reason) { - reject(reason); - } - }); + return this.get('ajax').request(url, { + method: "GET" }); }, // Returns all pages without the content 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) { - $.ajax({ - url: self.get('sessionService').appMeta.getUrl(`documents/${documentId}/pages?content=0`), - type: 'GET', - success: function(response) { - let data = []; - _.each(response, function(obj) { - data.pushObject(models.PageModel.create(obj)); - }); - resolve(data); - }, - error: function(reason) { - reject(reason); - } + return this.get('ajax').request(url, { + method: 'GET' + }).then((response) => { + let data = []; + _.each(response, function(obj) { + data.pushObject(models.PageModel.create(obj)); }); + + return data; }); }, // Returns all document pages with content getPages(documentId) { - let self = this; + let url = this.get('sessionService').appMeta.getUrl(`documents/${documentId}/pages`); - return new Ember.RSVP.Promise(function(resolve, reject) { - $.ajax({ - url: self.get('sessionService').appMeta.getUrl(`documents/${documentId}/pages`), - type: 'GET', - success: function(response) { - let pages = []; + return this.get('ajax').request(url, { + method: 'GET' + }).then((response) => { + let pages = []; - _.each(response, function(page) { - pages.pushObject(models.PageModel.create(page)); - }); - - if (pages.length > 0) { - Ember.set(pages[0], 'firstPage', true); - } - - resolve(pages); - }, - error: function(reason) { - reject(reason); - } + _.each(response, function(page) { + pages.pushObject(models.PageModel.create(page)); }); + + if (pages.length > 0) { + Ember.set(pages[0], 'firstPage', true); + } + + return pages; }); }, // Returns document page with content 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) { - $.ajax({ - url: self.get('sessionService').appMeta.getUrl(`documents/${documentId}/pages/${pageId}`), - type: 'GET', - success: function(response) { - let page = models.PageModel.create(response); - resolve(page); - }, - error: function(reason) { - reject(reason); - } - }); + return this.get('ajax').request(url, { + method: 'GET' + }).then((response) => { + let page = models.PageModel.create(response); + return page; }); }, // Returns document page meta object 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) { - $.ajax({ - url: self.get('sessionService').appMeta.getUrl(`documents/${documentId}/pages/${pageId}/meta`), - type: 'GET', - success: function(response) { - let meta = models.PageMetaModel.create(response); - resolve(meta); - }, - error: function(reason) { - reject(reason); - } - }); + return this.get('ajax').request(url, { + method: 'GET' + }).then((response) => { + let meta = models.PageMetaModel.create(response); + return meta; }); }, // document attachments without the actual content getAttachments(documentId) { - let self = this; + let url = this.get('sessionService').appMeta.getUrl(`documents/${documentId}/attachments`); - return new Ember.RSVP.Promise(function(resolve, reject) { - $.ajax({ - url: self.get('sessionService').appMeta.getUrl(`documents/${documentId}/attachments`), - type: 'GET', - success: function(response) { - let data = []; - _.each(response, function(obj) { - data.pushObject(models.AttachmentModel.create(obj)); - }); - resolve(data); - }, - error: function(reason) { - reject(reason); - } + return this.get('ajax').request(url, { + method: 'GET' + }).then((response) => { + let data = []; + _.each(response, function(obj) { + data.pushObject(models.AttachmentModel.create(obj)); }); + return data; }); }, // nuke an attachment 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) { - $.ajax({ - url: self.get('sessionService').appMeta.getUrl(`documents/${documentId}/attachments/${attachmentId}`), - type: 'DELETE', - success: function(response) { - resolve(response); - }, - error: function(reason) { - reject(reason); - } - }); + return this.get('ajax').request(url, { + method: 'DELETE' }); }, -}); \ No newline at end of file +}); diff --git a/app/app/services/folder.js b/app/app/services/folder.js index b0ed6b18..5e8ab247 100644 --- a/app/app/services/folder.js +++ b/app/app/services/folder.js @@ -1,11 +1,11 @@ // Copyright 2016 Documize Inc. . All rights reserved. // -// This software (Documize Community Edition) is licensed under +// This software (Documize Community Edition) is licensed under // GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html // // You can operate outside the AGPL restrictions by purchasing // Documize Enterprise Edition and obtaining a commercial license -// by contacting . +// by contacting . // // https://documize.com @@ -15,6 +15,7 @@ import BaseService from '../services/base'; export default BaseService.extend({ sessionService: Ember.inject.service('session'), + ajax: Ember.inject.service(), // selected folder currentFolder: null, @@ -22,41 +23,28 @@ export default BaseService.extend({ // Add a new 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) { - $.ajax({ - url: url, - type: 'POST', - data: JSON.stringify(folder), - contentType: 'json', - success: function(folder) { - let folderModel = models.FolderModel.create(folder); - resolve(folderModel); - }, - error: function(reason) { - reject(reason); - } - }); + return this.get('ajax').post(url, { + contentType: 'json', + data: JSON.stringify(folder) + }).then((folder)=>{ + let folderModel = models.FolderModel.create(folder); + return folderModel; }); }, // Returns folder model for specified folder 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) { - $.ajax({ - url: url, - type: 'GET', - success: function(response) { - let folder = models.FolderModel.create(response); - resolve(folder); - }, - error: function(reason) { - reject(reason); - } - }); + return this.get('ajax').request(url, { + method: 'GET' + }).then((response)=>{ + let folder = models.FolderModel.create(response); + return folder; }); }, @@ -78,57 +66,27 @@ export default BaseService.extend({ let id = folder.get('id'); let url = this.get('sessionService').appMeta.getUrl(`folders/${id}`); - return new Ember.RSVP.Promise(function(resolve, reject) { - $.ajax({ - url: url, - type: 'PUT', - data: JSON.stringify(folder), - contentType: 'json', - success: function(response) { - resolve(response); - }, - error: function(reason) { - reject(reason); - } - }); + return this.get('ajax').request(url, { + method: 'PUT', + contentType: 'json', + data: JSON.stringify(folder) }); }, remove: function(folderId, moveToId) { - var self = this; - var url = self.get('sessionService').appMeta.getUrl('folders/' + folderId + "/move/" + moveToId); + var url = this.get('sessionService').appMeta.getUrl('folders/' + folderId + "/move/" + moveToId); - return new Ember.RSVP.Promise(function(resolve, reject) { - $.ajax({ - url: url, - type: 'DELETE', - success: function(response) { - resolve(response); - }, - error: function(reason) { - reject(reason); - } - }); + return this.get('ajax').request(url, { + method: 'DELETE' }); }, onboard: function(folderId, payload) { - var self = this; - var url = self.get('sessionService').appMeta.getUrl('public/share/' + folderId); + var url = this.get('sessionService').appMeta.getUrl('public/share/' + folderId); - return new Ember.RSVP.Promise(function(resolve, reject) { - $.ajax({ - url: url, - type: "POST", - data: payload, - contentType: "application/json", - success: function(response) { - resolve(response); - }, - error: function(reason) { - reject(reason); - } - }); + return this.get('ajax').post(url, { + contentType: "application/json", + data: payload }); }, @@ -136,106 +94,69 @@ export default BaseService.extend({ getProtectedFolderInfo: function() { var url = this.get('sessionService').appMeta.getUrl('folders?filter=viewers'); - return new Ember.RSVP.Promise(function(resolve, reject) { - $.ajax({ - url: url, - type: 'GET', - success: function(response) { - let data = []; - _.each(response, function(obj) { - data.pushObject(models.ProtectedFolderParticipant.create(obj)); - }); - - resolve(data); - }, - error: function(reason) { - reject(reason); - } + return this.get('ajax').request(url, { + method: "GET" + }).then((response)=>{ + let data = []; + _.each(response, function(obj) { + data.pushObject(models.ProtectedFolderParticipant.create(obj)); }); + + return data; }); }, // reloads and caches folders. 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) { - $.ajax({ - url: url, - type: 'GET', - success: function(response) { - let data = []; - _.each(response, function(obj) { - data.pushObject(models.FolderModel.create(obj)); - }); - resolve(data); - }, - error: function(reason) { - reject(reason); - } + return this.get('ajax').request(url, { + method: "GET" + }).then((response)=>{ + let data = []; + _.each(response, function(obj) { + data.pushObject(models.FolderModel.create(obj)); }); + + return data; }); }, // so who can see/edit this folder? getPermissions(folderId) { - let self = this; + let url = this.get('sessionService').appMeta.getUrl(`folders/${folderId}/permissions`); - return new Ember.RSVP.Promise(function(resolve, reject) { - $.ajax({ - url: self.get('sessionService').appMeta.getUrl(`folders/${folderId}/permissions`), - type: 'GET', - success: function(response) { - let data = []; - _.each(response, function(obj) { - data.pushObject(models.FolderPermissionModel.create(obj)); - }); - resolve(data); - }, - error: function(reason) { - reject(reason); - } + return this.get('ajax').request(url, { + method: "GET" + }).then((response)=>{ + let data = []; + _.each(response, function(obj) { + data.pushObject(models.FolderPermissionModel.create(obj)); }); + + return data; }); }, // persist folder permissions savePermissions(folderId, payload) { - let self = this; + let url = this.get('sessionService').appMeta.getUrl(`folders/${folderId}/permissions`); - return new Ember.RSVP.Promise(function(resolve, reject) { - $.ajax({ - url: self.get('sessionService').appMeta.getUrl(`folders/${folderId}/permissions`), - type: 'PUT', - contentType: 'json', - data: JSON.stringify(payload), - success: function(response) { - resolve(response); - }, - error: function(reason) { - reject(reason); - } - }); + return this.get('ajax').request(url, { + method: 'PUT', + contentType: 'json', + data: JSON.stringify(payload) }); }, // share this folder with new users! share(folderId, invitation) { - let self = this; + let url = this.get('sessionService').appMeta.getUrl(`folders/${folderId}/invitation`); - return new Ember.RSVP.Promise(function(resolve, reject) { - $.ajax({ - url: self.get('sessionService').appMeta.getUrl(`folders/${folderId}/invitation`), - type: 'POST', - contentType: 'json', - data: JSON.stringify(invitation), - success: function(response) { - resolve(response); - }, - error: function(reason) { - reject(reason); - } - }); + return this.get('ajax').post(url, { + contentType: 'json', + data: JSON.stringify(invitation) }); }, @@ -255,42 +176,38 @@ export default BaseService.extend({ } let url = this.get('sessionService').appMeta.getUrl('users/' + userId + "/permissions"); - let self = this; - $.ajax({ - url: url, - type: 'GET', - success: function(folderPermissions) { - // safety check - self.set('canEditCurrentFolder', false); + return this.get('ajax').request(url).then((folderPermissions) => { + // safety check + this.set('canEditCurrentFolder', false); - if (folderPermissions.length === 0) { - return; + if (folderPermissions.length === 0) { + return; + } + + let result = []; + let folderId = folder.get('id'); + + folderPermissions.forEach(function(item) { + if (item.folderId === folderId) { + result.push(item); + } + }); + + let canEdit = false; + + result.forEach(function(permission) { + if (permission.userId === userId) { + canEdit = permission.canEdit; } - let result = []; - let folderId = folder.get('id'); - - folderPermissions.forEach(function(item) { - if (item.folderId === folderId) { - result.push(item); - } - }); - - let canEdit = false; - - result.forEach(function(permission) { - if (permission.userId === userId) { - canEdit = permission.canEdit; - } - - if (permission.userId === "" && !canEdit) { - canEdit = permission.canEdit; - } - }); - - self.set('canEditCurrentFolder', canEdit && self.get('sessionService').authenticated); - } + if (permission.userId === "" && !canEdit) { + canEdit = permission.canEdit; + } + }); + Ember.run(() => { + this.set('canEditCurrentFolder', canEdit && this.get('sessionService').authenticated); + }); }); }, -}); \ No newline at end of file +}); diff --git a/app/app/services/organization.js b/app/app/services/organization.js index 24ee457e..ba3d8964 100644 --- a/app/app/services/organization.js +++ b/app/app/services/organization.js @@ -1,11 +1,11 @@ // Copyright 2016 Documize Inc. . All rights reserved. // -// This software (Documize Community Edition) is licensed under +// This software (Documize Community Edition) is licensed under // GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html // // You can operate outside the AGPL restrictions by purchasing // Documize Enterprise Edition and obtaining a commercial license -// by contacting . +// by contacting . // // https://documize.com @@ -14,23 +14,17 @@ import models from '../utils/model'; export default Ember.Service.extend({ sessionService: Ember.inject.service('session'), + ajax: Ember.inject.service(), // Returns attributes for specified org id. getOrg(id) { let url = this.get('sessionService').appMeta.getUrl(`organizations/${id}`); - return new Ember.RSVP.Promise(function(resolve, reject) { - $.ajax({ - url: url, - type: 'GET', - success: function(response) { - let org = models.OrganizationModel.create(response); - resolve(org); - }, - error: function(reason) { - reject(reason); - } - }); + return this.get('ajax').request(url, { + method: 'GET' + }).then((response) =>{ + let org = models.OrganizationModel.create(response); + return org; }); }, @@ -43,19 +37,9 @@ export default Ember.Service.extend({ this.get('sessionService').get('appMeta').setSafe('message', org.message); this.get('sessionService').get('appMeta').setSafe('title', org.title); - return new Ember.RSVP.Promise(function(resolve, reject) { - $.ajax({ - url: url, - type: 'PUT', - data: JSON.stringify(org), - contentType: 'json', - success: function(response) { - resolve(response); - }, - error: function(reason) { - reject(reason); - } - }); + return this.get('ajax').request(url, { + method: 'PUT', + data: JSON.stringify(org) }); } -}); \ No newline at end of file +}); diff --git a/app/app/services/search.js b/app/app/services/search.js index c4f88d92..e2bd5935 100644 --- a/app/app/services/search.js +++ b/app/app/services/search.js @@ -1,11 +1,11 @@ // Copyright 2016 Documize Inc. . All rights reserved. // -// This software (Documize Community Edition) is licensed under +// This software (Documize Community Edition) is licensed under // GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html // // You can operate outside the AGPL restrictions by purchasing // Documize Enterprise Edition and obtaining a commercial license -// by contacting . +// by contacting . // // https://documize.com @@ -13,22 +13,14 @@ import Ember from 'ember'; export default Ember.Service.extend({ sessionService: Ember.inject.service('session'), + ajax: Ember.inject.service(), // getUsers returns all users for organization. find(keywords) { let url = this.get('sessionService').appMeta.getUrl("search?keywords=" + encodeURIComponent(keywords)); - return new Ember.RSVP.Promise(function(resolve, reject) { - $.ajax({ - url: url, - type: 'GET', - success: function(response) { - resolve(response); - }, - error: function(reason) { - reject(reason); - } - }); + return this.get('ajax').request(url, { + method: "GET" }); }, -}); \ No newline at end of file +}); diff --git a/app/app/services/section.js b/app/app/services/section.js index b7da9c7c..cdb2e131 100644 --- a/app/app/services/section.js +++ b/app/app/services/section.js @@ -1,11 +1,11 @@ // Copyright 2016 Documize Inc. . All rights reserved. // -// This software (Documize Community Edition) is licensed under +// This software (Documize Community Edition) is licensed under // GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html // // You can operate outside the AGPL restrictions by purchasing // Documize Enterprise Edition and obtaining a commercial license -// by contacting . +// by contacting . // // https://documize.com @@ -15,26 +15,21 @@ import BaseService from '../services/base'; export default BaseService.extend({ sessionService: Ember.inject.service('session'), + ajax: Ember.inject.service(), // Returns all available sections. getAll() { let url = this.get('sessionService').appMeta.getUrl(`sections`); - return new Ember.RSVP.Promise(function(resolve, reject) { - $.ajax({ - url: url, - type: 'GET', - success: function(response) { - let data = []; - _.each(response, function(obj) { - data.pushObject(models.SectionModel.create(obj)); - }); - resolve(data); - }, - error: function(reason) { - reject(reason); - } + return this.get('ajax').request(url,{ + method: 'GET' + }).then((response)=>{ + let data = []; + _.each(response, function(obj) { + data.pushObject(models.SectionModel.create(obj)); }); + + return data; }); }, @@ -46,19 +41,9 @@ export default BaseService.extend({ let endpoint = `sections?documentID=${documentId}§ion=${section}&method=${method}`; let url = this.get('sessionService').appMeta.getUrl(endpoint); - return new Ember.RSVP.Promise(function(resolve, reject) { - $.ajax({ - url: url, - type: 'POST', - data: JSON.stringify(data), - contentType: "application/json", - success: function(response) { - resolve(response); - }, - error: function(reason) { - reject(reason); - } - }); + return this.get('ajax').post(url, { + data: JSON.stringify(data), + contentType: "application/json" }); }, @@ -66,26 +51,18 @@ export default BaseService.extend({ refresh(documentId) { let url = this.get('sessionService').appMeta.getUrl(`sections/refresh?documentID=${documentId}`); - return new Ember.RSVP.Promise(function(resolve, reject) { - $.ajax({ - url: url, - type: 'GET', - success: function(response) { - // resolve(response); - let pages = []; + return this.get('ajax').request(url, { + method: 'GET' + }).then((response)=>{ + let pages = []; - if (is.not.null(response) && is.array(response) && response.length > 0) { - _.each(response, function(page) { - pages.pushObject(models.PageModel.create(page)); - }); - } + if (is.not.null(response) && is.array(response) && response.length > 0) { + _.each(response, function(page) { + pages.pushObject(models.PageModel.create(page)); + }); + } - resolve(pages); - }, - error: function(reason) { - reject(reason); - } - }); + return pages; }); } -}); \ No newline at end of file +}); diff --git a/app/app/services/session.js b/app/app/services/session.js index 818d6f6a..1de1fa04 100644 --- a/app/app/services/session.js +++ b/app/app/services/session.js @@ -24,6 +24,7 @@ export default Ember.Service.extend({ authenticated: false, folderPermissions: null, currentFolder: null, + ajax: Ember.inject.service(), isAdmin: function() { if (this.authenticated && is.not.null(this.user) && this.user.id !== "") { @@ -50,68 +51,48 @@ export default Ember.Service.extend({ // Authentication login: function(credentials) { - var self = this; - var url = self.appMeta.getUrl('public/authenticate'); + let url = this.appMeta.getUrl('public/authenticate'); let domain = netUtil.getSubdomain(); this.clearSession(); - return new Ember.RSVP.Promise(function(resolve, reject) { - if (is.empty(credentials.email) || is.empty(credentials.password)) { - reject("invalid"); - return; - } + 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 header = { - 'Authorization': 'Basic ' + encoded - }; + var encoded = encodingUtil.Base64.encode(domain + ":" + credentials.email + ":" + credentials.password); + var headers = { + 'Authorization': 'Basic ' + encoded + }; - $.ajax({ - url: url, - type: 'POST', - headers: header, - success: function(response) { - self.setSession(response.token, models.UserModel.create(response.user)); - self.get('ready', true); - resolve(response); - }, - error: function(reason) { - reject(reason); - } - }); + 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 in the form of 'domain:email:password' sso: function(credentials) { - var self = this; - var url = self.appMeta.getUrl('public/authenticate'); + let url = this.appMeta.getUrl('public/authenticate'); this.clearSession(); - return new Ember.RSVP.Promise(function(resolve, reject) { - if (is.empty(credentials.email) || is.empty(credentials.password)) { - reject("invalid"); - return; - } + if (is.empty(credentials.email) || is.empty(credentials.password)) { + return Ember.RSVP.reject("invalid"); + } - var header = { - 'Authorization': 'Basic ' + credentials - }; + var headers = { + 'Authorization': 'Basic ' + credentials + }; - $.ajax({ - url: url, - type: 'POST', - headers: header, - success: function(response) { - self.setSession(response.token, models.UserModel.create(response.user)); - self.get('ready', true); - resolve(response); - }, - error: function(reason) { - reject(reason); - } - }); + return this.get('ajax').post(url, { + headers + }).then((response)=>{ + this.setSession(response.token, models.UserModel.create(response.user)); + this.get('ready', true); + return response; }); }, @@ -192,51 +173,35 @@ export default Ember.Service.extend({ // this.set('popupBlocked', false); // } - return new Ember.RSVP.Promise(function(resolve) { - $.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 url = this.get('appMeta').getUrl("public/meta"); - 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); - if (is.not.undefined(token)) { - // We now validate current token - let tokenCheckUrl = self.get('appMeta').getUrl(`public/validate?token=${token}`); + let token = this.getSessionItem('token'); - $.ajax({ - url: tokenCheckUrl, - type: 'GET', - contentType: 'json', - success: function(user) { - self.setSession(token, models.UserModel.create(user)); - self.set('ready', true); - resolve(); - }, - error: function(reason) { - if (reason.status === 401 || reason.status === 403) { - localStorage.clear(); - window.location.href = "/auth/login"; - } - } - }); - } else { - self.set('ready', true); - resolve(); - } - }, - error: function(reason) { + 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) { - window.location.href = "https://documize.com"; + localStorage.clear(); + window.location.href = "/auth/login"; } - } - }); + }); + } }); } -}); \ No newline at end of file +}); diff --git a/app/app/services/template.js b/app/app/services/template.js index 471d6eee..86b48c9e 100644 --- a/app/app/services/template.js +++ b/app/app/services/template.js @@ -1,11 +1,11 @@ // Copyright 2016 Documize Inc. . All rights reserved. // -// This software (Documize Community Edition) is licensed under +// This software (Documize Community Edition) is licensed under // GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html // // You can operate outside the AGPL restrictions by purchasing // Documize Enterprise Edition and obtaining a commercial license -// by contacting . +// by contacting . // // https://documize.com @@ -14,85 +14,53 @@ import models from '../utils/model'; export default Ember.Service.extend({ sessionService: Ember.inject.service('session'), + ajax: Ember.inject.service(), importStockTemplate: function(folderId, templateId) { - let self = this; - return new Ember.RSVP.Promise(function(resolve, reject) { - $.ajax({ - url: self.get('sessionService').appMeta.getUrl("templates/" + templateId + "/folder/" + folderId + "?type=stock"), - type: 'POST', - success: function(response) { - resolve(response); - }, - error: function(reason) { - reject(reason); - } - }); + let url = this.get('sessionService').appMeta.getUrl("templates/" + templateId + "/folder/" + folderId + "?type=stock"); + + return this.get('ajax').request(url, { + method: "POST" }); }, 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) { - $.ajax({ - url: self.get('sessionService').appMeta.getUrl("templates/" + templateId + "/folder/" + folderId + "?type=saved"), - type: 'POST', - success: function(doc) { - let docModel = models.DocumentModel.create(doc); - resolve(docModel); - }, - error: function(reason) { - reject(reason); - } - }); + return this.get('ajax').post(url).then((doc)=>{ + let docModel = models.DocumentModel.create(doc); + return docModel; }); }, getSavedTemplates() { - let self = this; + let url = this.get('sessionService').appMeta.getUrl("templates"); - return new Ember.RSVP.Promise(function(resolve, reject) { - $.ajax({ - url: self.get('sessionService').appMeta.getUrl("templates"), - type: 'GET', - success: function(response) { - if (is.not.array(response)) { - response = []; - } - let templates = Ember.ArrayProxy.create({ - content: Ember.A([]) - }); - - _.each(response, function(template) { - let templateModel = models.TemplateModel.create(template); - templates.pushObject(templateModel); - }); - - resolve(templates); - }, - error: function(reason) { - reject(reason); - } + return this.get('ajax').request(url, { + method: 'GET' + }).then((response) => { + if (is.not.array(response)) { + response = []; + } + let templates = Ember.ArrayProxy.create({ + content: Ember.A([]) }); + + _.each(response, function(template) { + let templateModel = models.TemplateModel.create(template); + templates.pushObject(templateModel); + }); + + return templates; }); }, getStockTemplates() { - let self = this; + let url = this.get('sessionService').appMeta.getUrl("templates/stock"); - return new Ember.RSVP.Promise(function(resolve, reject) { - $.ajax({ - url: self.get('sessionService').appMeta.getUrl("templates/stock"), - type: 'GET', - success: function(response) { - resolve(response); - }, - error: function(reason) { - reject(reason); - } - }); + return this.get('ajax').request(url, { + method: 'GET' }); } -}); \ No newline at end of file +}); diff --git a/app/app/services/user.js b/app/app/services/user.js index 186d863a..d6a39b07 100644 --- a/app/app/services/user.js +++ b/app/app/services/user.js @@ -1,11 +1,11 @@ // Copyright 2016 Documize Inc. . All rights reserved. // -// This software (Documize Community Edition) is licensed under +// This software (Documize Community Edition) is licensed under // GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html // // You can operate outside the AGPL restrictions by purchasing // Documize Enterprise Edition and obtaining a commercial license -// by contacting . +// by contacting . // // https://documize.com @@ -14,24 +14,18 @@ import models from '../utils/model'; export default Ember.Service.extend({ sessionService: Ember.inject.service('session'), + ajax: Ember.inject.service(), // Adds a new user. add(user) { let url = this.get('sessionService').appMeta.getUrl(`users`); - return new Ember.RSVP.Promise(function(resolve, reject) { - $.ajax({ - url: url, - type: 'POST', - data: JSON.stringify(user), - contentType: 'json', - success: function(response) { - resolve(models.UserModel.create(response)); - }, - error: function(reason) { - reject(reason); - } - }); + return this.get('ajax').request(url, { + type: 'POST', + data: JSON.stringify(user), + contentType: 'json' + }).then(function(response){ + return models.UserModel.create(response); }); }, @@ -39,17 +33,10 @@ export default Ember.Service.extend({ getUser(userId) { let url = this.get('sessionService').appMeta.getUrl(`users/${userId}`); - return new Ember.RSVP.Promise(function(resolve, reject) { - $.ajax({ - url: url, - type: 'GET', - success: function(response) { - resolve(models.UserModel.create(response)); - }, - error: function(reason) { - reject(reason); - } - }); + return this.get('ajax').request(url, { + type: 'GET' + }).then((response) => { + return models.UserModel.create(response); }); }, @@ -57,21 +44,9 @@ export default Ember.Service.extend({ getAll() { let url = this.get('sessionService').appMeta.getUrl(`users`); - return new Ember.RSVP.Promise(function(resolve, reject) { - $.ajax({ - url: url, - type: 'GET', - success: function(response) { - let data = []; - _.each(response, function(obj) { - data.pushObject(models.UserModel.create(obj)); - }); - - resolve(data); - }, - error: function(reason) { - reject(reason); - } + return this.get('ajax').request(url).then((response) => { + return response.map(function(obj){ + return models.UserModel.create(obj); }); }); }, @@ -80,22 +55,15 @@ export default Ember.Service.extend({ getFolderUsers(folderId) { let url = this.get('sessionService').appMeta.getUrl(`users/folder/${folderId}`); - return new Ember.RSVP.Promise(function(resolve, reject) { - $.ajax({ - url: url, - type: 'GET', - success: function(response) { - let data = []; - _.each(response, function(obj) { - data.pushObject(models.UserModel.create(obj)); - }); - - resolve(data); - }, - error: function(reason) { - reject(reason); - } + return this.get('ajax').request(url, { + method: "GET" + }).then((response)=>{ + let data = []; + _.each(response, function(obj) { + data.pushObject(models.UserModel.create(obj)); }); + + return data; }); }, @@ -104,19 +72,10 @@ export default Ember.Service.extend({ let userId = user.get('id'); let url = this.get('sessionService').appMeta.getUrl(`users/${userId}`); - return new Ember.RSVP.Promise(function(resolve, reject) { - $.ajax({ - url: url, - type: 'PUT', - data: JSON.stringify(user), - contentType: 'json', - success: function(response) { - resolve(response); - }, - error: function(reason) { - reject(reason); - } - }); + return this.get('ajax').request(url, { + type: 'PUT', + data: JSON.stringify(user), + contentType: 'json' }); }, @@ -124,18 +83,8 @@ export default Ember.Service.extend({ updatePassword(userId, password) { let url = this.get('sessionService').appMeta.getUrl(`users/${userId}/password`); - return new Ember.RSVP.Promise(function(resolve, reject) { - $.ajax({ - url: url, - type: 'POST', - data: password, - success: function(response) { - resolve(response); - }, - error: function(reason) { - reject(reason); - } - }); + return this.get('ajax').post(url, { + data: password }); }, @@ -143,46 +92,27 @@ export default Ember.Service.extend({ remove(userId) { let url = this.get('sessionService').appMeta.getUrl(`users/${userId}`); - return new Ember.RSVP.Promise(function(resolve, reject) { - $.ajax({ - url: url, - type: 'DELETE', - success: function(response) { - resolve(response); - }, - error: function(reason) { - reject(reason); - } - }); + return this.get('ajax').request(url, { + method: 'DELETE' }); }, // Request password reset. 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)) { - reject("invalid"); - return; - } + if (is.empty(email)) { + return Ember.RSVP.reject("invalid"); + } - var data = JSON.stringify({ - Email: email - }); + let data = JSON.stringify({ + Email: email + }); - $.ajax({ - url: url, - type: 'POST', - dataType: 'json', - data: data, - success: function(response) { - resolve(response); - }, - error: function(reason) { - reject(reason); - } - }); + return this.get('ajax').request(url, { + method: 'POST', + dataType: 'json', + data: data }); }, @@ -190,23 +120,13 @@ export default Ember.Service.extend({ resetPassword(token, password) { 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)) { - reject("invalid"); - return; - } + if (is.empty(token) || is.empty(password)) { + return Ember.RSVP.reject("invalid"); + } - $.ajax({ - url: url, - type: 'POST', - data: password, - success: function(response) { - resolve(response); - }, - error: function(reason) { - reject(reason); - } - }); + return this.get('ajax').request(url, { + method: "POST", + data: password }); } -}); \ No newline at end of file +}); diff --git a/app/bower.json b/app/bower.json index b17f0403..ba2ada57 100644 --- a/app/bower.json +++ b/app/bower.json @@ -8,7 +8,10 @@ "jquery": "*", "loader.js": "^3.5.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": { "jquery": ">=2.1.1", diff --git a/app/config/environment.js b/app/config/environment.js index 77f0ac3b..564eeea7 100644 --- a/app/config/environment.js +++ b/app/config/environment.js @@ -15,7 +15,7 @@ module.exports = function(environment) { var ENV = { modulePrefix: 'documize', podModulePrefix: 'documize/pods', - locationType: 'history', + locationType: 'auto', environment: environment, baseURL: '/', apiHost: '', @@ -25,12 +25,21 @@ module.exports = function(environment) { EmberENV: { FEATURES: {} }, - APP: {} + "ember-cli-mirage": { + enabled: false + }, + APP: { + // Allows to disable audit service in tests + auditEnabled: true + } }; if (environment === 'development') { ENV.APP.LOG_TRANSITIONS = true; ENV.APP.LOG_TRANSITIONS_INTERNAL = true; + ENV['ember-cli-mirage'] = { + enabled: false + }; ENV.apiHost = "https://localhost:5001"; // ENV.apiHost = "https://demo1.dev:5001"; @@ -42,15 +51,16 @@ module.exports = function(environment) { ENV.APP.LOG_VIEW_LOOKUPS = false; // ENV.APP.LOG_TRANSITIONS = false; // ENV.APP.LOG_TRANSITIONS_INTERNAL = false; - ENV.APP.LOG_TRANSITIONS = true; - ENV.APP.LOG_TRANSITIONS_INTERNAL = true; - // ENV.baseURL = '/'; - // ENV.locationType = 'none'; - // ENV.APP.rootElement = '#ember-testing'; + ENV.baseURL = '/'; + ENV.locationType = 'none'; + ENV.APP.rootElement = '#ember-testing'; + ENV['ember-cli-mirage'] = { + enabled: true + }; + ENV.APP.auditEnabled = false; ENV.apiHost = "https://localhost:5001"; - // ENV.apiHost = "https://demo1.dev:5001"; } if (environment === 'production') { diff --git a/app/ember-cli-build.js b/app/ember-cli-build.js index 2e634c8b..7f2cfe05 100644 --- a/app/ember-cli-build.js +++ b/app/ember-cli-build.js @@ -15,9 +15,6 @@ var isDevelopment = EmberApp.env() === 'development'; module.exports = function(defaults) { var app = new EmberApp(defaults, { - tests: true, - storeConfigInMeta: false, - fingerprint: { enabled: true, extensions: ['js', 'css'], diff --git a/app/package.json b/app/package.json index d3c16066..afab26ad 100644 --- a/app/package.json +++ b/app/package.json @@ -20,7 +20,7 @@ "license": "MIT", "devDependencies": { "broccoli-asset-rev": "^2.4.2", - "ember-ajax": "0.7.1", + "ember-ajax": "2.3.2", "ember-cli": "2.5.0", "ember-cli-app-version": "^1.0.0", "ember-cli-babel": "^5.1.6", @@ -29,6 +29,7 @@ "ember-cli-htmlbars-inline-precompile": "^0.3.1", "ember-cli-inject-live-reload": "^1.4.0", "ember-cli-jshint": "^1.0.0", + "ember-cli-mirage": "0.1.13", "ember-cli-qunit": "^1.4.0", "ember-cli-release": "0.2.8", "ember-cli-sass": "5.3.1", @@ -40,4 +41,4 @@ "ember-resolver": "^2.0.3", "loader.js": "^4.0.1" } -} \ No newline at end of file +} diff --git a/app/tests/.jshintrc b/app/tests/.jshintrc index 4f9f51d8..ce9a4986 100644 --- a/app/tests/.jshintrc +++ b/app/tests/.jshintrc @@ -22,7 +22,16 @@ "andThen", "currentURL", "currentPath", - "currentRouteName" + "currentRouteName", + "stubSession", + "stubAudit", + "pauseTest", + "userLogin", + "skip", + "waitToAppear", + "waitToAppear", + "stubUserNotification", + "is" ], "node": false, "browser": false, diff --git a/app/tests/acceptance/anon-access-disabled-test.js b/app/tests/acceptance/anon-access-disabled-test.js new file mode 100644 index 00000000..5a260c6a --- /dev/null +++ b/app/tests/acceptance/anon-access-disabled-test.js @@ -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'); + }); +}); diff --git a/app/tests/acceptance/anon-access-enabled-test.js b/app/tests/acceptance/anon-access-enabled-test.js new file mode 100644 index 00000000..5ec94855 --- /dev/null +++ b/app/tests/acceptance/anon-access-enabled-test.js @@ -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'); + }); +}); diff --git a/app/tests/acceptance/authentication-test.js b/app/tests/acceptance/authentication-test.js new file mode 100644 index 00000000..2a53d7e0 --- /dev/null +++ b/app/tests/acceptance/authentication-test.js @@ -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'); + }); +}); diff --git a/app/tests/acceptance/documents-space-test.js b/app/tests/acceptance/documents-space-test.js new file mode 100644 index 00000000..ab2a60e9 --- /dev/null +++ b/app/tests/acceptance/documents-space-test.js @@ -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)'); +} diff --git a/app/tests/acceptance/login-test.js b/app/tests/acceptance/login-test.js deleted file mode 100644 index 9ecbe69e..00000000 --- a/app/tests/acceptance/login-test.js +++ /dev/null @@ -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'); - }); -}); \ No newline at end of file diff --git a/app/tests/acceptance/nologin-test.js b/app/tests/acceptance/nologin-test.js deleted file mode 100644 index 5db6fd84..00000000 --- a/app/tests/acceptance/nologin-test.js +++ /dev/null @@ -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 - }); -}); diff --git a/app/tests/acceptance/user-profile-test.js b/app/tests/acceptance/user-profile-test.js new file mode 100644 index 00000000..a0be37c7 --- /dev/null +++ b/app/tests/acceptance/user-profile-test.js @@ -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'); + }); +}); diff --git a/app/tests/acceptance/user-settings-test.js b/app/tests/acceptance/user-settings-test.js new file mode 100644 index 00000000..95328d58 --- /dev/null +++ b/app/tests/acceptance/user-settings-test.js @@ -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)'); +} diff --git a/app/tests/helpers/module-for-acceptance.js b/app/tests/helpers/module-for-acceptance.js index 8c8b74ec..6d6818e0 100644 --- a/app/tests/helpers/module-for-acceptance.js +++ b/app/tests/helpers/module-for-acceptance.js @@ -6,18 +6,28 @@ export default function(name, options = {}) { module(name, { beforeEach() { this.application = startApp(); + stubAudit(this); + stubSession(this); + stubUserNotification(this); if (options.beforeEach) { 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() { + destroyApp(this.application); + if (options.afterEach) { options.afterEach.apply(this, arguments); } - - destroyApp(this.application); } }); } diff --git a/app/tests/helpers/start-app.js b/app/tests/helpers/start-app.js index e098f1d5..024b70d1 100644 --- a/app/tests/helpers/start-app.js +++ b/app/tests/helpers/start-app.js @@ -1,6 +1,12 @@ import Ember from 'ember'; import Application from '../../app'; 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) { let application; diff --git a/app/tests/helpers/stub-audit.js b/app/tests/helpers/stub-audit.js new file mode 100644 index 00000000..2ec9137b --- /dev/null +++ b/app/tests/helpers/stub-audit.js @@ -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)); +}); diff --git a/app/tests/helpers/stub-session.js b/app/tests/helpers/stub-session.js new file mode 100644 index 00000000..85cfa1a9 --- /dev/null +++ b/app/tests/helpers/stub-session.js @@ -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)); +}); diff --git a/app/tests/helpers/stub-user-notification.js b/app/tests/helpers/stub-user-notification.js new file mode 100644 index 00000000..64ae69db --- /dev/null +++ b/app/tests/helpers/stub-user-notification.js @@ -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)); +}); diff --git a/app/tests/helpers/user-login.js b/app/tests/helpers/user-login.js new file mode 100644 index 00000000..dbca8c86 --- /dev/null +++ b/app/tests/helpers/user-login.js @@ -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'); +}); diff --git a/app/tests/helpers/wait-to-appear.js b/app/tests/helpers/wait-to-appear.js new file mode 100644 index 00000000..9292d84c --- /dev/null +++ b/app/tests/helpers/wait-to-appear.js @@ -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); + }); +}); diff --git a/app/tests/helpers/wait-to-disappear.js b/app/tests/helpers/wait-to-disappear.js new file mode 100644 index 00000000..8947e6d8 --- /dev/null +++ b/app/tests/helpers/wait-to-disappear.js @@ -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); + }); +}); diff --git a/app/tests/index.html b/app/tests/index.html index d8285128..87c5d442 100644 --- a/app/tests/index.html +++ b/app/tests/index.html @@ -6,15 +6,25 @@ Documize Tests - {{content-for "head"}} {{content-for "test-head"}} + + + + + + {{content-for "head"}} + {{content-for "test-head"}} - {{content-for "head-footer"}} {{content-for "test-head-footer"}} + + + {{content-for "head-footer"}} + {{content-for "test-head-footer"}} - {{content-for "body"}} {{content-for "test-body"}} + {{content-for "body"}} + {{content-for "test-body"}} @@ -23,7 +33,8 @@ - {{content-for "body-footer"}} {{content-for "test-body-footer"}} + {{content-for "body-footer"}} + {{content-for "test-body-footer"}} - \ No newline at end of file + diff --git a/app/tests/integration/components/section/gemini/type-editor-test.js b/app/tests/integration/components/section/gemini/type-editor-test.js deleted file mode 100644 index 10f5704c..00000000 --- a/app/tests/integration/components/section/gemini/type-editor-test.js +++ /dev/null @@ -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'); -}); diff --git a/app/tests/integration/components/section/gemini/type-renderer-test.js b/app/tests/integration/components/section/gemini/type-renderer-test.js deleted file mode 100644 index 3655012f..00000000 --- a/app/tests/integration/components/section/gemini/type-renderer-test.js +++ /dev/null @@ -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'); -}); diff --git a/app/tests/unit/helpers/document/file-icon-test.js b/app/tests/unit/helpers/document/file-icon-test.js deleted file mode 100644 index 89dca6ac..00000000 --- a/app/tests/unit/helpers/document/file-icon-test.js +++ /dev/null @@ -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"); -}); diff --git a/app/tests/unit/helpers/document/toc-entry-test.js b/app/tests/unit/helpers/document/toc-entry-test.js deleted file mode 100644 index 1ca81d05..00000000 --- a/app/tests/unit/helpers/document/toc-entry-test.js +++ /dev/null @@ -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(), ""); -}); - -test('toc entry should be indented and selected', function(assert) { - let result = documentTocEntry(['node-123', 'node-123', 2]); - assert.equal(result.toString(), ""); -}); \ No newline at end of file diff --git a/app/tests/unit/helpers/formatted-date-test.js b/app/tests/unit/helpers/formatted-date-test.js deleted file mode 100644 index 3e77b535..00000000 --- a/app/tests/unit/helpers/formatted-date-test.js +++ /dev/null @@ -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"); -}); diff --git a/app/tests/unit/helpers/time-ago-test.js b/app/tests/unit/helpers/time-ago-test.js deleted file mode 100644 index 82a99e84..00000000 --- a/app/tests/unit/helpers/time-ago-test.js +++ /dev/null @@ -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"); -}); diff --git a/app/tests/unit/helpers/user-initials-test.js b/app/tests/unit/helpers/user-initials-test.js deleted file mode 100644 index a64893f9..00000000 --- a/app/tests/unit/helpers/user-initials-test.js +++ /dev/null @@ -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"); -}); diff --git a/app/tests/unit/initializers/audit-test.js b/app/tests/unit/initializers/audit-test.js deleted file mode 100644 index 7f80c3b1..00000000 --- a/app/tests/unit/initializers/audit-test.js +++ /dev/null @@ -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); -}); diff --git a/app/tests/unit/mixins/notifier-test.js b/app/tests/unit/mixins/notifier-test.js deleted file mode 100644 index 1885603b..00000000 --- a/app/tests/unit/mixins/notifier-test.js +++ /dev/null @@ -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); -}); diff --git a/app/tests/unit/mixins/tooltip-test.js b/app/tests/unit/mixins/tooltip-test.js deleted file mode 100644 index 31bdac82..00000000 --- a/app/tests/unit/mixins/tooltip-test.js +++ /dev/null @@ -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); -}); diff --git a/app/tests/unit/pods/document/wizard/route-test.js b/app/tests/unit/pods/document/wizard/route-test.js deleted file mode 100644 index a05271f5..00000000 --- a/app/tests/unit/pods/document/wizard/route-test.js +++ /dev/null @@ -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); -}); diff --git a/app/tests/unit/routes/document/wizard-test.js b/app/tests/unit/routes/document/wizard-test.js deleted file mode 100644 index a05271f5..00000000 --- a/app/tests/unit/routes/document/wizard-test.js +++ /dev/null @@ -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); -}); diff --git a/app/tests/unit/services/section-test.js b/app/tests/unit/services/section-test.js deleted file mode 100644 index 6b77e35d..00000000 --- a/app/tests/unit/services/section-test.js +++ /dev/null @@ -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); -}); diff --git a/app/tests/unit/utils/date-test.js b/app/tests/unit/utils/date-test.js deleted file mode 100644 index a13ad94c..00000000 --- a/app/tests/unit/utils/date-test.js +++ /dev/null @@ -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"); -}); diff --git a/app/tests/unit/utils/encoding-test.js b/app/tests/unit/utils/encoding-test.js deleted file mode 100644 index aaf2cc08..00000000 --- a/app/tests/unit/utils/encoding-test.js +++ /dev/null @@ -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=="); -}); diff --git a/app/tests/unit/utils/string-test.js b/app/tests/unit/utils/string-test.js deleted file mode 100644 index f90c3864..00000000 --- a/app/tests/unit/utils/string-test.js +++ /dev/null @@ -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"); -});