From 7ac58f7e26468e05bcd0eba0c610dacfeeabaa9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Latzarus?= Date: Tue, 4 Mar 2025 11:12:52 +0100 Subject: [PATCH 1/2] feat(api): remove validating database created fields presence --- .../models/passage-events/PassageEvent.js | 2 -- .../domain/models/module/PassageEvent_test.js | 36 ------------------- 2 files changed, 38 deletions(-) diff --git a/api/src/devcomp/domain/models/passage-events/PassageEvent.js b/api/src/devcomp/domain/models/passage-events/PassageEvent.js index 566d3c479f0..9b7762cf542 100644 --- a/api/src/devcomp/domain/models/passage-events/PassageEvent.js +++ b/api/src/devcomp/domain/models/passage-events/PassageEvent.js @@ -16,10 +16,8 @@ class PassageEvent { throw new PassageEventInstantiationError(); } - assertNotNullOrUndefined(id, 'The id is required for a PassageEvent'); assertNotNullOrUndefined(type, 'The type is required for a PassageEvent'); assertNotNullOrUndefined(occurredAt, 'The occurredAt is required for a PassageEvent'); - assertNotNullOrUndefined(createdAt, 'The createdAt is required for a PassageEvent'); assertNotNullOrUndefined(passageId, 'The passageId is required for a PassageEvent'); this.id = id; diff --git a/api/tests/devcomp/unit/domain/models/module/PassageEvent_test.js b/api/tests/devcomp/unit/domain/models/module/PassageEvent_test.js index 402f4178ab2..63e5fb1e141 100644 --- a/api/tests/devcomp/unit/domain/models/module/PassageEvent_test.js +++ b/api/tests/devcomp/unit/domain/models/module/PassageEvent_test.js @@ -13,24 +13,6 @@ describe('Unit | Devcomp | Domain | Models | PassageEvent', function () { expect(error).to.be.instanceOf(PassageEventInstantiationError); }); - describe('if a passage event does not have an id', function () { - it('should throw an error', function () { - // given - class FakeEvent extends PassageEvent { - constructor() { - super({}); - } - } - - // when - const error = catchErrSync(() => new FakeEvent())(); - - // then - expect(error).to.be.instanceOf(DomainError); - expect(error.message).to.equal('The id is required for a PassageEvent'); - }); - }); - describe('if a passage event does not have a type', function () { it('should throw an error', function () { // given @@ -67,24 +49,6 @@ describe('Unit | Devcomp | Domain | Models | PassageEvent', function () { }); }); - describe('if a passage event does not have a createdAt', function () { - it('should throw an error', function () { - // given - class FakeEvent extends PassageEvent { - constructor() { - super({ id: 1, type: 'FAKE', occurredAt: Symbol('date') }); - } - } - - // when - const error = catchErrSync(() => new FakeEvent())(); - - // then - expect(error).to.be.instanceOf(DomainError); - expect(error.message).to.equal('The createdAt is required for a PassageEvent'); - }); - }); - describe('if a passage event does not have a passageId', function () { it('should throw an error', function () { // given From 6fa46444dcc4324a6020fac5c7affc29cfcbeb27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Latzarus?= Date: Tue, 4 Mar 2025 11:39:37 +0100 Subject: [PATCH 2/2] feat(api): add passage-event-repository with record method Co-authored-by: Diane Cordier Co-authored-by: Eric Lim --- .../repositories/passage-event-repository.js | 13 +++++++ .../passage-event-repository_test.js | 38 +++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 api/src/devcomp/infrastructure/repositories/passage-event-repository.js create mode 100644 api/tests/devcomp/integration/repositories/passage-event-repository_test.js diff --git a/api/src/devcomp/infrastructure/repositories/passage-event-repository.js b/api/src/devcomp/infrastructure/repositories/passage-event-repository.js new file mode 100644 index 00000000000..c964e3e762c --- /dev/null +++ b/api/src/devcomp/infrastructure/repositories/passage-event-repository.js @@ -0,0 +1,13 @@ +import { DomainTransaction } from '../../../shared/domain/DomainTransaction.js'; + +async function record(event) { + const knexConn = DomainTransaction.getConnection(); + await knexConn('passage-events').insert({ + passageId: event.passageId, + occurredAt: event.occurredAt, + type: event.type, + data: event.data, + }); +} + +export { record }; diff --git a/api/tests/devcomp/integration/repositories/passage-event-repository_test.js b/api/tests/devcomp/integration/repositories/passage-event-repository_test.js new file mode 100644 index 00000000000..bf0e1903ba3 --- /dev/null +++ b/api/tests/devcomp/integration/repositories/passage-event-repository_test.js @@ -0,0 +1,38 @@ +import { PassageStartedEvent } from '../../../../src/devcomp/domain/models/passage-events/passage-events.js'; +import * as passageEventRepository from '../../../../src/devcomp/infrastructure/repositories/passage-event-repository.js'; +import { databaseBuilder, expect, knex, sinon } from '../../../test-helper.js'; + +describe('Integration | DevComp | Repositories | PassageEventRepository', function () { + describe('#record', function () { + let clock; + + beforeEach(function () { + clock = sinon.useFakeTimers(new Date('2023-12-31'), 'Date'); + }); + + afterEach(function () { + clock.restore(); + }); + + it('should record a passage event', async function () { + // given + const passage = databaseBuilder.factory.buildPassage(); + await databaseBuilder.commit(); + const event = new PassageStartedEvent({ + occurredAt: new Date('2019-04-28'), + passageId: passage.id, + contentHash: 'abcd1234', + }); + + // when + await passageEventRepository.record(event); + + // then + const recordedEvent = await knex('passage-events') + .where({ type: 'PASSAGE_STARTED', passageId: passage.id }) + .first(); + expect(recordedEvent.data.contentHash).to.equal('abcd1234'); + expect(recordedEvent.occurredAt).to.deep.equal(new Date('2019-04-28')); + }); + }); +});