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
/* 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()
|
|
})
|
|
})
|
|
})
|