@@ -64,7 +64,7 @@ class UserServiceApplicationTests {
64
64
private const val hydraRedirectUrl = " someHydraRedirectUrl"
65
65
private val revokeRequest = RevokeRefreshTokensRequest (" 1" , null , true )
66
66
67
- private val user = User (1 , username, password, email, null , null )
67
+ private val user = User (1 , username, password, email, null , 0 )
68
68
private val mockServer = ClientAndServer (mockServerPort)
69
69
70
70
@JvmStatic
@@ -263,6 +263,84 @@ class UserServiceApplicationTests {
263
263
verify(banRepository).findAllByPlayerIdAndLevel(anyLong(), anyOrNull())
264
264
}
265
265
266
+ @Test
267
+ fun postLoginWithNonLinkedUserWithLobbyScope () {
268
+ val unlinkedUser = User (1 , username, password, email, null , null )
269
+ `when `(userRepository.findByUsernameOrEmail(username, username)).thenReturn(Mono .just(unlinkedUser))
270
+ `when `(passwordEncoder.matches(password, password)).thenReturn(true )
271
+ `when `(loginLogRepository.findFailedAttemptsByIp(anyString()))
272
+ .thenReturn(Mono .just(FailedAttemptsSummary (null , null , null , null )))
273
+ `when `(loginLogRepository.save(anyOrNull()))
274
+ .thenAnswer { Mono .just(it.arguments[0 ]) }
275
+ `when `(banRepository.findAllByPlayerIdAndLevel(anyLong(), anyOrNull())).thenReturn(
276
+ Flux .empty()
277
+ )
278
+
279
+ mockLoginRequest(scopes = listOf (OAuthScope .LOBBY ))
280
+ mockLoginReject()
281
+
282
+ webTestClient
283
+ .mutateWith(csrf())
284
+ .post()
285
+ .uri(" /oauth2/login?login_challenge=$challenge " )
286
+ .header(HttpHeaders .CONTENT_TYPE , MediaType .APPLICATION_JSON_VALUE )
287
+ .body(
288
+ BodyInserters .fromFormData(" login_challenge" , challenge)
289
+ .with (" usernameOrEmail" , username)
290
+ .with (" password" , password)
291
+ )
292
+ .exchange()
293
+ .expectStatus().is3xxRedirection
294
+ .expectHeader()
295
+ .location(" /oauth2/gameVerificationFailed" )
296
+ .expectBody(String ::class .java)
297
+
298
+ verify(userRepository).findByUsernameOrEmail(username, username)
299
+ verify(passwordEncoder).matches(password, password)
300
+ verify(loginLogRepository).findFailedAttemptsByIp(anyString())
301
+ verify(loginLogRepository).save(anyOrNull())
302
+ verify(banRepository).findAllByPlayerIdAndLevel(anyLong(), anyOrNull())
303
+ }
304
+
305
+ @Test
306
+ fun postLoginWithNonLinkedUserWithoutLobbyScope () {
307
+ val unlinkedUser = User (1 , username, password, email, null , null )
308
+ `when `(userRepository.findByUsernameOrEmail(username, username)).thenReturn(Mono .just(unlinkedUser))
309
+ `when `(passwordEncoder.matches(password, password)).thenReturn(true )
310
+ `when `(loginLogRepository.findFailedAttemptsByIp(anyString()))
311
+ .thenReturn(Mono .just(FailedAttemptsSummary (null , null , null , null )))
312
+ `when `(loginLogRepository.save(anyOrNull()))
313
+ .thenAnswer { Mono .just(it.arguments[0 ]) }
314
+ `when `(banRepository.findAllByPlayerIdAndLevel(anyLong(), anyOrNull())).thenReturn(
315
+ Flux .empty()
316
+ )
317
+
318
+ mockLoginRequest()
319
+ mockLoginAccept()
320
+
321
+ webTestClient
322
+ .mutateWith(csrf())
323
+ .post()
324
+ .uri(" /oauth2/login?login_challenge=$challenge " )
325
+ .header(HttpHeaders .CONTENT_TYPE , MediaType .APPLICATION_JSON_VALUE )
326
+ .body(
327
+ BodyInserters .fromFormData(" login_challenge" , challenge)
328
+ .with (" usernameOrEmail" , username)
329
+ .with (" password" , password)
330
+ )
331
+ .exchange()
332
+ .expectStatus().is3xxRedirection
333
+ .expectHeader()
334
+ .location(hydraRedirectUrl)
335
+ .expectBody(String ::class .java)
336
+
337
+ verify(userRepository).findByUsernameOrEmail(username, username)
338
+ verify(passwordEncoder).matches(password, password)
339
+ verify(loginLogRepository).findFailedAttemptsByIp(anyString())
340
+ verify(loginLogRepository).save(anyOrNull())
341
+ verify(banRepository).findAllByPlayerIdAndLevel(anyLong(), anyOrNull())
342
+ }
343
+
266
344
@Test
267
345
fun postLoginWithUnbannedUser () {
268
346
`when `(userRepository.findByUsernameOrEmail(username, username)).thenReturn(Mono .just(user))
@@ -429,7 +507,7 @@ class UserServiceApplicationTests {
429
507
.expectBody(String ::class .java)
430
508
}
431
509
432
- private fun mockLoginRequest () {
510
+ private fun mockLoginRequest (scopes : List < String > = listOf() ) {
433
511
mockServer.`when `(
434
512
HttpRequest .request()
435
513
.withMethod(" GET" )
@@ -446,7 +524,7 @@ class UserServiceApplicationTests {
446
524
"client": {},
447
525
"request_url": "someRequestUrl",
448
526
"requested_access_token_audience": [],
449
- "requested_scope": [],
527
+ "requested_scope": [${scopes.joinToString( " \" , \" " , " \" " , " \" " )} ],
450
528
"skip": false,
451
529
"subject": "1"
452
530
}
0 commit comments