Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
e841907
test(database): add CleanupService unit tests (#1061)
AbdulmujibOladayo Aug 26, 2026
b89d23b
test(support-tickets): add SupportTicketsService unit tests (#1060)
AbdulmujibOladayo Aug 26, 2026
0266009
fix(email): remove @ts-nocheck from email-webhook.controller.ts (#1059)
AbdulmujibOladayo Aug 26, 2026
ecef210
fix(email): remove @ts-nocheck from email.module.ts (#1059)
AbdulmujibOladayo Aug 26, 2026
2196efd
fix(email): remove @ts-nocheck from email.processor.ts (#1059)
AbdulmujibOladayo Aug 26, 2026
03b3849
fix(email): remove @ts-nocheck from email.service.ts (#1059)
AbdulmujibOladayo Aug 26, 2026
079cb8d
fix(property-views): remove @ts-nocheck from property-views.controlle…
AbdulmujibOladayo Aug 26, 2026
d7907ad
fix(property-views): remove @ts-nocheck from property-views.module.ts…
AbdulmujibOladayo Aug 26, 2026
316f2e7
fix(cleanup): correct Prisma mock setup in cleanup.service.spec.ts
AbdulmujibOladayo Aug 26, 2026
156c836
fix(email): type unknown catch error in processor
AbdulmujibOladayo Aug 26, 2026
e43171a
fix(email): type unknown catch error and fix i18n translate signature
AbdulmujibOladayo Aug 26, 2026
5826ec0
fix(property-views): add RequestWithAuth interface to controller
AbdulmujibOladayo Aug 26, 2026
9909488
fix(support-tickets): add non-null assertion to fix TS18048 in spec
AbdulmujibOladayo Aug 26, 2026
1e8a512
fix(email): remove @ts-nocheck, fix i18n translate signature and type…
AbdulmujibOladayo Aug 26, 2026
3fb3ffd
fix(email): type unknown error in sendEmail catch block
AbdulmujibOladayo Aug 26, 2026
1b325ce
fix(email): remove @ts-nocheck, fix i18n translate args and type catc…
AbdulmujibOladayo Aug 26, 2026
0d39a8f
fix(email): type unknown error in processor catch block
AbdulmujibOladayo Aug 26, 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
40 changes: 40 additions & 0 deletions src/database/cleanup.service.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import { CleanupService } from './cleanup.service';
import { PrismaService } from './prisma.service';

describe('CleanupService', () => {
let service: CleanupService;
let prisma: jest.Mocked<Partial<PrismaService>>;

beforeEach(() => {
prisma = {
blacklistedToken: {
findMany: jest.fn().mockResolvedValue([]),
deleteMany: jest.fn().mockResolvedValue({ count: 0 }),
} as any,
passwordResetToken: {
findMany: jest.fn().mockResolvedValue([]),
deleteMany: jest.fn().mockResolvedValue({ count: 0 }),
} as any,
session: {
findMany: jest.fn().mockResolvedValue([]),
deleteMany: jest.fn().mockResolvedValue({ count: 0 }),
} as any,
loginHistory: {
findMany: jest.fn().mockResolvedValue([]),
deleteMany: jest.fn().mockResolvedValue({ count: 0 }),
} as any,
};
service = new CleanupService(prisma as unknown as PrismaService);
});

it('performCleanup returns summary with totalDeleted of 0 when no records exist', async () => {
const summary = await service.performCleanup();
expect(summary.totalDeleted).toBe(0);
expect(summary.results).toHaveLength(4);
});

it('getLastSummary returns null before any cleanup run', () => {
const result = service.getLastSummary();
expect(result).toBeNull();
});
});
1 change: 0 additions & 1 deletion src/email/email-webhook.controller.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
// @ts-nocheck

import { Controller, Post, Body, Get, HttpCode, UseGuards } from '@nestjs/common';
import { EmailService } from './email.service';
Expand Down
1 change: 0 additions & 1 deletion src/email/email.module.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
// @ts-nocheck

import { Module } from '@nestjs/common';
import { EmailService } from './email.service';
Expand Down
4 changes: 2 additions & 2 deletions src/email/email.processor.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
// @ts-nocheck

import { Processor, WorkerHost } from '@nestjs/bullmq';
import { Job } from 'bullmq';
Expand Down Expand Up @@ -33,7 +32,8 @@ export class EmailProcessor extends WorkerHost {
context,
});
this.logger.log(`Email sent successfully to ${to}`);
} catch (error) {
} catch (err: unknown) {
const error = err instanceof Error ? err : new Error(String(err));
this.logger.error(`Failed to send email to ${to}: ${error.message}`, error.stack);
throw error; // BullMQ will handle retries if configured
}
Expand Down
8 changes: 4 additions & 4 deletions src/email/email.service.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
// @ts-nocheck

import { Injectable, Logger } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
Expand Down Expand Up @@ -264,7 +263,7 @@ export class EmailService {
if (options.language && options.template) {
const lang = options.language;
const i18nKey = `email.${options.template}`;
const translated = this.i18nService.translate(i18nKey, lang, options.context);
const translated = this.i18nService.translate(i18nKey, { userPreference: lang }, options.context);
if (translated !== i18nKey) {
options.subject = options.subject || translated;
}
Expand Down Expand Up @@ -329,7 +328,8 @@ export class EmailService {
);

this.logger.log(`📧 Email to ${options.to} queued for subject: ${options.subject}`);
} catch (error) {
} catch (err: unknown) {
const error = err instanceof Error ? err : new Error(String(err));
this.logger.error(`❌ Failed to queue email to ${options.to}: ${error.message}`);
throw error;
}
Expand All @@ -347,7 +347,7 @@ export class EmailService {
});

const language = user?.languagePreference || 'en';
const translated = this.i18nService.translate(templateKey, language, params);
const translated = this.i18nService.translate(templateKey, { userPreference: language }, params);

await this.sendEmail({
to,
Expand Down
5 changes: 4 additions & 1 deletion src/property-views/property-views.controller.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
// @ts-nocheck

import {
BadRequestException,
Expand All @@ -13,6 +12,10 @@ import {
UseGuards,
} from '@nestjs/common';
import { Request } from 'express';

interface RequestWithAuth extends Request {
authUser?: { sub: string };
}
import { ApiBearerAuth, ApiTags } from '@nestjs/swagger';
import { PropertyViewsService } from './property-views.service';
import {
Expand Down
1 change: 0 additions & 1 deletion src/property-views/property-views.module.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
// @ts-nocheck

import { Module } from '@nestjs/common';
import { PropertyViewsController } from './property-views.controller';
Expand Down
34 changes: 34 additions & 0 deletions src/support-tickets/support-tickets.service.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import { SupportTicketsService } from './support-tickets.service';
import { PrismaService } from '../database/prisma.service';
import { NotificationsService } from '../notifications/notifications.service';

describe('SupportTicketsService', () => {
let service: SupportTicketsService;
let prisma: jest.Mocked<Partial<PrismaService>>;
let notifications: jest.Mocked<Partial<NotificationsService>>;

beforeEach(() => {
prisma = {
supportTicket: {
create: jest.fn().mockResolvedValue({ id: 'ticket-1', priority: 'HIGH', slaDeadline: new Date() }),
findUnique: jest.fn().mockResolvedValue(null),
findMany: jest.fn().mockResolvedValue([]),
update: jest.fn().mockResolvedValue({}),
} as any,
};
notifications = { sendNotification: jest.fn().mockResolvedValue(undefined) };
service = new SupportTicketsService(
prisma as unknown as PrismaService,
notifications as unknown as NotificationsService,
);
});

it('creates a ticket with correct SLA deadline for HIGH priority', async () => {
const result = await service.createTicket('user-1', {
subject: 'Test', description: 'Desc', priority: 'HIGH',
} as any);
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
expect(prisma.supportTicket!.create).toHaveBeenCalled();
expect(result.id).toBe('ticket-1');
});
});
Loading