Skip to content
Merged

Main #348

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
141 commits
Select commit Hold shift + click to select a range
a0bb413
feat: change default value of offline_listening to true in Track enti…
YaraSenousy Apr 28, 2026
3625426
feat: add migration to drop unique constraint on downloaded_tracks table
YaraSenousy Apr 28, 2026
aa9944b
feat(admin): add dto for suspend users
omarreda04 Apr 28, 2026
2fde355
feat(admin): add user management functions in repository
omarreda04 Apr 28, 2026
3fc037a
feat: add playlist download and deletion functionality in DownloadSer…
YaraSenousy Apr 28, 2026
e87153f
feat: implement report submission functionality with validation and S…
3atar2004 Apr 28, 2026
61c76d6
feat: add getAllReports functionality with pagination and enrich repo…
3atar2004 Apr 28, 2026
a6b8e7a
feat(admin): add users management functionality such as filter user, …
omarreda04 Apr 28, 2026
a79f155
feat: implement delete report functionality with validation and Swagg…
3atar2004 Apr 28, 2026
9900169
test(admin): add unit tests for users management feature
omarreda04 Apr 29, 2026
1169a98
feat: implement update report status functionality with validation an…
3atar2004 Apr 29, 2026
d74572f
feat: implement getReport functionality to retrieve report details wi…
3atar2004 Apr 29, 2026
fb6f73f
feat(admin): add get top 5 tracks based on total plays
omarreda04 Apr 29, 2026
dfa26c6
Merge remote-tracking branch 'origin/moderation-and-admin-dashboard' …
3atar2004 Apr 29, 2026
410eb20
feat(admin): enhance AdminService tests with additional mock reposito…
3atar2004 Apr 29, 2026
9237016
Merge pull request #301 from Team-6-CUFE/298-report-handeling
3atar2004 Apr 29, 2026
11f7fdc
feat(track): enhance deleteTrack method to allow admin users to delet…
3atar2004 Apr 29, 2026
4e2e389
feat(admin): add endpoint to retrieve all tracks with report counts
3atar2004 Apr 29, 2026
fdc76ed
feat(admin): add swagger docs and unit tests for top tracks
omarreda04 Apr 29, 2026
c3b8295
feat(users): add platform statistics feature in admin dashboard
omarreda04 Apr 29, 2026
b02bb7f
docs(admin): add swagger docs for platform stats
omarreda04 Apr 29, 2026
0fa7ae5
test(admin): add unit tests for platform stats
omarreda04 Apr 29, 2026
482b18a
feat(report): implement ReportController tests
3atar2004 Apr 29, 2026
d7f03bb
Merge branch 'dev' into 298-report-handeling
3atar2004 Apr 29, 2026
87aa0f2
Merge pull request #302 from Team-6-CUFE/298-report-handeling
3atar2004 Apr 29, 2026
ee01919
feat(admin): add engagement analytics for admin dashboard
omarreda04 Apr 29, 2026
05a0bdc
docs(admin): add swagger docs for engagement analytics
omarreda04 Apr 29, 2026
6ac81cb
test(admin): add unit tests for engagement analytics
omarreda04 Apr 29, 2026
826dc44
Module 11 Done
omarreda04 Apr 29, 2026
b97edcf
Module 10 Done #2
omarreda04 Apr 29, 2026
ed7f193
Module 11 Done
omarreda04 Apr 29, 2026
c0d6bd3
Merge pull request #304 from Team-6-CUFE/moderation-and-admin-dashboard
omarreda04 Apr 29, 2026
49905d0
Merge pull request #305 from Team-6-CUFE/dev
3atar2004 Apr 29, 2026
d0a09d8
feat: implement functionality to retrieve downloaded tracks and playl…
YaraSenousy Apr 29, 2026
d420447
feat: add download count to the all time stats
YaraSenousy Apr 29, 2026
efcb441
feat: enhance DownloadService and DownloadController tests with compr…
YaraSenousy Apr 29, 2026
c7fa52a
feat: add Swagger decorators for download and deletion endpoints in D…
YaraSenousy Apr 29, 2026
6fbaa49
feat: update audio URL to use high-quality version in formatTrack method
YaraSenousy Apr 29, 2026
d471c05
Merge branch 'dev' into 265-mock-downloads
YaraSenousy Apr 29, 2026
57f5a93
Merge pull request #306 from Team-6-CUFE/265-mock-downloads
YaraSenousy Apr 29, 2026
beb7fed
Merge pull request #307 from Team-6-CUFE/dev
YaraSenousy Apr 29, 2026
1153f8f
feat: update cache TTL values for fans and tracks to 1 hour for testi…
YaraSenousy Apr 29, 2026
f4955b0
feat: add Swagger decorators for subscription management endpoints
YaraSenousy Apr 29, 2026
cf57452
feat: enhance subscription controller and service tests with addition…
YaraSenousy Apr 29, 2026
10eb8e3
feat: update track status to 'finished' in factory and add migration …
YaraSenousy Apr 30, 2026
8ba16df
added check to return secretToken to owner
3atar2004 Apr 30, 2026
25de68d
Merge branch 'dev' into 308-fix-add-secret-token-for-shared-url-for-p…
3atar2004 Apr 30, 2026
02610ec
feat: handle optional last name in display name and conditionally add…
YaraSenousy Apr 30, 2026
281b8d3
feat: add reindexing script for Meilisearch to index users, tracks, p…
YaraSenousy Apr 30, 2026
2bebb43
Merge pull request #314 from Team-6-CUFE/310-search-return-higher-tot…
YaraSenousy Apr 30, 2026
75bdd8c
fix: swap parameters in getUserLikedby method for correct user context
YaraSenousy Apr 30, 2026
e1a61b8
fix: correct parameter order in getUserLikedby call for accurate user…
YaraSenousy Apr 30, 2026
ad359b8
feat: enhance subscription service with payment processing and status…
3atar2004 Apr 30, 2026
3c1516b
Merge pull request #315 from Team-6-CUFE/312-liked-by-user-return-cur…
YaraSenousy Apr 30, 2026
1df5db2
feat: enhance subscription service tests with user ID handling and ti…
3atar2004 Apr 30, 2026
ebd3294
Merge pull request #316 from Team-6-CUFE/251-mock-payments
3atar2004 Apr 30, 2026
0702649
feat: add status filter to admin endpoint for retrieving tracks with …
3atar2004 Apr 30, 2026
4cf84be
feat: update track and user factories with new media URLs and avatar …
YaraSenousy Apr 30, 2026
902399d
Merge pull request #317 from Team-6-CUFE/311-top-fans-top-listeners-r…
YaraSenousy Apr 30, 2026
6e8ab83
Merge pull request #318 from Team-6-CUFE/308-fix-add-secret-token-for…
YaraSenousy Apr 30, 2026
47c90a3
Merge pull request #319 from Team-6-CUFE/dev
YaraSenousy Apr 30, 2026
5768a73
feat: add role and status filters to admin user retrieval endpoint
3atar2004 Apr 30, 2026
2da08d8
feat: add filters for report retrieval in admin endpoints
3atar2004 Apr 30, 2026
8cf01aa
feat: add endpoint to retrieve top listeners for a user
YaraSenousy Apr 30, 2026
da9b7b4
Merge remote-tracking branch 'origin/313-add-filters-for-admin-endpoi…
YaraSenousy Apr 30, 2026
d3700c4
feat: add swagger doc for top listeners for authenticated artist
YaraSenousy Apr 30, 2026
c3169a6
feat: add tests for getTopListeners in TrackService and TrackController
YaraSenousy Apr 30, 2026
3f9526f
feat: add spotlight_tracks table and related entities; establish rela…
3atar2004 Apr 30, 2026
2541cc8
feat: add endpoint and swagger documentation for retrieving top regio…
YaraSenousy Apr 30, 2026
ca4cf8a
feat: add migration to update users' country to 'England' where missing
YaraSenousy Apr 30, 2026
cc4ec76
feat: implement spotlight tracks retrieval for users; add service and…
3atar2004 Apr 30, 2026
b109347
feat: add endpoint and swagger documentation for retrieving top playl…
YaraSenousy Apr 30, 2026
debb038
feat: add getTopRegions and getTopPlaylistsAndAlbums methods with tes…
YaraSenousy Apr 30, 2026
1957bac
Merge pull request #320 from Team-6-CUFE/282-insights
YaraSenousy Apr 30, 2026
f68dfd7
feat: implement spotlight track management; add endpoints to add and …
3atar2004 Apr 30, 2026
628b336
feat: add spotlight track management; implement service methods and c…
YaraSenousy Apr 30, 2026
d056d84
Merge branch 'dev' into 264-spotlight
YaraSenousy Apr 30, 2026
62f18b1
Merge pull request #321 from Team-6-CUFE/264-spotlight
YaraSenousy Apr 30, 2026
6b6138a
Merge pull request #322 from Team-6-CUFE/dev
YaraSenousy Apr 30, 2026
823ec34
fix: update entity file extension from .ts to .js in data source conf…
YaraSenousy Apr 30, 2026
5ec0ea2
feat: add scheduled track management; implement migration for schedul…
YaraSenousy Apr 30, 2026
830ec53
feat: implement track scheduling feature; add scheduled_at column, se…
YaraSenousy Apr 30, 2026
753dd32
test: add unit tests for scheduleRelease method in TrackService
YaraSenousy Apr 30, 2026
093658c
feat: add mail.service function and template for email on first message
MoaazEmam Apr 30, 2026
d85b317
feat: integrate email for first message, add notifications in messages
MoaazEmam Apr 30, 2026
d10b384
fix: mocks and messaging.service.spec
MoaazEmam Apr 30, 2026
72b8849
feat: implement audio URL resolution based on user plan; update Track…
YaraSenousy Apr 30, 2026
a02e6e0
feat: update getPublicPlaylist method to include user plan and resolv…
YaraSenousy Apr 30, 2026
ed459e4
feat: enhance DiscoveryController and DiscoveryService to include use…
YaraSenousy Apr 30, 2026
52454f4
feat: add high-quality audio URL to track repository query
YaraSenousy Apr 30, 2026
0fe4ff2
Merge pull request #327 from Team-6-CUFE/323-add-notifications-in-mes…
MoaazEmam Apr 30, 2026
c19f40c
Merge pull request #328 from Team-6-CUFE/262-schedule-release
YaraSenousy May 1, 2026
0cf6110
Merge pull request #329 from Team-6-CUFE/dev
YaraSenousy May 1, 2026
f1c5752
feat: include jti in refresh token payload to avoid duplication
YaraSenousy May 1, 2026
d78bc93
Merge pull request #330 from Team-6-CUFE/refresh-token-duplicate-fix
YaraSenousy May 1, 2026
a1e1907
fix(notifications): add high priority field for android push notifica…
omarreda04 May 1, 2026
38299a5
Merge pull request #331 from Team-6-CUFE/moderation-and-admin-dashboard
omarreda04 May 1, 2026
9d11e7a
fix: update waveformUrl handling and API documentation for blocked tr…
YaraSenousy May 1, 2026
89fd87d
fix: update API documentation and service logic to reflect removal of…
YaraSenousy May 1, 2026
766380a
Merge pull request #332 from Team-6-CUFE/218-blocked-tracks-need-to-r…
YaraSenousy May 1, 2026
8b6ea29
feat(track): enforce unique track title per user in upload and update…
YaraSenousy May 1, 2026
632cdf6
Merge pull request #333 from Team-6-CUFE/326-add-uniqueness-check-on-…
YaraSenousy May 1, 2026
431a337
fix(notifications): fix message notifications to only send push notif…
omarreda04 May 1, 2026
ef0b77d
Merge pull request #334 from Team-6-CUFE/moderation-and-admin-dashboard
omarreda04 May 1, 2026
c8a65f6
Merge pull request #335 from Team-6-CUFE/dev
YaraSenousy May 1, 2026
3494cab
fix(notifications): fix firebase private key parsing
omarreda04 May 2, 2026
d5473d4
Merge pull request #336 from Team-6-CUFE/real-time-notifications
omarreda04 May 2, 2026
b3819b2
fix(seeds): update track URLs and user data in seeders for consistency
YaraSenousy May 2, 2026
1fc652b
feat(admin): add hide and delete tracks endpoints
omarreda04 May 2, 2026
88c8ffd
Merge pull request #337 from Team-6-CUFE/moderation-and-admin-dashboard
omarreda04 May 2, 2026
94c68cc
Merge pull request #338 from Team-6-CUFE/211-returned-tracks-or-playl…
YaraSenousy May 2, 2026
f16c006
Merge pull request #339 from Team-6-CUFE/dev
YaraSenousy May 2, 2026
4d93e4c
fix: update notification type description for clarity in API document…
YaraSenousy May 2, 2026
e3a0a67
Merge pull request #340 from Team-6-CUFE/211-returned-tracks-or-playl…
YaraSenousy May 2, 2026
ada1bd8
fix: remove 'preferNotToSay' option from gender field in profile update
YaraSenousy May 2, 2026
bfde681
fix: remove 'preferNotToSay' option from gender fields in user-relate…
YaraSenousy May 2, 2026
52d1f7d
fix: mark profile update functions as deprecated in API documentation
YaraSenousy May 2, 2026
fc94322
Merge pull request #341 from Team-6-CUFE/dev
YaraSenousy May 2, 2026
21d0a2b
Merge pull request #342 from Team-6-CUFE/staging
elhussienawad1 May 2, 2026
e1bd17f
Update main.yml
elhussienawad1 May 2, 2026
35aacf2
Firebase key
elhussienawad1 May 2, 2026
b04e746
fix(admin): fix toggle hidden status internal server error
omarreda04 May 2, 2026
50483af
Merge pull request #343 from Team-6-CUFE/dev
MoaazEmam May 2, 2026
24258e4
fix: update track factory to update urls
YaraSenousy May 2, 2026
d638723
fix: implement protection for seeded audio URLs in processor and factory
YaraSenousy May 2, 2026
6863cd1
Merge branch 'dev' of https://github.com/Team-6-CUFE/Backend into dev
YaraSenousy May 2, 2026
0c1dfe5
Merge pull request #344 from Team-6-CUFE/dev
YaraSenousy May 2, 2026
1bb62fe
yarab
elhussienawad1 May 2, 2026
8a9d750
yarab tany
elhussienawad1 May 2, 2026
b8f17da
fix: set fixed durationSeconds value in track factory
YaraSenousy May 2, 2026
7b11991
refactor: remove obsolete database configuration tests
YaraSenousy May 2, 2026
25cf96e
feat: add CreateCheckoutSessionDto with billing cycle, plan type, and…
YaraSenousy May 2, 2026
c1fec66
fix:reindex meilie data source
elhussienawad1 May 2, 2026
6e0f92d
feat: add 'com.harmonica.app://' to allowed mobile deep-link schemes
YaraSenousy May 2, 2026
3029146
Merge pull request #345 from Team-6-CUFE/dev
YaraSenousy May 2, 2026
7470ae5
fix: update token payload to reflect current user plan and role on re…
YaraSenousy May 3, 2026
ca04834
Add unit tests for subscription and track services, controllers, and …
YaraSenousy May 3, 2026
f729f07
fix: update reuploadTrackAudio tests to handle undefined audio parame…
YaraSenousy May 3, 2026
adc2a09
Merge pull request #346 from Team-6-CUFE/dev
YaraSenousy May 3, 2026
392ad37
refactor: remove redundant tests for Firebase environment variable ha…
YaraSenousy May 3, 2026
2d6761a
Merge pull request #347 from Team-6-CUFE/dev
YaraSenousy May 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ jobs:
username: ${{ secrets.EC2_USER }}
key: ${{ secrets.EC2_SSH_KEY }}
script: |
cd ~/app
cd ~/app-new
docker pull ${{ secrets.DOCKERHUB_USERNAME }}/harmonica-backend:${{ env.TAG }}
docker compose -p ${{ env.PROJECT }} \
-f ${{ env.COMPOSE_FILE }} \
Expand Down
14 changes: 13 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
"seed": "ts-node -P tsconfig.json src/seed-main.ts",
"schema:drop": "typeorm-ts-node-commonjs schema:drop -d src/ormconfig.ts",
"meili:clear": "ts-node src/search/clear-meili.ts",
"meili:reindex": "ts-node src/search/reindex-meili.ts",
"seed:fresh": "npm run schema:drop && npm run migration:run && npm run meili:clear && npm run seed",
"test": "jest",
"test:watch": "jest --watch",
Expand Down Expand Up @@ -192,7 +193,18 @@
"\\.dto\\.ts$",
"\\.entity\\.ts$",
"\\.type\\.ts$",
"\\.filter\\.ts$"
"\\.filter\\.ts$",
"\\.interface\\.ts$",
"\\.repository\\.ts$",
"\\.d\\.ts$",
"\\.mock\\.ts$",
"\\.decorator\\.ts$",
"\\.swagger\\.ts$",
"\\.constants\\.ts$",
"ormconfig\\.ts$",
"src/database/",
"src/search/",
"src/config/database.config.ts"
],
"coverageThreshold": {
"global": {
Expand Down
212 changes: 211 additions & 1 deletion src/activity/activity.service.spec.ts
Original file line number Diff line number Diff line change
@@ -1,22 +1,46 @@
import { Test, TestingModule } from '@nestjs/testing';
import { getRepositoryToken } from '@nestjs/typeorm';
import { ActivityService } from './activity.service';
import { Activity } from './entities/activity.entity';
import { Activity, ActivityType } from './entities/activity.entity';

// ─── Chainable query builder mock ────────────────────────────────────────────

const makeQbMock = () => ({
where: jest.fn().mockReturnThis(),
andWhere: jest.fn().mockReturnThis(),
orderBy: jest.fn().mockReturnThis(),
skip: jest.fn().mockReturnThis(),
take: jest.fn().mockReturnThis(),
limit: jest.fn().mockReturnThis(),
innerJoin: jest.fn().mockReturnThis(),
select: jest.fn().mockReturnThis(),
groupBy: jest.fn().mockReturnThis(),
getMany: jest.fn(),
getRawMany: jest.fn(),
});

// ─── Suite ────────────────────────────────────────────────────────────────────

describe('ActivityService', () => {
let service: ActivityService;
let qbMock: ReturnType<typeof makeQbMock>;

const mockActivityRepository = {
create: jest.fn(),
save: jest.fn(),
find: jest.fn(),
findOne: jest.fn(),
count: jest.fn(),
delete: jest.fn(),
createQueryBuilder: jest.fn(),
};

beforeEach(async () => {
jest.clearAllMocks();

qbMock = makeQbMock();
mockActivityRepository.createQueryBuilder.mockReturnValue(qbMock);

const module: TestingModule = await Test.createTestingModule({
providers: [
ActivityService,
Expand All @@ -33,4 +57,190 @@ describe('ActivityService', () => {
it('should be defined', () => {
expect(service).toBeDefined();
});

// ─── createActivity ───────────────────────────────────────────────────────────

describe('createActivity', () => {
it('should call repository.create with correct fields and return the saved activity', async () => {
const activityData = {
activityId: 'act-uuid',
activityType: ActivityType.TRACK_LIKE,
targetId: 'track-uuid',
userId: 'user-uuid',
targetUserId: 'target-user-uuid',
};
mockActivityRepository.create.mockReturnValue(activityData);
mockActivityRepository.save.mockResolvedValue(activityData);

const result = await service.createActivity(
ActivityType.TRACK_LIKE,
'track-uuid',
'user-uuid',
'target-user-uuid'
);

expect(mockActivityRepository.create).toHaveBeenCalledWith({
activityType: ActivityType.TRACK_LIKE,
targetId: 'track-uuid',
userId: 'user-uuid',
targetUserId: 'target-user-uuid',
});
expect(mockActivityRepository.save).toHaveBeenCalledWith(activityData);
expect(result).toBe(activityData);
});

it('should accept null for targetUserId', async () => {
const activityData = {
activityType: ActivityType.TRACK_LIKE,
targetId: 'track-uuid',
userId: 'user-uuid',
targetUserId: null,
};
mockActivityRepository.create.mockReturnValue(activityData);
mockActivityRepository.save.mockResolvedValue(activityData);

await service.createActivity(ActivityType.TRACK_LIKE, 'track-uuid', 'user-uuid', null);

expect(mockActivityRepository.create).toHaveBeenCalledWith(
expect.objectContaining({ targetUserId: null })
);
});
});

// ─── getActivitiesByUserIds ────────────────────────────────────────────────────

describe('getActivitiesByUserIds', () => {
const userIds = ['user-1', 'user-2'];

it('should query with 4 activity types when includeReposts is true', async () => {
qbMock.getMany.mockResolvedValue([]);

await service.getActivitiesByUserIds(userIds, 1, 10, true);

const andWhereCall = qbMock.andWhere.mock.calls.find((call) =>
call[0].includes('activityType')
);
expect(andWhereCall).toBeDefined();
const types = andWhereCall![1].types as ActivityType[];
expect(types).toHaveLength(4);
expect(types).toContain(ActivityType.TRACK_POSTED);
expect(types).toContain(ActivityType.TRACK_REPOST);
expect(types).toContain(ActivityType.PLAYLIST_POSTED);
expect(types).toContain(ActivityType.PLAYLIST_REPOST);
});

it('should query with 2 activity types (POSTED only) when includeReposts is false', async () => {
qbMock.getMany.mockResolvedValue([]);

await service.getActivitiesByUserIds(userIds, 1, 10, false);

const andWhereCall = qbMock.andWhere.mock.calls.find((call) =>
call[0].includes('activityType')
);
expect(andWhereCall).toBeDefined();
const types = andWhereCall![1].types as ActivityType[];
expect(types).toHaveLength(2);
expect(types).toContain(ActivityType.TRACK_POSTED);
expect(types).toContain(ActivityType.PLAYLIST_POSTED);
expect(types).not.toContain(ActivityType.TRACK_REPOST);
expect(types).not.toContain(ActivityType.PLAYLIST_REPOST);
});

it('should compute correct offset: page=2, limit=10 → skip 10', async () => {
qbMock.getMany.mockResolvedValue([]);

await service.getActivitiesByUserIds(userIds, 2, 10, false);

expect(qbMock.skip).toHaveBeenCalledWith(10);
expect(qbMock.take).toHaveBeenCalledWith(10);
});

it('should compute correct offset: page=3, limit=5 → skip 10', async () => {
qbMock.getMany.mockResolvedValue([]);

await service.getActivitiesByUserIds(userIds, 3, 5, false);

expect(qbMock.skip).toHaveBeenCalledWith(10);
expect(qbMock.take).toHaveBeenCalledWith(5);
});

it('should return activities from getMany', async () => {
const mockActivities = [{ activityId: 'act-1' }, { activityId: 'act-2' }] as Activity[];
qbMock.getMany.mockResolvedValue(mockActivities);

const result = await service.getActivitiesByUserIds(userIds, 1, 10, false);

expect(result).toBe(mockActivities);
});
});

// ─── deleteActivity ───────────────────────────────────────────────────────────

describe('deleteActivity', () => {
it('should call repository.delete with activityType, targetId and userId', async () => {
mockActivityRepository.delete.mockResolvedValue({ affected: 1 });

await service.deleteActivity(ActivityType.TRACK_LIKE, 'track-uuid', 'user-uuid');

expect(mockActivityRepository.delete).toHaveBeenCalledWith({
activityType: ActivityType.TRACK_LIKE,
targetId: 'track-uuid',
userId: 'user-uuid',
});
});
});

// ─── getLikedByUsers ─────────────────────────────────────────────────────────

describe('getLikedByUsers', () => {
it('should call getRawMany and return results', async () => {
const mockUsers = [{ userId: 'user-1', username: 'alice' }];
qbMock.getRawMany.mockResolvedValue(mockUsers);

const result = await service.getLikedByUsers('current-user-uuid');

expect(qbMock.getRawMany).toHaveBeenCalledTimes(1);
expect(result).toBe(mockUsers);
});

it('should use default limit of 8 when limit is not provided', async () => {
qbMock.getRawMany.mockResolvedValue([]);

await service.getLikedByUsers('current-user-uuid');

expect(qbMock.limit).toHaveBeenCalledWith(8);
});

it('should use provided limit when specified', async () => {
qbMock.getRawMany.mockResolvedValue([]);

await service.getLikedByUsers('current-user-uuid', 5);

expect(qbMock.limit).toHaveBeenCalledWith(5);
});

it('should filter by TRACK_LIKE and PLAYLIST_LIKE activity types', async () => {
qbMock.getRawMany.mockResolvedValue([]);

await service.getLikedByUsers('current-user-uuid');

const whereCall = qbMock.where.mock.calls.find((call) => call[0].includes('activityType'));
expect(whereCall).toBeDefined();
const types = whereCall![1].types as ActivityType[];
expect(types).toContain(ActivityType.TRACK_LIKE);
expect(types).toContain(ActivityType.PLAYLIST_LIKE);
});

it('should filter by currentUserId', async () => {
qbMock.getRawMany.mockResolvedValue([]);

await service.getLikedByUsers('current-user-uuid');

const andWhereCall = qbMock.andWhere.mock.calls.find(
(call) => call[1]?.currentUserId !== undefined
);
expect(andWhereCall).toBeDefined();
expect(andWhereCall![1].currentUserId).toBe('current-user-uuid');
});
});
});
Loading
Loading