mongoms.ts 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import { MongoMemoryServer } from 'mongodb-memory-server-core';
  2. import mongoose from 'mongoose';
  3. import { mongoOptions } from '~/server/util/mongoose-utils';
  4. let mongoServer: MongoMemoryServer | undefined;
  5. beforeAll(async () => {
  6. // Use external MongoDB if MONGO_URI is provided (e.g., in CI with GitHub Actions services)
  7. if (process.env.MONGO_URI) {
  8. // Generate unique database name for each test worker to avoid conflicts in parallel execution
  9. // VITEST_POOL_ID is provided by Vitest (e.g., "1", "2", "3"...)
  10. const workerId = process.env.VITEST_POOL_ID || '1';
  11. const dbName = `growi_test_${workerId}`;
  12. // Parse base URI and append database name
  13. // Handle both cases: with and without existing database name in URI
  14. let mongoUri: string;
  15. if (process.env.MONGO_URI.includes('?')) {
  16. // URI has query parameters: mongodb://host:port/dbname?params
  17. mongoUri = process.env.MONGO_URI.replace(/\/[^/?]*(\?|$)/, `/${dbName}$1`);
  18. } else if (process.env.MONGO_URI.match(/\/[^/]+$/)) {
  19. // URI has database name: mongodb://host:port/dbname
  20. mongoUri = process.env.MONGO_URI.replace(/\/[^/]+$/, `/${dbName}`);
  21. } else {
  22. // URI has no database name: mongodb://host:port or mongodb://host:port/
  23. mongoUri = process.env.MONGO_URI.replace(/\/?$/, `/${dbName}`);
  24. }
  25. // biome-ignore lint/suspicious/noConsole: Allow logging
  26. console.log(`Using external MongoDB at ${mongoUri} (worker: ${workerId})`);
  27. await mongoose.connect(mongoUri, mongoOptions);
  28. return;
  29. }
  30. // Use MongoMemoryServer for local development
  31. // set debug flag
  32. process.env.MONGOMS_DEBUG = process.env.VITE_MONGOMS_DEBUG;
  33. // set version
  34. mongoServer = await MongoMemoryServer.create({
  35. instance: {
  36. dbName: 'growi_test',
  37. },
  38. binary: {
  39. version: process.env.VITE_MONGOMS_VERSION,
  40. downloadDir: 'node_modules/.cache/mongodb-binaries',
  41. },
  42. });
  43. // biome-ignore lint/suspicious/noConsole: Allow logging
  44. console.log(`MongoMemoryServer is running on ${mongoServer.getUri()}`);
  45. await mongoose.connect(mongoServer.getUri(), mongoOptions);
  46. });
  47. afterAll(async () => {
  48. await mongoose.disconnect();
  49. // Stop MongoMemoryServer if it was created
  50. if (mongoServer) {
  51. await mongoServer.stop();
  52. }
  53. });