449 lines
15 KiB
JavaScript
449 lines
15 KiB
JavaScript
'use strict'
|
|
|
|
const { test } = require('node:test')
|
|
const Fastify = require('fastify')
|
|
const fastifyMongo = require('..')
|
|
const { ObjectId } = require('..')
|
|
|
|
const mongodb = require('mongodb')
|
|
|
|
const NO_DATABASE_MONGODB_URL = 'mongodb://127.0.0.1'
|
|
const DATABASE_NAME = 'test'
|
|
const MONGODB_URL = 'mongodb://127.0.0.1/' + DATABASE_NAME
|
|
const CLIENT_NAME = 'client_name'
|
|
const ANOTHER_DATABASE_NAME = 'my_awesome_database'
|
|
const COLLECTION_NAME = 'mycoll'
|
|
|
|
function objectIdTest (t, ObjectId, message) {
|
|
t.plan(4)
|
|
message = message || 'expect ObjectId value'
|
|
|
|
const obj1 = new ObjectId()
|
|
t.assert.ok(obj1)
|
|
|
|
const obj2 = new ObjectId(obj1)
|
|
t.assert.ok(obj2)
|
|
t.assert.ok(obj1.equals(obj2))
|
|
|
|
const obj3 = new ObjectId()
|
|
t.assert.ok(!obj1.equals(obj3))
|
|
}
|
|
|
|
async function clientTest (t, client, message) {
|
|
t.plan(1)
|
|
message = message || 'expect client'
|
|
const db = client.db(DATABASE_NAME)
|
|
|
|
const col = db.collection(COLLECTION_NAME)
|
|
|
|
const r = await col.insertMany([{ a: 1 }])
|
|
t.assert.strictEqual(1, r.insertedCount)
|
|
}
|
|
|
|
async function databaseTest (t, db, message) {
|
|
t.plan(1)
|
|
message = message || 'expect database'
|
|
|
|
const col = db.collection(COLLECTION_NAME)
|
|
|
|
const r = await col.insertMany([{ a: 1 }])
|
|
t.assert.strictEqual(1, r.insertedCount)
|
|
}
|
|
|
|
test('re-export ObjectId', async (t) => {
|
|
t.plan(1)
|
|
await t.test(async t => objectIdTest(t, fastifyMongo.ObjectId))
|
|
})
|
|
|
|
test('re-export ObjectId destructured', async (t) => {
|
|
t.plan(1)
|
|
await t.test(async t => objectIdTest(t, ObjectId))
|
|
})
|
|
|
|
test('export of mongodb', async (t) => {
|
|
t.plan(2)
|
|
t.assert.strictEqual(typeof fastifyMongo.mongodb.ObjectId, 'function')
|
|
t.assert.strictEqual(fastifyMongo.mongodb.BSONType.array, 4)
|
|
})
|
|
|
|
test('{ url: NO_DATABASE_MONGODB_URL }', async (t) => {
|
|
t.plan(6)
|
|
|
|
const fastify = await register(t, { url: NO_DATABASE_MONGODB_URL })
|
|
|
|
t.assert.ok(fastify.mongo)
|
|
t.assert.ok(fastify.mongo.client)
|
|
t.assert.ok(fastify.mongo.ObjectId)
|
|
t.assert.ifError(fastify.mongo.db)
|
|
|
|
await t.test(async t => objectIdTest(t, fastify.mongo.ObjectId))
|
|
await t.test(async t => clientTest(t, fastify.mongo.client))
|
|
})
|
|
|
|
test('{ url: MONGODB_URL }', async (t) => {
|
|
t.plan(8)
|
|
|
|
const fastify = await register(t, { url: MONGODB_URL })
|
|
t.assert.ok(fastify.mongo)
|
|
t.assert.ok(fastify.mongo.client)
|
|
t.assert.ok(fastify.mongo.ObjectId)
|
|
t.assert.ok(fastify.mongo.db)
|
|
t.assert.strictEqual(fastify.mongo.db.databaseName, DATABASE_NAME)
|
|
|
|
await t.test(async t => objectIdTest(t, fastify.mongo.ObjectId))
|
|
await t.test(async t => clientTest(t, fastify.mongo.client))
|
|
await t.test(async t => databaseTest(t, fastify.mongo.db))
|
|
})
|
|
|
|
test('{ url: NO_DATABASE_MONGODB_URL, name: CLIENT_NAME }', async (t) => {
|
|
t.plan(11)
|
|
|
|
const fastify = await register(t, { url: NO_DATABASE_MONGODB_URL, name: CLIENT_NAME })
|
|
t.assert.ok(fastify.mongo)
|
|
t.assert.ok(fastify.mongo.client)
|
|
t.assert.ok(fastify.mongo.ObjectId)
|
|
t.assert.ifError(fastify.mongo.db)
|
|
|
|
t.assert.ok(fastify.mongo[CLIENT_NAME].client)
|
|
t.assert.ok(fastify.mongo[CLIENT_NAME].ObjectId)
|
|
t.assert.ifError(fastify.mongo[CLIENT_NAME].db)
|
|
|
|
await t.test(async t => objectIdTest(t, fastify.mongo.ObjectId))
|
|
await t.test(async t => clientTest(t, fastify.mongo.client))
|
|
|
|
await t.test(async t => objectIdTest(t, fastify.mongo[CLIENT_NAME].ObjectId))
|
|
await t.test(async t => clientTest(t, fastify.mongo[CLIENT_NAME].client))
|
|
})
|
|
|
|
test('{ url: MONGODB_URL, name: CLIENT_NAME }', async (t) => {
|
|
t.plan(15)
|
|
|
|
const fastify = await register(t, { url: MONGODB_URL, name: CLIENT_NAME })
|
|
t.assert.ok(fastify.mongo)
|
|
t.assert.ok(fastify.mongo.client)
|
|
t.assert.ok(fastify.mongo.ObjectId)
|
|
t.assert.ok(fastify.mongo.db)
|
|
t.assert.strictEqual(fastify.mongo.db.databaseName, DATABASE_NAME)
|
|
|
|
t.assert.ok(fastify.mongo[CLIENT_NAME].client)
|
|
t.assert.ok(fastify.mongo[CLIENT_NAME].ObjectId)
|
|
t.assert.ok(fastify.mongo[CLIENT_NAME].db)
|
|
t.assert.strictEqual(fastify.mongo[CLIENT_NAME].db.databaseName, DATABASE_NAME)
|
|
|
|
await t.test(async t => objectIdTest(t, fastify.mongo.ObjectId))
|
|
await t.test(async t => clientTest(t, fastify.mongo.client))
|
|
await t.test(async t => databaseTest(t, fastify.mongo.db))
|
|
|
|
await t.test(async t => objectIdTest(t, fastify.mongo[CLIENT_NAME].ObjectId))
|
|
await t.test(async t => clientTest(t, fastify.mongo[CLIENT_NAME].client))
|
|
await t.test(async t => databaseTest(t, fastify.mongo[CLIENT_NAME].db))
|
|
})
|
|
|
|
test('{ url: NO_DATABASE_MONGODB_URL, name: CLIENT_NAME, database: ANOTHER_DATABASE_NAME }', async (t) => {
|
|
t.plan(15)
|
|
|
|
const fastify = await register(t, { url: NO_DATABASE_MONGODB_URL, name: CLIENT_NAME, database: ANOTHER_DATABASE_NAME })
|
|
t.assert.ok(fastify.mongo)
|
|
t.assert.ok(fastify.mongo.client)
|
|
t.assert.ok(fastify.mongo.ObjectId)
|
|
t.assert.ok(fastify.mongo.db)
|
|
t.assert.strictEqual(fastify.mongo.db.databaseName, ANOTHER_DATABASE_NAME)
|
|
|
|
t.assert.ok(fastify.mongo[CLIENT_NAME].client)
|
|
t.assert.ok(fastify.mongo[CLIENT_NAME].ObjectId)
|
|
t.assert.ok(fastify.mongo[CLIENT_NAME].db)
|
|
t.assert.strictEqual(fastify.mongo[CLIENT_NAME].db.databaseName, ANOTHER_DATABASE_NAME)
|
|
|
|
await t.test(async t => objectIdTest(t, fastify.mongo.ObjectId))
|
|
await t.test(async t => clientTest(t, fastify.mongo.client))
|
|
await t.test(async t => databaseTest(t, fastify.mongo.db))
|
|
|
|
await t.test(async t => objectIdTest(t, fastify.mongo[CLIENT_NAME].ObjectId))
|
|
await t.test(async t => clientTest(t, fastify.mongo[CLIENT_NAME].client))
|
|
await t.test(async t => databaseTest(t, fastify.mongo[CLIENT_NAME].db))
|
|
})
|
|
|
|
test('{ url: MONGODB_URL, name: CLIENT_NAME, database: ANOTHER_DATABASE_NAME }', async (t) => {
|
|
t.plan(15)
|
|
|
|
const fastify = await register(t, { url: MONGODB_URL, name: CLIENT_NAME, database: ANOTHER_DATABASE_NAME })
|
|
t.assert.ok(fastify.mongo)
|
|
t.assert.ok(fastify.mongo.client)
|
|
t.assert.ok(fastify.mongo.ObjectId)
|
|
t.assert.ok(fastify.mongo.db)
|
|
t.assert.strictEqual(fastify.mongo.db.databaseName, ANOTHER_DATABASE_NAME)
|
|
|
|
t.assert.ok(fastify.mongo[CLIENT_NAME].client)
|
|
t.assert.ok(fastify.mongo[CLIENT_NAME].ObjectId)
|
|
t.assert.ok(fastify.mongo[CLIENT_NAME].db)
|
|
t.assert.strictEqual(fastify.mongo[CLIENT_NAME].db.databaseName, ANOTHER_DATABASE_NAME)
|
|
|
|
await t.test(async t => objectIdTest(t, fastify.mongo.ObjectId))
|
|
await t.test(async t => clientTest(t, fastify.mongo.client))
|
|
await t.test(async t => databaseTest(t, fastify.mongo.db))
|
|
|
|
await t.test(async t => objectIdTest(t, fastify.mongo[CLIENT_NAME].ObjectId))
|
|
await t.test(async t => clientTest(t, fastify.mongo[CLIENT_NAME].client))
|
|
await t.test(async t => databaseTest(t, fastify.mongo[CLIENT_NAME].db))
|
|
})
|
|
|
|
test('{ url: NO_DATABASE_MONGODB_URL, database: ANOTHER_DATABASE_NAME }', async (t) => {
|
|
t.plan(8)
|
|
|
|
const fastify = await register(t, { url: NO_DATABASE_MONGODB_URL, database: ANOTHER_DATABASE_NAME })
|
|
t.assert.ok(fastify.mongo)
|
|
t.assert.ok(fastify.mongo.client)
|
|
t.assert.ok(fastify.mongo.ObjectId)
|
|
t.assert.ok(fastify.mongo.db)
|
|
t.assert.strictEqual(fastify.mongo.db.databaseName, ANOTHER_DATABASE_NAME)
|
|
|
|
await t.test(async t => objectIdTest(t, fastify.mongo.ObjectId))
|
|
await t.test(async t => clientTest(t, fastify.mongo.client))
|
|
await t.test(async t => databaseTest(t, fastify.mongo.db))
|
|
})
|
|
|
|
test('{ url: MONGODB_URL, database: ANOTHER_DATABASE_NAME }', async (t) => {
|
|
t.plan(8)
|
|
|
|
const fastify = await register(t, { url: MONGODB_URL, name: CLIENT_NAME, database: ANOTHER_DATABASE_NAME })
|
|
t.assert.ok(fastify.mongo)
|
|
t.assert.ok(fastify.mongo.client)
|
|
t.assert.ok(fastify.mongo.ObjectId)
|
|
t.assert.ok(fastify.mongo.db)
|
|
t.assert.strictEqual(fastify.mongo.db.databaseName, ANOTHER_DATABASE_NAME)
|
|
|
|
await t.test(async t => objectIdTest(t, fastify.mongo.ObjectId))
|
|
await t.test(async t => clientTest(t, fastify.mongo.client))
|
|
await t.test(async t => databaseTest(t, fastify.mongo.db))
|
|
})
|
|
|
|
test('{ client: client }', async (t) => {
|
|
t.plan(6)
|
|
|
|
const client = await mongodb.MongoClient.connect(NO_DATABASE_MONGODB_URL)
|
|
t.after(() => client.close())
|
|
|
|
const fastify = await register(t, { client })
|
|
t.assert.ok(fastify.mongo)
|
|
t.assert.ok(fastify.mongo.client)
|
|
t.assert.ok(fastify.mongo.ObjectId)
|
|
t.assert.ifError(fastify.mongo.db)
|
|
|
|
await t.test(async t => objectIdTest(t, fastify.mongo.ObjectId))
|
|
await t.test(async t => clientTest(t, fastify.mongo.client))
|
|
})
|
|
|
|
test('{ client: client, database: DATABASE_NAME }', async (t) => {
|
|
t.plan(8)
|
|
|
|
const client = await mongodb.MongoClient.connect(NO_DATABASE_MONGODB_URL)
|
|
t.after(() => client.close())
|
|
|
|
const fastify = await register(t, { client, database: ANOTHER_DATABASE_NAME })
|
|
t.assert.ok(fastify.mongo)
|
|
t.assert.ok(fastify.mongo.client)
|
|
t.assert.ok(fastify.mongo.ObjectId)
|
|
t.assert.ok(fastify.mongo.db)
|
|
t.assert.strictEqual(fastify.mongo.db.databaseName, ANOTHER_DATABASE_NAME)
|
|
|
|
await t.test(async t => objectIdTest(t, fastify.mongo.ObjectId))
|
|
await t.test(async t => clientTest(t, fastify.mongo.client))
|
|
await t.test(async t => databaseTest(t, fastify.mongo.db))
|
|
})
|
|
|
|
test('{ client: client, name: CLIENT_NAME }', async (t) => {
|
|
t.plan(11)
|
|
|
|
const client = await mongodb.MongoClient.connect(NO_DATABASE_MONGODB_URL)
|
|
t.after(() => client.close())
|
|
|
|
const fastify = await register(t, { client, name: CLIENT_NAME })
|
|
t.assert.ok(fastify.mongo)
|
|
t.assert.ok(fastify.mongo.client)
|
|
t.assert.ok(fastify.mongo.ObjectId)
|
|
t.assert.ifError(fastify.mongo.db)
|
|
|
|
t.assert.ok(fastify.mongo[CLIENT_NAME].client)
|
|
t.assert.ok(fastify.mongo[CLIENT_NAME].ObjectId)
|
|
t.assert.ifError(fastify.mongo[CLIENT_NAME].db)
|
|
|
|
await t.test(async t => objectIdTest(t, fastify.mongo.ObjectId))
|
|
await t.test(async t => clientTest(t, fastify.mongo.client))
|
|
|
|
await t.test(async t => objectIdTest(t, fastify.mongo[CLIENT_NAME].ObjectId))
|
|
await t.test(async t => clientTest(t, fastify.mongo[CLIENT_NAME].client))
|
|
})
|
|
|
|
test('{ client: client, name: CLIENT_NAME, database: ANOTHER_DATABASE_NAME }', async (t) => {
|
|
t.plan(15)
|
|
|
|
const client = await mongodb.MongoClient.connect(NO_DATABASE_MONGODB_URL)
|
|
t.after(() => client.close())
|
|
|
|
const fastify = await register(t, { client, name: CLIENT_NAME, database: ANOTHER_DATABASE_NAME })
|
|
t.assert.ok(fastify.mongo)
|
|
t.assert.ok(fastify.mongo.client)
|
|
t.assert.ok(fastify.mongo.ObjectId)
|
|
t.assert.ok(fastify.mongo.db)
|
|
t.assert.strictEqual(fastify.mongo.db.databaseName, ANOTHER_DATABASE_NAME)
|
|
|
|
t.assert.ok(fastify.mongo[CLIENT_NAME].client)
|
|
t.assert.ok(fastify.mongo[CLIENT_NAME].ObjectId)
|
|
t.assert.ok(fastify.mongo[CLIENT_NAME].db)
|
|
t.assert.strictEqual(fastify.mongo[CLIENT_NAME].db.databaseName, ANOTHER_DATABASE_NAME)
|
|
|
|
await t.test(async t => objectIdTest(t, fastify.mongo.ObjectId))
|
|
await t.test(async t => clientTest(t, fastify.mongo.client))
|
|
await t.test(async t => databaseTest(t, fastify.mongo.db))
|
|
|
|
await t.test(async t => objectIdTest(t, fastify.mongo[CLIENT_NAME].ObjectId))
|
|
await t.test(async t => clientTest(t, fastify.mongo[CLIENT_NAME].client))
|
|
await t.test(async t => databaseTest(t, fastify.mongo[CLIENT_NAME].db))
|
|
})
|
|
|
|
test('{ client: client } does not set onClose', async (t) => {
|
|
const client = await mongodb.MongoClient.connect(NO_DATABASE_MONGODB_URL)
|
|
t.after(() => client.close())
|
|
|
|
const fastify = Fastify()
|
|
fastify.register(fastifyMongo, { client, database: DATABASE_NAME })
|
|
await fastify.ready()
|
|
await fastify.close()
|
|
|
|
await t.test(async t => databaseTest(t, fastify.mongo.db))
|
|
})
|
|
|
|
test('{ }', async (t) => {
|
|
t.plan(2)
|
|
try {
|
|
await register(t, {})
|
|
} catch (err) {
|
|
t.assert.ok(err)
|
|
t.assert.strictEqual(err.message, '`url` parameter is mandatory if no client is provided')
|
|
}
|
|
})
|
|
|
|
test('{ url: "unknown://protocol" }', async (t) => {
|
|
t.plan(2)
|
|
try {
|
|
await register(t, { url: 'unknown://protocol' })
|
|
} catch (err) {
|
|
t.assert.ok(err)
|
|
t.assert.match(err.message, /expected connection string/)
|
|
}
|
|
})
|
|
|
|
test('double register without name', async (t) => {
|
|
t.plan(2)
|
|
|
|
const fastify = Fastify()
|
|
t.after(() => fastify.close())
|
|
|
|
try {
|
|
await fastify
|
|
.register(fastifyMongo, { url: MONGODB_URL })
|
|
.register(fastifyMongo, { url: MONGODB_URL })
|
|
.ready()
|
|
} catch (err) {
|
|
t.assert.ok(err)
|
|
t.assert.strictEqual(err.message, 'fastify-mongodb has already registered')
|
|
}
|
|
})
|
|
|
|
test('double register with different name', async (t) => {
|
|
t.plan(22)
|
|
|
|
const fastify = Fastify()
|
|
t.after(() => fastify.close())
|
|
|
|
await fastify
|
|
.register(fastifyMongo, { url: MONGODB_URL, name: 'client1' })
|
|
.register(fastifyMongo, { url: NO_DATABASE_MONGODB_URL, name: 'client2', database: ANOTHER_DATABASE_NAME })
|
|
.ready()
|
|
|
|
t.assert.ok(fastify.mongo)
|
|
|
|
t.assert.ok(fastify.mongo.client)
|
|
t.assert.ok(fastify.mongo.ObjectId)
|
|
t.assert.ok(fastify.mongo.db)
|
|
t.assert.strictEqual(fastify.mongo.db.databaseName, DATABASE_NAME)
|
|
|
|
t.assert.ok(fastify.mongo.client1.client)
|
|
t.assert.ok(fastify.mongo.client1.ObjectId)
|
|
t.assert.ok(fastify.mongo.client1.db)
|
|
t.assert.strictEqual(fastify.mongo.client1.db.databaseName, DATABASE_NAME)
|
|
|
|
t.assert.ok(fastify.mongo.client2.client)
|
|
t.assert.ok(fastify.mongo.client2.ObjectId)
|
|
t.assert.ok(fastify.mongo.client2.db)
|
|
t.assert.strictEqual(fastify.mongo.client2.db.databaseName, ANOTHER_DATABASE_NAME)
|
|
|
|
await t.test(async t => objectIdTest(t, fastify.mongo.ObjectId))
|
|
await t.test(async t => clientTest(t, fastify.mongo.client))
|
|
await t.test(async t => databaseTest(t, fastify.mongo.db))
|
|
|
|
await t.test(async t => objectIdTest(t, fastify.mongo.client1.ObjectId))
|
|
await t.test(async t => clientTest(t, fastify.mongo.client1.client))
|
|
await t.test(async t => databaseTest(t, fastify.mongo.client1.db))
|
|
|
|
await t.test(async t => objectIdTest(t, fastify.mongo.client2.ObjectId))
|
|
await t.test(async t => clientTest(t, fastify.mongo.client2.client))
|
|
await t.test(async t => databaseTest(t, fastify.mongo.client2.db))
|
|
})
|
|
|
|
test('double register with the same name', async (t) => {
|
|
t.plan(2)
|
|
|
|
const fastify = Fastify()
|
|
t.after(() => fastify.close())
|
|
|
|
try {
|
|
await fastify
|
|
.register(fastifyMongo, { url: MONGODB_URL, name: CLIENT_NAME })
|
|
.register(fastifyMongo, { url: MONGODB_URL, name: CLIENT_NAME })
|
|
.ready()
|
|
} catch (err) {
|
|
t.assert.ok(err)
|
|
t.assert.strictEqual(err.message, 'Connection name already registered: ' + CLIENT_NAME)
|
|
}
|
|
})
|
|
|
|
test('Immutable options', async (t) => {
|
|
t.plan(1)
|
|
|
|
const given = { url: MONGODB_URL, name: CLIENT_NAME, database: DATABASE_NAME }
|
|
await register(t, given)
|
|
t.assert.deepStrictEqual(given, {
|
|
url: MONGODB_URL,
|
|
name: CLIENT_NAME,
|
|
database: DATABASE_NAME
|
|
})
|
|
})
|
|
|
|
test('timeout', async (t) => {
|
|
t.plan(2)
|
|
|
|
const fastify = Fastify()
|
|
t.after(() => fastify.close())
|
|
|
|
try {
|
|
await fastify
|
|
.register(fastifyMongo, { url: 'mongodb://127.0.0.1:9999' })
|
|
.ready()
|
|
} catch (err) {
|
|
t.assert.ok(err)
|
|
t.assert.strictEqual(err.message, 'connect ECONNREFUSED 127.0.0.1:9999')
|
|
}
|
|
})
|
|
|
|
async function register (t, options) {
|
|
const fastify = Fastify()
|
|
t.after(() => fastify.close())
|
|
|
|
fastify.register(fastifyMongo, options)
|
|
|
|
await fastify.ready()
|
|
|
|
return fastify
|
|
}
|