@volontariapp/domain-event 2.3.3 → 2.4.0-next.20260417122013
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/repositories/postgres-event.repository.d.ts +1 -0
- package/dist/repositories/postgres-event.repository.d.ts.map +1 -1
- package/dist/repositories/postgres-event.repository.js +4 -0
- package/dist/repositories/postgres-event.repository.js.map +1 -1
- package/dist/test/__test-utils__/factories/event.factory.d.ts +7 -0
- package/dist/test/__test-utils__/factories/event.factory.d.ts.map +1 -0
- package/dist/test/__test-utils__/factories/event.factory.js +56 -0
- package/dist/test/__test-utils__/factories/event.factory.js.map +1 -0
- package/dist/test/__test-utils__/factories/requirement.factory.d.ts +7 -0
- package/dist/test/__test-utils__/factories/requirement.factory.d.ts.map +1 -0
- package/dist/test/__test-utils__/factories/requirement.factory.js +33 -0
- package/dist/test/__test-utils__/factories/requirement.factory.js.map +1 -0
- package/dist/test/__test-utils__/factories/tag.factory.d.ts +7 -0
- package/dist/test/__test-utils__/factories/tag.factory.d.ts.map +1 -0
- package/dist/test/__test-utils__/factories/tag.factory.js +27 -0
- package/dist/test/__test-utils__/factories/tag.factory.js.map +1 -0
- package/dist/test/__test-utils__/mocks/event.repository.mock.d.ts +4 -0
- package/dist/test/__test-utils__/mocks/event.repository.mock.d.ts.map +1 -0
- package/dist/test/__test-utils__/mocks/event.repository.mock.js +10 -0
- package/dist/test/__test-utils__/mocks/event.repository.mock.js.map +1 -0
- package/dist/test/__test-utils__/mocks/requirement.repository.mock.d.ts +4 -0
- package/dist/test/__test-utils__/mocks/requirement.repository.mock.d.ts.map +1 -0
- package/dist/test/__test-utils__/mocks/requirement.repository.mock.js +9 -0
- package/dist/test/__test-utils__/mocks/requirement.repository.mock.js.map +1 -0
- package/dist/test/__test-utils__/mocks/tag.repository.mock.d.ts +4 -0
- package/dist/test/__test-utils__/mocks/tag.repository.mock.d.ts.map +1 -0
- package/dist/test/__test-utils__/mocks/tag.repository.mock.js +11 -0
- package/dist/test/__test-utils__/mocks/tag.repository.mock.js.map +1 -0
- package/dist/test/__test-utils__/mocks/tag.service.mock.d.ts +4 -0
- package/dist/test/__test-utils__/mocks/tag.service.mock.d.ts.map +1 -0
- package/dist/test/__test-utils__/mocks/tag.service.mock.js +11 -0
- package/dist/test/__test-utils__/mocks/tag.service.mock.js.map +1 -0
- package/dist/test/data-source.d.ts +8 -0
- package/dist/test/data-source.d.ts.map +1 -0
- package/dist/test/data-source.js +32 -0
- package/dist/test/data-source.js.map +1 -0
- package/dist/test/integration/event.int.spec.d.ts +2 -0
- package/dist/test/integration/event.int.spec.d.ts.map +1 -0
- package/dist/test/integration/event.int.spec.js +212 -0
- package/dist/test/integration/event.int.spec.js.map +1 -0
- package/dist/test/integration/requirement.int.spec.d.ts +2 -0
- package/dist/test/integration/requirement.int.spec.d.ts.map +1 -0
- package/dist/test/integration/requirement.int.spec.js +101 -0
- package/dist/test/integration/requirement.int.spec.js.map +1 -0
- package/dist/test/integration/tag.int.spec.d.ts +2 -0
- package/dist/test/integration/tag.int.spec.d.ts.map +1 -0
- package/dist/test/integration/tag.int.spec.js +120 -0
- package/dist/test/integration/tag.int.spec.js.map +1 -0
- package/dist/test/migrations/1776008237420-InitialSchema.d.ts +7 -0
- package/dist/test/migrations/1776008237420-InitialSchema.d.ts.map +1 -0
- package/dist/test/migrations/1776008237420-InitialSchema.js +40 -0
- package/dist/test/migrations/1776008237420-InitialSchema.js.map +1 -0
- package/dist/test/migrations/1776104175000-AddDetailsToRequirement.d.ts +7 -0
- package/dist/test/migrations/1776104175000-AddDetailsToRequirement.d.ts.map +1 -0
- package/dist/test/migrations/1776104175000-AddDetailsToRequirement.js +12 -0
- package/dist/test/migrations/1776104175000-AddDetailsToRequirement.js.map +1 -0
- package/dist/test/migrations/1776104180000-AddEventOrganizerAndMakeRequirementCreatorNullable.d.ts +7 -0
- package/dist/test/migrations/1776104180000-AddEventOrganizerAndMakeRequirementCreatorNullable.d.ts.map +1 -0
- package/dist/test/migrations/1776104180000-AddEventOrganizerAndMakeRequirementCreatorNullable.js +12 -0
- package/dist/test/migrations/1776104180000-AddEventOrganizerAndMakeRequirementCreatorNullable.js.map +1 -0
- package/dist/test/migrations/1776110000000-UpdateTagSchemaAndAddEventLocalisation.d.ts +7 -0
- package/dist/test/migrations/1776110000000-UpdateTagSchemaAndAddEventLocalisation.d.ts.map +1 -0
- package/dist/test/migrations/1776110000000-UpdateTagSchemaAndAddEventLocalisation.js +14 -0
- package/dist/test/migrations/1776110000000-UpdateTagSchemaAndAddEventLocalisation.js.map +1 -0
- package/dist/test/setup.d.ts +2 -0
- package/dist/test/setup.d.ts.map +1 -0
- package/dist/test/setup.js +2 -0
- package/dist/test/setup.js.map +1 -0
- package/dist/test/unit/event-location.value-object.unit.spec.d.ts +2 -0
- package/dist/test/unit/event-location.value-object.unit.spec.d.ts.map +1 -0
- package/dist/test/unit/event-location.value-object.unit.spec.js +75 -0
- package/dist/test/unit/event-location.value-object.unit.spec.js.map +1 -0
- package/dist/test/unit/event.service.unit.spec.d.ts +2 -0
- package/dist/test/unit/event.service.unit.spec.d.ts.map +1 -0
- package/dist/test/unit/event.service.unit.spec.js +273 -0
- package/dist/test/unit/event.service.unit.spec.js.map +1 -0
- package/dist/test/unit/mappers.unit.spec.d.ts +2 -0
- package/dist/test/unit/mappers.unit.spec.d.ts.map +1 -0
- package/dist/test/unit/mappers.unit.spec.js +174 -0
- package/dist/test/unit/mappers.unit.spec.js.map +1 -0
- package/dist/test/unit/requirement.service.unit.spec.d.ts +2 -0
- package/dist/test/unit/requirement.service.unit.spec.d.ts.map +1 -0
- package/dist/test/unit/requirement.service.unit.spec.js +119 -0
- package/dist/test/unit/requirement.service.unit.spec.js.map +1 -0
- package/dist/test/unit/tag.service.unit.spec.d.ts +2 -0
- package/dist/test/unit/tag.service.unit.spec.d.ts.map +1 -0
- package/dist/test/unit/tag.service.unit.spec.js +187 -0
- package/dist/test/unit/tag.service.unit.spec.js.map +1 -0
- package/package.json +15 -2
|
@@ -7,5 +7,6 @@ export declare class PostgresEventRepository extends BaseRepository<EventModel,
|
|
|
7
7
|
constructor(repository: Repository<EventModel>);
|
|
8
8
|
findById(id: string, relations?: string[]): Promise<EventEntity | null>;
|
|
9
9
|
findAll(relations?: string[]): Promise<EventEntity[]>;
|
|
10
|
+
search(searchTerm: string): Promise<EventEntity[]>;
|
|
10
11
|
}
|
|
11
12
|
//# sourceMappingURL=postgres-event.repository.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgres-event.repository.d.ts","sourceRoot":"","sources":["../../src/repositories/postgres-event.repository.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"postgres-event.repository.d.ts","sourceRoot":"","sources":["../../src/repositories/postgres-event.repository.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAEpE,qBACa,uBACX,SAAQ,cAAc,CAAC,UAAU,EAAE,WAAW,CAC9C,YAAW,gBAAgB;gBAIzB,UAAU,EAAE,UAAU,CAAC,UAAU,CAAC;IAK9B,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAO3E,OAAO,CAAC,SAAS,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAOzD,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;CAGzD"}
|
|
@@ -13,6 +13,7 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
|
13
13
|
import { Injectable } from '@nestjs/common';
|
|
14
14
|
import { InjectRepository } from '@nestjs/typeorm';
|
|
15
15
|
import { BaseRepository } from '@volontariapp/database';
|
|
16
|
+
import { ILike } from 'typeorm';
|
|
16
17
|
import { EventModel } from '../models/event.model.js';
|
|
17
18
|
import { EventEntity } from '../entities/event.entity.js';
|
|
18
19
|
let PostgresEventRepository = class PostgresEventRepository extends BaseRepository {
|
|
@@ -31,6 +32,9 @@ let PostgresEventRepository = class PostgresEventRepository extends BaseReposito
|
|
|
31
32
|
}
|
|
32
33
|
return super.find();
|
|
33
34
|
}
|
|
35
|
+
async search(searchTerm) {
|
|
36
|
+
return super.find({ where: { name: ILike(`%${searchTerm}%`) } });
|
|
37
|
+
}
|
|
34
38
|
};
|
|
35
39
|
PostgresEventRepository = __decorate([
|
|
36
40
|
Injectable(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgres-event.repository.js","sourceRoot":"","sources":["../../src/repositories/postgres-event.repository.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAInD,IAAM,uBAAuB,GAA7B,MAAM,uBACX,SAAQ,cAAuC;IAG/C,YAEE,UAAkC;QAElC,KAAK,CAAC,UAAU,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,EAAU,EAAE,YAAsB,EAAE;QACjD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC,iBAAiB,CAAC,EAAE,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC;QACnD,CAAC;QACD,OAAO,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,YAAsB,EAAE;QACpC,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,OAAO,KAAK,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC;QAC/C,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;IACtB,CAAC;CACF,CAAA;
|
|
1
|
+
{"version":3,"file":"postgres-event.repository.js","sourceRoot":"","sources":["../../src/repositories/postgres-event.repository.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAInD,IAAM,uBAAuB,GAA7B,MAAM,uBACX,SAAQ,cAAuC;IAG/C,YAEE,UAAkC;QAElC,KAAK,CAAC,UAAU,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,EAAU,EAAE,YAAsB,EAAE;QACjD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC,iBAAiB,CAAC,EAAE,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC;QACnD,CAAC;QACD,OAAO,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,YAAsB,EAAE;QACpC,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,OAAO,KAAK,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC;QAC/C,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,UAAkB;QAC7B,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,UAAU,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IACnE,CAAC;CACF,CAAA;AA5BY,uBAAuB;IADnC,UAAU,EAAE;IAMR,WAAA,gBAAgB,CAAC,UAAU,CAAC,CAAA;;GALpB,uBAAuB,CA4BnC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { EventEntity } from '../../../entities/event.entity.js';
|
|
2
|
+
export declare class EventFactory {
|
|
3
|
+
static build(overrides?: Partial<EventEntity>): EventEntity;
|
|
4
|
+
static buildMany(count: number, overrides?: Partial<EventEntity>): EventEntity[];
|
|
5
|
+
static buildInput(overrides?: Partial<Omit<EventEntity, 'id' | 'createdAt' | 'updatedAt'>>): Partial<EventEntity>;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=event.factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event.factory.d.ts","sourceRoot":"","sources":["../../../../src/test/__test-utils__/factories/event.factory.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAKhE,qBAAa,YAAY;IACvB,MAAM,CAAC,KAAK,CAAC,SAAS,GAAE,OAAO,CAAC,WAAW,CAAM,GAAG,WAAW;IA0B/D,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,GAAE,OAAO,CAAC,WAAW,CAAM,GAAG,WAAW,EAAE;IAIpF,MAAM,CAAC,UAAU,CACf,SAAS,GAAE,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,CAAC,CAAM,GAC3E,OAAO,CAAC,WAAW,CAAC;CAoBxB"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { EventState, EventType } from '@volontariapp/contracts';
|
|
3
|
+
import { EventEntity } from '../../../entities/event.entity.js';
|
|
4
|
+
import { EventLocation } from '../../../value-objects/event-location.value-object.js';
|
|
5
|
+
const ONE_DAY_MS = 86_400_000;
|
|
6
|
+
export class EventFactory {
|
|
7
|
+
static build(overrides = {}) {
|
|
8
|
+
const uid = randomUUID().slice(0, 8);
|
|
9
|
+
const now = new Date();
|
|
10
|
+
const tomorrow = new Date(now.getTime() + ONE_DAY_MS);
|
|
11
|
+
return Object.assign(new EventEntity(), {
|
|
12
|
+
id: randomUUID(),
|
|
13
|
+
name: `Event ${uid}`,
|
|
14
|
+
description: `Description for event ${uid}`,
|
|
15
|
+
startAt: now,
|
|
16
|
+
endAt: tomorrow,
|
|
17
|
+
location: new EventLocation(48.8566, 2.3522),
|
|
18
|
+
localisationName: 'Paris, France',
|
|
19
|
+
type: EventType.EVENT_TYPE_SOCIAL,
|
|
20
|
+
state: EventState.EVENT_STATE_DRAFT,
|
|
21
|
+
awardedImpactScore: 10,
|
|
22
|
+
maxParticipants: 100,
|
|
23
|
+
currentParticipants: 0,
|
|
24
|
+
organizerId: randomUUID(),
|
|
25
|
+
createdAt: now,
|
|
26
|
+
updatedAt: now,
|
|
27
|
+
requirements: [],
|
|
28
|
+
tags: [],
|
|
29
|
+
...overrides,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
static buildMany(count, overrides = {}) {
|
|
33
|
+
return Array.from({ length: count }, () => EventFactory.build(overrides));
|
|
34
|
+
}
|
|
35
|
+
static buildInput(overrides = {}) {
|
|
36
|
+
const uid = randomUUID().slice(0, 8);
|
|
37
|
+
const now = new Date();
|
|
38
|
+
const tomorrow = new Date(now.getTime() + ONE_DAY_MS);
|
|
39
|
+
return {
|
|
40
|
+
name: `Event ${uid}`,
|
|
41
|
+
description: `Description for event ${uid}`,
|
|
42
|
+
startAt: now,
|
|
43
|
+
endAt: tomorrow,
|
|
44
|
+
location: new EventLocation(48.8566, 2.3522),
|
|
45
|
+
localisationName: 'Paris, France',
|
|
46
|
+
type: EventType.EVENT_TYPE_SOCIAL,
|
|
47
|
+
state: EventState.EVENT_STATE_DRAFT,
|
|
48
|
+
awardedImpactScore: 10,
|
|
49
|
+
maxParticipants: 100,
|
|
50
|
+
currentParticipants: 0,
|
|
51
|
+
organizerId: randomUUID(),
|
|
52
|
+
...overrides,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=event.factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event.factory.js","sourceRoot":"","sources":["../../../../src/test/__test-utils__/factories/event.factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,uDAAuD,CAAC;AAEtF,MAAM,UAAU,GAAG,UAAU,CAAC;AAE9B,MAAM,OAAO,YAAY;IACvB,MAAM,CAAC,KAAK,CAAC,YAAkC,EAAE;QAC/C,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,UAAU,CAAC,CAAC;QACtD,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,WAAW,EAAE,EAAE;YACtC,EAAE,EAAE,UAAU,EAAE;YAChB,IAAI,EAAE,SAAS,GAAG,EAAE;YACpB,WAAW,EAAE,yBAAyB,GAAG,EAAE;YAC3C,OAAO,EAAE,GAAG;YACZ,KAAK,EAAE,QAAQ;YACf,QAAQ,EAAE,IAAI,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC;YAC5C,gBAAgB,EAAE,eAAe;YACjC,IAAI,EAAE,SAAS,CAAC,iBAAiB;YACjC,KAAK,EAAE,UAAU,CAAC,iBAAiB;YACnC,kBAAkB,EAAE,EAAE;YACtB,eAAe,EAAE,GAAG;YACpB,mBAAmB,EAAE,CAAC;YACtB,WAAW,EAAE,UAAU,EAAE;YACzB,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,GAAG;YACd,YAAY,EAAE,EAAE;YAChB,IAAI,EAAE,EAAE;YACR,GAAG,SAAS;SACb,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,SAAS,CAAC,KAAa,EAAE,YAAkC,EAAE;QAClE,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;IAC5E,CAAC;IAED,MAAM,CAAC,UAAU,CACf,YAA0E,EAAE;QAE5E,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,UAAU,CAAC,CAAC;QACtD,OAAO;YACL,IAAI,EAAE,SAAS,GAAG,EAAE;YACpB,WAAW,EAAE,yBAAyB,GAAG,EAAE;YAC3C,OAAO,EAAE,GAAG;YACZ,KAAK,EAAE,QAAQ;YACf,QAAQ,EAAE,IAAI,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC;YAC5C,gBAAgB,EAAE,eAAe;YACjC,IAAI,EAAE,SAAS,CAAC,iBAAiB;YACjC,KAAK,EAAE,UAAU,CAAC,iBAAiB;YACnC,kBAAkB,EAAE,EAAE;YACtB,eAAe,EAAE,GAAG;YACpB,mBAAmB,EAAE,CAAC;YACtB,WAAW,EAAE,UAAU,EAAE;YACzB,GAAG,SAAS;SACb,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { RequirementEntity } from '../../../entities/requirement.entity.js';
|
|
2
|
+
export declare class RequirementFactory {
|
|
3
|
+
static build(overrides?: Partial<RequirementEntity>): RequirementEntity;
|
|
4
|
+
static buildMany(count: number, overrides?: Partial<RequirementEntity>): RequirementEntity[];
|
|
5
|
+
static buildInput(overrides?: Partial<Omit<RequirementEntity, 'id'>>): Omit<RequirementEntity, 'id'>;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=requirement.factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"requirement.factory.d.ts","sourceRoot":"","sources":["../../../../src/test/__test-utils__/factories/requirement.factory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,yCAAyC,CAAC;AAE5E,qBAAa,kBAAkB;IAC7B,MAAM,CAAC,KAAK,CAAC,SAAS,GAAE,OAAO,CAAC,iBAAiB,CAAM,GAAG,iBAAiB;IAc3E,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,GAAE,OAAO,CAAC,iBAAiB,CAAM,GAAG,iBAAiB,EAAE;IAIhG,MAAM,CAAC,UAAU,CACf,SAAS,GAAE,OAAO,CAAC,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAM,GACrD,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC;CAYjC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { RequirementEntity } from '../../../entities/requirement.entity.js';
|
|
3
|
+
export class RequirementFactory {
|
|
4
|
+
static build(overrides = {}) {
|
|
5
|
+
const uid = randomUUID().slice(0, 8);
|
|
6
|
+
return Object.assign(new RequirementEntity(), {
|
|
7
|
+
id: randomUUID(),
|
|
8
|
+
name: `Requirement ${uid}`,
|
|
9
|
+
description: `Description for requirement ${uid}`,
|
|
10
|
+
quantity: 10,
|
|
11
|
+
currentQuantity: 0,
|
|
12
|
+
isSystem: false,
|
|
13
|
+
createdBy: randomUUID(),
|
|
14
|
+
...overrides,
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
static buildMany(count, overrides = {}) {
|
|
18
|
+
return Array.from({ length: count }, () => RequirementFactory.build(overrides));
|
|
19
|
+
}
|
|
20
|
+
static buildInput(overrides = {}) {
|
|
21
|
+
const uid = randomUUID().slice(0, 8);
|
|
22
|
+
return {
|
|
23
|
+
name: `Requirement ${uid}`,
|
|
24
|
+
description: `Description for requirement ${uid}`,
|
|
25
|
+
quantity: 10,
|
|
26
|
+
currentQuantity: 0,
|
|
27
|
+
isSystem: false,
|
|
28
|
+
createdBy: randomUUID(),
|
|
29
|
+
...overrides,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=requirement.factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"requirement.factory.js","sourceRoot":"","sources":["../../../../src/test/__test-utils__/factories/requirement.factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,yCAAyC,CAAC;AAE5E,MAAM,OAAO,kBAAkB;IAC7B,MAAM,CAAC,KAAK,CAAC,YAAwC,EAAE;QACrD,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACrC,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,iBAAiB,EAAE,EAAE;YAC5C,EAAE,EAAE,UAAU,EAAE;YAChB,IAAI,EAAE,eAAe,GAAG,EAAE;YAC1B,WAAW,EAAE,+BAA+B,GAAG,EAAE;YACjD,QAAQ,EAAE,EAAE;YACZ,eAAe,EAAE,CAAC;YAClB,QAAQ,EAAE,KAAK;YACf,SAAS,EAAE,UAAU,EAAE;YACvB,GAAG,SAAS;SACb,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,SAAS,CAAC,KAAa,EAAE,YAAwC,EAAE;QACxE,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,CAAC,kBAAkB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;IAClF,CAAC;IAED,MAAM,CAAC,UAAU,CACf,YAAoD,EAAE;QAEtD,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACrC,OAAO;YACL,IAAI,EAAE,eAAe,GAAG,EAAE;YAC1B,WAAW,EAAE,+BAA+B,GAAG,EAAE;YACjD,QAAQ,EAAE,EAAE;YACZ,eAAe,EAAE,CAAC;YAClB,QAAQ,EAAE,KAAK;YACf,SAAS,EAAE,UAAU,EAAE;YACvB,GAAG,SAAS;SACb,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { TagEntity } from '../../../entities/tag.entity.js';
|
|
2
|
+
export declare class TagFactory {
|
|
3
|
+
static build(overrides?: Partial<TagEntity>): TagEntity;
|
|
4
|
+
static buildMany(count: number, overrides?: Partial<TagEntity>): TagEntity[];
|
|
5
|
+
static buildInput(overrides?: Partial<Omit<TagEntity, 'id'>>): Omit<TagEntity, 'id'>;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=tag.factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tag.factory.d.ts","sourceRoot":"","sources":["../../../../src/test/__test-utils__/factories/tag.factory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AAE5D,qBAAa,UAAU;IACrB,MAAM,CAAC,KAAK,CAAC,SAAS,GAAE,OAAO,CAAC,SAAS,CAAM,GAAG,SAAS;IAW3D,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,GAAE,OAAO,CAAC,SAAS,CAAM,GAAG,SAAS,EAAE;IAIhF,MAAM,CAAC,UAAU,CAAC,SAAS,GAAE,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAM,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC;CASzF"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { TagEntity } from '../../../entities/tag.entity.js';
|
|
3
|
+
export class TagFactory {
|
|
4
|
+
static build(overrides = {}) {
|
|
5
|
+
const uid = randomUUID().slice(0, 8);
|
|
6
|
+
return Object.assign(new TagEntity(), {
|
|
7
|
+
id: randomUUID(),
|
|
8
|
+
name: `Tag ${uid}`,
|
|
9
|
+
slug: `tag-${uid}`,
|
|
10
|
+
balise: `#tag${uid}`,
|
|
11
|
+
...overrides,
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
static buildMany(count, overrides = {}) {
|
|
15
|
+
return Array.from({ length: count }, () => TagFactory.build(overrides));
|
|
16
|
+
}
|
|
17
|
+
static buildInput(overrides = {}) {
|
|
18
|
+
const uid = randomUUID().slice(0, 8);
|
|
19
|
+
return {
|
|
20
|
+
name: `Tag ${uid}`,
|
|
21
|
+
slug: `tag-${uid}`,
|
|
22
|
+
balise: `#tag${uid}`,
|
|
23
|
+
...overrides,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=tag.factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tag.factory.js","sourceRoot":"","sources":["../../../../src/test/__test-utils__/factories/tag.factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AAE5D,MAAM,OAAO,UAAU;IACrB,MAAM,CAAC,KAAK,CAAC,YAAgC,EAAE;QAC7C,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACrC,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,SAAS,EAAE,EAAE;YACpC,EAAE,EAAE,UAAU,EAAE;YAChB,IAAI,EAAE,OAAO,GAAG,EAAE;YAClB,IAAI,EAAE,OAAO,GAAG,EAAE;YAClB,MAAM,EAAE,OAAO,GAAG,EAAE;YACpB,GAAG,SAAS;SACb,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,SAAS,CAAC,KAAa,EAAE,YAAgC,EAAE;QAChE,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;IAC1E,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,YAA4C,EAAE;QAC9D,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACrC,OAAO;YACL,IAAI,EAAE,OAAO,GAAG,EAAE;YAClB,IAAI,EAAE,OAAO,GAAG,EAAE;YAClB,MAAM,EAAE,OAAO,GAAG,EAAE;YACpB,GAAG,SAAS;SACb,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { jest } from '@jest/globals';
|
|
2
|
+
import type { IEventRepository } from '../../../repositories/interfaces/event.repository.js';
|
|
3
|
+
export declare const createEventRepositoryMock: () => jest.Mocked<IEventRepository>;
|
|
4
|
+
//# sourceMappingURL=event.repository.mock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event.repository.mock.d.ts","sourceRoot":"","sources":["../../../../src/test/__test-utils__/mocks/event.repository.mock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sDAAsD,CAAC;AAE7F,eAAO,MAAM,yBAAyB,QAAO,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAQzB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { jest } from '@jest/globals';
|
|
2
|
+
export const createEventRepositoryMock = () => ({
|
|
3
|
+
findAll: jest.fn(),
|
|
4
|
+
findById: jest.fn(),
|
|
5
|
+
create: jest.fn(),
|
|
6
|
+
update: jest.fn(),
|
|
7
|
+
delete: jest.fn(),
|
|
8
|
+
search: jest.fn(),
|
|
9
|
+
});
|
|
10
|
+
//# sourceMappingURL=event.repository.mock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event.repository.mock.js","sourceRoot":"","sources":["../../../../src/test/__test-utils__/mocks/event.repository.mock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAGrC,MAAM,CAAC,MAAM,yBAAyB,GAAG,GAAkC,EAAE,CAC3E,CAAC;IACC,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE;IAClB,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE;IACnB,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE;IACjB,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE;IACjB,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE;IACjB,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE;CAClB,CAA6C,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { jest } from '@jest/globals';
|
|
2
|
+
import type { IRequirementRepository } from '../../../repositories/interfaces/requirement.repository.js';
|
|
3
|
+
export declare const createRequirementRepositoryMock: () => jest.Mocked<IRequirementRepository>;
|
|
4
|
+
//# sourceMappingURL=requirement.repository.mock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"requirement.repository.mock.d.ts","sourceRoot":"","sources":["../../../../src/test/__test-utils__/mocks/requirement.repository.mock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4DAA4D,CAAC;AAEzG,eAAO,MAAM,+BAA+B,QAAO,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAO/B,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { jest } from '@jest/globals';
|
|
2
|
+
export const createRequirementRepositoryMock = () => ({
|
|
3
|
+
findAll: jest.fn(),
|
|
4
|
+
findById: jest.fn(),
|
|
5
|
+
create: jest.fn(),
|
|
6
|
+
update: jest.fn(),
|
|
7
|
+
delete: jest.fn(),
|
|
8
|
+
});
|
|
9
|
+
//# sourceMappingURL=requirement.repository.mock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"requirement.repository.mock.js","sourceRoot":"","sources":["../../../../src/test/__test-utils__/mocks/requirement.repository.mock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAGrC,MAAM,CAAC,MAAM,+BAA+B,GAAG,GAAwC,EAAE,CACvF,CAAC;IACC,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE;IAClB,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE;IACnB,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE;IACjB,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE;IACjB,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE;CAClB,CAAmD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tag.repository.mock.d.ts","sourceRoot":"","sources":["../../../../src/test/__test-utils__/mocks/tag.repository.mock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oDAAoD,CAAC;AAEzF,eAAO,MAAM,uBAAuB,QAAO,IAAI,CAAC,MAAM,CAAC,cAAc,CASvB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { jest } from '@jest/globals';
|
|
2
|
+
export const createTagRepositoryMock = () => ({
|
|
3
|
+
findAll: jest.fn(),
|
|
4
|
+
findById: jest.fn(),
|
|
5
|
+
findByIds: jest.fn(),
|
|
6
|
+
findBySlug: jest.fn(),
|
|
7
|
+
create: jest.fn(),
|
|
8
|
+
update: jest.fn(),
|
|
9
|
+
delete: jest.fn(),
|
|
10
|
+
});
|
|
11
|
+
//# sourceMappingURL=tag.repository.mock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tag.repository.mock.js","sourceRoot":"","sources":["../../../../src/test/__test-utils__/mocks/tag.repository.mock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAGrC,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAgC,EAAE,CACvE,CAAC;IACC,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE;IAClB,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE;IACnB,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE;IACpB,UAAU,EAAE,IAAI,CAAC,EAAE,EAAE;IACrB,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE;IACjB,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE;IACjB,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE;CAClB,CAA2C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tag.service.mock.d.ts","sourceRoot":"","sources":["../../../../src/test/__test-utils__/mocks/tag.service.mock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAEnE,eAAO,MAAM,oBAAoB,QAAO,IAAI,CAAC,MAAM,CAAC,UAAU,CASpB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { jest } from '@jest/globals';
|
|
2
|
+
export const createTagServiceMock = () => ({
|
|
3
|
+
findAll: jest.fn(),
|
|
4
|
+
findById: jest.fn(),
|
|
5
|
+
findByIds: jest.fn(),
|
|
6
|
+
findBySlug: jest.fn(),
|
|
7
|
+
create: jest.fn(),
|
|
8
|
+
update: jest.fn(),
|
|
9
|
+
delete: jest.fn(),
|
|
10
|
+
});
|
|
11
|
+
//# sourceMappingURL=tag.service.mock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tag.service.mock.js","sourceRoot":"","sources":["../../../../src/test/__test-utils__/mocks/tag.service.mock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAGrC,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAA4B,EAAE,CAChE,CAAC;IACC,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE;IAClB,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE;IACnB,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE;IACpB,UAAU,EAAE,IAAI,CAAC,EAAE,EAAE;IACrB,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE;IACjB,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE;IACjB,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE;CAClB,CAAuC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { DataSource } from 'typeorm';
|
|
2
|
+
import type { Repository } from '@volontariapp/database';
|
|
3
|
+
export declare const testDataSource: DataSource;
|
|
4
|
+
export declare const getTestRepository: <T extends object>(EntityClass: new () => T) => Repository<T>;
|
|
5
|
+
export declare const initializeTestDb: () => Promise<void>;
|
|
6
|
+
export declare const closeTestDb: () => Promise<void>;
|
|
7
|
+
export declare const truncateAll: () => Promise<void>;
|
|
8
|
+
//# sourceMappingURL=data-source.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-source.d.ts","sourceRoot":"","sources":["../../src/test/data-source.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAMzD,eAAO,MAAM,cAAc,YAUzB,CAAC;AAEH,eAAO,MAAM,iBAAiB,GAAI,CAAC,SAAS,MAAM,eAAe,UAAU,CAAC,KAAG,UAAU,CAAC,CAAC,CACpB,CAAC;AAExE,eAAO,MAAM,gBAAgB,QAAa,OAAO,CAAC,IAAI,CAMrD,CAAC;AAEF,eAAO,MAAM,WAAW,QAAa,OAAO,CAAC,IAAI,CAIhD,CAAC;AAEF,eAAO,MAAM,WAAW,QAAa,OAAO,CAAC,IAAI,CAIhD,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { DataSource } from 'typeorm';
|
|
2
|
+
import { EventModel } from '../models/event.model.js';
|
|
3
|
+
import { TagModel } from '../models/tag.model.js';
|
|
4
|
+
import { RequirementModel } from '../models/requirement.model.js';
|
|
5
|
+
import { registerEventMappings } from '../models/mappers.js';
|
|
6
|
+
export const testDataSource = new DataSource({
|
|
7
|
+
type: 'postgres',
|
|
8
|
+
host: 'localhost',
|
|
9
|
+
port: 5434,
|
|
10
|
+
username: 'user',
|
|
11
|
+
password: 'password',
|
|
12
|
+
database: 'ms_event',
|
|
13
|
+
entities: [EventModel, TagModel, RequirementModel],
|
|
14
|
+
synchronize: false,
|
|
15
|
+
logging: false,
|
|
16
|
+
});
|
|
17
|
+
export const getTestRepository = (EntityClass) => testDataSource.getRepository(EntityClass);
|
|
18
|
+
export const initializeTestDb = async () => {
|
|
19
|
+
if (!testDataSource.isInitialized) {
|
|
20
|
+
await testDataSource.initialize();
|
|
21
|
+
}
|
|
22
|
+
registerEventMappings();
|
|
23
|
+
};
|
|
24
|
+
export const closeTestDb = async () => {
|
|
25
|
+
if (testDataSource.isInitialized) {
|
|
26
|
+
await testDataSource.destroy();
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
export const truncateAll = async () => {
|
|
30
|
+
await testDataSource.query('TRUNCATE TABLE event_tags, event_requirements, events, tags, requirements CASCADE;');
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=data-source.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-source.js","sourceRoot":"","sources":["../../src/test/data-source.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,UAAU,CAAC;IAC3C,IAAI,EAAE,UAAU;IAChB,IAAI,EAAE,WAAW;IACjB,IAAI,EAAE,IAAI;IACV,QAAQ,EAAE,MAAM;IAChB,QAAQ,EAAE,UAAU;IACpB,QAAQ,EAAE,UAAU;IACpB,QAAQ,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,gBAAgB,CAAC;IAClD,WAAW,EAAE,KAAK;IAClB,OAAO,EAAE,KAAK;CACf,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAmB,WAAwB,EAAiB,EAAE,CAC7F,cAAc,CAAC,aAAa,CAAC,WAAW,CAA6B,CAAC;AAExE,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,IAAmB,EAAE;IACxD,IAAI,CAAC,cAAc,CAAC,aAAa,EAAE,CAAC;QAClC,MAAM,cAAc,CAAC,UAAU,EAAE,CAAC;IACpC,CAAC;IAED,qBAAqB,EAAE,CAAC;AAC1B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,IAAmB,EAAE;IACnD,IAAI,cAAc,CAAC,aAAa,EAAE,CAAC;QACjC,MAAM,cAAc,CAAC,OAAO,EAAE,CAAC;IACjC,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,IAAmB,EAAE;IACnD,MAAM,cAAc,CAAC,KAAK,CACxB,oFAAoF,CACrF,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event.int.spec.d.ts","sourceRoot":"","sources":["../../../src/test/integration/event.int.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
import { describe, it, expect, beforeAll, afterAll, beforeEach } from '@jest/globals';
|
|
2
|
+
import { EventState, EventType } from '@volontariapp/contracts';
|
|
3
|
+
import { testDataSource, initializeTestDb, closeTestDb, truncateAll, getTestRepository, } from '../data-source.js';
|
|
4
|
+
import { EventModel } from '../../models/event.model.js';
|
|
5
|
+
import { TagModel } from '../../models/tag.model.js';
|
|
6
|
+
import { RequirementModel } from '../../models/requirement.model.js';
|
|
7
|
+
import { PostgresEventRepository } from '../../repositories/postgres-event.repository.js';
|
|
8
|
+
import { PostgresTagRepository } from '../../repositories/postgres-tag.repository.js';
|
|
9
|
+
import { PostgresRequirementRepository } from '../../repositories/postgres-requirement.repository.js';
|
|
10
|
+
import { EventEntity } from '../../entities/event.entity.js';
|
|
11
|
+
import { EventLocation } from '../../value-objects/event-location.value-object.js';
|
|
12
|
+
import { EventFactory } from '../__test-utils__/factories/event.factory.js';
|
|
13
|
+
import { TagFactory } from '../__test-utils__/factories/tag.factory.js';
|
|
14
|
+
import { RequirementFactory } from '../__test-utils__/factories/requirement.factory.js';
|
|
15
|
+
describe('PostgresEventRepository (Integration)', () => {
|
|
16
|
+
let eventRepository;
|
|
17
|
+
let tagRepository;
|
|
18
|
+
let requirementRepository;
|
|
19
|
+
beforeAll(async () => {
|
|
20
|
+
await initializeTestDb();
|
|
21
|
+
eventRepository = new PostgresEventRepository(getTestRepository(EventModel));
|
|
22
|
+
tagRepository = new PostgresTagRepository(getTestRepository(TagModel));
|
|
23
|
+
requirementRepository = new PostgresRequirementRepository(getTestRepository(RequirementModel));
|
|
24
|
+
});
|
|
25
|
+
afterAll(async () => {
|
|
26
|
+
await closeTestDb();
|
|
27
|
+
});
|
|
28
|
+
beforeEach(async () => {
|
|
29
|
+
await truncateAll();
|
|
30
|
+
});
|
|
31
|
+
describe('create()', () => {
|
|
32
|
+
it('should persist an event and return a mapped EventEntity', async () => {
|
|
33
|
+
const input = EventFactory.buildInput();
|
|
34
|
+
const result = await eventRepository.create(input);
|
|
35
|
+
expect(result).toBeInstanceOf(EventEntity);
|
|
36
|
+
expect(result.id).toBeDefined();
|
|
37
|
+
expect(result.name).toBe(input.name);
|
|
38
|
+
expect(result.description).toBe(input.description);
|
|
39
|
+
expect(result.type).toBe(EventType.EVENT_TYPE_SOCIAL);
|
|
40
|
+
expect(result.state).toBe(EventState.EVENT_STATE_DRAFT);
|
|
41
|
+
expect(result.awardedImpactScore).toBe(10);
|
|
42
|
+
expect(result.maxParticipants).toBe(100);
|
|
43
|
+
});
|
|
44
|
+
it('should generate a UUID for the id automatically', async () => {
|
|
45
|
+
const input = EventFactory.buildInput();
|
|
46
|
+
const result = await eventRepository.create(input);
|
|
47
|
+
expect(result.id).toMatch(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/);
|
|
48
|
+
});
|
|
49
|
+
it('should persist and retrieve location as EventLocation from PostGIS', async () => {
|
|
50
|
+
const paris = new EventLocation(48.8566, 2.3522);
|
|
51
|
+
const input = EventFactory.buildInput({ location: paris });
|
|
52
|
+
const created = await eventRepository.create(input);
|
|
53
|
+
const retrieved = await eventRepository.findById(created.id);
|
|
54
|
+
expect(retrieved?.location).toBeInstanceOf(EventLocation);
|
|
55
|
+
expect(retrieved?.location.latitude).toBeCloseTo(48.8566, 2);
|
|
56
|
+
expect(retrieved?.location.longitude).toBeCloseTo(2.3522, 2);
|
|
57
|
+
});
|
|
58
|
+
it('should persist events with different EventType values', async () => {
|
|
59
|
+
const input = EventFactory.buildInput({ type: EventType.EVENT_TYPE_ECOLOGY });
|
|
60
|
+
const result = await eventRepository.create(input);
|
|
61
|
+
expect(result.type).toBe(EventType.EVENT_TYPE_ECOLOGY);
|
|
62
|
+
});
|
|
63
|
+
it('should set createdAt and updatedAt automatically', async () => {
|
|
64
|
+
const input = EventFactory.buildInput();
|
|
65
|
+
const result = await eventRepository.create(input);
|
|
66
|
+
expect(result.createdAt).toBeInstanceOf(Date);
|
|
67
|
+
expect(result.updatedAt).toBeInstanceOf(Date);
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
describe('findById()', () => {
|
|
71
|
+
it('should return the event when it exists (without relations by default)', async () => {
|
|
72
|
+
const created = await eventRepository.create(EventFactory.buildInput());
|
|
73
|
+
const result = await eventRepository.findById(created.id);
|
|
74
|
+
expect(result).not.toBeNull();
|
|
75
|
+
expect(result?.id).toBe(created.id);
|
|
76
|
+
});
|
|
77
|
+
it('should return null when the event does not exist', async () => {
|
|
78
|
+
const result = await eventRepository.findById('00000000-0000-0000-0000-000000000000');
|
|
79
|
+
expect(result).toBeNull();
|
|
80
|
+
});
|
|
81
|
+
it('should load tags relation when requested', async () => {
|
|
82
|
+
const tag = await tagRepository.create(TagFactory.buildInput());
|
|
83
|
+
const input = EventFactory.buildInput();
|
|
84
|
+
const event = await eventRepository.create(input);
|
|
85
|
+
await testDataSource.query(`INSERT INTO event_tags ("eventsId", "tagsId") VALUES ($1, $2)`, [
|
|
86
|
+
event.id,
|
|
87
|
+
tag.id,
|
|
88
|
+
]);
|
|
89
|
+
const result = await eventRepository.findById(event.id, ['tags']);
|
|
90
|
+
expect(result?.tags).toHaveLength(1);
|
|
91
|
+
expect(result?.tags?.[0].id).toBe(tag.id);
|
|
92
|
+
});
|
|
93
|
+
it('should load requirements relation when requested', async () => {
|
|
94
|
+
const req = await requirementRepository.create(RequirementFactory.buildInput());
|
|
95
|
+
const event = await eventRepository.create(EventFactory.buildInput());
|
|
96
|
+
await testDataSource.query(`INSERT INTO event_requirements ("eventsId", "requirementsId") VALUES ($1, $2)`, [event.id, req.id]);
|
|
97
|
+
const result = await eventRepository.findById(event.id, ['requirements']);
|
|
98
|
+
expect(result?.requirements).toHaveLength(1);
|
|
99
|
+
expect(result?.requirements?.[0].id).toBe(req.id);
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
describe('findAll()', () => {
|
|
103
|
+
it('should return all persisted events', async () => {
|
|
104
|
+
await eventRepository.create(EventFactory.buildInput());
|
|
105
|
+
await eventRepository.create(EventFactory.buildInput());
|
|
106
|
+
await eventRepository.create(EventFactory.buildInput());
|
|
107
|
+
const result = await eventRepository.findAll();
|
|
108
|
+
expect(result).toHaveLength(3);
|
|
109
|
+
expect(result[0]).toBeInstanceOf(EventEntity);
|
|
110
|
+
});
|
|
111
|
+
it('should return an empty array when no events are persisted', async () => {
|
|
112
|
+
const result = await eventRepository.findAll();
|
|
113
|
+
expect(result).toHaveLength(0);
|
|
114
|
+
});
|
|
115
|
+
it('should load relations when findAll is called with relation names', async () => {
|
|
116
|
+
const tag = await tagRepository.create(TagFactory.buildInput());
|
|
117
|
+
const event = await eventRepository.create(EventFactory.buildInput());
|
|
118
|
+
await testDataSource.query(`INSERT INTO event_tags ("eventsId", "tagsId") VALUES ($1, $2)`, [
|
|
119
|
+
event.id,
|
|
120
|
+
tag.id,
|
|
121
|
+
]);
|
|
122
|
+
const result = await eventRepository.findAll(['tags']);
|
|
123
|
+
expect(result).toHaveLength(1);
|
|
124
|
+
expect(result[0].tags).toHaveLength(1);
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
describe('update()', () => {
|
|
128
|
+
it('should update the event fields and return the updated entity', async () => {
|
|
129
|
+
const original = await eventRepository.create(EventFactory.buildInput({ name: 'Original Event', awardedImpactScore: 5 }));
|
|
130
|
+
const updated = await eventRepository.update(original.id, {
|
|
131
|
+
name: 'Updated Event',
|
|
132
|
+
awardedImpactScore: 50,
|
|
133
|
+
});
|
|
134
|
+
expect(updated).not.toBeNull();
|
|
135
|
+
expect(updated?.name).toBe('Updated Event');
|
|
136
|
+
expect(updated?.awardedImpactScore).toBe(50);
|
|
137
|
+
expect(updated?.id).toBe(original.id);
|
|
138
|
+
});
|
|
139
|
+
it('should update the event state', async () => {
|
|
140
|
+
const original = await eventRepository.create(EventFactory.buildInput({ state: EventState.EVENT_STATE_DRAFT }));
|
|
141
|
+
const updated = await eventRepository.update(original.id, {
|
|
142
|
+
state: EventState.EVENT_STATE_PUBLISHED,
|
|
143
|
+
});
|
|
144
|
+
expect(updated?.state).toBe(EventState.EVENT_STATE_PUBLISHED);
|
|
145
|
+
});
|
|
146
|
+
it('should return null when updating a non-existent event', async () => {
|
|
147
|
+
const result = await eventRepository.update('00000000-0000-0000-0000-000000000000', {
|
|
148
|
+
name: 'Ghost',
|
|
149
|
+
});
|
|
150
|
+
expect(result).toBeNull();
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
describe('delete()', () => {
|
|
154
|
+
it('should delete the event and return true', async () => {
|
|
155
|
+
const event = await eventRepository.create(EventFactory.buildInput());
|
|
156
|
+
const result = await eventRepository.delete(event.id);
|
|
157
|
+
expect(result).toBe(true);
|
|
158
|
+
const found = await eventRepository.findById(event.id);
|
|
159
|
+
expect(found).toBeNull();
|
|
160
|
+
});
|
|
161
|
+
it('should return false when deleting a non-existent id', async () => {
|
|
162
|
+
const result = await eventRepository.delete('00000000-0000-0000-0000-000000000000');
|
|
163
|
+
expect(result).toBe(false);
|
|
164
|
+
});
|
|
165
|
+
});
|
|
166
|
+
describe('search()', () => {
|
|
167
|
+
it('should return events whose name contains the search term', async () => {
|
|
168
|
+
await eventRepository.create(EventFactory.buildInput({ name: 'Beach Cleanup 2025' }));
|
|
169
|
+
await eventRepository.create(EventFactory.buildInput({ name: 'Forest Walk' }));
|
|
170
|
+
const result = await eventRepository.search('Beach');
|
|
171
|
+
expect(result).toHaveLength(1);
|
|
172
|
+
expect(result[0].name).toBe('Beach Cleanup 2025');
|
|
173
|
+
});
|
|
174
|
+
it('should return an empty array when no events match the search term', async () => {
|
|
175
|
+
await eventRepository.create(EventFactory.buildInput({ name: 'City Marathon' }));
|
|
176
|
+
const result = await eventRepository.search('nonexistent');
|
|
177
|
+
expect(result).toHaveLength(0);
|
|
178
|
+
});
|
|
179
|
+
it('should be case-insensitive for the search term', async () => {
|
|
180
|
+
await eventRepository.create(EventFactory.buildInput({ name: 'Volunteer Day' }));
|
|
181
|
+
const result = await eventRepository.search('volunteer');
|
|
182
|
+
expect(result).toHaveLength(1);
|
|
183
|
+
});
|
|
184
|
+
it('should return multiple events matching the partial search term', async () => {
|
|
185
|
+
await eventRepository.create(EventFactory.buildInput({ name: 'Park Cleanup North' }));
|
|
186
|
+
await eventRepository.create(EventFactory.buildInput({ name: 'Park Cleanup South' }));
|
|
187
|
+
await eventRepository.create(EventFactory.buildInput({ name: 'City Run' }));
|
|
188
|
+
const result = await eventRepository.search('Park Cleanup');
|
|
189
|
+
expect(result).toHaveLength(2);
|
|
190
|
+
});
|
|
191
|
+
});
|
|
192
|
+
describe('location round-trip (PostGIS)', () => {
|
|
193
|
+
it('should preserve latitude and longitude through PostGIS geography column', async () => {
|
|
194
|
+
const eiffelTower = new EventLocation(48.8584, 2.2945);
|
|
195
|
+
const input = EventFactory.buildInput({ location: eiffelTower });
|
|
196
|
+
const created = await eventRepository.create(input);
|
|
197
|
+
const fetched = await eventRepository.findById(created.id);
|
|
198
|
+
expect(fetched?.location).toBeInstanceOf(EventLocation);
|
|
199
|
+
expect(fetched?.location.latitude).toBeCloseTo(eiffelTower.latitude, 3);
|
|
200
|
+
expect(fetched?.location.longitude).toBeCloseTo(eiffelTower.longitude, 3);
|
|
201
|
+
});
|
|
202
|
+
it('should handle negative coordinates (Southern/Western hemisphere)', async () => {
|
|
203
|
+
const saoPaulo = new EventLocation(-23.5505, -46.6333);
|
|
204
|
+
const input = EventFactory.buildInput({ location: saoPaulo });
|
|
205
|
+
const created = await eventRepository.create(input);
|
|
206
|
+
const fetched = await eventRepository.findById(created.id);
|
|
207
|
+
expect(fetched?.location.latitude).toBeCloseTo(-23.5505, 2);
|
|
208
|
+
expect(fetched?.location.longitude).toBeCloseTo(-46.6333, 2);
|
|
209
|
+
});
|
|
210
|
+
});
|
|
211
|
+
});
|
|
212
|
+
//# sourceMappingURL=event.int.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event.int.spec.js","sourceRoot":"","sources":["../../../src/test/integration/event.int.spec.ts"],"names":[],"mappings":"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"}
|