Skip to content

Commit 6aee912

Browse files
authored
feat(chat): v2 (#114)
* feat(chat): DMs done * feat(chat): add get messages * fix(chat): swagger and validation
1 parent 08382f6 commit 6aee912

16 files changed

+422
-88
lines changed

package-lock.json

Lines changed: 119 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@
8181
"sharp": "^0.34.5",
8282
"socket.io": "^4.8.1",
8383
"swagger-ui-express": "^5.0.1",
84+
"tunnel-ssh": "^5.2.0",
8485
"typeorm": "^0.3.26",
8586
"xlsx": "^0.18.5"
8687
},
@@ -100,6 +101,7 @@
100101
"@types/passport-facebook": "^3.0.3",
101102
"@types/passport-github2": "^1.2.9",
102103
"@types/supertest": "^6.0.2",
104+
"@types/tunnel-ssh": "^5.0.4",
103105
"eslint": "^9.18.0",
104106
"eslint-config-prettier": "^10.0.1",
105107
"eslint-plugin-prettier": "^5.2.2",

src/chat/chat.controller.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,12 @@ export class ChatController {
4444
@ResponseMessage(SUCCESS_MESSAGES.CHAT_CREATED)
4545
@Post()
4646
async createChat(@Body() create_chat_dto: CreateChatDto, @GetUserId() user_id: string) {
47-
return this.chat_service.createChat(user_id, create_chat_dto);
47+
try {
48+
return this.chat_service.createChat(user_id, create_chat_dto);
49+
} catch (error) {
50+
console.error('Error in ChatController.createChat:', error);
51+
throw error;
52+
}
4853
}
4954

5055
@ApiOperation(get_chats_swagger.operation)

src/chat/chat.module.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,13 @@ import { Chat } from './entities/chat.entity';
66
import { ChatRepository } from './chat.repository';
77
import { PaginationService } from '../shared/services/pagination/pagination.service';
88
import { Message } from '../messages/entities/message.entity';
9+
import { UserRepository } from 'src/user/user.repository';
910

1011
@Module({
1112
imports: [TypeOrmModule.forFeature([Chat, Message])],
1213

1314
controllers: [ChatController],
14-
providers: [ChatService, ChatRepository, PaginationService],
15+
providers: [ChatService, ChatRepository, PaginationService, UserRepository],
1516
exports: [ChatRepository],
1617
})
1718
export class ChatModule {}

src/chat/chat.repository.spec.ts

Lines changed: 39 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { DataSource } from 'typeorm';
33
import { ChatRepository } from './chat.repository';
44
import { Chat } from './entities/chat.entity';
55
import { PaginationService } from 'src/shared/services/pagination/pagination.service';
6-
import { InternalServerErrorException } from '@nestjs/common';
6+
import { InternalServerErrorException, NotFoundException } from '@nestjs/common';
77
import { CreateChatDto, GetChatsQueryDto } from './dto';
88

99
describe('ChatRepository', () => {
@@ -33,17 +33,26 @@ describe('ChatRepository', () => {
3333
last_message: null,
3434
};
3535

36+
let mock_data_source: any;
37+
3638
beforeEach(async () => {
3739
const mock_entity_manager = {} as any;
3840

41+
const mock_user_repository = {
42+
findOne: jest.fn(),
43+
};
44+
45+
mock_data_source = {
46+
createEntityManager: jest.fn(() => mock_entity_manager),
47+
getRepository: jest.fn(() => mock_user_repository),
48+
};
49+
3950
const module: TestingModule = await Test.createTestingModule({
4051
providers: [
4152
ChatRepository,
4253
{
4354
provide: DataSource,
44-
useValue: {
45-
createEntityManager: jest.fn(() => mock_entity_manager),
46-
},
55+
useValue: mock_data_source,
4756
},
4857
{
4958
provide: PaginationService,
@@ -72,6 +81,11 @@ describe('ChatRepository', () => {
7281
describe('createChat', () => {
7382
it('should create a new chat successfully', async () => {
7483
const create_dto: CreateChatDto = { recipient_id: 'user-2' };
84+
85+
// Mock user repository to find recipient
86+
const mock_user_repository = mock_data_source.getRepository();
87+
mock_user_repository.findOne.mockResolvedValue({ id: 'user-2', username: 'user2' });
88+
7589
jest.spyOn(chat_repository, 'findOne').mockResolvedValue(null);
7690

7791
const result = await chat_repository.createChat('user-1', create_dto);
@@ -86,6 +100,11 @@ describe('ChatRepository', () => {
86100

87101
it('should return existing chat if it exists', async () => {
88102
const create_dto: CreateChatDto = { recipient_id: 'user-2' };
103+
104+
// Mock user repository to find recipient
105+
const mock_user_repository = mock_data_source.getRepository();
106+
mock_user_repository.findOne.mockResolvedValue({ id: 'user-2', username: 'user2' });
107+
89108
jest.spyOn(chat_repository, 'findOne').mockResolvedValue(mock_chat as any);
90109

91110
const result = await chat_repository.createChat('user-1', create_dto);
@@ -94,9 +113,24 @@ describe('ChatRepository', () => {
94113
expect(chat_repository.create).not.toHaveBeenCalled();
95114
});
96115

116+
it('should throw NotFoundException if recipient does not exist', async () => {
117+
const create_dto: CreateChatDto = { recipient_id: 'non-existent-user' };
118+
119+
// Mock user repository to not find recipient
120+
const mock_user_repository = mock_data_source.getRepository();
121+
mock_user_repository.findOne.mockResolvedValue(null);
122+
123+
await expect(chat_repository.createChat('user-1', create_dto)).rejects.toThrow(
124+
NotFoundException
125+
);
126+
});
127+
97128
it('should throw InternalServerErrorException on error', async () => {
98129
const create_dto: CreateChatDto = { recipient_id: 'user-2' };
99-
jest.spyOn(chat_repository, 'findOne').mockRejectedValue(new Error('DB error'));
130+
131+
// Mock user repository to throw error
132+
const mock_user_repository = mock_data_source.getRepository();
133+
mock_user_repository.findOne.mockRejectedValue(new Error('DB error'));
100134

101135
await expect(chat_repository.createChat('user-1', create_dto)).rejects.toThrow(
102136
InternalServerErrorException

0 commit comments

Comments
 (0)