Skip to content

Commit

Permalink
Adding tests for file drop directive
Browse files Browse the repository at this point in the history
  • Loading branch information
Adrian Fâciu committed Sep 26, 2017
1 parent eca1129 commit 6bdf60f
Show file tree
Hide file tree
Showing 2 changed files with 147 additions and 37 deletions.
47 changes: 19 additions & 28 deletions src/file-upload/file-drop.directive.ts
Original file line number Diff line number Diff line change
@@ -1,29 +1,29 @@
import { Directive, EventEmitter, ElementRef, HostListener, Input, Output } from '@angular/core';

import { FileUploader } from './file-uploader.class';
import { FileUploader, FileUploaderOptions } from './file-uploader.class';

@Directive({selector: '[ng2FileDrop]'})
@Directive({ selector: '[ng2FileDrop]' })
export class FileDropDirective {
@Input() public uploader:FileUploader;
@Output() public fileOver:EventEmitter<any> = new EventEmitter();
@Output() public onFileDrop:EventEmitter<File[]> = new EventEmitter<File[]>();
@Input() public uploader: FileUploader;
@Output() public fileOver: EventEmitter<any> = new EventEmitter();
@Output() public onFileDrop: EventEmitter<File[]> = new EventEmitter<File[]>();

protected element:ElementRef;
protected element: ElementRef;

public constructor(element:ElementRef) {
public constructor(element: ElementRef) {
this.element = element;
}

public getOptions():any {
public getOptions(): FileUploaderOptions {
return this.uploader.options;
}

public getFilters():any {
public getFilters(): any {
return {};
}

@HostListener('drop', ['$event'])
public onDrop(event:any):void {
@HostListener('drop', [ '$event' ])
public onDrop(event: any): void {
let transfer = this._getTransfer(event);
if (!transfer) {
return;
Expand All @@ -37,8 +37,8 @@ export class FileDropDirective {
this.onFileDrop.emit(transfer.files);
}

@HostListener('dragover', ['$event'])
public onDragOver(event:any):void {
@HostListener('dragover', [ '$event' ])
public onDragOver(event: any): void {
let transfer = this._getTransfer(event);
if (!this._haveFiles(transfer.types)) {
return;
Expand All @@ -49,10 +49,10 @@ export class FileDropDirective {
this.fileOver.emit(true);
}

@HostListener('dragleave', ['$event'])
public onDragLeave(event:any):any {
@HostListener('dragleave', [ '$event' ])
public onDragLeave(event: any): any {
if ((this as any).element) {
if (event.currentTarget === (this as any).element[0]) {
if (event.currentTarget === (this as any).element[ 0 ]) {
return;
}
}
Expand All @@ -61,16 +61,16 @@ export class FileDropDirective {
this.fileOver.emit(false);
}

protected _getTransfer(event:any):any {
protected _getTransfer(event: any): any {
return event.dataTransfer ? event.dataTransfer : event.originalEvent.dataTransfer; // jQuery fix;
}

protected _preventAndStop(event:any):any {
protected _preventAndStop(event: any): any {
event.preventDefault();
event.stopPropagation();
}

protected _haveFiles(types:any):any {
protected _haveFiles(types: any): any {
if (!types) {
return false;
}
Expand All @@ -83,13 +83,4 @@ export class FileDropDirective {
return false;
}
}

/*
_addOverClass(item:any):any {
item.addOverClass();
}
_removeOverClass(item:any):any {
item.removeOverClass();
}*/
}
137 changes: 128 additions & 9 deletions src/spec/file-drop.directive.spec.ts
Original file line number Diff line number Diff line change
@@ -1,28 +1,147 @@
import { Component } from '@angular/core';
import { Component, DebugElement } from '@angular/core';
import { By } from '@angular/platform-browser';
import { inject, ComponentFixture, TestBed } from '@angular/core/testing';

import { FileUploader } from '../file-upload/file-uploader.class';
import { FileUploadModule } from '../file-upload/file-upload.module';
import { FileDropDirective } from '../file-upload/file-drop.directive';

@Component({
selector: 'container',
template: `<input type="file" ng2FileSelect [uploader]="uploader" />`
template: `<input type="file"
ng2FileDrop
[uploader]="uploader"
/>`
})
export class ContainerComponent {
public uploader:FileUploader = new FileUploader({url: 'localhost:3000'});
public get url(): string { return 'localhost:3000'; }
public uploader: FileUploader = new FileUploader({ url: this.url });
}

describe('Directive: FileSelectDirective', () => {

let fixture: ComponentFixture<ContainerComponent>;
let hostComponent: ContainerComponent;
let directiveElement: DebugElement;
let fileDropDirective: FileDropDirective;

beforeEach(() => {
TestBed.configureTestingModule({
imports: [FileUploadModule],
declarations: [ContainerComponent],
providers: [ContainerComponent]
imports: [ FileUploadModule ],
declarations: [ ContainerComponent ],
providers: [ ContainerComponent ]
});
});

it('should be fine', inject([ContainerComponent], (fixture:ComponentFixture<ContainerComponent>) => {
expect(fixture).not.toBeNull();
}));
beforeEach(() => {
fixture = TestBed.createComponent(ContainerComponent);
hostComponent = fixture.componentInstance;

fixture.detectChanges();

directiveElement = fixture.debugElement.query(By.directive(FileDropDirective));
fileDropDirective = directiveElement.injector.get(FileDropDirective) as FileDropDirective;
});

it('can be initialized', () => {
expect(fixture).toBeDefined();
expect(hostComponent).toBeDefined();
expect(fileDropDirective).toBeDefined();
});

it('can set file uploader', () => {
expect(fileDropDirective.uploader).toBe(hostComponent.uploader);
});

it('can get uploader options', () => {
const options = fileDropDirective.getOptions();

// Check url set through binding
expect(options.url).toBe(hostComponent.url);

// Check default options
expect(options.autoUpload).toBeFalsy();
expect(options.isHTML5).toBeTruthy();
expect(options.removeAfterUpload).toBeFalsy();
expect(options.disableMultipart).toBeFalsy();
});

it('can get filters', () => {
const filters = fileDropDirective.getFilters();

// TODO: Update test once implemented
expect(filters).toEqual({});
});

it('handles drop event', () => {
spyOn(fileDropDirective, 'onDrop');

directiveElement.triggerEventHandler('drop', getFakeEvent());

expect(fileDropDirective.onDrop).toHaveBeenCalled();
});

it('adds file to upload', () => {
spyOn(fileDropDirective.uploader, 'addToQueue');

let fileOverData;
fileDropDirective.fileOver.subscribe((data: any) => fileOverData = data);

let fileDropData;
fileDropDirective.onFileDrop.subscribe((data: File[]) => fileDropData = data);

fileDropDirective.onDrop(getFakeEvent());

const uploadedFiles = getFakeEvent().dataTransfer.files;
const expectedArguments = [ uploadedFiles, fileDropDirective.getOptions(), fileDropDirective.getFilters() ];

expect(fileDropDirective.uploader.addToQueue).toHaveBeenCalledWith(...expectedArguments);
expect(fileOverData).toBeFalsy();
expect(fileDropData).toEqual(uploadedFiles);
});

it('handles dragover event', () => {
spyOn(fileDropDirective, 'onDragOver');

directiveElement.triggerEventHandler('dragover', getFakeEvent());

expect(fileDropDirective.onDragOver).toHaveBeenCalled();
});

it('handles file over', () => {
let fileOverData;
fileDropDirective.fileOver.subscribe((data: any) => fileOverData = data);

fileDropDirective.onDragOver(getFakeEvent());

expect(fileOverData).toBeTruthy();
});

it('handles dragleave event', () => {
spyOn(fileDropDirective, 'onDragLeave');

directiveElement.triggerEventHandler('dragleave', getFakeEvent());

expect(fileDropDirective.onDragLeave).toHaveBeenCalled();
});

it('handles file over leave', () => {
let fileOverData;
fileDropDirective.fileOver.subscribe((data: any) => fileOverData = data);

fileDropDirective.onDragLeave(getFakeEvent());

expect(fileOverData).toBeFalsy();
});
});

function getFakeEvent(): any {
return {
dataTransfer: {
files: [ 'foo.bar' ],
types: [ 'Files' ]
},
preventDefault: () => undefined,
stopPropagation: () => undefined
}
}

0 comments on commit 6bdf60f

Please sign in to comment.