You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					131 lines
				
				3.6 KiB
			
		
		
			
		
	
	
					131 lines
				
				3.6 KiB
			| 
											3 years ago
										 | /* eslint-env mocha */ | ||
|  | 
 | ||
|  | const fs = require('fs') | ||
|  | const mongoose = require('mongoose') | ||
|  | const { MongoMemoryServer } = require('mongodb-memory-server') | ||
|  | const { expect } = require('chai') | ||
|  | const MemoryStream = require('memorystream') | ||
|  | 
 | ||
|  | const { mongo } = mongoose | ||
|  | 
 | ||
|  | describe('Schema', () => { | ||
|  |   let GridFile | ||
|  |   let GridFileSchema | ||
|  |   let connection | ||
|  |   let mongodb | ||
|  | 
 | ||
|  |   before(async () => { | ||
|  |     // create mongo connection
 | ||
|  |     mongodb = await MongoMemoryServer.create() | ||
|  |     const connectionUri = await mongodb.getUri() | ||
|  | 
 | ||
|  |     connection = await mongoose.connect( | ||
|  |       connectionUri, { useNewUrlParser: true, useUnifiedTopology: true } | ||
|  |     ) | ||
|  | 
 | ||
|  |     GridFileSchema = require('./src/gridFile.schema') | ||
|  | 
 | ||
|  |     GridFile = connection.model('GridFile', GridFileSchema) | ||
|  |   }) | ||
|  | 
 | ||
|  |   after(async () => { | ||
|  |     // close mongo connection
 | ||
|  |     await mongoose.connection.close() | ||
|  |     await mongodb.stop() | ||
|  |   }) | ||
|  | 
 | ||
|  |   describe('GridFS Bucket', () => { | ||
|  |     it('should create a GridFS Bucket', () => { | ||
|  |       const bucket = GridFile.getBucket() | ||
|  | 
 | ||
|  |       expect(bucket).instanceOf(mongo.GridFSBucket) | ||
|  |     }) | ||
|  | 
 | ||
|  |     it('should create a GridFS Bucket with custom name', () => { | ||
|  |       const CustomGridFile = connection.model('CustomGridFile', GridFileSchema, 'attachment.files') | ||
|  | 
 | ||
|  |       const bucket = CustomGridFile.getBucket() | ||
|  | 
 | ||
|  |       expect(bucket).instanceOf(mongo.GridFSBucket) | ||
|  |       expect(bucket.s.options.bucketName).equals('attachment') | ||
|  |     }) | ||
|  | 
 | ||
|  |     it('should throw error when collection name doesn\'t end with .files', () => { | ||
|  |       try { | ||
|  |         const CustomGridFile = connection.model('CustomGridFile1', GridFileSchema, 'attachment.files1') | ||
|  |         const bucket = CustomGridFile.getBucket() | ||
|  | 
 | ||
|  |         expect(bucket).equals(false) | ||
|  |       } catch (error) { | ||
|  |         expect(error.message).equals('Collection Name doesn\'t end with .files') | ||
|  |       } | ||
|  |     }) | ||
|  |   }) | ||
|  | 
 | ||
|  |   describe('GridFS Files', () => { | ||
|  |     it('should upload a file to GridFS', async () => { | ||
|  |       const file = new GridFile() | ||
|  | 
 | ||
|  |       file.filename = 'package.json' | ||
|  |       file.metadata = 'test' | ||
|  |       file.aliases = ['test-alieas1', 'alias-2'] | ||
|  |       file.contentType = 'application/json' | ||
|  | 
 | ||
|  |       const fileStream = fs.createReadStream('./package.json') | ||
|  |       const uploadedFile = await file.upload(fileStream) | ||
|  | 
 | ||
|  |       expect(uploadedFile).instanceOf(GridFile) | ||
|  |     }) | ||
|  | 
 | ||
|  |     it('should find recently uploaded file by id', async () => { | ||
|  |       const file = new GridFile() | ||
|  | 
 | ||
|  |       file.filename = 'package.json' | ||
|  | 
 | ||
|  |       const fileStream = fs.createReadStream('./package.json') | ||
|  |       const uploadedFile = await file.upload(fileStream) | ||
|  | 
 | ||
|  |       const foundFile = await GridFile.findById(uploadedFile.id) | ||
|  | 
 | ||
|  |       expect(foundFile.md5).equals(uploadedFile.md5) | ||
|  |     }) | ||
|  | 
 | ||
|  |     it('should download a file from GridFS', async () => { | ||
|  |       const file = new GridFile() | ||
|  | 
 | ||
|  |       file.filename = 'package.json' | ||
|  | 
 | ||
|  |       const fileStream = fs.createReadStream('./package.json') | ||
|  |       const uploadedFile = await file.upload(fileStream) | ||
|  | 
 | ||
|  |       const foundFile = await GridFile.findById(uploadedFile.id) | ||
|  | 
 | ||
|  |       // download file as in-memory stream
 | ||
|  |       const stream = new MemoryStream() | ||
|  | 
 | ||
|  |       await foundFile.download(stream) | ||
|  | 
 | ||
|  |       expect(stream._readableState.length).equals(uploadedFile.length) | ||
|  |     }) | ||
|  | 
 | ||
|  |     it('should delete a file from GridFS', async ()=>{ | ||
|  |       const file = new GridFile() | ||
|  | 
 | ||
|  |       file.filename = 'package.json' | ||
|  | 
 | ||
|  |       const fileStream = fs.createReadStream('./package.json') | ||
|  |       const uploadedFile = await file.upload(fileStream) | ||
|  | 
 | ||
|  |       const foundFile = await GridFile.findByIdAndDelete(uploadedFile.id) | ||
|  |       expect(foundFile.md5).equals(uploadedFile.md5) | ||
|  | 
 | ||
|  |       const search = await GridFile.findOne() | ||
|  |       expect(search).to.equal(null) | ||
|  |     }) | ||
|  | 
 | ||
|  |     afterEach(async () => { | ||
|  |       await GridFile.deleteMany() | ||
|  |     }) | ||
|  |   }) | ||
|  | }) |