got karma:unit tests working

This commit is contained in:
David Baldwynn 2015-08-19 15:29:01 -07:00
parent 44e37ce1da
commit 0f21478c46
16 changed files with 601 additions and 243 deletions

View file

@ -32,10 +32,10 @@ exports.validateVerificationToken = function(req, res, next){
exports.resendVerificationEmail = function(req, res, next){
nev.resendVerificationEmail(req.body.email, function(user) {
if (user){
res.status(200).send('User successfully verified');
res.status(200).send('Verification email successfully Re-Sent');
}else {
// user hasn't been found yet
res.status(400).send( {message: 'Error: User could NOT be verified'} );
res.status(400).send( {message: 'Error: Verification Email could NOT be sent'} );
}
});
};

View file

@ -3,7 +3,10 @@
/**
* Module dependencies.
*/
var applicationConfiguration = require('./config/config');
var applicationConfiguration = require('./config/config'),
bowerFiles = require('main-bower-files');
var bowerDep = bowerFiles('**/**.js');
// Karma configuration
module.exports = function(config) {
@ -17,11 +20,6 @@ module.exports = function(config) {
// Test results reporter to use
// Possible values: 'dots', 'progress', 'junit', 'growl', 'coverage'
reporters: ['mocha', 'html', 'progress'],
// plugins: [
// 'karma-jasmine',
// 'karma-mocha-reporter',
// ],
// Web server port
port: 9876,
@ -29,6 +27,14 @@ module.exports = function(config) {
// Enable / disable colors in the output (reporters and logs)
colors: true,
//Make sure we capture console.log output
client: {
captureConsole: true,
mocha: {
bail: true
}
},
// Level of logging
// Possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
logLevel: config.LOG_INFO,

View file

@ -24,55 +24,55 @@ angular.module(ApplicationConfiguration.applicationModuleName).constant('USER_RO
superuser: 'superuser',
});
angular.module(ApplicationConfiguration.applicationModuleName).run(['$rootScope', 'Auth', '$state', '$stateParams',
function($rootScope, Auth, $state, $stateParams) {
// angular.module(ApplicationConfiguration.applicationModuleName).run(['$rootScope', 'Auth', '$state', '$stateParams',
// function($rootScope, Auth, $state, $stateParams) {
$rootScope.$state = $state;
$rootScope.$stateParams = $stateParams;
// $rootScope.$state = $state;
// $rootScope.$stateParams = $stateParams;
// add previous state property
$rootScope.$on('$stateChangeSuccess', function (event, toState, toParams, fromState) {
$state.previous = fromState;
// // add previous state property
// $rootScope.$on('$stateChangeSuccess', function (event, toState, toParams, fromState) {
// $state.previous = fromState;
//Redirect to listForms if user is authenticated
if(toState.name === 'home' || toState.name === 'signin' || toState.name === 'resendVerifyEmail' || toState.name === 'verify' || toState.name === 'signup' || toState.name === 'signup-success'){
if(Auth.isAuthenticated()){
event.preventDefault(); // stop current execution
$state.go('listForms'); // go to listForms page
}
}
//Redirect to 'home' route if user is not authenticated
else if(toState.name !== 'access_denied' && !Auth.isAuthenticated() ){
event.preventDefault(); // stop current execution
$state.go('home'); // go to listForms page
}
// //Redirect to listForms if user is authenticated
// if(toState.name === 'home' || toState.name === 'signin' || toState.name === 'resendVerifyEmail' || toState.name === 'verify' || toState.name === 'signup' || toState.name === 'signup-success'){
// if(Auth.isAuthenticated()){
// event.preventDefault(); // stop current execution
// $state.go('listForms'); // go to listForms page
// }
// }
// //Redirect to 'home' route if user is not authenticated
// else if(toState.name !== 'access_denied' && !Auth.isAuthenticated() ){
// event.preventDefault(); // stop current execution
// $state.go('home'); // go to listForms page
// }
});
// });
}
]);
// }
// ]);
//Page access/authorization logic
angular.module(ApplicationConfiguration.applicationModuleName).run(['$rootScope', 'Auth', 'User', 'Authorizer', '$state', '$stateParams',
function($rootScope, Auth, User, Authorizer, $state, $stateParams) {
$rootScope.$on('$stateChangeStart', function(event, next) {
var authenticator, permissions, user;
permissions = next && next.data && next.data.permissions ? next.data.permissions : null;
// //Page access/authorization logic
// angular.module(ApplicationConfiguration.applicationModuleName).run(['$rootScope', 'Auth', 'User', 'Authorizer', '$state', '$stateParams',
// function($rootScope, Auth, User, Authorizer, $state, $stateParams) {
// $rootScope.$on('$stateChangeStart', function(event, next) {
// var authenticator, permissions, user;
// permissions = next && next.data && next.data.permissions ? next.data.permissions : null;
Auth.ensureHasCurrentUser(User);
user = Auth.currentUser;
// Auth.ensureHasCurrentUser(User);
// user = Auth.currentUser;
if(user){
authenticator = new Authorizer(user);
// if(user){
// authenticator = new Authorizer(user);
if( (permissions !== null) && !authenticator.canAccess(permissions) ){
event.preventDefault();
console.log('access denied')
$state.go('access_denied');
}
}
});
}]);
// if( (permissions !== null) && !authenticator.canAccess(permissions) ){
// event.preventDefault();
// console.log('access denied')
// $state.go('access_denied');
// }
// }
// });
// }]);
//Then define the init function for starting up the application
angular.element(document).ready(function() {

View file

@ -4,7 +4,6 @@
angular.module('forms').controller('AdminFormController', ['$rootScope', '$scope', '$stateParams', '$state', 'Forms', 'CurrentForm', '$http', '$modal',
function($rootScope, $scope, $stateParams, $state, Forms, CurrentForm, $http, $modal) {
var deleteModal;
$scope = $rootScope;
$scope.myform = CurrentForm.getForm();
@ -17,7 +16,6 @@ angular.module('forms').controller('AdminFormController', ['$rootScope', '$scope
});
CurrentForm.setForm($scope.myform);
};
$scope.setForm = function(form){
$scope.myform = form;
};
@ -31,82 +29,70 @@ angular.module('forms').controller('AdminFormController', ['$rootScope', '$scope
** DeleteModal Functions
*/
$scope.openDeleteModal = function(){
deleteModal = $modal.open({
$scope.deleteModal = $modal.open({
animation: $scope.animationsEnabled,
templateUrl: 'myModalContent.html',
controller: 'AdminFormController',
});
};
$scope.cancelDeleteModal = function(){
if(deleteModal){
deleteModal.dismiss('cancel');
if($scope.deleteModal){
$scope.deleteModal.dismiss('cancel');
}
};
// Remove existing Form
$scope.remove = function(form_id) {
if(deleteModal && deleteModal.opened){
$scope.removeCurrentForm = function() {
if($scope.deleteModal && $scope.deleteModal.opened){
deleteModal.close();
$scope.deleteModal.close();
var form = {};
if(!form_id){
form = CurrentForm.getForm();
if(!form) form = $scope.myform;
}else {
form._id = form_id;
}
var form_id = $scope.myform._id;
if(!form_id) throw new Error('Error - removeCurrentForm(): $scope.myform._id does not exist');
$http.delete('/forms/'+form._id)
$http.delete('/forms/'+form_id)
.success(function(data, status, headers){
console.log('form deleted successfully');
if(!form_id){
$state.go('listForms', {}, {reload: true});
}
if($scope.myforms.length > 0){
$scope.myforms = _.filter($scope.myforms, function(myform){
return myform._id !== form._id;
});
}
$state.go('listForms', {}, {reload: true});
}).error(function(error){
console.log('ERROR: Form could not be deleted.');
console.error(error);
}).finally(function(){
});
}
};
// Update existing Form
$scope.update = $rootScope.update = function(shouldUpdateNow, cb){
// console.log('shouldUpdateNow: '+shouldUpdateNow);
$scope.update = $rootScope.update = function(updateImmediately, cb){
var continueUpdate = true;
if(shouldUpdateNow){
continueUpdate = !$rootScope.saveInProgress;
if(!updateImmediately){
continueUpdate = !$rootScope.saveInProgress;
}
//Update form if we **are not currently updating** or if **shouldUpdateNow flag is set**
if(continueUpdate){
console.log('begin updating form');
// console.log('begin updating form');
var err = null;
if(shouldUpdateNow){ $rootScope.saveInProgress = true; }
if(!updateImmediately){ $rootScope.saveInProgress = true; }
$scope.updatePromise = $http.put('/forms/'+$scope.myform._id, {form: $scope.myform})
.then(function(response){
$rootScope.myform = $scope.myform = response.data;
console.log(response.data);
// console.log(response.data);
}).catch(function(response){
console.log('Error occured during form UPDATE.\n');
console.log(response.data);
// console.log('Error occured during form UPDATE.\n');
// console.log(response.data);
err = response.data;
}).finally(function() {
console.log('finished updating');
if(shouldUpdateNow){$rootScope.saveInProgress = false; }
cb(err);
// console.log('finished updating');
if(!updateImmediately){$rootScope.saveInProgress = false; }
if( (typeof cb) === 'function'){
cb(err);
}
});
}
};

View file

@ -1,7 +1,7 @@
'use strict';
// Forms controller
angular.module('forms').controller('ListFormsController', ['$rootScope', '$scope', '$stateParams', '$state', 'Forms', 'CurrentForm','$http',
angular.module('forms').controller('ListFormsController', ['$rootScope', '$scope', '$stateParams', '$state', 'Forms', 'CurrentForm', '$http',
function($rootScope, $scope, $stateParams, $state, Forms, CurrentForm, $http) {
$scope = $rootScope;
@ -33,13 +33,14 @@ angular.module('forms').controller('ListFormsController', ['$rootScope', '$scope
$state.go(route, {'formId': id}, {reload: true});
};
$scope.duplicate = function(form, form_index){
$scope.duplicate = function(form_index){
var form = $scope.myforms[form_index];
delete form._id;
$http.post('/forms', {form: form})
.success(function(data, status, headers){
console.log('form duplicated');
$scope.myforms.splice(form_index, 0, data);
// console.log('form duplicated');
$scope.myforms.splice(form_index+1, 0, data);
}).error(function(errorResponse){
console.log(errorResponse);
$scope.error = errorResponse.data.message;
@ -69,19 +70,16 @@ angular.module('forms').controller('ListFormsController', ['$rootScope', '$scope
}
};
$scope.removeFromList = function(deleted_form_id) {
$scope.removeForm = function(form_index) {
if(form_index >= $scope.myforms.length || form_index < 0){
throw new Error('Error: form_index in removeForm() must be between 0 and '+$scope.myforms.length-1);
}
console.log('Remove existing form');
$http.delete('/forms/'+deleted_form_id)
$http.delete('/forms/'+$scope.myforms[form_index]._id)
.success(function(data, status, headers){
console.log('form deleted successfully');
if($scope.myforms.length > 0){
$scope.myforms = _.filter($scope.myforms, function(myform){
return myform._id !== deleted_form_id;
});
}
$scope.myforms.splice(form_index, 1);
}).error(function(error){
console.log('ERROR: Form could not be deleted.');

View file

@ -37,12 +37,10 @@ angular.module('forms').directive('autoSaveForm', ['$rootScope', '$timeout', fun
var debounceSave = function () {
$rootScope.saveInProgress = true;
$rootScope[$attrs.autoSaveCallback](false,
$rootScope[$attrs.autoSaveCallback](true,
function(err){
if(!err){
console.log('\n\nForm data persisted -- setting pristine flag');
// console.log('\n\n---------\nUpdate form CLIENT');
// console.log(Date.now());
$formCtrl.$setPristine();
}else{
console.error('Error form data NOT persisted');
@ -51,7 +49,7 @@ angular.module('forms').directive('autoSaveForm', ['$rootScope', '$timeout', fun
});
};
//Update/save Form if any Form fields are Dirty and Touched
$scope.$watch(function(newValue, oldValue) {
if($scope.anyDirtyAndTouched($scope.editForm) && !$rootScope.saveInProgress){
debounceSave();
@ -86,7 +84,9 @@ angular.module('forms').directive('autoSaveForm', ['$rootScope', '$timeout', fun
console.log('Saving Form');
debounceSave();
});
}else if($rootScope.finishedRender && $rootScope.saveInProgress){
}
//If we are finished rendering then form saving should be finished
else if($rootScope.finishedRender && $rootScope.saveInProgress){
$rootScope.saveInProgress = false;
}

View file

@ -1,8 +1,8 @@
'use strict';
//Forms service used for communicating with the forms REST endpoints
angular.module('forms').service('CurrentForm', ['Forms',
function(Forms){
angular.module('forms').service('CurrentForm',
function(){
//Private variables
var _form = {};
@ -15,4 +15,4 @@ angular.module('forms').service('CurrentForm', ['Forms',
_form = form;
};
}
]);
);

View file

@ -3,21 +3,22 @@
//Forms service used for communicating with the forms REST endpoints
angular.module('forms').factory('Forms', ['$resource',
function($resource) {
return $resource('forms/:formId', {
return $resource('/forms/:formId', {
formId: '@_id'
}, {
'query' : {
method: 'GET',
isArray: true,
transformResponse: function(data, header) {
var forms = angular.fromJson(data);
angular.forEach(forms, function(form, idx) {
form.visible_form_fields = _.filter(form.form_fields, function(field){
return field.deletePreserved === false;
}); //<-- replace each item with an instance of the resource object
});
return forms;
}
//DAVID: TODO: Do we really need to get visible_form_fields for a Query?
// transformResponse: function(data, header) {
// var forms = angular.fromJson(data);
// angular.forEach(forms, function(form, idx) {
// form.visible_form_fields = _.filter(form.form_fields, function(field){
// return (field.deletePreserved === false);
// });
// });
// return forms;
// }
},
'get' : {
method: 'GET',
@ -25,8 +26,8 @@ angular.module('forms').factory('Forms', ['$resource',
var form = angular.fromJson(data);
form.visible_form_fields = _.filter(form.form_fields, function(field){
return field.deletePreserved === false;
}); //<-- replace each item with an instance of the resource object
return (field.deletePreserved === false);
});
return form;
}
},

View file

@ -5,10 +5,74 @@
describe('AdminFormController Tests', function() {
// Initialize global variables
var AdminFormController,
createAdminFormController,
scope,
$httpBackend,
$stateParams,
$location;
$location,
$state;
var sampleUser = {
firstName: 'Full',
lastName: 'Name',
email: 'test@test.com',
username: 'test@test.com',
password: 'password',
provider: 'local',
roles: ['user'],
_id: 'ed873933b1f1dea0ce12fab9'
};
var sampleForm = {
title: 'Form Title',
admin: 'ed873933b1f1dea0ce12fab9',
language: 'english',
form_fields: [
{'fieldType':'textfield', 'title':'First Name', 'fieldValue': '', 'deletePreserved': false},
{'fieldType':'checkbox', 'title':'nascar', 'fieldValue': '', 'deletePreserved': false},
{'fieldType':'checkbox', 'title':'hockey', 'fieldValue': '', 'deletePreserved': false}
],
_id: '525a8422f6d0f87f0e407a33'
};
var expectedForm = {
title: 'Form Title',
admin: 'ed873933b1f1dea0ce12fab9',
language: 'english',
form_fields: [
{'fieldType':'textfield', 'title':'First Name', 'fieldValue': '', 'deletePreserved': false},
{'fieldType':'checkbox', 'title':'nascar', 'fieldValue': '', 'deletePreserved': false},
{'fieldType':'checkbox', 'title':'hockey', 'fieldValue': '', 'deletePreserved': false}
],
visible_form_fields: [
{'fieldType':'textfield', 'title':'First Name', 'fieldValue': '', 'deletePreserved': false},
{'fieldType':'checkbox', 'title':'nascar', 'fieldValue': '', 'deletePreserved': false},
{'fieldType':'checkbox', 'title':'hockey', 'fieldValue': '', 'deletePreserved': false}
],
_id: '525a8422f6d0f87f0e407a33'
};
var fakeModal = function(){
this.opened = true;
this.result = function(confirmCallback, cancelCallback) {
//Store the callbacks for later when the user clicks on the OK or Cancel button of the dialog
this.confirmCallBack = confirmCallback;
this.cancelCallback = cancelCallback;
};
this.close = function( item ) {
//The user clicked OK on the modal dialog, call the stored confirm callback with the selected item
this.opened = false;
this.confirmCallBack( item );
};
this.dismiss = function( type ) {
//The user clicked cancel on the modal dialog, call the stored cancel callback
this.opened = false;
this.cancelCallback( type );
};
}
// The $resource service augments the response object with methods for updating and deleting the resource.
// If we were to use the standard toEqual matcher, our tests would fail because the test values would not match
@ -29,156 +93,185 @@
});
});
// Then we can start by loading the main application module
//Mock Users Service
beforeEach(module(function($provide) {
$provide.service('User', function($q) {
return {
getCurrent: function() {
var deferred = $q.defer();
deferred.resolve( JSON.stringify(sampleUser) );
return deferred.promise;
},
login: function(credentials) {
var deferred = $q.defer();
if( credentials.password === sampleUser.password && credentials.username === sampleUser.username){
deferred.resolve( JSON.stringify(sampleUser) );
}else {
deferred.resolve('Error: User could not be loggedin');
}
return deferred.promise;
},
logout: function() {
var deferred = $q.defer();
deferred.resolve(null);
return deferred.promise;
},
signup: function(credentials) {
var deferred = $q.defer();
if( credentials.password === sampleUser.password && credentials.username === sampleUser.username){
deferred.resolve( JSON.stringify(sampleUser) );
}else {
deferred.resolve('Error: User could not be signed up');
}
return deferred.promise;
}
};
});
}));
//Mock Authentication Service
beforeEach(module(function($provide) {
$provide.service('Auth', function() {
return {
ensureHasCurrentUser: function() {
return sampleUser;
},
isAuthenticated: function() {
return true;
},
getUserState: function() {
return true;
}
};
});
}));
// Load the main application module
beforeEach(module(ApplicationConfiguration.applicationModuleName));
beforeEach(module('stateMock'));
beforeEach(inject(function($modal) {
spyOn($modal, 'open').and.returnValue(new fakeModal());
}));
// The injector ignores leading and trailing underscores here (i.e. _$httpBackend_).
// This allows us to inject a service but then attach it to a variable
// with the same name as the service.
beforeEach(inject(function($controller, $rootScope, _$location_, _$state_, _$stateParams_, _$httpBackend_) {
beforeEach(inject(function($controller, $rootScope, _$state_, _$location_, _$stateParams_, _$httpBackend_, CurrentForm, Forms) {
// Set a new global scope
scope = $rootScope.$new();
//Set CurrentForm
CurrentForm.setForm(sampleForm);
// Point global variables to injected services
$stateParams = _$stateParams_;
$httpBackend = _$httpBackend_;
$location = _$location_;
$state = _$state_;
$httpBackend.whenGET(/\.html$/).respond('');
$httpBackend.whenGET('/users/me/').respond('');
// Initialize the Forms controller.
AdminFormController = $controller('AdminFormController', {
$scope: scope,
});
createAdminFormController = function(){
return $controller('AdminFormController', { $scope: scope });
};
}));
it('AdminFormController should fetch current Form when instantiated', inject(function() {
// Run controller functionality
var controller = createAdminFormController();
// Test scope value
expect(scope.myform).toEqualData(sampleForm);
}));
//Mock Authentication Service
$provide.value("MyLoginServce", {
ensureHasCurrentUser: function(){
return true;
},
redirectForLogin: function {}
});
it('$scope.findOne() should fetch current Form', inject(function(Forms) {
// Define a sample article object
var sampleForm = new Forms({
title: 'Form Title',
admin: 'ed873933b1f1dea0ce12fab9',
language: 'english',
form_fields: [
{'fieldType':'textfield', 'title':'First Name', 'fieldValue': ''},
{'fieldType':'checkbox', 'title':'nascar', 'fieldValue': ''},
{'fieldType':'checkbox', 'title':'hockey', 'fieldValue': ''}
]
});
var expectedFormObj = new Forms(expectedForm);
var controller = createAdminFormController();
// Set the URL parameter
$stateParams.formId = '525a8422f6d0f87f0e407a33';
$stateParams.formId = expectedForm._id;
// Set GET response
$httpBackend.expectGET(/forms\/([0-9a-fA-F]{24})$/).respond(sampleForm);
$httpBackend.expectGET(/^(\/forms\/)([0-9a-fA-F]{24})$/).respond(200, sampleForm);
// Run controller functionality
scope.findOne();
$httpBackend.flush();
// Test scope value
expect(scope.article).toEqualData(sampleArticle);
expect( scope.myform.toJSON() ).toEqualData(expectedFormObj.toJSON());
}));
// it('$scope.find() should create an array with at least one article object fetched from XHR', inject(function(Forms) {
// // Create sample article using the Forms service
// var sampleArticle = new Forms({
// title: 'An Article about MEAN',
// content: 'MEAN rocks!'
// });
it('$scope.removeCurrentForm() with valid form data should send a DELETE request with the id of form', function() {
var controller = createAdminFormController();
// // Create a sample Forms array that includes the new article
// var sampleForms = [sampleForm];
//Set expected $state transition
$state.expectTransitionTo('listForms');
// // Set GET response
// $httpBackend.expectGET('Forms').respond(sampleForms);
// Set DELETE response
$httpBackend.expect('DELETE', /^(\/forms\/)([0-9a-fA-F]{24})$/).respond(200, sampleForm);
// // Run controller functionality
// scope.find();
// $httpBackend.flush();
//Run controller functionality
scope.openDeleteModal();
// // Test scope value
// expect(scope.Forms).toEqualData(sampleForms);
// }));
scope.deleteModal.result(function(selectedItem){
scope.selected = selectedItem;
}, function(type){
$scope.canceled = true;
});
scope.removeCurrentForm();
$httpBackend.flush();
});
// it('$scope.create() with valid form data should send a POST request with the form input values and then locate to new object URL', inject(function(Forms) {
// // Create a sample article object
// var sampleArticlePostData = new Forms({
// title: 'An Article about MEAN',
// content: 'MEAN rocks!'
// });
it('$scope.update() should send a PUT request with the id of form', function() {
var controller = createAdminFormController();
// // Create a sample article response
// var sampleArticleResponse = new Forms({
// _id: '525cf20451979dea2c000001',
// title: 'An Article about MEAN',
// content: 'MEAN rocks!'
// });
//Set PUT response
$httpBackend.expect('PUT', /^(\/forms\/)([0-9a-fA-F]{24})$/).respond(200, sampleForm);
// // Fixture mock form input values
// scope.title = 'An Article about MEAN';
// scope.content = 'MEAN rocks!';
//Run controller functionality
scope.update(false, null);
// // Set POST response
// $httpBackend.expectPOST('Forms', sampleArticlePostData).respond(sampleArticleResponse);
$httpBackend.flush();
});
// // Run controller functionality
// scope.create();
// $httpBackend.flush();
it('$scope.openDeleteModal() should open scope.deleteModal', function() {
var controller = createAdminFormController();
// // Test form inputs are reset
// expect(scope.title).toEqual('');
// expect(scope.content).toEqual('');
//Run controller functionality
scope.openDeleteModal();
expect( scope.deleteModal.opened ).toEqual(true);
});
// // Test URL redirection after the article was created
// expect($location.path()).toBe('/Forms/' + sampleArticleResponse._id);
// }));
it('$scope.cancelDeleteModal() should close scope.deleteModal', inject(function($modal) {
var controller = createAdminFormController();
// it('$scope.update() should update a valid article', inject(function(Forms) {
// // Define a sample article put data
// var sampleArticlePutData = new Forms({
// _id: '525cf20451979dea2c000001',
// title: 'An Article about MEAN',
// content: 'MEAN Rocks!'
// });
//Run controller functionality
scope.openDeleteModal();
console.log(scope.deleteModal.opened);
// // Mock article in scope
// scope.article = sampleArticlePutData;
scope.deleteModal.result(function(selectedItem){
this.selected = selectedItem;
}, function(type){
this.canceled = true;
});
// // Set PUT response
// $httpBackend.expectPUT(/Forms\/([0-9a-fA-F]{24})$/).respond();
scope.cancelDeleteModal();
console.log(scope.deleteModal.opened);
expect( scope.deleteModal.opened ).toEqual(false);
expect( scope.deleteModal.canceled ).toEqual(true);
// // Run controller functionality
// scope.update();
// $httpBackend.flush();
// // Test URL location to new object
// expect($location.path()).toBe('/Forms/' + sampleArticlePutData._id);
// }));
// it('$scope.remove() should send a DELETE request with a valid articleId and remove the article from the scope', inject(function(Forms) {
// // Create new article object
// var sampleArticle = new Forms({
// _id: '525a8422f6d0f87f0e407a33'
// });
// // Create new Forms array and include the article
// scope.Forms = [sampleArticle];
// // Set expected DELETE response
// $httpBackend.expectDELETE(/Forms\/([0-9a-fA-F]{24})$/).respond(204);
// // Run controller functionality
// scope.remove(sampleArticle);
// $httpBackend.flush();
// // Test array after successful delete
// expect(scope.Forms.length).toBe(0);
// }));
}));
});
}());

View file

@ -0,0 +1,255 @@
'use strict';
(function() {
// Forms Controller Spec
describe('ListFormsController Tests', function() {
// Initialize global variables
var ListFormsController,
createListFormsController,
scope,
$httpBackend,
$stateParams,
$location,
$state;
var sampleUser = {
firstName: 'Full',
lastName: 'Name',
email: 'test@test.com',
username: 'test@test.com',
password: 'password',
provider: 'local',
roles: ['user'],
_id: 'ed873933b1f1dea0ce12fab9'
};
var sampleForm = {
title: 'Form Title',
admin: 'ed873933b1f1dea0ce12fab9',
language: 'english',
form_fields: [
{'fieldType':'textfield', 'title':'First Name', 'fieldValue': '', 'deletePreserved': false},
{'fieldType':'checkbox', 'title':'nascar', 'fieldValue': '', 'deletePreserved': false},
{'fieldType':'checkbox', 'title':'hockey', 'fieldValue': '', 'deletePreserved': false}
],
_id: '525a8422f6d0f87f0e407a33'
};
var sampleFormList = [{
title: 'Form Title1',
admin: 'ed873933b1f1dea0ce12fab9',
language: 'english',
form_fields: [
{'fieldType':'textfield', 'title':'First Name', 'fieldValue': '', 'deletePreserved': false},
{'fieldType':'checkbox', 'title':'nascar', 'fieldValue': '', 'deletePreserved': false},
{'fieldType':'checkbox', 'title':'hockey', 'fieldValue': '', 'deletePreserved': false}
],
_id: '525a8422f6d0f87f0e407a33'
},{
title: 'Form Title2',
admin: '39223933b1f1dea0ce12fab9',
language: 'english',
form_fields: [
{'fieldType':'textfield', 'title':'First Name', 'fieldValue': '', 'deletePreserved': false},
{'fieldType':'checkbox', 'title':'nascar', 'fieldValue': '', 'deletePreserved': false},
{'fieldType':'checkbox', 'title':'hockey', 'fieldValue': '', 'deletePreserved': false}
],
_id: '52f6d0f87f5a407a384220e3'
},{
title: 'Form Title3',
admin: '2fab9ed873937f0e1dea0ce1',
language: 'english',
form_fields: [
{'fieldType':'textfield', 'title':'First Name', 'fieldValue': '', 'deletePreserved': false},
{'fieldType':'checkbox', 'title':'nascar', 'fieldValue': '', 'deletePreserved': false},
{'fieldType':'checkbox', 'title':'hockey', 'fieldValue': '', 'deletePreserved': false}
],
_id: '922f6d0f87fed8730e4e1233'
}
];
// The $resource service augments the response object with methods for updating and deleting the resource.
// If we were to use the standard toEqual matcher, our tests would fail because the test values would not match
// the responses exactly. To solve the problem, we define a new toEqualData Jasmine matcher.
// When the toEqualData matcher compares two objects, it takes only object properties into
// account and ignores methods.
beforeEach(function() {
jasmine.addMatchers({
toEqualData: function(util, customEqualityTesters) {
return {
compare: function(actual, expected) {
return {
pass: angular.equals(actual, expected)
};
}
};
}
});
});
//Mock Users Service
beforeEach(module(function($provide) {
$provide.service('User', function($q) {
return {
getCurrent: function() {
var deferred = $q.defer();
deferred.resolve( JSON.stringify(sampleUser) );
return deferred.promise;
},
login: function(credentials) {
var deferred = $q.defer();
if( credentials.password === sampleUser.password && credentials.username === sampleUser.username){
deferred.resolve( JSON.stringify(sampleUser) );
}else {
deferred.resolve('Error: User could not be loggedin');
}
return deferred.promise;
},
logout: function() {
var deferred = $q.defer();
deferred.resolve(null);
return deferred.promise;
},
signup: function(credentials) {
var deferred = $q.defer();
if( credentials.password === sampleUser.password && credentials.username === sampleUser.username){
deferred.resolve( JSON.stringify(sampleUser) );
}else {
deferred.resolve('Error: User could not be signed up');
}
return deferred.promise;
}
};
});
}));
//Mock Authentication Service
beforeEach(module(function($provide) {
$provide.service('Auth', function() {
return {
ensureHasCurrentUser: function() {
return sampleUser;
},
isAuthenticated: function() {
return true;
},
getUserState: function() {
return true;
}
};
});
}));
// Load the main application module
beforeEach(module(ApplicationConfiguration.applicationModuleName));
beforeEach(module('stateMock'));
// The injector ignores leading and trailing underscores here (i.e. _$httpBackend_).
// This allows us to inject a service but then attach it to a variable
// with the same name as the service.
beforeEach(inject(function($controller, $rootScope, _$state_, _$location_, _$stateParams_, _$httpBackend_, CurrentForm, Forms) {
// Set a new global scope
scope = $rootScope.$new();
//Set CurrentForm
CurrentForm.setForm(sampleForm);
// Point global variables to injected services
$stateParams = _$stateParams_;
$httpBackend = _$httpBackend_;
$location = _$location_;
$state = _$state_;
$httpBackend.whenGET(/\.html$/).respond('');
$httpBackend.whenGET('/users/me/').respond('');
// Initialize the Forms controller.
createListFormsController = function(){
return $controller('ListFormsController', { $scope: scope });
};
}));
it('$scope.findAll() should query all User\'s Forms', inject(function(Forms) {
var controller = createListFormsController();
// Set GET response
$httpBackend.expectGET(/^(\/forms)$/).respond(200, sampleFormList);
// Run controller functionality
scope.findAll();
$httpBackend.flush();
// Test scope value
expect( scope.myforms ).toEqualData(sampleFormList);
}));
it('$scope.duplicate() should duplicate a Form', inject(function(Forms) {
var dupSampleForm = sampleFormList[2],
dupSampleForm_index = 3,
newSampleFormList = sampleFormList;
dupSampleForm._id = 'a02df75b44c1d26b6a5e05b8';
newSampleFormList.splice(2, 0, dupSampleForm);
var controller = createListFormsController();
// Set GET response
$httpBackend.expectGET(/^(\/forms)$/).respond(200, sampleFormList);
// Run controller functionality
scope.findAll();
$httpBackend.flush();
// Set GET response
$httpBackend.expect('POST', '/forms').respond(200, dupSampleForm);
// Run controller functionality
scope.duplicate(2);
$httpBackend.flush();
// Test scope value
expect( scope.myforms.length ).toEqual(sampleFormList.length+1);
// expect( scope.myforms ).toEqualData(newSampleFormList);
expect( scope.myforms[dupSampleForm_index] ).toEqualData(dupSampleForm);
}));
it('$scope.removeForm() should remove a Form', inject(function(Forms) {
var delIndex = 0,
delSampleForm = sampleFormList[delIndex],
delSampleFormList = sampleFormList;
delSampleFormList.splice(delIndex, 1);
var controller = createListFormsController();
// Set GET response
$httpBackend.expectGET(/^(\/forms)$/).respond(200, sampleFormList);
// Run controller functionality
scope.findAll();
$httpBackend.flush();
// Set GET response
$httpBackend.expect('DELETE', /^(\/forms\/)([0-9a-fA-F]{24})$/).respond(200, delSampleForm);
// Run controller functionality
scope.removeForm(delIndex);
$httpBackend.flush();
// Test scope value
expect( scope.myforms.length ).toEqual(sampleFormList.length-1);
for(var i=0; i<scope.myforms.length){
expect( scope.myforms[i] ).toEqualData(sampleFormList.slice(1,2)[i]);
}
expect( scope.myforms[0] ).not.toEqualData(delSampleForm);
}));
});
}());

View file

@ -0,0 +1,30 @@
angular.module('stateMock',[]);
angular.module('stateMock').service("$state", function($q){
this.expectedTransitions = [];
this.transitionTo = function(stateName){
if(this.expectedTransitions.length > 0){
var expectedState = this.expectedTransitions.shift();
if(expectedState !== stateName){
throw Error("Expected transition to state: " + expectedState + " but transitioned to " + stateName );
}
}else{
throw Error("No more transitions were expected! Tried to transition to "+ stateName );
}
console.log("Mock transition to: " + stateName);
var deferred = $q.defer();
var promise = deferred.promise;
deferred.resolve();
return promise;
}
this.go = this.transitionTo;
this.expectTransitionTo = function(stateName){
this.expectedTransitions.push(stateName);
}
this.ensureAllTransitionsHappened = function(){
if(this.expectedTransitions.length > 0){
throw Error("Not all transitions happened!");
}
}
});

View file

@ -19,7 +19,7 @@
<p>
<input type="text" data-ng-model="deleteConfirm" class="input-block" autofocus required aria-label="Type in the name of the form to confirm that you want to delete this form.">
</p>
<button type="submit" ng-click="remove()" class="btn btn-block btn-danger" ng-disabled="myform.title != deleteConfirm">
<button type="submit" ng-click="removeCurrentForm()" class="btn btn-block btn-danger" ng-disabled="myform.title != deleteConfirm">
I understand the consequences, delete this form
</button>
</div>

View file

@ -276,7 +276,7 @@
</div>
<div class="row">
<div class="col-sm-offset-4 col-sm-2">
<button class="btn btn-primary btn-large" type="button" ng-click="update()"><i class="icon-arrow-left icon-white"></i> Save Changes</button>
<button class="btn btn-primary btn-large" type="button" ng-click="update(false, null)"><i class="icon-arrow-left icon-white"></i> Save Changes</button>
</div>
<div class="col-sm-1">
<button class="btn btn-default" type="button" ng-click="resetForm()"><i class="icon-eye-open icon-white"></i> Cancel</button>

View file

@ -269,15 +269,6 @@
</div>
</div>
<!-- <div class="row"><br><hr></div>
<div class="row">
<div class="col-sm-4 col-sm-offset-4">
<button class="btn btn-primary btn-large" type="button" ng-click="update()">
<i class="icon-arrow-left icon-white"></i> Save Changes
</button>
</div>
</div> -->
</div>
</accordion-group>

View file

@ -54,8 +54,8 @@
<div class="row">
<span class="pull-right">
<i style="cursor:pointer;" class="fa fa-trash-o" ng-click="removeFromList(form._id)"></i>
<i style="cursor:pointer;" class="fa fa-files-o" ng-click="duplicate(form)"></i>
<i style="cursor:pointer;" class="fa fa-trash-o" ng-click="removeForm(form._id)"></i>
<i style="cursor:pointer;" class="fa fa-files-o" ng-click="duplicate($index)"></i>
</span>
</div>

View file

@ -24,7 +24,6 @@ angular.module('users').factory('User', ['$window', '$q', '$timeout', '$http', '
$http.post('/auth/signin', credentials).success(function(response) {
deferred.resolve(response);
}).error(function(error) {
deferred.reject(error.message || error);
});
return deferred.promise;
@ -79,7 +78,6 @@ angular.module('users').factory('User', ['$window', '$q', '$timeout', '$http', '
resetPassword: function(passwordDetails, token) {
var deferred = $q.defer();
$http.get('/auth/password/'+token, passwordDetails).success(function(response) {
deferred.resolve();
}).error(function(error) {
deferred.reject(error.message || error);