You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			141 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			TypeScript
		
	
			
		
		
	
	
			141 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			TypeScript
		
	
| import { expect } from 'chai';
 | |
| import { beforeEach } from 'mocha';
 | |
| import Sinon from 'sinon';
 | |
| import * as DecryptedAttachmentsManager from '../../../../session/crypto/DecryptedAttachmentsManager';
 | |
| import { TestUtils } from '../../../test-utils';
 | |
| 
 | |
| describe('DecryptedAttachmentsManager', () => {
 | |
|   beforeEach(() => {
 | |
|     DecryptedAttachmentsManager.resetDecryptedUrlForTesting();
 | |
|     TestUtils.stubWindowLog();
 | |
|     Sinon.stub(DecryptedAttachmentsManager, 'getLocalAttachmentPath').returns('/local/attachment');
 | |
|     Sinon.stub(DecryptedAttachmentsManager, 'getAbsoluteAttachmentPath').returns;
 | |
|   });
 | |
| 
 | |
|   afterEach(() => {
 | |
|     Sinon.restore();
 | |
|   });
 | |
| 
 | |
|   describe('getAlreadyDecryptedMediaUrl', () => {
 | |
|     describe('invalid url', () => {
 | |
|       it('url is null', () => {
 | |
|         expect(DecryptedAttachmentsManager.getAlreadyDecryptedMediaUrl(null as any)).to.be.null;
 | |
|       });
 | |
| 
 | |
|       it('url is undefined', () => {
 | |
|         expect(DecryptedAttachmentsManager.getAlreadyDecryptedMediaUrl(undefined as any)).to.be
 | |
|           .null;
 | |
|       });
 | |
| 
 | |
|       it('url is empty string', () => {
 | |
|         expect(DecryptedAttachmentsManager.getAlreadyDecryptedMediaUrl('')).to.be.null;
 | |
|       });
 | |
| 
 | |
|       it('url starts with something not being the attachment path', () => {
 | |
|         expect(DecryptedAttachmentsManager.getAlreadyDecryptedMediaUrl('/local/notvalid')).to.be
 | |
|           .null;
 | |
|       });
 | |
|     });
 | |
|     it('url starts with "blob:" => returns the already decrypted url right away', () => {
 | |
|       expect(DecryptedAttachmentsManager.getAlreadyDecryptedMediaUrl('blob:whatever')).to.be.eq(
 | |
|         'blob:whatever'
 | |
|       );
 | |
|     });
 | |
| 
 | |
|     describe('url starts with attachmentPath', () => {
 | |
|       let readFileContent: Sinon.SinonStub;
 | |
|       let getItemById: Sinon.SinonStub;
 | |
|       let decryptAttachmentBufferNode: Sinon.SinonStub;
 | |
| 
 | |
|       beforeEach(() => {
 | |
|         readFileContent = Sinon.stub(DecryptedAttachmentsManager, 'readFileContent').resolves(
 | |
|           Buffer.from('this is a test')
 | |
|         );
 | |
|         getItemById = TestUtils.stubData('getItemById')
 | |
|           .withArgs('local_attachment_encrypted_key')
 | |
|           .callsFake(async () => {
 | |
|             return { value: 'dfdf' };
 | |
|           });
 | |
| 
 | |
|         decryptAttachmentBufferNode = TestUtils.stubUtilWorker(
 | |
|           'decryptAttachmentBufferNode',
 | |
|           new Uint8Array(5)
 | |
|         );
 | |
|         TestUtils.stubCreateObjectUrl();
 | |
|       });
 | |
| 
 | |
|       it('url starts with attachment path but is not already decrypted', () => {
 | |
|         expect(
 | |
|           DecryptedAttachmentsManager.getAlreadyDecryptedMediaUrl('/local/attachment/attachment1')
 | |
|         ).to.be.eq(null);
 | |
|       });
 | |
| 
 | |
|       it('url starts with attachment path but is not already decrypted', async () => {
 | |
|         expect(
 | |
|           DecryptedAttachmentsManager.getAlreadyDecryptedMediaUrl('/local/attachment/attachment1')
 | |
|         ).to.be.eq(null);
 | |
| 
 | |
|         expect(readFileContent.callCount).to.be.eq(0);
 | |
|         expect(decryptAttachmentBufferNode.callCount).to.be.eq(0);
 | |
|         expect(getItemById.callCount).to.be.eq(0);
 | |
| 
 | |
|         const resolved = await DecryptedAttachmentsManager.getDecryptedMediaUrl(
 | |
|           '/local/attachment/attachment1',
 | |
|           'image/jpeg',
 | |
|           false
 | |
|         );
 | |
| 
 | |
|         expect(readFileContent.callCount).to.be.eq(1);
 | |
|         expect(decryptAttachmentBufferNode.callCount).to.be.eq(1);
 | |
|         expect(getItemById.callCount).to.be.eq(1);
 | |
| 
 | |
|         const now = `${Date.now()}`;
 | |
|         expect(resolved).to.be.not.empty;
 | |
|         expect(resolved.startsWith(now.slice(0, 9))).to.be.true;
 | |
|       });
 | |
| 
 | |
|       it('url starts with attachment path and is already decrypted', async () => {
 | |
|         expect(
 | |
|           DecryptedAttachmentsManager.getAlreadyDecryptedMediaUrl('/local/attachment/attachment1')
 | |
|         ).to.be.eq(null);
 | |
| 
 | |
|         expect(readFileContent.callCount).to.be.eq(0);
 | |
|         expect(decryptAttachmentBufferNode.callCount).to.be.eq(0);
 | |
|         expect(getItemById.callCount).to.be.eq(0);
 | |
| 
 | |
|         const resolved = await DecryptedAttachmentsManager.getDecryptedMediaUrl(
 | |
|           '/local/attachment/attachment1',
 | |
|           'image/jpeg',
 | |
|           false
 | |
|         );
 | |
| 
 | |
|         expect(readFileContent.callCount).to.be.eq(1);
 | |
|         expect(decryptAttachmentBufferNode.callCount).to.be.eq(1);
 | |
|         expect(getItemById.callCount).to.be.eq(1);
 | |
| 
 | |
|         const now = `${Date.now()}`;
 | |
|         expect(resolved).to.be.not.empty;
 | |
|         expect(resolved.startsWith(now.slice(0, 9))).to.be.true;
 | |
| 
 | |
|         const resolved2 = await DecryptedAttachmentsManager.getDecryptedMediaUrl(
 | |
|           '/local/attachment/attachment1',
 | |
|           'image/jpeg',
 | |
|           false
 | |
|         );
 | |
| 
 | |
|         // should not try to decrypt nor read from file again
 | |
|         expect(readFileContent.callCount).to.be.eq(1);
 | |
|         expect(decryptAttachmentBufferNode.callCount).to.be.eq(1);
 | |
|         expect(getItemById.callCount).to.be.eq(1);
 | |
| 
 | |
|         const now2 = `${Date.now()}`;
 | |
|         expect(resolved2).to.be.not.empty;
 | |
|         expect(resolved2.startsWith(now2.slice(0, 9))).to.be.true;
 | |
|       });
 | |
|     });
 | |
|   });
 | |
| 
 | |
|   it.skip('cleanUpOldDecryptedMedias', () => {});
 | |
|   it.skip('getDecryptedBlob', () => {});
 | |
| });
 |