Skip to content

Commit be080fc

Browse files
committed
feat(users): add getCurrentUser endpoint and corresponding tests
1 parent 27a3444 commit be080fc

File tree

3 files changed

+93
-1
lines changed

3 files changed

+93
-1
lines changed

src/users/users.controller.spec.ts

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -471,6 +471,50 @@ describe('UsersController', () => {
471471
});
472472
});
473473

474+
describe('getCurrentUser', () => {
475+
it('should get current user successfully', async () => {
476+
const mockUserDto = {
477+
id: 1,
478+
username: 'testuser',
479+
nickname: 'Test User',
480+
email: 'test@example.com',
481+
};
482+
483+
mockUsersService.getUserDtoById.mockResolvedValue(mockUserDto);
484+
485+
const result = await controller.getCurrentUser(
486+
'Bearer token',
487+
1,
488+
'127.0.0.1',
489+
'test-agent',
490+
);
491+
492+
expect(result).toEqual({
493+
code: 200,
494+
message: 'Query current user successfully.',
495+
data: {
496+
user: mockUserDto,
497+
},
498+
});
499+
expect(mockUsersService.getUserDtoById).toHaveBeenCalledWith(
500+
1,
501+
1,
502+
'127.0.0.1',
503+
'test-agent',
504+
);
505+
});
506+
507+
it('should throw error when current user not found', async () => {
508+
mockUsersService.getUserDtoById.mockRejectedValue(
509+
new UserIdNotFoundError(1),
510+
);
511+
512+
await expect(
513+
controller.getCurrentUser('Bearer token', 1, '127.0.0.1', 'test-agent'),
514+
).rejects.toThrow(UserIdNotFoundError);
515+
});
516+
});
517+
474518
describe('getUser', () => {
475519
it('should get user successfully', async () => {
476520
const mockUserDto = {

src/users/users.controller.ts

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -521,7 +521,30 @@ export class UsersController {
521521
};
522522
}
523523

524-
@Get('/:id')
524+
@Get('/me')
525+
@Guard('query', 'user')
526+
async getCurrentUser(
527+
@Headers('Authorization') @AuthToken() auth: string | undefined,
528+
@UserId(true) userId: number,
529+
@Ip() ip: string,
530+
@Headers('User-Agent') userAgent: string | undefined,
531+
): Promise<GetUserResponseDto> {
532+
const user = await this.usersService.getUserDtoById(
533+
userId,
534+
userId,
535+
ip,
536+
userAgent,
537+
);
538+
return {
539+
code: 200,
540+
message: 'Query current user successfully.',
541+
data: {
542+
user: user,
543+
},
544+
};
545+
}
546+
547+
@Get('/:id(\\d+)')
525548
@Guard('query', 'user')
526549
async getUser(
527550
@Param('id', ParseIntPipe) @ResourceId() id: number,

test/user.e2e-spec.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -663,6 +663,31 @@ describe('User Module', () => {
663663
});
664664
});
665665

666+
describe('current user info', () => {
667+
it('should get current user info successfully', async () => {
668+
const response = await request(app.getHttpServer())
669+
.get('/users/me')
670+
.set('Authorization', `Bearer ${TestToken}`)
671+
.expect(200);
672+
673+
expect(response.body.message).toBe('Query current user successfully.');
674+
expect(response.body.data.user.username).toBe(TestUsername);
675+
expect(response.body.data.user.nickname).toBe('test_user');
676+
expect(response.body.data.user.id).toBeDefined();
677+
});
678+
679+
it('should return 401 when not authenticated', async () => {
680+
await request(app.getHttpServer()).get('/users/me').expect(401);
681+
});
682+
683+
it('should return 401 with invalid token', async () => {
684+
await request(app.getHttpServer())
685+
.get('/users/me')
686+
.set('Authorization', 'Bearer invalid-token')
687+
.expect(401);
688+
});
689+
});
690+
666691
describe('password reset logic', () => {
667692
it('should return InvalidEmailAddressError', async () => {
668693
const respond = await request(app.getHttpServer())

0 commit comments

Comments
 (0)