{"version":3,"file":"global-setup.mjs","names":[],"sources":["../src/global-setup.ts"],"sourcesContent":["/**\n * Global setup module for starting RabbitMQ test containers\n *\n * This module provides a Vitest globalSetup function that automatically starts\n * a RabbitMQ container with the management plugin before tests run, and stops\n * it after all tests complete.\n *\n * The RabbitMQ image can be configured via the `RABBITMQ_IMAGE` environment variable.\n * By default, it uses the public Docker Hub image (`rabbitmq:4.2.1-management-alpine`).\n *\n * @module global-setup\n * @packageDocumentation\n */\n\nimport { GenericContainer, Wait } from \"testcontainers\";\nimport type { TestProject } from \"vitest/node\";\n\n/**\n * Default RabbitMQ Docker image to use for testing.\n * Can be overridden via RABBITMQ_IMAGE environment variable.\n */\nconst DEFAULT_RABBITMQ_IMAGE = \"rabbitmq:4.2.1-management-alpine\";\n\ndeclare module \"vitest\" {\n  // eslint-disable-next-line @typescript-eslint/consistent-type-definitions -- Module augmentation requires interface for declaration merging\n  export interface ProvidedContext {\n    __TESTCONTAINERS_RABBITMQ_IP__: string;\n    __TESTCONTAINERS_RABBITMQ_PORT_5672__: number;\n    __TESTCONTAINERS_RABBITMQ_PORT_15672__: number;\n    __TESTCONTAINERS_RABBITMQ_USERNAME__: string;\n    __TESTCONTAINERS_RABBITMQ_PASSWORD__: string;\n  }\n}\n\n/**\n * Setup function for Vitest globalSetup\n *\n * Starts a RabbitMQ container before all tests and provides connection details\n * to tests via Vitest's provide API. The container is automatically stopped\n * and cleaned up after all tests complete.\n *\n * This function should be configured in your `vitest.config.ts`:\n *\n * @example\n * ```typescript\n * import { defineConfig } from \"vitest/config\";\n *\n * export default defineConfig({\n *   test: {\n *     globalSetup: [\"@amqp-contract/testing/global-setup\"],\n *   },\n * });\n * ```\n *\n * @param provide - Function to provide context values to tests\n * @returns Cleanup function that stops the RabbitMQ container\n */\nexport default async function setup({ provide }: TestProject) {\n  const rabbitmqImage = process.env[\"RABBITMQ_IMAGE\"] ?? DEFAULT_RABBITMQ_IMAGE;\n\n  console.log(\"🐳 Starting RabbitMQ test environment...\");\n  console.log(`📦 Using RabbitMQ image: ${rabbitmqImage}`);\n\n  // Start RabbitMQ container with management plugin\n  const rabbitmqContainer = await new GenericContainer(rabbitmqImage)\n    .withExposedPorts(5672, 15672)\n    .withEnvironment({\n      RABBITMQ_DEFAULT_USER: \"guest\",\n      RABBITMQ_DEFAULT_PASS: \"guest\",\n    })\n    .withWaitStrategy(\n      Wait.forAll([Wait.forLogMessage(/Server startup complete/), Wait.forListeningPorts()]),\n    )\n    .start();\n\n  console.log(\"✅ RabbitMQ container started\");\n\n  const __TESTCONTAINERS_RABBITMQ_IP__ = rabbitmqContainer.getHost();\n  const __TESTCONTAINERS_RABBITMQ_PORT_5672__ = rabbitmqContainer.getMappedPort(5672);\n  const __TESTCONTAINERS_RABBITMQ_PORT_15672__ = rabbitmqContainer.getMappedPort(15672);\n  const __TESTCONTAINERS_RABBITMQ_USERNAME__ = \"guest\";\n  const __TESTCONTAINERS_RABBITMQ_PASSWORD__ = \"guest\";\n\n  // Provide context values with type assertions to work around TypeScript limitations\n  provide(\"__TESTCONTAINERS_RABBITMQ_IP__\", __TESTCONTAINERS_RABBITMQ_IP__);\n  provide(\"__TESTCONTAINERS_RABBITMQ_PORT_5672__\", __TESTCONTAINERS_RABBITMQ_PORT_5672__);\n  provide(\"__TESTCONTAINERS_RABBITMQ_PORT_15672__\", __TESTCONTAINERS_RABBITMQ_PORT_15672__);\n  provide(\"__TESTCONTAINERS_RABBITMQ_USERNAME__\", __TESTCONTAINERS_RABBITMQ_USERNAME__);\n  provide(\"__TESTCONTAINERS_RABBITMQ_PASSWORD__\", __TESTCONTAINERS_RABBITMQ_PASSWORD__);\n\n  console.log(\n    `🚀 RabbitMQ test environment is ready at ${__TESTCONTAINERS_RABBITMQ_IP__}:${__TESTCONTAINERS_RABBITMQ_PORT_5672__}`,\n  );\n  console.log(\n    `📊 RabbitMQ management console available at http://${__TESTCONTAINERS_RABBITMQ_IP__}:${__TESTCONTAINERS_RABBITMQ_PORT_15672__}`,\n  );\n\n  // Return cleanup function that stops the container\n  return async () => {\n    console.log(\"🧹 Stopping RabbitMQ test environment...\");\n    await rabbitmqContainer.stop();\n    console.log(\"✅ RabbitMQ container stopped\");\n  };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAqBA,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;AAoC/B,eAA8B,MAAM,EAAE,WAAwB;CAC5D,MAAM,gBAAgB,QAAQ,IAAI,qBAAqB;CAEvD,QAAQ,IAAI,0CAA0C;CACtD,QAAQ,IAAI,4BAA4B,eAAe;CAGvD,MAAM,oBAAoB,MAAM,IAAI,iBAAiB,aAAa,CAAC,CAChE,iBAAiB,MAAM,KAAK,CAAC,CAC7B,gBAAgB;EACf,uBAAuB;EACvB,uBAAuB;CACzB,CAAC,CAAC,CACD,iBACC,KAAK,OAAO,CAAC,KAAK,cAAc,yBAAyB,GAAG,KAAK,kBAAkB,CAAC,CAAC,CACvF,CAAC,CACA,MAAM;CAET,QAAQ,IAAI,8BAA8B;CAE1C,MAAM,iCAAiC,kBAAkB,QAAQ;CACjE,MAAM,wCAAwC,kBAAkB,cAAc,IAAI;CAClF,MAAM,yCAAyC,kBAAkB,cAAc,KAAK;CACpF,MAAM,uCAAuC;CAC7C,MAAM,uCAAuC;CAG7C,QAAQ,kCAAkC,8BAA8B;CACxE,QAAQ,yCAAyC,qCAAqC;CACtF,QAAQ,0CAA0C,sCAAsC;CACxF,QAAQ,wCAAwC,oCAAoC;CACpF,QAAQ,wCAAwC,oCAAoC;CAEpF,QAAQ,IACN,4CAA4C,+BAA+B,GAAG,uCAChF;CACA,QAAQ,IACN,sDAAsD,+BAA+B,GAAG,wCAC1F;CAGA,OAAO,YAAY;EACjB,QAAQ,IAAI,0CAA0C;EACtD,MAAM,kBAAkB,KAAK;EAC7B,QAAQ,IAAI,8BAA8B;CAC5C;AACF"}