/* MMigreringsbeslut: denna test behöver Chrome headless eller PhantomJs + es6-shim för att kunna köras */ describe("fbDokumentField", function () { var element: any; var $scope; var link: any; var dokumentVaerde: fb.DokumentVaerde; var fbWindow: any; beforeEach(angular.mock.module('fasit', 'fbMocks')); beforeEach(function () { dokumentVaerde = new fb.DokumentVaerde({ "DokumentVaerdeId": 0, "DokumentId": 0, "VaerdeNamn": "OA1", "Vaerde": "Tacosgatan 33", "FontSize": null, "Bold": null, "Italic": null, "Underline": null, "FontColor": null }); }); afterEach(function () { $scope.$destroy(); }); describe('med data som är korrekt', function () { var innerScope: fb.IFbDokumentFieldScope; var contentElement: any; beforeEach(inject(function ($compile, $rootScope, $httpBackend) { $scope = $rootScope; $scope.dokumentVaerden = {}; $scope.dokumentVaerden[dokumentVaerde.VaerdeNamn] = dokumentVaerde $scope.pageSplit = []; $scope.vaerdeHoejdData = {}; $scope.maxWidth = 20; $scope.originalText = 'Granstigen 22'; var DOM = '' element = angular.element(DOM); link = $compile(element)($scope); $scope.$digest(); innerScope = $scope.$$childTail; // Hämtar div-taggen som innehåller värdet som bearbetas av directivet contentElement = element.find('.fb-dokument-field-editable-field'); fbWindow = window; })); afterEach(function () { $scope.$destroy(); innerScope.$destroy(); }); it('borde skapa elementet ', function () { expect(element).not.toBe(null); }); it('borde ladda in rätt html och skapa bindningar', inject(function () { expect(contentElement[0].innerHTML).toContain(dokumentVaerde.Vaerde); $scope.dokumentVaerden[dokumentVaerde.VaerdeNamn].Vaerde = 'Tacogatan 34'; $scope.$digest(); expect(contentElement[0].innerHTML).toContain('Tacogatan 34'); })); it('borde kunna återställa sitt värde till originalvärdet', inject(function () { expect(contentElement[0].innerHTML).toContain(dokumentVaerde.Vaerde); innerScope.reset(); $scope.$digest(); expect(contentElement[0].innerHTML).toContain($scope.originalText); })); it('Borde uppdatera scope från och kunna läsa eventen focusin, focusout, blur, keyup och change', inject(function () { //var testTexter = ['Testtext1', 'Testtext2', 'Testtext3', 'Testtext4']; //expect(innerScope.editing).toBe(false); //angular.element(link[2].lastChild).triggerHandler('focusin'); //expect(innerScope.editing).toBe(true); //angular.element(link[2].lastChild).triggerHandler('focusout'); //expect(innerScope.editing).toBe(false); //angular.element(link[2].lastChild).triggerHandler('focusin'); //var tmpElement: any = angular.element(link[2].lastChild).context.lastChild; //tmpElement.innerHTML = testTexter[0]; //angular.element(link[2].lastChild).triggerHandler('blur'); //expect(dokumentVaerde1.Vaerde).toBe(testTexter[0]); //tmpElement.innerHTML = testTexter[1]; //expect(dokumentVaerde1.Vaerde).toBe(testTexter[0]); //angular.element(link[2].lastChild).triggerHandler('keyup'); //expect(dokumentVaerde1.Vaerde).toBe(testTexter[1]); //tmpElement.innerHTML = testTexter[2]; //expect(dokumentVaerde1.Vaerde).toBe(testTexter[1]); //angular.element(link[2].lastChild).triggerHandler('change'); //expect(dokumentVaerde1.Vaerde).toBe(testTexter[2]); })); it('Borde sätta värdet av fältet till originalvärdet om focusout triggas och fältet innehåller en tom sträng', inject(function () { //var tmpElement: any = angular.element(link[2].lastChild); //tmpElement.triggerHandler('focusin'); //tmpElement.context.lastChild.innerHTML = ''; //tmpElement.triggerHandler('focusout'); //expect(innerScope.editing).toBe(false); //expect(dokumentVaerde1.Vaerde).toBe(originalText); })); describe('vid paste av text', function () { it('Borde klistra in oformaterad data i fältet genom e.clipboardData', inject(function () { var textToPaste = 'testing this text'; contentElement.triggerHandler({ type: 'paste', clipboardData: { getData: function (properties) { return textToPaste; } } }); $scope.$digest(); })); it('Borde klistra in oformaterad data i fältet genom window.clipboardData', inject(function () { var textToPaste = 'testing this text'; fbWindow.clipboardData = { getData: function (properties) { return textToPaste; } }; contentElement.triggerHandler({ type: 'paste' }); $scope.$digest(); })); it('Borde klistra in oformaterad data i fältet genom e.originalEvent.clipboardData', inject(function () { var textToPaste = 'testing this text'; ( window).clipboardData = null; contentElement.triggerHandler({ type: 'paste', originalEvent: { clipboardData: { getData: function (properties) { return textToPaste; } } } }); $scope.$digest(); })); it('Borde inte klistra in data i fältet om ingen data hittas', inject(function () { ( window).clipboardData = null; contentElement.triggerHandler({ type: 'paste' }); $scope.$digest(); })); //it('Borde klistra in text i DOM om elementet är ett DOM-element', inject(function () { // var textToPaste = 'testing this text'; // var tmp = document.queryCommandSupported; // document.queryCommandSupported = function (type) { return false; }; // var domToPasteIn = '
abcdefghijklmnopqrstuvwxyz
'; // var elementToPasteIn = angular.element(domToPasteIn)[0]; // fbWindow.getSelection = function () { // return { // focusNode: elementToPasteIn, // focusOffset: 10 // }; // }; // contentElement.triggerHandler({ // type: 'paste', // clipboardData: { getData: function (properties) { return textToPaste; } } // }); // $scope.$digest(); // expect(elementToPasteIn.innerHTML).toContain(textToPaste); // expect(elementToPasteIn.innerHTML.substring(0, 10)).toBe(domToPasteIn.substring(5, 15)); // expect(elementToPasteIn.innerHTML.substring(10, 27)).toBe(textToPaste); // expect(elementToPasteIn.innerHTML.substring(28, 43)).toBe(domToPasteIn.substring(16, 31)); // document.queryCommandSupported = tmp; //})); //it('Borde klistra in text i elementet om elementet är ett text-element', inject(function () { // var textToPaste = 'testing this text'; // var tmp = document.queryCommandSupported; // document.queryCommandSupported = function (type) { return false; }; // var text = 'abcdefghijklmnopqrstuvwxyz'; // var elementToPasteIn = { // text: text, // insertData: function (offset, data) { // this.text = this.text.substring(0, offset) + data + this.text.substring(offset, this.text.length); // } // }; // fbWindow.getSelection = function () { // return { // focusNode: elementToPasteIn, // focusOffset: 10 // }; // }; // contentElement.triggerHandler({ // type: 'paste', // clipboardData: { getData: function (properties) { return textToPaste; } } // }); // $scope.$digest(); // expect(elementToPasteIn.text).toContain(textToPaste); // expect(elementToPasteIn.text.substring(0, 10)).toBe(text.substring(0, 10)); // expect(elementToPasteIn.text.substring(10, 27)).toBe(textToPaste); // expect(elementToPasteIn.text.substring(28, 43)).toBe(text.substring(11, 26)); // document.queryCommandSupported = tmp; //})); }); describe('radindelning', function () { it('Borde göra radjusteringar vid focusout-event om texten är för lång', inject(function () { //expect(innerScope.editing).toBe(false); //angular.element(link[2].lastChild).triggerHandler('focusin'); //expect(innerScope.editing).toBe(true); //innerScope.dokumentVaerde.Vaerde = 'Tacosgatan är en gata som inte är som andra gator då den gatan är en gata med tacos'; //innerScope.$digest(); //angular.element(link[2].lastChild).triggerHandler('focusout'); //expect(innerScope.editing).toBe(false); //expect(innerScope.dokumentVaerde.Vaerde).toContain('
'); })); it('Borde inte ta bort radjusteringar vid focusin-event om vaerde är null', inject(function () { //innerScope.dokumentVaerde.Vaerde = ''; //angular.element(link[2].lastChild).triggerHandler('focusin'); //innerScope.$digest(); //expect(innerScope.dokumentVaerde.Vaerde).toBe(innerScope.originalVaerde); })); it('Borde inte göra radjusteringar vid focusout-event om inte maxWidth är satt', inject(function () { //$scope.maxWidth = 0; //$scope.$digest(); //expect(innerScope.editing).toBe(false); //angular.element(link[2].lastChild).triggerHandler('focusin'); //expect(innerScope.editing).toBe(true); //innerScope.dokumentVaerde.Vaerde = 'Tacosgatan är en gata som inte är som andra gator då den gatan är en gata med tacos'; //innerScope.$digest(); //angular.element(link[2].lastChild).triggerHandler('focusout'); //expect(innerScope.editing).toBe(false); //expect(innerScope.dokumentVaerde.Vaerde).not.toContain('
'); })); }); }); describe('sidindelning', function () { var innerScope: fb.IFbDokumentFieldScope; var divMedText: any; var pageSplitDiv: any; var contentElement: any; beforeEach(inject(function ($compile, $rootScope, $httpBackend) { $scope = $rootScope; $scope.dokumentVaerden = {}; $scope.dokumentVaerden[dokumentVaerde.VaerdeNamn] = dokumentVaerde $scope.pageSplit = []; $scope.vaerdeHoejdData = {}; $scope.maxWidth = 20; $scope.originalText = 'Granstigen 22'; var DOM = '' element = angular.element(DOM); link = $compile(element)($scope); $scope.$digest(); innerScope = $scope.$$childTail; // Hämtar div-taggen som innehåller värdet som bearbetas av directivet contentElement = element.find('.fb-dokument-field-editable-field'); fbWindow = window; })); afterEach(function () { $scope.$destroy(); innerScope.$destroy(); }); it('borde inte göra någonting ifall pageSplit inte är satt', inject(function ($timeout: ng.ITimeoutService) { })); it('borde dela in vaerdet i sidor om pageSplit är satt och vaerdet överlappar sidbrytningen', inject(function ($timeout: ng.ITimeoutService) { })); it('borde dela in vaerdet i sidor beroende på font-storlek', inject(function ($timeout: ng.ITimeoutService) { })); it('borde dela in vaerdet i sidor beroende på line-height', inject(function ($timeout: ng.ITimeoutService) { })); it('borde dela in vaerdet i mer än 2 sidor om pageSplit är satt och vaerdet överlappar sidbrytningen', inject(function ($timeout: ng.ITimeoutService) { })); it('borde kalla på att uppdatera sidindelning ifall vaerdeOffset ändras', inject(function ($timeout: ng.ITimeoutService) { })); it('borde kalla på att uppdatera sidindelning ifall dokumentVaerdet ändras', inject(function ($timeout: ng.ITimeoutService) { })); }); describe('med felaktiga attribut', function () { describe('utan ng-model satt i DOM', function () { var innerScope; var contentElement: any; beforeEach(inject(function ($compile, $rootScope, $httpBackend) { $scope = $rootScope; $scope.dokumentVaerden = {}; $scope.dokumentVaerden[dokumentVaerde.VaerdeNamn] = dokumentVaerde; $scope.pageSplit = []; $scope.vaerdeHoejdData = {}; $scope.maxWidth = 20; $scope.originalText = 'Granstigen 22'; var DOM = ''; element = angular.element(DOM); link = $compile(element)($scope); $scope.$digest(); innerScope = $scope.$$childTail; // Hämtar div-taggen som innehåller värdet som bearbetas av directivet contentElement = element.find('.fb-dokument-field-editable-field'); fbWindow = window; })); afterEach(function () { $scope.$destroy(); innerScope.$destroy(); }); it('borde skapa elementet ', function () { expect(element).not.toBe(null); }); it('borde inte ha någon funktionalitet i scope', function () { expect(innerScope.setBold).toBeUndefined(); expect(innerScope.setItalic).toBeUndefined(); expect(innerScope.setUnderline).toBeUndefined(); expect(innerScope.setFontSize).toBeUndefined(); }); it('borde ladda in rätt html, men inte skapa några bindningar', inject(function () { expect(contentElement[0].innerHTML).toContain(dokumentVaerde.Vaerde); $scope.dokumentVaerden[dokumentVaerde.VaerdeNamn].Vaerde = 'Tacogatan 34'; $scope.$digest(); expect(contentElement[0].innerHTML).toContain('Tacosgatan 33'); })); }); describe('med ett dokument-vaerde som inte existerar', function () { var innerScope; var contentElement: any; beforeEach(inject(function ($compile, $rootScope, $httpBackend) { $scope = $rootScope; $scope.dokumentVaerden = {}; $scope.dokumentVaerden[dokumentVaerde.VaerdeNamn] = dokumentVaerde; $scope.pageSplit = []; $scope.vaerdeHoejdData = {}; $scope.maxWidth = 20; $scope.originalText = 'Granstigen 22'; var DOM = ''; element = angular.element(DOM); link = $compile(element)($scope); $scope.$digest(); innerScope = $scope.$$childTail; // Hämtar div-taggen som innehåller värdet som bearbetas av directivet contentElement = element.find('.fb-dokument-field-editable-field'); fbWindow = window; })); afterEach(function () { $scope.$destroy(); innerScope.$destroy(); }); it('borde skapa elementet ', function () { expect(element).not.toBe(null); }); it('borde skapa det icke existerande dokument-vaerdet som ett scope-objekt', function () { expect(innerScope.dokumentVaerde).not.toBeUndefined(); expect($scope.dokumentVaerden.OA5).not.toBeUndefined(); }); it('borde visa originalvärdet', function () { expect(contentElement[0].innerHTML).toContain('Granstigen 22'); }); }); describe('utan ngModel och med ett dokument-vaerde som inte existerar', function () { var innerScope; var contentElement: any; beforeEach(inject(function ($compile, $rootScope, $httpBackend) { $scope = $rootScope; $scope.dokumentVaerden = {}; $scope.dokumentVaerden[dokumentVaerde.VaerdeNamn] = dokumentVaerde; $scope.pageSplit = []; $scope.vaerdeHoejdData = {}; $scope.maxWidth = 20; $scope.originalText = 'Granstigen 22'; var DOM = ''; element = angular.element(DOM); link = $compile(element)($scope); $scope.$digest(); innerScope = $scope.$$childTail; // Hämtar div-taggen som innehåller värdet som bearbetas av directivet contentElement = element.find('.fb-dokument-field-editable-field'); fbWindow = window; })); afterEach(function () { $scope.$destroy(); innerScope.$destroy(); }); it('borde skapa elementet ', function () { expect(element).not.toBe(null); }); it('borde visa originalvärdet', function () { expect(contentElement[0].innerHTML).toContain('Granstigen 22'); }); }); }); });