'use strict';
(function() {
// Forms Controller Spec
describe('SubmitForm Directive-Controller Tests', function() {
// Initialize global variables
var scope, controller, $httpBackend;
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', fieldOptions: [], fieldValue: '', required: true, disabled: false, deletePreserved: false, _id: 'ed873933b0ce121f1deafab9'},
{fieldType:'checkbox', title:'nascar', fieldOptions: [], fieldValue: '', required: true, disabled: false, deletePreserved: false, _id: 'ed83b0ce121f17393deafab9'},
{fieldType:'checkbox', title:'hockey', fieldOptions: [], fieldValue: '', required: true, disabled: false, deletePreserved: false, _id: 'ed8317393deab0ce121ffab9'} ],
visible_form_fields: [
{fieldType:'textfield', title:'First Name', fieldOptions: [], fieldValue: '', required: true, disabled: false, deletePreserved: false, _id: 'ed873933b0ce121f1deafab9'},
{fieldType:'checkbox', title:'nascar', fieldOptions: [], fieldValue: '', required: true, disabled: false, deletePreserved: false, _id: 'ed83b0ce121f17393deafab9'},
{fieldType:'checkbox', title:'hockey', fieldOptions: [], fieldValue: '', required: true, disabled: false, deletePreserved: false, _id: 'ed8317393deab0ce121ffab9'} ],
pdf: {},
pdfFieldMap: {},
startPage: {
showStart: false
},
hideFooter: false,
isGenerated: false,
isLive: false,
autofillPDFs: false,
_id: '525a8422f6d0f87f0e407a33'
};
var sampleSubmission = {
form_fields: [
{fieldType:'textfield', title:'First Name', fieldValue: 'John Smith', deletePreserved: false, _id: 'ed873933b0ce121f1deafab9'},
{fieldType:'yes_no', title:'Do you like nascar', fieldValue: true, deletePreserved: false, _id: 'ed83b0ce121f17393deafab9'},
{fieldType:'yes_no', title:'Do you like hockey', fieldValue: false, deletePreserved: false, _id: 'ed8317393deab0ce121ffab9'}
],
admin: sampleUser,
form: sampleForm,
timeElapsed: 17.55
};
var sampleSubmissions = [{
form_fields: [
{fieldType:'textfield', title:'First Name', fieldValue: 'The Terminator', deletePreserved: false},
{fieldType:'yes_no', title:'Do you like nascar', fieldValue: 'true', deletePreserved: false},
{fieldType:'yes_no', title:'Do you like hockey', fieldValue: 'false', deletePreserved: false}
],
admin: sampleUser,
form: sampleForm,
timeElapsed: 10.33
},
{
form_fields: [
{fieldType:'textfield', title:'First Name', fieldValue: 'John Smith', deletePreserved: false},
{fieldType:'yes_no', title:'Do you like nascar', fieldValue: 'true', deletePreserved: false},
{fieldType:'yes_no', title:'Do you like hockey', fieldValue: 'true', deletePreserved: false}
],
admin: sampleUser,
form: sampleForm,
timeElapsed: 2.33
},
{
form_fields: [
{fieldType:'textfield', title:'First Name', fieldValue: 'Jane Doe', deletePreserved: false},
{fieldType:'yes_no', title:'Do you like nascar', fieldValue: 'false', deletePreserved: false},
{fieldType:'yes_no', title:'Do you like hockey', fieldValue: 'false', deletePreserved: false}
],
admin: sampleUser,
form: sampleForm,
timeElapsed: 11.11
}];
// 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)
};
}
};
}
});
});
// Load the main application module
beforeEach(module(ApplicationConfiguration.applicationModuleName));
beforeEach(module('module-templates'));
beforeEach(module('stateMock'));
beforeEach(inject(function($compile, $controller, $rootScope, _$httpBackend_) {
// Point global variables to injected services
$httpBackend = _$httpBackend_;
$httpBackend.whenGET('/users/me/').respond('');
//Instantiate directive.
var tmp_scope = $rootScope.$new();
tmp_scope.myform = sampleForm;
//gotacha: Controller and link functions will execute.
var el = angular.element('');
$compile(el)(tmp_scope);
tmp_scope.$digest();
$rootScope.$digest();
//Grab controller instance
controller = el.controller();
//Grab scope. Depends on type of scope.
//See angular.element documentation.
scope = el.isolateScope() || el.scope();
}));
var Validator = (function() {
return {
hasMinimumFields: function(entry) {
return !_.isEmpty(entry._id) && !_.isEmpty(entry.title);
},
isNewForm: function(entry) {
return this.hasMinimumFields(entry);
}
};
})();
it('$scope.submitForm() should submit valid form', function(){
//Initialize variables
scope.myform.form_fields = sampleSubmissions[0].form_fields;
var expectedForm = _.cloneDeep(sampleForm);
expectedForm.form_fields = sampleSubmissions[0].form_fields;
delete expectedForm.visible_form_fields;
var data = function(data) {
var form = angular.fromJson(data);
var compareForm = _.cloneDeep(form);
delete compareForm.timeElapsed;
delete compareForm.percentageComplete;
return Validator.isNewForm(form) && _.isEqual(compareForm, expectedForm);
};
//Set expected HTTP requests
$httpBackend.expect('POST',/^(\/forms\/)([0-9a-fA-F]{24})$/, data).respond(200);
//Run Controller Logic to Test
scope.submitForm(function(error){
expect(error).toBe(null);
expect(scope.myform.submitted).toBe(true);
expect(scope.error).toEqual('');
});
});
it('$scope.reloadForm() should reset and reload form', function(){
scope.submitForm();
scope.reloadForm();
expect(scope.myform.submitted).toBe(false);
for(var i=0; i