diff --git a/server/.env.template b/server/.env.template index cbe53fc..ec7ce40 100644 --- a/server/.env.template +++ b/server/.env.template @@ -1,4 +1,5 @@ RABBITMQ_URL=amqp://queue +RABBITMQ_URL_TEST=amqp://localhost POSTGRES_URL=database POSTGRES_PORT=5432 diff --git a/server/package-lock.json b/server/package-lock.json index 03d2bc2..b83034a 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -5859,6 +5859,12 @@ } } }, + "mock-amqplib": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/mock-amqplib/-/mock-amqplib-1.3.0.tgz", + "integrity": "sha512-vGA5OBvYfmcxaijV5k070FxT8h/Oy0YIrDFjD/WCLBxXgvOcYbEQSDSRFmgFk18hVI+7Gjy5KBbK/S5Q3mOMgg==", + "dev": true + }, "moment": { "version": "2.29.1", "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", diff --git a/server/package.json b/server/package.json index 0e2aaf3..22b708d 100644 --- a/server/package.json +++ b/server/package.json @@ -57,6 +57,7 @@ "eslint": "^7.13.0", "eslint-config-google": "^0.14.0", "jest": "^26.6.3", + "mock-amqplib": "^1.3.0", "regenerator-runtime": "^0.13.7", "sinon": "^9.2.3", "slonik": "^23.5.4", diff --git a/server/services/core/config.ts b/server/services/core/config.ts index fd3a538..4fab8e9 100644 --- a/server/services/core/config.ts +++ b/server/services/core/config.ts @@ -4,6 +4,7 @@ dotenv.config(); const config = Object.freeze({ rabbitMqUrl: String(process.env.RABBITMQ_URL), + rabbitMqUrlTest: String(process.env.RABBITMQ_URL_TEST), postgresUrl: String(process.env.POSTGRES_URL), postgresPort: parseInt(String(process.env.POSTGRES_PORT)), diff --git a/server/services/core/interfaces/shared-queue/shared-queue.spec.ts b/server/services/core/interfaces/shared-queue/shared-queue.spec.ts index 32a87a5..5a797f1 100644 --- a/server/services/core/interfaces/shared-queue/shared-queue.spec.ts +++ b/server/services/core/interfaces/shared-queue/shared-queue.spec.ts @@ -1,3 +1,51 @@ +import amqp from 'mock-amqplib'; +import config from '../../config'; +import {SharedQueue} from '../../@types/global'; +import makeSharedQueue from './shared-queue'; + describe('shared-queue', () => { - it('must pass', () => {}); + let sharedQueue: SharedQueue; + + beforeEach(async () => { + sharedQueue = makeSharedQueue({ + queueLibrary: amqp, + queueUrl: config.rabbitMqUrlTest, + }); + }); + + it('must emit event on a single queue', async () => { + const message = {message: 'i do stuff'}; + const queueName = 'test_queue'; + + // Asserting whether emitting to a single queue was successful + expect(async () => { + await sharedQueue.emit([queueName], message); + }).not.toThrow(); + }); + + it('must get emitted messages when listening', async () => { + const message = {message: 'i do stuff'}; + const queueName = 'test_queue'; + + // Asserting whether emitting to a single queue was successful + expect(async () => { + await sharedQueue.emit([queueName], message); + }).not.toThrow(); + + // Defining a callback function and a spy bound to it which will be used to + // verify the callback was called exactly once (only 1 message in queue) + let response: object; + const callbackObject = { + callback: (result: object) => response = result, + }; + const spy = jest.spyOn(callbackObject, 'callback'); + + // Starting to listen for messages + await sharedQueue.listen( + queueName, + callbackObject.callback, + ); + expect(response).toEqual(message); + expect(spy).toHaveBeenCalledTimes(1); + }); });