mirror of https://github.com/Squidex/squidex.git
25 changed files with 469 additions and 1117 deletions
@ -0,0 +1,211 @@ |
|||||
|
/* |
||||
|
* Squidex Headless CMS |
||||
|
* |
||||
|
* @license |
||||
|
* Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. |
||||
|
*/ |
||||
|
|
||||
|
import { never, of, throwError } from 'rxjs'; |
||||
|
import { onErrorResumeNext } from 'rxjs/operators'; |
||||
|
import { IMock, Mock } from 'typemoq'; |
||||
|
|
||||
|
import { |
||||
|
AssetUploaderState, |
||||
|
DialogService, |
||||
|
ofForever, |
||||
|
Types, |
||||
|
Version, |
||||
|
versioned |
||||
|
} from './../'; |
||||
|
|
||||
|
import { AssetDto, AssetReplacedDto, AssetsService } from '../services/assets.service'; |
||||
|
import { TestValues } from './_test-helpers'; |
||||
|
|
||||
|
describe('AssetsState', () => { |
||||
|
const { |
||||
|
app, |
||||
|
appsState, |
||||
|
authService, |
||||
|
creator, |
||||
|
creation, |
||||
|
modified, |
||||
|
modifier, |
||||
|
now, |
||||
|
userId |
||||
|
} = TestValues; |
||||
|
|
||||
|
let assetsService: IMock<AssetsService>; |
||||
|
let dialogs: IMock<DialogService>; |
||||
|
let assetUploader: AssetUploaderState; |
||||
|
|
||||
|
const asset = new AssetDto('id1', |
||||
|
creator, |
||||
|
creator, |
||||
|
creation, |
||||
|
creation, |
||||
|
'my-asset', |
||||
|
'my-hash', |
||||
|
'png', |
||||
|
100, |
||||
|
1, |
||||
|
'image/png', |
||||
|
true, |
||||
|
true, |
||||
|
800, |
||||
|
600, |
||||
|
'my-slug', |
||||
|
[], |
||||
|
'http://url', |
||||
|
new Version('1')); |
||||
|
|
||||
|
beforeEach(() => { |
||||
|
dialogs = Mock.ofType<DialogService>(); |
||||
|
|
||||
|
assetsService = Mock.ofType<AssetsService>(); |
||||
|
assetUploader = new AssetUploaderState(appsState.object, assetsService.object, authService.object, dialogs.object); |
||||
|
}); |
||||
|
|
||||
|
afterEach(() => { |
||||
|
assetsService.verifyAll(); |
||||
|
}); |
||||
|
|
||||
|
it('should create initial state when uploading file', () => { |
||||
|
const file: File = <any>{ name: 'my-file' }; |
||||
|
|
||||
|
assetsService.setup(x => x.uploadFile(app, file, userId, now)) |
||||
|
.returns(() => never()).verifiable(); |
||||
|
|
||||
|
assetUploader.uploadFile(file, undefined, now).subscribe(); |
||||
|
|
||||
|
const upload = assetUploader.snapshot.uploads.at(0); |
||||
|
|
||||
|
expect(upload.status).toBe('Running'); |
||||
|
expect(upload.progress).toBe(1); |
||||
|
}); |
||||
|
|
||||
|
it('should update progress when uploading file makes progress', () => { |
||||
|
const file: File = <any>{ name: 'my-file' }; |
||||
|
|
||||
|
assetsService.setup(x => x.uploadFile(app, file, userId, now)) |
||||
|
.returns(() => ofForever(10, 20)).verifiable(); |
||||
|
|
||||
|
assetUploader.uploadFile(file, undefined, now).subscribe(); |
||||
|
|
||||
|
const upload = assetUploader.snapshot.uploads.at(0); |
||||
|
|
||||
|
expect(upload.status).toBe('Running'); |
||||
|
expect(upload.progress).toBe(20); |
||||
|
}); |
||||
|
|
||||
|
it('should update status when uploading file failed', () => { |
||||
|
const file: File = <any>{ name: 'my-file' }; |
||||
|
|
||||
|
assetsService.setup(x => x.uploadFile(app, file, userId, now)) |
||||
|
.returns(() => throwError('Error')).verifiable(); |
||||
|
|
||||
|
assetUploader.uploadFile(file, undefined, now).pipe(onErrorResumeNext()).subscribe(); |
||||
|
|
||||
|
const upload = assetUploader.snapshot.uploads.at(0); |
||||
|
|
||||
|
expect(upload.status).toBe('Failed'); |
||||
|
expect(upload.progress).toBe(1); |
||||
|
}); |
||||
|
|
||||
|
it('should update status when uploading file completes', (cb) => { |
||||
|
const file: File = <any>{ name: 'my-file' }; |
||||
|
|
||||
|
assetsService.setup(x => x.uploadFile(app, file, userId, now)) |
||||
|
.returns(() => of(10, 20, asset)).verifiable(); |
||||
|
|
||||
|
let uploadedAsset: AssetDto; |
||||
|
|
||||
|
assetUploader.uploadFile(file, undefined, now).subscribe(dto => { |
||||
|
if (Types.is(dto, AssetDto)) { |
||||
|
uploadedAsset = dto; |
||||
|
} |
||||
|
|
||||
|
cb(); |
||||
|
}); |
||||
|
|
||||
|
const upload = assetUploader.snapshot.uploads.at(0); |
||||
|
|
||||
|
expect(upload.status).toBe('Completed'); |
||||
|
expect(upload.progress).toBe(100); |
||||
|
expect(uploadedAsset!).toBe(asset); |
||||
|
}); |
||||
|
|
||||
|
it('should create initial state when uploading asset', () => { |
||||
|
const file: File = <any>{ name: 'my-file' }; |
||||
|
|
||||
|
assetsService.setup(x => x.replaceFile(app, asset.id, file, asset.version)) |
||||
|
.returns(() => never()).verifiable(); |
||||
|
|
||||
|
assetUploader.uploadAsset(asset, file, now).subscribe(); |
||||
|
|
||||
|
const upload = assetUploader.snapshot.uploads.at(0); |
||||
|
|
||||
|
expect(upload.status).toBe('Running'); |
||||
|
expect(upload.progress).toBe(1); |
||||
|
}); |
||||
|
|
||||
|
it('should update progress when uploading asset makes progress', () => { |
||||
|
const file: File = <any>{ name: 'my-file' }; |
||||
|
|
||||
|
assetsService.setup(x => x.replaceFile(app, asset.id, file, asset.version)) |
||||
|
.returns(() => ofForever(10, 20)).verifiable(); |
||||
|
|
||||
|
assetUploader.uploadAsset(asset, file, now).subscribe(); |
||||
|
|
||||
|
const upload = assetUploader.snapshot.uploads.at(0); |
||||
|
|
||||
|
expect(upload.status).toBe('Running'); |
||||
|
expect(upload.progress).toBe(20); |
||||
|
}); |
||||
|
|
||||
|
it('should update status when uploading asset failed', () => { |
||||
|
const file: File = <any>{ name: 'my-file' }; |
||||
|
|
||||
|
assetsService.setup(x => x.replaceFile(app, asset.id, file, asset.version)) |
||||
|
.returns(() => throwError('Error')).verifiable(); |
||||
|
|
||||
|
assetUploader.uploadAsset(asset, file, now).pipe(onErrorResumeNext()).subscribe(); |
||||
|
|
||||
|
const upload = assetUploader.snapshot.uploads.at(0); |
||||
|
|
||||
|
expect(upload.status).toBe('Failed'); |
||||
|
expect(upload.progress).toBe(1); |
||||
|
}); |
||||
|
|
||||
|
it('should update status when uploading asset completes', () => { |
||||
|
const file: File = <any>{ name: 'my-file' }; |
||||
|
|
||||
|
let update: AssetReplacedDto = { |
||||
|
isImage: true, |
||||
|
mimeType: 'image/jpeg', |
||||
|
pixelWidth: 800, |
||||
|
pixelHeight: 600, |
||||
|
fileHash: 'my-hash2', |
||||
|
fileSize: 200, |
||||
|
fileVersion: 2 |
||||
|
}; |
||||
|
|
||||
|
const newAsset = asset.update(update, modifier, new Version('2'), modified); |
||||
|
|
||||
|
assetsService.setup(x => x.replaceFile(app, asset.id, file, asset.version)) |
||||
|
.returns(() => of(10, 20, versioned(new Version('2'), update))).verifiable(); |
||||
|
|
||||
|
let uploadedAsset: AssetDto; |
||||
|
|
||||
|
assetUploader.uploadAsset(asset, file, modified).subscribe(dto => { |
||||
|
if (Types.is(dto, AssetDto)) { |
||||
|
uploadedAsset = dto; |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
const upload = assetUploader.snapshot.uploads.at(0); |
||||
|
|
||||
|
expect(upload.status).toBe('Completed'); |
||||
|
expect(upload.progress).toBe(100); |
||||
|
expect(uploadedAsset!).toEqual(newAsset); |
||||
|
}); |
||||
|
}); |
||||
File diff suppressed because it is too large
Loading…
Reference in new issue