fixed form field preservation logic

This commit is contained in:
David Baldwynn 2017-07-28 17:04:16 -07:00
parent ed032d6db9
commit 5a18735b4c
12 changed files with 229 additions and 442 deletions

View file

@ -280,22 +280,6 @@ FormSchema.plugin(mUtilities.timestamp, {
useVirtual: false useVirtual: false
}); });
var _original;
function getDeletedIndexes(needle, haystack){
var deletedIndexes = [];
if(haystack.length > 0){
for(var i = 0; i < needle.length; i++){
if(haystack.indexOf(needle[i]) === -1){
deletedIndexes.push(i);
}
}
}
return deletedIndexes;
}
FormSchema.pre('save', function (next) { FormSchema.pre('save', function (next) {
switch(this.language){ switch(this.language){
case 'spanish': case 'spanish':
@ -317,14 +301,39 @@ FormSchema.pre('save', function (next) {
next(); next();
}); });
function getDeletedIndexes(needle, haystack){
var deletedIndexes = [];
if(haystack.length > 0){
for(var i = 0; i < needle.length; i++){
if(haystack.indexOf(needle[i]) === -1){
deletedIndexes.push(i);
}
}
}
return deletedIndexes;
}
function formFieldsAllHaveIds(form_fields){
for(var i=0; i<form_fields.length; i++){
if(!form_fields[i].hasOwnProperty('_id') && !form_fields[i].hasOwnProperty('globalId')){
return false;
}
}
return true;
}
FormSchema.pre('save', function (next) { FormSchema.pre('save', function (next) {
var that = this; var that = this;
var _original;
async.series([function(cb) { async.series([function(cb) {
that.constructor that.constructor
.findOne({_id: that._id}).exec(function (err, original) { .findOne({_id: that._id}).exec(function (err, original) {
if (err) { if (err) {
return cb(err); return cb(err);
} else if (!original){
return next();
} else { } else {
_original = original; _original = original;
return cb(null); return cb(null);
@ -332,21 +341,18 @@ FormSchema.pre('save', function (next) {
}); });
}, },
function(cb) { function(cb) {
var hasIds = true; if(that.form_fields && that.isModified('form_fields') && formFieldsAllHaveIds(that.toObject().form_fields)){
for(var i=0; i<that.form_fields.length; i++){
if(!that.form_fields.hasOwnProperty('_id')){
hasIds = false;
break;
}
}
if(that.isModified('form_fields') && that.form_fields && _original && hasIds){
var old_form_fields = _original.form_fields, var current_form = that.toObject(),
new_ids = _.map(_.pluck(that.form_fields, 'id'), function(id){ return ''+id;}), old_form_fields = _original.toObject().form_fields,
old_ids = _.map(_.pluck(old_form_fields, 'id'), function(id){ return ''+id;}), new_ids = _.map(_.map(current_form.form_fields, 'globalId'), function(id){ return ''+id;}),
old_ids = _.map(_.map(old_form_fields, 'globalId'), function(id){ return ''+id;}),
deletedIds = getDeletedIndexes(old_ids, new_ids); deletedIds = getDeletedIndexes(old_ids, new_ids);
//Preserve fields that have at least one submission console.log(deletedIds);
console.log(new_ids);
console.log(old_ids);
//Check if any form_fileds were deleted
if( deletedIds.length > 0 ){ if( deletedIds.length > 0 ){
var modifiedSubmissions = []; var modifiedSubmissions = [];
@ -355,23 +361,21 @@ FormSchema.pre('save', function (next) {
function (deletedIdIndex, key, cb_id) { function (deletedIdIndex, key, cb_id) {
var deleted_id = old_ids[deletedIdIndex]; var deleted_id = old_ids[deletedIdIndex];
//Find FormSubmissions that contain field with _id equal to 'deleted_id' //Find FormSubmissions that contain field with _id equal to 'deleted_id'
FormSubmission. FormSubmission.
find({ form: that._id, admin: that.admin, form_fields: {$elemMatch: {submissionId: deleted_id} } }). find({ form: that, form_fields: {$elemMatch: {globalId: deleted_id} } }).
exec(function(err, submissions){ exec(function(err, submissions){
if(err) { if(err) {
return cb_id(err); return cb_id(err);
} }
//Delete field if there are no submission(s) found //Preserve fields that have at least one submission
if (submissions.length) { if (submissions.length) {
//Add submissions //Add submissions
modifiedSubmissions.push.apply(modifiedSubmissions, submissions); modifiedSubmissions.push.apply(modifiedSubmissions, submissions);
} }
return cb_id(null); return cb_id(null);
}); });
}, },
function (err) { function (err) {
@ -383,29 +387,33 @@ FormSchema.pre('save', function (next) {
//Iterate through all submissions with modified form_fields //Iterate through all submissions with modified form_fields
async.forEachOfSeries(modifiedSubmissions, function (submission, key, callback) { async.forEachOfSeries(modifiedSubmissions, function (submission, key, callback) {
//Iterate through ids of deleted fields var submission_form_fields = submission.toObject().form_fields;
for (i = 0; i < deletedIds.length; i++) { var currentform_form_fields = that.toObject().form_fields;
var index = _.findIndex(submission.form_fields, function (field) { //Iterate through ids of deleted fields
var tmp_id = field._id + ''; for (var i = 0; i < deletedIds.length; i++) {
var index = _.findIndex(submission_form_fields, function (field) {
var tmp_id = field.globalId + '';
return tmp_id === old_ids[deletedIds[i]]; return tmp_id === old_ids[deletedIds[i]];
}); });
var deletedField = submission.form_fields[index]; var deletedField = submission_form_fields[index];
//Hide field if it exists //Hide field if it exists
if (deletedField) { if (deletedField) {
//Delete old form_field //Delete old form_field
submission.form_fields.splice(index, 1); submission_form_fields.splice(index, 1);
deletedField.deletePreserved = true; deletedField.deletePreserved = true;
//Move deleted form_field to start //Move deleted form_field to start
submission.form_fields.unshift(deletedField); submission_form_fields.unshift(deletedField);
that.form_fields.unshift(deletedField); currentform_form_fields.unshift(deletedField);
} }
} }
submission.form_fields = submission_form_fields;
that.form_fields = currentform_form_fields;
submission.save(function (saveErr) { submission.save(function (saveErr) {
return callback(saveErr); return callback(saveErr);
@ -413,13 +421,14 @@ FormSchema.pre('save', function (next) {
}, function (err) { }, function (err) {
return cb(err); return cb(err);
}); });
} }
); );
} else {
return cb(null);
} }
} else {
return cb(null); return cb(null);
} }
return cb(null);
}], }],
function(err, results){ function(err, results){
next(err); next(err);

View file

@ -10,6 +10,9 @@ var mongoose = require('mongoose'),
Schema = mongoose.Schema, Schema = mongoose.Schema,
LogicJumpSchema = require('./logic_jump.server.model'); LogicJumpSchema = require('./logic_jump.server.model');
const UIDGenerator = require('uid-generator');
const uidgen3 = new UIDGenerator(256, UIDGenerator.BASE62);
var FieldOptionSchema = new Schema({ var FieldOptionSchema = new Schema({
option_id: { option_id: {
type: Number type: Number
@ -61,6 +64,9 @@ function BaseFieldSchema(){
Schema.apply(this, arguments); Schema.apply(this, arguments);
this.add({ this.add({
globalId: {
type: String,
},
isSubmission: { isSubmission: {
type: Boolean, type: Boolean,
default: false default: false
@ -193,6 +199,9 @@ FormFieldSchema.pre('save', function(next) {
if(this.logicJump && this.logicJump.fieldA) { if(this.logicJump && this.logicJump.fieldA) {
if(this.logicJump.jumpTo === '') delete this.logicJump.jumpTo; if(this.logicJump.jumpTo === '') delete this.logicJump.jumpTo;
} }
if(!this.globalId){
this.globalId = uidgen3.generateSync()
}
next(); next();
}); });

View file

@ -149,7 +149,6 @@ describe('FormSubmission Model Unit Tests:', function() {
mySubmission.save(function(err, submission) { mySubmission.save(function(err, submission) {
should.not.exist(err); should.not.exist(err);
should.exist(submission); should.exist(submission);
done(); done();
}); });
}); });
@ -187,7 +186,7 @@ describe('FormSubmission Model Unit Tests:', function() {
//Create Submission //Create Submission
mySubmission = new FormSubmission({ mySubmission = new FormSubmission({
form_fields: sampleSubmission, form_fields: _.merge(sampleSubmission, myForm.form_fields),
admin: user, admin: user,
form: myForm, form: myForm,
timeElapsed: 17.55 timeElapsed: 17.55
@ -200,7 +199,6 @@ describe('FormSubmission Model Unit Tests:', function() {
}); });
/*
it('should preserve deleted form_fields that have submissions without any problems', function(done) { it('should preserve deleted form_fields that have submissions without any problems', function(done) {
var old_fields = myForm.toObject().form_fields; var old_fields = myForm.toObject().form_fields;
@ -214,17 +212,18 @@ describe('FormSubmission Model Unit Tests:', function() {
should.not.exist(err); should.not.exist(err);
should.exist(_form.form_fields); should.exist(_form.form_fields);
var actual_fields = _.deepOmit(_form.toObject().form_fields, ['lastModified', 'created', '_id']); var actual_fields = _.deepOmit(_form.toObject().form_fields, ['deletePreserved', 'globalId', 'lastModified', 'created', '_id', 'submissionId']);
old_fields = _.deepOmit(old_fields, ['lastModified', 'created', '_id']); old_fields = _.deepOmit(old_fields, ['deletePreserved', 'globalId', 'lastModified', 'created', '_id', 'submissionId']);
should.deepEqual(JSON.stringify(actual_fields), JSON.stringify(old_fields), 'old form_fields not equal to newly saved form_fields'); should.deepEqual(actual_fields, old_fields, 'old form_fields not equal to newly saved form_fields');
done(); done();
}); });
}); });
//
it('should delete \'preserved\' form_fields whose submissions have been removed without any problems', function(done) { it('should delete \'preserved\' form_fields whose submissions have been removed without any problems', function(done) {
var old_fields = myForm.toObject().form_fields; var old_fields = myForm.toObject().form_fields;
old_fields.splice(0,1);
var new_form_fields = _.clone(myForm.toObject().form_fields); var new_form_fields = _.clone(myForm.toObject().form_fields);
new_form_fields.splice(0, 1); new_form_fields.splice(0, 1);
@ -240,16 +239,9 @@ describe('FormSubmission Model Unit Tests:', function() {
should.deepEqual(JSON.stringify(actual_fields), JSON.stringify(old_fields)); //'old form_fields not equal to newly saved form_fields'); should.deepEqual(JSON.stringify(actual_fields), JSON.stringify(old_fields)); //'old form_fields not equal to newly saved form_fields');
done(); done();
// //Remove submission
// mySubmission.remove(function(err){
// myForm.submissions.should.have.length(0);
// myForm.form_fields.should.not.containDeep(old_fields[0]);
// done();
// });
}); });
}); });
*/
afterEach(function(done){ afterEach(function(done){
mySubmission.remove(function(){ mySubmission.remove(function(){
done(); done();

View file

@ -210,7 +210,8 @@ module.exports = function(grunt) {
reporter: 'spec', reporter: 'spec',
quiet: false, quiet: false,
require: 'server.js', require: 'server.js',
ui: 'bdd' ui: 'bdd',
debug: true
} }
}, },
karma: { karma: {

View file

@ -95,6 +95,7 @@
"socket.io": "^1.4.6", "socket.io": "^1.4.6",
"socket.io-redis": "^1.0.0", "socket.io-redis": "^1.0.0",
"swig": "~1.4.1", "swig": "~1.4.1",
"uid-generator": "^0.1.1",
"uuid-token-generator": "^0.5.0", "uuid-token-generator": "^0.5.0",
"wildcard-subdomains": "github:tellform/wildcard-subdomains", "wildcard-subdomains": "github:tellform/wildcard-subdomains",
"winston": "^2.3.1", "winston": "^2.3.1",

View file

@ -86,9 +86,7 @@
scope = el.isolateScope() || el.scope(); scope = el.isolateScope() || el.scope();
scope.update = function(updateImmediately, data, isDiffed, refreshAfterUpdate, cb){ scope.update = function(updateImmediately, data, isDiffed, refreshAfterUpdate, cb){
if(cb){ if(cb) cb();
cb();
}
}; };
})); }));
@ -153,53 +151,5 @@
}); });
}); });
/*
describe('> Form Field Button >',function(){
it('$scope.addButton() should ADD a button to $scope.myform.startPage.buttons', function() {
var expectedStartPageBtn = {
bgColor:'#ddd',
color:'#ffffff',
text: 'Button'
};
//Run controller methods
scope.addButton();
var actualStartPageBtn = _.cloneDeep(_.last(scope.myform.startPage.buttons));
delete actualStartPageBtn._id;
expect(scope.myform.startPage.buttons.length).toEqual(sampleForm.startPage.buttons.length+1);
expect(actualStartPageBtn).toEqualData(expectedStartPageBtn);
});
it('$scope.deleteButton() should DELETE a button from $scope.myform.startPage.buttons', function() {
//Run controller methods
scope.deleteButton(scope.myform.startPage.buttons[0]);
expect(scope.myform.startPage.buttons.length).toEqual(0);
});
});
describe('> Form Field Option >',function(){
it('$scope.addOption() should ADD a new option to a field.fieldOptions', function() {
var originalOptionLen = scope.myform.form_fields[1].fieldOptions.length;
//Run controller methods
scope.addOption(1);
expect(originalOptionLen+1).toEqual(scope.myform.form_fields[1].fieldOptions.length);
expect(scope.myform.form_fields[1].fieldOptions[0].option_title).toEqualData('Option 0');
expect(scope.myform.form_fields[1].fieldOptions[0].option_value).toEqualData('Option 0');
});
it('$scope.deleteOption() should DELETE remove option from field.fieldOptions', function() {
//Run controller methods
scope.deleteOption(1, scope.myform.form_fields[1].fieldOptions[0]);
expect(scope.myform.form_fields[0].fieldOptions.length).toEqual(0);
expect(scope.myform.form_fields[0].fieldOptions[0]).not.toBeDefined();
});
});*/
}); });
}()); }());

View file

@ -35,7 +35,7 @@
it('should be able render all field-icon types', inject(function($compile) { it('should be able render all field-icon types', inject(function($compile) {
var currType, currClass; var currType, currClass;
for(var i=0; i<FormFields.types.length; i++){ for(var i=0; i<FormFields.types.length; i++){
currType = FormFields.types[i]; currType = FormFields.types[i];
currClass = faClasses[currType.name]; currClass = faClasses[currType.name];

View file

@ -18,7 +18,6 @@
})); }));
it('should emit Custom "Finished" and "Started" events on ng-repeat', inject(function($compile, $rootScope) { it('should emit Custom "Finished" and "Started" events on ng-repeat', inject(function($compile, $rootScope) {
scope.myfields = FormFields.types; scope.myfields = FormFields.types;
$compile('<div><div ng-repeat="item in myfields" on-finish-render="editFormFields">{{item.name}}</div></div>')(scope); $compile('<div><div ng-repeat="item in myfields" on-finish-render="editFormFields">{{item.name}}</div></div>')(scope);
@ -30,8 +29,6 @@
})); }));
it('should emit "ngRepeat Finished" and "ngRepeat Started" events on ng-repeat when attr is not set to string', inject(function($compile, $rootScope) { it('should emit "ngRepeat Finished" and "ngRepeat Started" events on ng-repeat when attr is not set to string', inject(function($compile, $rootScope) {
// console.log(FormFields.types);
scope.myfields = FormFields.types; scope.myfields = FormFields.types;
$compile('<div><div ng-repeat="item in myfields" on-finish-render>{{item.name}}</div></div>')(scope); $compile('<div><div ng-repeat="item in myfields" on-finish-render>{{item.name}}</div></div>')(scope);

View file

@ -169,7 +169,6 @@
expect(scope.myform.submitted).toBe(true); expect(scope.myform.submitted).toBe(true);
expect(scope.error).toEqual(''); expect(scope.error).toEqual('');
}); });
}); });
it('$scope.reloadForm() should reset and reload form', function(){ it('$scope.reloadForm() should reset and reload form', function(){

View file

@ -1,170 +0,0 @@
// 'use strict';
// (function() {
// // Principal controller Spec for E2E Tests
// describe('AuthenticationController E2E Tests', function() {
// describe('/signup should work for a unique username', function() {
// beforeEach(function() {
// var ptor = protractor.getInstance();
// ptor.get('http://localhost:3000/#!/signup');
// });
// it('should show the signup panel on page load', function() {
// expect($('section > section.row.auth > .col-md-12.text-center')).toEqual('Signup with your email');
// });
// //Jasmine it statement : What "it" will do.
// it('Verify that the user is logged in', function() {
// //Delete all cookies
// browser.driver.manage().deleteAllCookies();
// //Enter UserName
// element.all(by.model('username')).get(0).sendKeys('abc@wingify.com');
// //Enter Password
// element(by.model('password')).sendKeys('test');
// //Click Submit button
// element(by.css('.login-form button[type="submit"]')).click();
// //Wait for the current URL to change to welcome
// browser.driver.wait(function() {
// return browser.driver.getCurrentUrl().then(function(url) {
// return (/welcome/).test(url);
// });
// });
// var firstname = element(by.model('credentials.firstname')),
// lastname = element(by.model('credentials.lastname')),
// email = element(by.model('credentials.email')),
// password = element(by.model('credentials.password'));
// email.sendKeys('admin@app.com');
// firstname.sendKeys('admin_first');
// lastname.sendKeys('admin_last');
// password.sendKeys('1234');
// //Click signup button
// element(by.css('.btn.btn-large.btn-primary')).click().then(function () {
// expect(browser.getCurrentUrl()).toEqual('http://localhost:3000/#!/signup-success');
// });
// });
// });
// });
// // Principal controller Spec
// describe('AuthenticationController Unit Tests', function() {
// // Initialize global variables
// var AuthenticationController,
// scope,
// $httpBackend,
// $stateParams,
// $location;
// beforeEach(function() {
// jasmine.addMatchers({
// toEqualData: function(util, customEqualityTesters) {
// return {
// compare: function(actual, expected) {
// return {
// pass: angular.equals(actual, expected)
// };
// }
// };
// }
// });
// });
// // Load the main application module
// beforeEach(module(ApplicationConfiguration.applicationModuleName));
// // 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_, _$stateParams_, _$httpBackend_) {
// // Set a new global scope
// scope = $rootScope.$new();
// // Point global variables to injected services
// $stateParams = _$stateParams_;
// $httpBackend = _$httpBackend_;
// $location = _$location_;
// // Initialize the Principal controller
// AuthenticationController = $controller('AuthenticationController', {
// $scope: scope
// });
// }));
// it('$scope.signin() should login with a correct user and password', function() {
// // Test expected GET request
// $httpBackend.when('POST', '/auth/signin').respond(200, 'Fred');
// scope.signin();
// $httpBackend.flush();
// // Test scope value
// expect(scope.authentication.user).toEqual('Fred');
// expect($location.url()).toEqual('/');
// });
// it('$scope.signin() should fail to log in with nothing', function() {
// // Test expected POST request
// $httpBackend.expectPOST('/auth/signin').respond(400, {
// 'message': 'Missing credentials'
// });
// scope.signin();
// $httpBackend.flush();
// // Test scope value
// expect(scope.error).toEqual('Missing credentials');
// });
// it('$scope.signin() should fail to log in with wrong credentials', function() {
// // Foo/Bar combo assumed to not exist
// scope.authentication.user = 'Foo';
// scope.credentials = 'Bar';
// // Test expected POST request
// $httpBackend.expectPOST('/auth/signin').respond(400, {
// 'message': 'Unknown user'
// });
// scope.signin();
// $httpBackend.flush();
// // Test scope value
// expect(scope.error).toEqual('Unknown user');
// });
// it('$scope.signup() should register with correct data', function() {
// // Test expected GET request
// scope.authentication.user = 'Fred';
// $httpBackend.when('POST', '/auth/signup').respond(200, 'Fred');
// scope.signup();
// $httpBackend.flush();
// // test scope value
// expect(scope.authentication.user).toBe('Fred');
// expect(scope.error).toEqual(undefined);
// expect($location.url()).toBe('/');
// });
// it('$scope.signup() should fail to register with duplicate Username', function() {
// // Test expected POST request
// $httpBackend.when('POST', '/auth/signup').respond(400, {
// 'message': 'Username already exists'
// });
// scope.signup();
// $httpBackend.flush();
// // Test scope value
// expect(scope.error).toBe('Username already exists');
// });
// });
// }());

View file

@ -1,181 +1,181 @@
// 'use strict'; 'use strict';
// (function() { (function() {
// // Forms Controller Spec // Forms Controller Spec
// describe('Authentication Controller Tests', function() { describe('Authentication Controller Tests', function() {
// // Initialize global variables // Initialize global variables
// var AuthenticationController, var AuthenticationController,
// scope, scope,
// $httpBackend, $httpBackend,
// $stateParams, $stateParams,
// $location, $location,
// $state; $state;
// var sampleUser = { var sampleUser = {
// firstName: 'Full', firstName: 'Full',
// lastName: 'Name', lastName: 'Name',
// email: 'test@test.com', email: 'test@test.com',
// username: 'test@test.com', username: 'test@test.com',
// password: 'password', password: 'password',
// provider: 'local', provider: 'local',
// roles: ['user'], roles: ['user'],
// _id: 'ed873933b1f1dea0ce12fab9' _id: 'ed873933b1f1dea0ce12fab9'
// }; };
// var sampleForm = { var sampleForm = {
// title: 'Form Title', title: 'Form Title',
// admin: 'ed873933b1f1dea0ce12fab9', admin: 'ed873933b1f1dea0ce12fab9',
// language: 'english', language: 'english',
// form_fields: [ form_fields: [
// {fieldType:'textfield', title:'First Name', fieldValue: '', deletePreserved: false}, {fieldType:'textfield', title:'First Name', fieldValue: '', deletePreserved: false},
// {fieldType:'checkbox', title:'nascar', fieldValue: '', deletePreserved: false}, {fieldType:'checkbox', title:'nascar', fieldValue: '', deletePreserved: false},
// {fieldType:'checkbox', title:'hockey', fieldValue: '', deletePreserved: false} {fieldType:'checkbox', title:'hockey', fieldValue: '', deletePreserved: false}
// ], ],
// _id: '525a8422f6d0f87f0e407a33' _id: '525a8422f6d0f87f0e407a33'
// }; };
// var expectedForm = { var expectedForm = {
// title: 'Form Title', title: 'Form Title',
// admin: 'ed873933b1f1dea0ce12fab9', admin: 'ed873933b1f1dea0ce12fab9',
// language: 'english', language: 'english',
// form_fields: [ form_fields: [
// {fieldType:'textfield', title:'First Name', fieldValue: '', deletePreserved: false}, {fieldType:'textfield', title:'First Name', fieldValue: '', deletePreserved: false},
// {fieldType:'checkbox', title:'nascar', fieldValue: '', deletePreserved: false}, {fieldType:'checkbox', title:'nascar', fieldValue: '', deletePreserved: false},
// {fieldType:'checkbox', title:'hockey', fieldValue: '', deletePreserved: false} {fieldType:'checkbox', title:'hockey', fieldValue: '', deletePreserved: false}
// ], ],
// visible_form_fields: [ visible_form_fields: [
// {fieldType:'textfield', title:'First Name', fieldValue: '', deletePreserved: false}, {fieldType:'textfield', title:'First Name', fieldValue: '', deletePreserved: false},
// {fieldType:'checkbox', title:'nascar', fieldValue: '', deletePreserved: false}, {fieldType:'checkbox', title:'nascar', fieldValue: '', deletePreserved: false},
// {fieldType:'checkbox', title:'hockey', fieldValue: '', deletePreserved: false} {fieldType:'checkbox', title:'hockey', fieldValue: '', deletePreserved: false}
// ], ],
// _id: '525a8422f6d0f87f0e407a33' _id: '525a8422f6d0f87f0e407a33'
// }; };
// var sampleCredentials = { var sampleCredentials = {
// username: sampleUser.username, username: sampleUser.username,
// password: sampleUser.password, password: sampleUser.password,
// }; };
// // The $resource service augments the response object with methods for updating and deleting the resource. // 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 // 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. // 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 // When the toEqualData matcher compares two objects, it takes only object properties into
// // account and ignores methods. // account and ignores methods.
// beforeEach(function() { beforeEach(function() {
// jasmine.addMatchers({ jasmine.addMatchers({
// toEqualData: function(util, customEqualityTesters) { toEqualData: function(util, customEqualityTesters) {
// return { return {
// compare: function(actual, expected) { compare: function(actual, expected) {
// return { return {
// pass: angular.equals(actual, expected) pass: angular.equals(actual, expected)
// }; };
// } }
// }; };
// } }
// }); });
// }); });
// // Load the main application module // Load the main application module
// beforeEach(module(ApplicationConfiguration.applicationModuleName)); beforeEach(module(ApplicationConfiguration.applicationModuleName));
// beforeEach(module('stateMock')); beforeEach(module('stateMock'));
// // Mock Users Service // Mock Users Service
// beforeEach(module(function($provide) { beforeEach(module(function($provide) {
// $provide.service('User', function($q) { $provide.service('User', function($q) {
// return { return {
// getCurrent: function() { getCurrent: function() {
// var deferred = $q.defer(); var deferred = $q.defer();
// deferred.resolve( JSON.stringify(sampleUser) ); deferred.resolve( JSON.stringify(sampleUser) );
// return deferred.promise; return deferred.promise;
// }, },
// login: function(credentials) { login: function(credentials) {
// var deferred = $q.defer(); var deferred = $q.defer();
// if( credentials.password === sampleUser.password && credentials.username === sampleUser.username){ if( credentials.password === sampleUser.password && credentials.username === sampleUser.username){
// deferred.resolve( JSON.stringify(sampleUser) ); deferred.resolve( JSON.stringify(sampleUser) );
// }else { }else {
// deferred.resolve('Error: User could not be loggedin'); deferred.resolve('Error: User could not be loggedin');
// } }
// return deferred.promise; return deferred.promise;
// }, },
// logout: function() { logout: function() {
// var deferred = $q.defer(); var deferred = $q.defer();
// deferred.resolve(null); deferred.resolve(null);
// return deferred.promise; return deferred.promise;
// }, },
// signup: function(credentials) { signup: function(credentials) {
// var deferred = $q.defer(); var deferred = $q.defer();
// if( credentials.password === sampleUser.password && credentials.username === sampleUser.username){ if( credentials.password === sampleUser.password && credentials.username === sampleUser.username){
// deferred.resolve( JSON.stringify(sampleUser) ); deferred.resolve( JSON.stringify(sampleUser) );
// }else { }else {
// deferred.resolve('Error: User could not be signed up'); deferred.resolve('Error: User could not be signed up');
// } }
// return deferred.promise; return deferred.promise;
// } }
// }; };
// }); });
// })); }));
// // Mock Authentication Service // Mock Authentication Service
// beforeEach(module(function($provide) { beforeEach(module(function($provide) {
// $provide.service('Auth', function() { $provide.service('Auth', function() {
// return { return {
// ensureHasCurrentUser: function() { ensureHasCurrentUser: function() {
// return sampleUser; return sampleUser;
// }, },
// isAuthenticated: function() { isAuthenticated: function() {
// return true; return true;
// }, },
// getUserState: function() { getUserState: function() {
// return true; return true;
// } }
// }; };
// }); });
// })); }));
// // The injector ignores leading and trailing underscores here (i.e. _$httpBackend_). // 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 // This allows us to inject a service but then attach it to a variable
// // with the same name as the service. // with the same name as the service.
// beforeEach(inject(function($controller, $rootScope, _$state_, _$location_, _$stateParams_, _$httpBackend_, CurrentForm, Forms) { beforeEach(inject(function($controller, $rootScope, _$state_, _$location_, _$stateParams_, _$httpBackend_, CurrentForm, Forms) {
// // Set a new global scope // Set a new global scope
// scope = $rootScope.$new(); scope = $rootScope.$new();
// scope.abc = 'hello'; scope.abc = 'hello';
// // Point global variables to injected services // Point global variables to injected services
// $stateParams = _$stateParams_; $stateParams = _$stateParams_;
// $httpBackend = _$httpBackend_; $httpBackend = _$httpBackend_;
// $location = _$location_; $location = _$location_;
// $state = _$state_; $state = _$state_;
// // $httpBackend.whenGET(/\.html$/).respond(''); // $httpBackend.whenGET(/\.html$/).respond('');
// $httpBackend.whenGET('/users/me/').respond(''); $httpBackend.whenGET('/users/me/').respond('');
// // Initialize the Forms controller. // Initialize the Forms controller.
// AuthenticationController = $controller('AuthenticationController', { $scope: scope }); AuthenticationController = $controller('AuthenticationController', { $scope: scope });
// })); }));
// it('$scope.signin should sigin in user with valid credentials', inject(function(Auth) { it('$scope.signin should sigin in user with valid credentials', inject(function(Auth) {
// //Set $state transition //Set $state transition
// // $state.expectTransitionTo('listForms'); // $state.expectTransitionTo('listForms');
// //Set POST response //Set POST response
// // $httpBackend.expect('POST', '/auth/signin', sampleCredentials).respond(200, sampleUser); // $httpBackend.expect('POST', '/auth/signin', sampleCredentials).respond(200, sampleUser);
// scope.abc = 'sampleCredentials'; scope.abc = 'sampleCredentials';
// //Run Controller Logic to Test //Run Controller Logic to Test
// scope.signin(); scope.signin();
// // $httpBackend.flush(); // $httpBackend.flush();
// // Test scope value // Test scope value
// // expect(Auth.ensureHasCurrentUser()).toEqualData(sampleUser); // expect(Auth.ensureHasCurrentUser()).toEqualData(sampleUser);
// })); }));
// }); });
// }()); }());

View file

@ -65,7 +65,6 @@
})); }));
it('Auth.getUserState() should fetch current user state', function() { it('Auth.getUserState() should fetch current user state', function() {
//Run Service Logic to Test //Run Service Logic to Test
Auth.login(sampleUser); Auth.login(sampleUser);
var currUserState = Auth.getUserState(); var currUserState = Auth.getUserState();