1
+ package com .bu .getactivecore .service .users ;
2
+
3
+ import static org .junit .jupiter .api .Assertions .*;
4
+ import static org .mockito .Mockito .*;
5
+
6
+ import java .time .LocalDateTime ;
7
+ import java .util .Optional ;
8
+
9
+ import org .junit .jupiter .api .BeforeEach ;
10
+ import org .junit .jupiter .api .Test ;
11
+ import org .junit .jupiter .api .extension .ExtendWith ;
12
+ import org .mockito .Mock ;
13
+ import org .mockito .junit .jupiter .MockitoExtension ;
14
+ import org .springframework .security .authentication .AuthenticationManager ;
15
+ import org .springframework .security .core .Authentication ;
16
+
17
+ import com .bu .getactivecore .model .users .UserPrincipal ;
18
+ import com .bu .getactivecore .model .users .Users ;
19
+ import com .bu .getactivecore .repository .UserRepository ;
20
+ import com .bu .getactivecore .service .jwt .api .JwtApi ;
21
+ import com .bu .getactivecore .service .users .api .UserInfoApi ;
22
+ import com .bu .getactivecore .service .users .entity .UpdateAvatarRequestDto ;
23
+ import com .bu .getactivecore .service .users .entity .UpdateAvatarResponseDto ;
24
+ import com .bu .getactivecore .shared .ApiErrorPayload ;
25
+ import com .bu .getactivecore .shared .ErrorCode ;
26
+ import com .bu .getactivecore .shared .exception .ApiException ;
27
+ import com .bu .getactivecore .shared .validation .AccountStateChecker ;
28
+
29
+ @ ExtendWith (MockitoExtension .class )
30
+ class UsersServiceTest {
31
+
32
+ @ Mock
33
+ private AuthenticationManager authManager ;
34
+
35
+ @ Mock
36
+ private JwtApi jwtApi ;
37
+
38
+ @ Mock
39
+ private AccountStateChecker accountStateChecker ;
40
+
41
+ @ Mock
42
+ private UserRepository userRepository ;
43
+
44
+ private UsersService usersService ;
45
+
46
+ @ BeforeEach
47
+ void setUp () {
48
+ usersService = new UsersService (authManager , jwtApi , accountStateChecker , userRepository );
49
+ }
50
+
51
+ @ Test
52
+ void updateAvatar_Success () {
53
+ // Arrange
54
+ String username = "testuser" ;
55
+ String avatarData = "data:image/jpeg;base64," + "a" .repeat (1000 ); // Small base64 string
56
+ UpdateAvatarRequestDto requestDto = new UpdateAvatarRequestDto (avatarData );
57
+
58
+ Users user = new Users ();
59
+ user .setUsername (username );
60
+ user .setAvatar (null );
61
+ user .setAvatarUpdatedAt (null );
62
+
63
+ when (userRepository .findByUsername (username )).thenReturn (Optional .of (user ));
64
+ when (userRepository .save (any (Users .class ))).thenAnswer (i -> i .getArguments ()[0 ]);
65
+
66
+ // Act
67
+ UpdateAvatarResponseDto response = usersService .updateAvatar (username , requestDto );
68
+
69
+ // Assert
70
+ assertNotNull (response );
71
+ assertEquals (avatarData , response .getAvatar ());
72
+ assertNotNull (response .getAvatarUpdatedAt ());
73
+ verify (userRepository ).findByUsername (username );
74
+ verify (userRepository ).save (any (Users .class ));
75
+ }
76
+
77
+ @ Test
78
+ void updateAvatar_ExceedsSizeLimit () {
79
+ // Arrange
80
+ String username = "testuser" ;
81
+ // Create a base64 string that exceeds 3MB when decoded
82
+ String largeBase64 = "data:image/jpeg;base64," + "a" .repeat (10 * 1024 * 1024 );
83
+ UpdateAvatarRequestDto requestDto = new UpdateAvatarRequestDto (largeBase64 );
84
+
85
+ // Act & Assert
86
+ ApiException exception = assertThrows (ApiException .class , () -> {
87
+ usersService .updateAvatar (username , requestDto );
88
+ });
89
+
90
+ ApiErrorPayload error = exception .getError ();
91
+ assertEquals (ErrorCode .AVATAR_SIZE_EXCEEDS_LIMIT , error .getErrorCode ());
92
+ assertEquals ("Avatar size exceeds 3MB limit" , error .getMessage ());
93
+ verify (userRepository , never ()).findByUsername (anyString ());
94
+ verify (userRepository , never ()).save (any (Users .class ));
95
+ }
96
+
97
+ @ Test
98
+ void updateAvatar_UserNotFound () {
99
+ // Arrange
100
+ String username = "nonexistentuser" ;
101
+ String avatarData = "data:image/jpeg;base64," + "a" .repeat (1000 );
102
+ UpdateAvatarRequestDto requestDto = new UpdateAvatarRequestDto (avatarData );
103
+
104
+ when (userRepository .findByUsername (username )).thenReturn (Optional .empty ());
105
+
106
+ // Act & Assert
107
+ ApiException exception = assertThrows (ApiException .class , () -> {
108
+ usersService .updateAvatar (username , requestDto );
109
+ });
110
+
111
+ ApiErrorPayload error = exception .getError ();
112
+ assertEquals (ErrorCode .WRONG_CREDENTIALS , error .getErrorCode ());
113
+ assertEquals ("User not found" , error .getMessage ());
114
+ verify (userRepository ).findByUsername (username );
115
+ verify (userRepository , never ()).save (any (Users .class ));
116
+ }
117
+
118
+ @ Test
119
+ void updateAvatar_InvalidBase64Data () {
120
+ // Arrange
121
+ String username = "testuser" ;
122
+ String invalidBase64 = "data:image/jpeg;base64,invalid-base64-data" ;
123
+ UpdateAvatarRequestDto requestDto = new UpdateAvatarRequestDto (invalidBase64 );
124
+
125
+ // Act & Assert
126
+ assertThrows (IllegalArgumentException .class , () -> {
127
+ usersService .updateAvatar (username , requestDto );
128
+ });
129
+
130
+ verify (userRepository , never ()).findByUsername (anyString ());
131
+ verify (userRepository , never ()).save (any (Users .class ));
132
+ }
133
+ }
0 commit comments