add tests

Signed-off-by: Andrey Litvitski <andrey1010102008@gmail.com>
This commit is contained in:
Andrey Litvitski 2026-03-28 00:13:07 +03:00 committed by Josh Cummings
parent 6335caabae
commit b92c072501
4 changed files with 214 additions and 6 deletions

View File

@ -0,0 +1,102 @@
/*
* Copyright 2004-present the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.security.docs.servlet.addingcustomfilter;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.user;
import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.springSecurity;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static org.springframework.security.test.web.servlet.response.SecurityMockMvcResultMatchers.authenticated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = {
CustomFilterAfterTests.UserDetailsConfig.class,
CustomFilterAfterTests.ApiController.class,
SecurityConfigAfter.class })
@WebAppConfiguration
public class CustomFilterAfterTests {
@Autowired
private WebApplicationContext context;
private MockMvc mvc;
@BeforeEach
void setup() {
this.mvc = MockMvcBuilders.webAppContextSetup(this.context)
.defaultRequest(get("/api").with(user("user")))
.apply(springSecurity())
.build();
}
@Test
void tenantFilterWhenHeaderMissingThenAccessDenied() {
assertThatExceptionOfType(AccessDeniedException.class)
.isThrownBy(() -> this.mvc.perform(get("/api")).andReturn());
}
@Test
void tenantFilterWhenHeaderPresentThenContinuesFilterChain() throws Exception {
this.mvc.perform(get("/api").header("X-Tenant-Id", "some-tenant-id"))
.andExpect(status().isOk())
.andExpect(authenticated().withUsername("user"));
}
@Configuration
static class UserDetailsConfig {
@Bean
UserDetailsService userDetailsService() {
UserDetails user = User.withDefaultPasswordEncoder()
.username("user")
.password("password")
.roles("USER")
.build();
return new InMemoryUserDetailsManager(user);
}
}
@RestController
static class ApiController {
@GetMapping("/api")
String api() {
return "ok";
}
}
}

View File

@ -45,11 +45,11 @@ import org.springframework.web.bind.annotation.RestController;
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = {
CustomFilterTests.UserDetailsConfig.class,
CustomFilterTests.ApiController.class,
CustomFilterBeforeTests.UserDetailsConfig.class,
CustomFilterBeforeTests.ApiController.class,
SecurityConfigBefore.class })
@WebAppConfiguration
public class CustomFilterTests {
public class CustomFilterBeforeTests {
@Autowired
private WebApplicationContext context;

View File

@ -0,0 +1,106 @@
/*
* Copyright 2004-present the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.security.kt.docs.servlet.addingcustomfilter
import org.assertj.core.api.Assertions.assertThatExceptionOfType
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.extension.ExtendWith
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.security.core.userdetails.User
import org.springframework.security.core.userdetails.UserDetails
import org.springframework.security.core.userdetails.UserDetailsService
import org.springframework.security.provisioning.InMemoryUserDetailsManager
import org.springframework.test.context.ContextConfiguration
import org.springframework.test.context.junit.jupiter.SpringExtension
import org.springframework.test.context.web.WebAppConfiguration
import org.springframework.test.web.servlet.MockMvc
import org.springframework.test.web.servlet.setup.MockMvcBuilders
import org.springframework.web.context.WebApplicationContext
import org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.user
import org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.springSecurity
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get
import org.springframework.test.web.servlet.result.MockMvcResultMatchers.status
import org.springframework.security.test.web.servlet.response.SecurityMockMvcResultMatchers.authenticated
import org.springframework.test.web.servlet.setup.DefaultMockMvcBuilder
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RestController
@ExtendWith(SpringExtension::class)
@ContextConfiguration(
classes = [
CustomFilterAfterTests.UserDetailsConfig::class,
CustomFilterAfterTests.ApiController::class,
SecurityConfigAfter::class
]
)
@WebAppConfiguration
class CustomFilterAfterTests {
@Autowired
private lateinit var context: WebApplicationContext
private lateinit var mvc: MockMvc
@BeforeEach
fun setup() {
this.mvc = MockMvcBuilders.webAppContextSetup(this.context)
.apply<DefaultMockMvcBuilder>(springSecurity())
.build();
}
@Test
fun tenantFilterWhenHeaderMissingThenAccessDenied() {
assertThatExceptionOfType(Exception::class.java)
.isThrownBy { this.mvc.perform(get("/api").with(user("user"))).andReturn() }
}
@Test
fun tenantFilterWhenHeaderPresentThenContinuesFilterChain() {
this.mvc.perform(get("/api")
.with(user("user"))
.header("X-Tenant-Id", "some-tenant-id"))
.andExpect(status().isOk)
.andExpect(authenticated().withUsername("user"))
}
@Configuration
open class UserDetailsConfig {
@Bean
open fun userDetailsService(): UserDetailsService {
@Suppress("DEPRECATION")
val user: UserDetails = User.withDefaultPasswordEncoder()
.username("user")
.password("password")
.roles("USER")
.build()
return InMemoryUserDetailsManager(user)
}
}
@RestController
class ApiController {
@GetMapping("/api")
fun api(): String {
return "ok"
}
}
}

View File

@ -45,13 +45,13 @@ import org.springframework.web.bind.annotation.RestController
@ExtendWith(SpringExtension::class)
@ContextConfiguration(
classes = [
CustomFilterTests.UserDetailsConfig::class,
CustomFilterTests.ApiController::class,
CustomFilterBeforeTests.UserDetailsConfig::class,
CustomFilterBeforeTests.ApiController::class,
SecurityConfigBefore::class
]
)
@WebAppConfiguration
class CustomFilterTests {
class CustomFilterBeforeTests {
@Autowired
private lateinit var context: WebApplicationContext