import { GCMockModule } from '@core/mocks/gc-module.mock'; import { FileStatus, FileUploadEvent } from '@core/typings/file.typing'; import { YcFile } from '@yourcause/common'; import { Spec, TestCase } from '@yourcause/test-decorators'; import { DescribeAngularService } from '@yourcause/test-decorators/angular'; import { expect } from 'chai'; import { BehaviorSubject } from 'rxjs'; import { FileUploadProgressService } from './file-upload-progress.service'; @DescribeAngularService(FileUploadProgressService, { imports: [GCMockModule] }) export class FileUploadProgressServiceSpec implements Spec { // validators @TestCase('should reject invalid extensions') async testShouldRejectInvalidFile (service: FileUploadProgressService) { const fileName = 'some-file.with-invalid-extension'; const uploadRequest = new YcFile( fileName, new File([], fileName) ); const isValid = service['checkIfFileValid'](uploadRequest); expect(isValid).to.be.false; expect((uploadRequest['_statusClass$'] as BehaviorSubject).value).to.equal('danger'); } @TestCase('should reject too large files') async testShouldRejectTooLargeFile (service: FileUploadProgressService) { const fileName = 'some-file.pdf'; service['maxFileSizeBytes'] = 10; const uploadRequest = new YcFile( fileName, new File([Array(service['maxFileSizeBytes'] + 1).fill('0').join('')], fileName) ); const isValid = service['checkIfFileValid'](uploadRequest); expect(isValid).to.be.false; expect((uploadRequest['_statusClass$'] as BehaviorSubject).value).to.equal('danger'); } @TestCase('should close request when upload canceled') async testShouldCloseRequestWhenCanceled (service: FileUploadProgressService) { const upload = new BehaviorSubject>({ status: FileStatus.AWAITING_API }); const uploadRequest = new YcFile( 'file.pdf', new File([Array(10).fill('0').join('')], 'file.pdf') ); let caught = false; const prom = service.processFileUploadRequest( upload, uploadRequest ).catch(e => { caught = true; expect(upload['observers'].length).to.equal(0); }); uploadRequest.cancel(); await prom; expect(caught).to.be.true; } }