diff --git a/.gitignore b/.gitignore index a1c2a23..fddeabf 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,6 @@ # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml hs_err_pid* + +.idea +.gradle \ No newline at end of file diff --git a/src/main/java/com/example/DummyController.java b/src/main/java/com/example/DummyController.java index 767d222..daad187 100644 --- a/src/main/java/com/example/DummyController.java +++ b/src/main/java/com/example/DummyController.java @@ -1,13 +1,15 @@ package com.example; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; import reactor.core.publisher.Mono; import java.security.Principal; +@RestController public class DummyController { - @GetMapping("/api/sayHello") + @GetMapping("/**") public Mono sayHello(Mono pM) { return pM .map(Principal::getName) diff --git a/src/test/java/com/example/FormLoginTest.java b/src/test/java/com/example/FormLoginTest.java index 1291cfa..14c08c7 100644 --- a/src/test/java/com/example/FormLoginTest.java +++ b/src/test/java/com/example/FormLoginTest.java @@ -1,92 +1,75 @@ package com.example; -import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.reactive.AutoConfigureWebTestClient; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.context.ApplicationContext; import org.springframework.http.MediaType; -import org.springframework.test.context.ContextConfiguration; +import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.reactive.server.FluxExchangeResult; import org.springframework.test.web.reactive.server.WebTestClient; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.web.reactive.function.BodyInserters; import java.time.Duration; -import java.util.Arrays; import java.util.Collections; +import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.security.test.web.reactive.server.SecurityMockServerConfigurers.csrf; -import static org.springframework.security.test.web.reactive.server.SecurityMockServerConfigurers.springSecurity; - +@SpringBootTest @RunWith(SpringRunner.class) -@ContextConfiguration(classes = Application.class) -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +@AutoConfigureWebTestClient public class FormLoginTest { @Autowired - ApplicationContext context; - private WebTestClient rest; - @Before - public void setup() { - this.rest = WebTestClient - .bindToApplicationContext(this.context) - .apply(springSecurity()) - .configureClient() - .responseTimeout(Duration.ofDays(1)) - .build(); - } - - @Test - public void returnOwnUser() throws Exception { - this.formLogin("user1", "user1"); - - this.rest - .get() - .uri("/api/user/current") + public void formLoginWhenValidCredentialsThenSessionCreated() { + FluxExchangeResult result = this.rest + .mutateWith(csrf()) + .post() + .uri("/login") + .body(BodyInserters + .fromFormData(new FormData("user1", "user1").toParamList())) + .accept(MediaType.TEXT_HTML) .exchange() - .expectStatus().is2xxSuccessful() - .expectBody(String.class) - .isEqualTo("Hello user1!") - ; + .expectStatus().is3xxRedirection() + .expectHeader().valueEquals("Location", "/") + .returnResult(String.class); - this.rest - .get() - .uri("/logout") - .exchange() - .expectStatus().is2xxSuccessful(); + assertThat(result.getResponseCookies().keySet()).contains("SESSION"); + } - this.rest - .get() + @Test + @WithMockUser("user1") + public void apiWhenWithMockUserThenSaysHello() throws Exception { + this.rest.get() .uri("/api/user/current") .exchange() - .expectStatus().isEqualTo(403) - ; - + .expectStatus().is2xxSuccessful() + .expectBody(String.class).isEqualTo("Hello user1!"); } + @Test + @WithMockUser + public void logoutWhenSuccessThenDeletesSession() throws Exception { - private void formLogin(String user, String password) { - this.rest - .get() - .uri("/login") - .exchange() - .expectStatus().is2xxSuccessful(); - this.rest + FluxExchangeResult result = this.rest .mutateWith(csrf()) .post() - .uri("/login") - .body(BodyInserters.fromFormData(new FormData(user, password).toParamList())) - .accept(MediaType.TEXT_HTML) - .exchange() - .expectStatus().is3xxRedirection() - .expectHeader().valueEquals("Location", "/"); + .uri("/logout") + .cookie("SESSION", "any") + .exchange().expectStatus() + .is3xxRedirection().returnResult(String.class); + + assertThat(result.getResponseCookies().getFirst("SESSION").getMaxAge()).isEqualTo( + Duration.ZERO); + } public static final class FormData {