describeMixin('mail_view/ui/attachment_list', function () { 'use strict'; describe('initialization', function () { beforeEach(function () { this.setupComponent('
' + '' + '' + '
'); }); it('should add attachment to the list based on uploadedAttachment event', function () { var stubAttachment = {ident: 'faked'}; $(document).trigger(Pixelated.events.mail.appendAttachment, stubAttachment); expect(this.component.attr.attachments).toEqual([stubAttachment]); var anotherStubAttachment = {ident: 'faked 2'}; $(document).trigger(Pixelated.events.mail.appendAttachment, anotherStubAttachment); expect(this.component.attr.attachments).toEqual([stubAttachment, anotherStubAttachment]); }); it('should trigger add attachment event', function () { var triggerUploadAttachment = spyOnEvent(document, Pixelated.events.mail.appendAttachment); var stubAttachment = {ident: 'faked'}; $(document).trigger(Pixelated.events.mail.uploadedAttachment, stubAttachment); expect(triggerUploadAttachment).toHaveBeenTriggeredOnAndWith(document, stubAttachment); }); it('should render attachment list view based on uploadedAttachment event', function () { var stubAttachment = {ident: 'faked', name: 'haha.txt', size: 4500, encoding: 'base64'}; $(document).trigger(Pixelated.events.mail.uploadedAttachment, stubAttachment); expect(this.component.select('attachmentListItem').html()).toContain('href="/attachment/faked'); expect(this.component.select('attachmentListItem').html()).toContain('filename=haha.txt'); expect(this.component.select('attachmentListItem').html()).toContain('encoding=base64'); expect(this.component.select('attachmentListItem').html()).toContain('haha.txt'); expect(this.component.select('attachmentListItem').html()).toContain('(4.39 Kb'); }); describe('Upload', function() { describe('Progress Bar', function () { it('should show/hide progress bar', function() { this.component.showUploadProgressBar(null, {originalFiles: [{name: 'foo.txt', size: 4500}]}); expect(this.component.select('attachmentUploadItem').html()).toContain('foo.txt'); expect(this.component.select('attachmentUploadItem').html()).toContain('(4.39 Kb'); expect(this.component.select('attachmentUploadItem').css('display')).toEqual('block'); this.component.hideUploadProgressBar(); expect(this.component.select('attachmentUploadItem').css('display')).toEqual('none'); }); }); describe('Cancel', function() { it('should cancel the upload', function() { var fakeJQXHR = { abort: function() {} }; spyOn(fakeJQXHR, 'abort'); this.component.showUploadProgressBar(null, {originalFiles: [{name: 'foo.txt', size: 4500}]}); this.component.attachUploadAbort(null, fakeJQXHR); this.component.select('attachmentUploadItemAbort').click(); expect(fakeJQXHR.abort).toHaveBeenCalled(); }); }); describe('Error', function() { it('should show error message', function () { this.component.showUploadError(); expect(this.component.select('uploadError').html()).toContain('Upload failed. This file exceeds the 1MB limit.'); }); it('should dismiss upload failed message when clicking close icon', function () { this.component.showUploadError(); this.component.select('closeIcon').click(); expect(this.component.select('uploadError').html()).toBe(undefined); }); it('should dismiss upload failed message when clicking dismiss button', function () { this.component.showUploadError(); this.component.select('dismissButton').click(); expect(this.component.select('uploadError').html()).toBe(undefined); }); it('should start file upload when clicking Choose another file button', function () { this.component.showUploadError(); var triggerUploadAttachment = spyOnEvent(document, Pixelated.events.mail.startUploadAttachment); this.component.select('uploadFileButton').click(); expect(triggerUploadAttachment).toHaveBeenTriggeredOn(document); }); }); describe('File size check', function (){ var ONE_MEGABYTE = 1024*1024; var largeAttachment = {originalFiles: [{size: ONE_MEGABYTE+1}]}; it('should reject files larger than 1MB', function () { var uploadAccepted = this.component.performPreUploadCheck(null, largeAttachment); expect(uploadAccepted).toBe(false); }); it('should accept files less or equal 1MB', function () { var smallAttachment = {originalFiles: [{size: ONE_MEGABYTE}]}; var uploadAccepted = this.component.performPreUploadCheck(null, smallAttachment); expect(uploadAccepted).toBe(true); }); }); describe('Remove attachment', function () { it('should call the remove attachment method when triggered the removeAttachement event', function () { var stubAttachment = {ident: 'whatever', element: 'element'}; spyOn(this.component, 'removeAttachmentFromList'); spyOn(this.component, 'destroyAttachmentElement'); $(document).trigger(Pixelated.events.mail.removeAttachment, stubAttachment); expect(this.component.removeAttachmentFromList).toHaveBeenCalledWith('whatever'); expect(this.component.destroyAttachmentElement).toHaveBeenCalledWith('element'); }); it('should remove the attachment item from the DOM', function () { var stubAttachment = {ident: 'whatever', element: 'element'}; this.setupComponent('
' + '' + '' + '
'); var element = this.component.$node.find('i.remove-icon'); expect(this.component.$node.find('li[data-ident=whatever]').length).toEqual(1); this.component.destroyAttachmentElement(element); expect(this.component.$node.find('li[data-ident=whatever]').length).toEqual(0); }); it('should remove attachment from attachment list', function () { var stubAttachment = {ident: 'whatever', element: 'element'}; this.component.attr.attachments = [{ident: 'whatever'}, {ident: 'another attachment'}]; this.component.removeAttachmentFromList('whatever'); expect(this.component.attr.attachments).toEqual([{ident: 'another attachment'}]); }); it('when remove attachment that is not on the attachment list should not do anything', function () { var stubAttachment = {ident: 'whatever', element: 'element'}; this.component.attr.attachments = [{ident: 'whatever'}]; this.component.removeAttachmentFromList({ident: 'different attachment'}); expect(this.component.attr.attachments).toEqual([{ident: 'whatever'}]); }); }); }); }); });