diff --git a/docker-compose.yml b/docker-compose.yml index ae1c6557..f13e6c3f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -9,25 +9,6 @@ services: - rabbit_data:/var/lib/rabbitmq restart: on-failure - localstack: - image: localstack/localstack:4.13.1 - network_mode: bridge - hostname: localstack - ports: - - '127.0.0.1:4566:4566' # LocalStack Gateway - - '127.0.0.1:4510-4559:4510-4559' # external services port range - environment: - - SERVICES=sns,sqs,s3,sts - - DEBUG=0 - - DATA_DIR=${DATA_DIR-} - - DOCKER_HOST=unix:///var/run/docker.sock - - LOCALSTACK_HOST=localstack - # - LOCALSTACK_API_KEY=someDummyKey - volumes: - - '${TMPDIR:-/tmp}/localstack:/var/log/localstack' - - '/var/run/docker.sock:/var/run/docker.sock' - restart: on-failure - redis: image: redis:6.2.7-alpine command: redis-server --requirepass sOmE_sEcUrE_pAsS diff --git a/packages/s3-payload-store/package.json b/packages/s3-payload-store/package.json index 6ad6ea6a..f4102bbf 100644 --- a/packages/s3-payload-store/package.json +++ b/packages/s3-payload-store/package.json @@ -27,8 +27,6 @@ "test:coverage": "npm run test -- --coverage", "lint": "biome check . && tsc", "lint:fix": "biome check --write .", - "docker:start": "docker compose up -d --quiet-pull localstack", - "docker:stop": "docker compose down", "prepublishOnly": "npm run lint && npm run build" }, "dependencies": {}, @@ -43,8 +41,9 @@ "@lokalise/tsconfig": "^3.0.0", "@types/node": "^25.0.2", "@vitest/coverage-v8": "^4.0.15", + "fauxqs": "^1.6.8", "rimraf": "^6.0.1", - "typescript": "^5.9.2", + "typescript": "^5.9.3", "vitest": "^4.0.15" }, "homepage": "https://github.com/kibertoad/message-queue-toolkit", diff --git a/packages/s3-payload-store/test/utils/globalSetup.ts b/packages/s3-payload-store/test/utils/globalSetup.ts new file mode 100644 index 00000000..2a282fc7 --- /dev/null +++ b/packages/s3-payload-store/test/utils/globalSetup.ts @@ -0,0 +1,11 @@ +import { startFauxqs } from 'fauxqs' + +let server: Awaited> + +export async function setup() { + server = await startFauxqs({ port: 4566, logger: false, host: 'localstack' }) +} + +export async function teardown() { + await server.stop() +} diff --git a/packages/s3-payload-store/test/utils/testS3Config.ts b/packages/s3-payload-store/test/utils/testS3Config.ts index 15244f52..a892b766 100644 --- a/packages/s3-payload-store/test/utils/testS3Config.ts +++ b/packages/s3-payload-store/test/utils/testS3Config.ts @@ -1,10 +1,12 @@ import type { S3ClientConfig } from '@aws-sdk/client-s3' +import { createLocalhostHandler } from 'fauxqs' export const TEST_AWS_CONFIG: S3ClientConfig = { - endpoint: 'http://s3.localhost.localstack.cloud:4566', + endpoint: 'http://s3.localhost:4566', region: 'eu-west-1', credentials: { accessKeyId: 'access', secretAccessKey: 'secret', }, + requestHandler: createLocalhostHandler(), } diff --git a/packages/s3-payload-store/vitest.config.ts b/packages/s3-payload-store/vitest.config.ts index ec65a91a..c25562f4 100644 --- a/packages/s3-payload-store/vitest.config.ts +++ b/packages/s3-payload-store/vitest.config.ts @@ -7,6 +7,8 @@ export default defineConfig({ watch: false, mockReset: true, pool: 'threads', + maxWorkers: 1, + globalSetup: ['test/utils/globalSetup.ts'], coverage: { provider: 'v8', include: ['lib/**/*.ts'], diff --git a/packages/sns/package.json b/packages/sns/package.json index a61850b5..8fbe27ab 100644 --- a/packages/sns/package.json +++ b/packages/sns/package.json @@ -23,7 +23,7 @@ "test:coverage": "npm run test -- --coverage", "lint": "biome check . && tsc", "lint:fix": "biome check --write .", - "docker:start": "docker compose up -d localstack redis", + "docker:start": "docker compose up -d redis", "docker:stop": "docker compose down", "prepublishOnly": "npm run lint && npm run build" }, @@ -53,8 +53,9 @@ "@message-queue-toolkit/sqs": "*", "@types/node": "^25.0.2", "@vitest/coverage-v8": "^4.0.15", - "awilix": "^12.0.5", + "awilix": "^12.1.1", "awilix-manager": "^6.1.0", + "fauxqs": "^1.6.8", "ioredis": "^5.7.0", "rimraf": "^6.0.1", "typescript": "^5.9.3", diff --git a/packages/sns/test/utils/globalSetup.ts b/packages/sns/test/utils/globalSetup.ts new file mode 100644 index 00000000..2a282fc7 --- /dev/null +++ b/packages/sns/test/utils/globalSetup.ts @@ -0,0 +1,11 @@ +import { startFauxqs } from 'fauxqs' + +let server: Awaited> + +export async function setup() { + server = await startFauxqs({ port: 4566, logger: false, host: 'localstack' }) +} + +export async function teardown() { + await server.stop() +} diff --git a/packages/sns/test/utils/testContext.ts b/packages/sns/test/utils/testContext.ts index 542a5630..4044f20d 100644 --- a/packages/sns/test/utils/testContext.ts +++ b/packages/sns/test/utils/testContext.ts @@ -26,7 +26,7 @@ import { SnsSqsPermissionConsumer } from '../consumers/SnsSqsPermissionConsumer. import { CreateLocateConfigMixPublisher } from '../publishers/CreateLocateConfigMixPublisher.ts' import { SnsPermissionPublisher } from '../publishers/SnsPermissionPublisher.ts' import { TEST_REDIS_CONFIG } from './testRedisConfig.ts' -import { TEST_AWS_CONFIG } from './testSnsConfig.ts' +import { TEST_AWS_CONFIG, TEST_S3_CONFIG } from './testSnsConfig.ts' export const SINGLETON_CONFIG = { lifetime: Lifetime.SINGLETON } @@ -109,7 +109,7 @@ export async function registerDependencies( }, ), s3: asFunction(() => { - return new S3(TEST_AWS_CONFIG) + return new S3(TEST_S3_CONFIG) }), consumerErrorResolver: asClass(FakeConsumerErrorResolver, SINGLETON_CONFIG), diff --git a/packages/sns/test/utils/testSnsConfig.ts b/packages/sns/test/utils/testSnsConfig.ts index 01824552..7b503152 100644 --- a/packages/sns/test/utils/testSnsConfig.ts +++ b/packages/sns/test/utils/testSnsConfig.ts @@ -1,12 +1,23 @@ import type { S3ClientConfig } from '@aws-sdk/client-s3' import type { SNSClientConfig } from '@aws-sdk/client-sns' import type { SQSClientConfig } from '@aws-sdk/client-sqs' +import { createLocalhostHandler } from 'fauxqs' -export const TEST_AWS_CONFIG: SNSClientConfig & SQSClientConfig & S3ClientConfig = { - endpoint: 'http://s3.localhost.localstack.cloud:4566', +export const TEST_AWS_CONFIG: SNSClientConfig & SQSClientConfig = { + endpoint: 'http://localhost:4566', region: 'eu-west-1', credentials: { accessKeyId: 'access', secretAccessKey: 'secret', }, } + +export const TEST_S3_CONFIG: S3ClientConfig = { + endpoint: 'http://s3.localhost:4566', + region: 'eu-west-1', + credentials: { + accessKeyId: 'access', + secretAccessKey: 'secret', + }, + requestHandler: createLocalhostHandler(), +} diff --git a/packages/sns/vitest.config.ts b/packages/sns/vitest.config.ts index fc60a43b..4016cafe 100644 --- a/packages/sns/vitest.config.ts +++ b/packages/sns/vitest.config.ts @@ -8,6 +8,7 @@ export default defineConfig({ mockReset: true, pool: 'threads', maxWorkers: 1, + globalSetup: ['test/utils/globalSetup.ts'], coverage: { provider: 'v8', include: ['lib/**/*.ts'], diff --git a/packages/sqs/package.json b/packages/sqs/package.json index f0eb1271..afc5f6c7 100644 --- a/packages/sqs/package.json +++ b/packages/sqs/package.json @@ -23,7 +23,7 @@ "test:coverage": "npm run test -- --coverage", "lint": "biome check && tsc", "lint:fix": "biome check --write .", - "docker:start": "docker compose up -d localstack redis", + "docker:start": "docker compose up -d redis", "docker:stop": "docker compose down", "prepublishOnly": "npm run lint && npm run build" }, @@ -50,8 +50,9 @@ "@vitest/coverage-v8": "^4.0.15", "awilix": "^12.0.5", "awilix-manager": "^6.1.0", - "rimraf": "^6.0.1", + "fauxqs": "^1.6.8", "ioredis": "^5.6.1", + "rimraf": "^6.0.1", "typescript": "^5.9.3", "vitest": "^4.0.15", "zod": "^4.1.13" diff --git a/packages/sqs/test/consumers/SqsPermisssionConsumer.deadLetterQueue.spec.ts b/packages/sqs/test/consumers/SqsPermisssionConsumer.deadLetterQueue.spec.ts index 1f52b4d3..b1521785 100644 --- a/packages/sqs/test/consumers/SqsPermisssionConsumer.deadLetterQueue.spec.ts +++ b/packages/sqs/test/consumers/SqsPermisssionConsumer.deadLetterQueue.spec.ts @@ -137,7 +137,7 @@ describe('SqsPermissionConsumer - deadLetterQueue', () => { deadLetterQueue: { redrivePolicy: { maxReceiveCount: 5 }, locatorConfig: { - queueUrl: 'http://s3.localhost.localstack.cloud:4566/000000000000/badQueue', + queueUrl: 'http://localhost:4566/000000000000/badQueue', }, }, }) diff --git a/packages/sqs/test/utils/globalSetup.ts b/packages/sqs/test/utils/globalSetup.ts new file mode 100644 index 00000000..2a282fc7 --- /dev/null +++ b/packages/sqs/test/utils/globalSetup.ts @@ -0,0 +1,11 @@ +import { startFauxqs } from 'fauxqs' + +let server: Awaited> + +export async function setup() { + server = await startFauxqs({ port: 4566, logger: false, host: 'localstack' }) +} + +export async function teardown() { + await server.stop() +} diff --git a/packages/sqs/test/utils/testAwsConfig.ts b/packages/sqs/test/utils/testAwsConfig.ts index 27e7801e..079a9fa5 100644 --- a/packages/sqs/test/utils/testAwsConfig.ts +++ b/packages/sqs/test/utils/testAwsConfig.ts @@ -1,11 +1,22 @@ import type { S3ClientConfig } from '@aws-sdk/client-s3' import type { SQSClientConfig } from '@aws-sdk/client-sqs' +import { createLocalhostHandler } from 'fauxqs' -export const TEST_AWS_CONFIG: SQSClientConfig & S3ClientConfig = { - endpoint: 'http://s3.localhost.localstack.cloud:4566', +export const TEST_AWS_CONFIG: SQSClientConfig = { + endpoint: 'http://localhost:4566', region: 'eu-west-1', credentials: { accessKeyId: 'access', secretAccessKey: 'secret', }, } + +export const TEST_S3_CONFIG: S3ClientConfig = { + endpoint: 'http://s3.localhost:4566', + region: 'eu-west-1', + credentials: { + accessKeyId: 'access', + secretAccessKey: 'secret', + }, + requestHandler: createLocalhostHandler(), +} diff --git a/packages/sqs/test/utils/testContext.ts b/packages/sqs/test/utils/testContext.ts index 7f17934c..cfce010d 100644 --- a/packages/sqs/test/utils/testContext.ts +++ b/packages/sqs/test/utils/testContext.ts @@ -12,7 +12,7 @@ import { Redis } from 'ioredis' import { SqsConsumerErrorResolver } from '../../lib/errors/SqsConsumerErrorResolver.ts' import { SqsPermissionConsumer } from '../consumers/SqsPermissionConsumer.ts' import { SqsPermissionPublisher } from '../publishers/SqsPermissionPublisher.ts' -import { TEST_AWS_CONFIG } from './testAwsConfig.ts' +import { TEST_AWS_CONFIG, TEST_S3_CONFIG } from './testAwsConfig.ts' import { TEST_REDIS_CONFIG } from './testRedisConfig.ts' export const SINGLETON_CONFIG = { lifetime: Lifetime.SINGLETON } @@ -51,7 +51,7 @@ export async function registerDependencies(dependencyOverrides: DependencyOverri }, ), s3: asFunction(() => { - return new S3(TEST_AWS_CONFIG) + return new S3(TEST_S3_CONFIG) }), consumerErrorResolver: asFunction(() => { return new SqsConsumerErrorResolver() diff --git a/packages/sqs/vitest.config.ts b/packages/sqs/vitest.config.ts index d5f38e14..40633de0 100644 --- a/packages/sqs/vitest.config.ts +++ b/packages/sqs/vitest.config.ts @@ -8,6 +8,7 @@ export default defineConfig({ mockReset: true, pool: 'threads', maxWorkers: 1, + globalSetup: ['test/utils/globalSetup.ts'], coverage: { provider: 'v8', include: ['lib/**/*.ts'],