Files
fatsify-schema/node_modules/@fastify/mongodb/test/index.test.js
2025-09-22 16:00:32 +08:00

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
}