Commit 71e9db01 authored by Madhura Bhave's avatar Madhura Bhave

Convert tests to use ApplicationContextRunner

parent 905666e7
...@@ -21,23 +21,22 @@ import java.util.EnumSet; ...@@ -21,23 +21,22 @@ import java.util.EnumSet;
import javax.servlet.DispatcherType; import javax.servlet.DispatcherType;
import org.junit.After;
import org.junit.Rule; import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.autoconfigure.TestAutoConfigurationPackage; import org.springframework.boot.autoconfigure.TestAutoConfigurationPackage;
import org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration; import org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration; import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
import org.springframework.boot.autoconfigure.orm.jpa.test.City; import org.springframework.boot.autoconfigure.orm.jpa.test.City;
import org.springframework.boot.test.context.runner.WebApplicationContextRunner;
import org.springframework.boot.test.rule.OutputCapture; import org.springframework.boot.test.rule.OutputCapture;
import org.springframework.boot.test.util.TestPropertyValues;
import org.springframework.boot.web.servlet.DelegatingFilterProxyRegistrationBean; import org.springframework.boot.web.servlet.DelegatingFilterProxyRegistrationBean;
import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.mock.web.MockServletContext;
import org.springframework.orm.jpa.JpaTransactionManager; import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.security.authentication.AuthenticationEventPublisher; import org.springframework.security.authentication.AuthenticationEventPublisher;
import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.AuthenticationManager;
...@@ -57,7 +56,6 @@ import org.springframework.security.data.repository.query.SecurityEvaluationCont ...@@ -57,7 +56,6 @@ import org.springframework.security.data.repository.query.SecurityEvaluationCont
import org.springframework.security.provisioning.InMemoryUserDetailsManager; import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.FilterChainProxy; import org.springframework.security.web.FilterChainProxy;
import org.springframework.test.util.ReflectionTestUtils; import org.springframework.test.util.ReflectionTestUtils;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
...@@ -71,41 +69,28 @@ import static org.assertj.core.api.Assertions.assertThat; ...@@ -71,41 +69,28 @@ import static org.assertj.core.api.Assertions.assertThat;
*/ */
public class SecurityAutoConfigurationTests { public class SecurityAutoConfigurationTests {
private AnnotationConfigWebApplicationContext context; private WebApplicationContextRunner contextRunner = new WebApplicationContextRunner()
.withConfiguration(AutoConfigurations.of(SecurityAutoConfiguration.class,
PropertyPlaceholderAutoConfiguration.class));
@Rule @Rule
public OutputCapture outputCapture = new OutputCapture(); public OutputCapture outputCapture = new OutputCapture();
@After
public void close() {
if (this.context != null) {
this.context.close();
}
}
@Test @Test
public void testWebConfiguration() { public void testWebConfiguration() {
this.context = new AnnotationConfigWebApplicationContext(); this.contextRunner.run(context -> {
this.context.setServletContext(new MockServletContext()); assertThat(context.getBean(AuthenticationManagerBuilder.class)).isNotNull();
this.context.register(SecurityAutoConfiguration.class, assertThat(context.getBean(FilterChainProxy.class).getFilterChains())
PropertyPlaceholderAutoConfiguration.class); .hasSize(1);
this.context.refresh(); });
assertThat(this.context.getBean(AuthenticationManagerBuilder.class)).isNotNull();
assertThat(this.context.getBean(FilterChainProxy.class).getFilterChains())
.hasSize(1);
} }
@Test @Test
public void testDefaultFilterOrderWithSecurityAdapter() { public void testDefaultFilterOrderWithSecurityAdapter() {
this.context = new AnnotationConfigWebApplicationContext(); this.contextRunner.withConfiguration(AutoConfigurations.of(WebSecurity.class, SecurityFilterAutoConfiguration.class))
this.context.setServletContext(new MockServletContext()); .run(context -> assertThat(context.getBean("securityFilterChainRegistration",
this.context.register(WebSecurity.class, SecurityAutoConfiguration.class, DelegatingFilterProxyRegistrationBean.class).getOrder()).isEqualTo(
SecurityFilterAutoConfiguration.class, FilterRegistrationBean.REQUEST_WRAPPER_FILTER_MAX_ORDER - 100));
PropertyPlaceholderAutoConfiguration.class);
this.context.refresh();
assertThat(this.context.getBean("securityFilterChainRegistration",
DelegatingFilterProxyRegistrationBean.class).getOrder()).isEqualTo(
FilterRegistrationBean.REQUEST_WRAPPER_FILTER_MAX_ORDER - 100);
} }
@Test @Test
...@@ -122,173 +107,132 @@ public class SecurityAutoConfigurationTests { ...@@ -122,173 +107,132 @@ public class SecurityAutoConfigurationTests {
@Test @Test
public void defaultAuthenticationEventPublisherRegistered() { public void defaultAuthenticationEventPublisherRegistered() {
this.context = new AnnotationConfigWebApplicationContext(); this.contextRunner.run(context -> {
this.context.register(SecurityAutoConfiguration.class); assertThat(context.getBean(AuthenticationEventPublisher.class))
this.context.refresh(); .isInstanceOf(DefaultAuthenticationEventPublisher.class);
assertThat(this.context.getBean(AuthenticationEventPublisher.class)) });
.isInstanceOf(DefaultAuthenticationEventPublisher.class);
} }
@Test @Test
public void defaultAuthenticationEventPublisherIsConditionalOnMissingBean() { public void defaultAuthenticationEventPublisherIsConditionalOnMissingBean() {
this.context = new AnnotationConfigWebApplicationContext(); this.contextRunner.withUserConfiguration(AuthenticationEventPublisherConfiguration.class).run(context -> {
this.context.register(AuthenticationEventPublisherConfiguration.class, assertThat(context.getBean(AuthenticationEventPublisher.class))
SecurityAutoConfiguration.class); .isInstanceOf(AuthenticationEventPublisherConfiguration.TestAuthenticationEventPublisher.class);
this.context.refresh(); });
assertThat(this.context.getBean(AuthenticationEventPublisher.class))
.isInstanceOf(AuthenticationEventPublisherConfiguration.TestAuthenticationEventPublisher.class);
} }
@Test @Test
public void testDefaultFilterOrder() { public void testDefaultFilterOrder() {
this.context = new AnnotationConfigWebApplicationContext(); this.contextRunner.withConfiguration(AutoConfigurations.of(SecurityFilterAutoConfiguration.class)).run(context -> {
this.context.setServletContext(new MockServletContext()); assertThat(context.getBean("securityFilterChainRegistration",
this.context.register(SecurityAutoConfiguration.class, DelegatingFilterProxyRegistrationBean.class).getOrder()).isEqualTo(
SecurityFilterAutoConfiguration.class, FilterRegistrationBean.REQUEST_WRAPPER_FILTER_MAX_ORDER - 100);
PropertyPlaceholderAutoConfiguration.class); });
this.context.refresh();
assertThat(this.context.getBean("securityFilterChainRegistration",
DelegatingFilterProxyRegistrationBean.class).getOrder()).isEqualTo(
FilterRegistrationBean.REQUEST_WRAPPER_FILTER_MAX_ORDER - 100);
} }
@Test @Test
public void testCustomFilterOrder() { public void testCustomFilterOrder() {
this.context = new AnnotationConfigWebApplicationContext(); this.contextRunner.withConfiguration(AutoConfigurations.of(SecurityFilterAutoConfiguration.class))
TestPropertyValues.of("spring.security.filter.order:12345").applyTo(this.context); .withPropertyValues("spring.security.filter.order:12345")
this.context.setServletContext(new MockServletContext()); .run(context -> {
this.context.register(SecurityAutoConfiguration.class, assertThat(context.getBean("securityFilterChainRegistration",
SecurityFilterAutoConfiguration.class, DelegatingFilterProxyRegistrationBean.class).getOrder()).isEqualTo(
PropertyPlaceholderAutoConfiguration.class); 12345);
this.context.refresh(); });
assertThat(this.context.getBean("securityFilterChainRegistration",
DelegatingFilterProxyRegistrationBean.class).getOrder()).isEqualTo(12345);
} }
@Test @Test
public void testDefaultUsernamePassword() { public void testDefaultUsernamePassword() {
this.context = new AnnotationConfigWebApplicationContext(); this.contextRunner.run(context -> {
this.context.setServletContext(new MockServletContext()); UserDetailsService manager = context.getBean(UserDetailsService.class);
this.context.register(SecurityAutoConfiguration.class); assertThat(this.outputCapture.toString())
this.context.refresh(); .contains("Using generated security password:");
UserDetailsService manager = this.context.getBean(UserDetailsService.class); assertThat(manager.loadUserByUsername("user")).isNotNull();
assertThat(this.outputCapture.toString()) });
.contains("Using generated security password:");
assertThat(manager.loadUserByUsername("user")).isNotNull();
} }
@Test @Test
public void defaultUserNotCreatedIfAuthenticationManagerBeanPresent() { public void defaultUserNotCreatedIfAuthenticationManagerBeanPresent() {
this.context = new AnnotationConfigWebApplicationContext(); this.contextRunner.withUserConfiguration(TestAuthenticationManagerConfiguration.class).run(context -> {
this.context.setServletContext(new MockServletContext()); AuthenticationManager manager = context.getBean(AuthenticationManager.class);
this.context.register(TestAuthenticationManagerConfiguration.class, assertThat(manager).isEqualTo(context.getBean(
SecurityAutoConfiguration.class, TestAuthenticationManagerConfiguration.class).authenticationManager);
PropertyPlaceholderAutoConfiguration.class); assertThat(this.outputCapture.toString())
this.context.refresh(); .doesNotContain("Using generated security password: ");
AuthenticationManager manager = this.context.getBean(AuthenticationManager.class); TestingAuthenticationToken token = new TestingAuthenticationToken("foo", "bar");
assertThat(manager).isEqualTo(this.context.getBean( assertThat(manager.authenticate(token)).isNotNull();
TestAuthenticationManagerConfiguration.class).authenticationManager); });
assertThat(this.outputCapture.toString())
.doesNotContain("Using generated security password: ");
TestingAuthenticationToken token = new TestingAuthenticationToken("foo", "bar");
assertThat(manager.authenticate(token)).isNotNull();
} }
@Test @Test
public void defaultUserNotCreatedIfUserDetailsServiceBeanPresent() { public void defaultUserNotCreatedIfUserDetailsServiceBeanPresent() {
this.context = new AnnotationConfigWebApplicationContext(); this.contextRunner.withUserConfiguration(TestUserDetailsServiceConfiguration.class).run(context -> {
this.context.setServletContext(new MockServletContext()); UserDetailsService userDetailsService = context
this.context.register(TestUserDetailsServiceConfiguration.class, .getBean(UserDetailsService.class);
SecurityAutoConfiguration.class, assertThat(this.outputCapture.toString())
PropertyPlaceholderAutoConfiguration.class); .doesNotContain("Using default security password: ");
this.context.refresh(); assertThat(userDetailsService.loadUserByUsername("foo")).isNotNull();
UserDetailsService userDetailsService = this.context });
.getBean(UserDetailsService.class);
assertThat(this.outputCapture.toString())
.doesNotContain("Using default security password: ");
assertThat(userDetailsService.loadUserByUsername("foo")).isNotNull();
} }
@Test @Test
public void defaultUserNotCreatedIfAuthenticationProviderBeanPresent() { public void defaultUserNotCreatedIfAuthenticationProviderBeanPresent() {
this.context = new AnnotationConfigWebApplicationContext(); this.contextRunner.withUserConfiguration(TestAuthenticationProviderConfiguration.class).run(context -> {
this.context.setServletContext(new MockServletContext()); AuthenticationProvider provider = context
this.context.register(TestAuthenticationProviderConfiguration.class, .getBean(AuthenticationProvider.class);
SecurityAutoConfiguration.class, assertThat(this.outputCapture.toString())
PropertyPlaceholderAutoConfiguration.class); .doesNotContain("Using default security password: ");
this.context.refresh(); TestingAuthenticationToken token = new TestingAuthenticationToken("foo", "bar");
AuthenticationProvider provider = this.context assertThat(provider.authenticate(token)).isNotNull();
.getBean(AuthenticationProvider.class); });
assertThat(this.outputCapture.toString())
.doesNotContain("Using default security password: ");
TestingAuthenticationToken token = new TestingAuthenticationToken("foo", "bar");
assertThat(provider.authenticate(token)).isNotNull();
} }
@Test @Test
public void testJpaCoexistsHappily() { public void testJpaCoexistsHappily() {
this.context = new AnnotationConfigWebApplicationContext(); this.contextRunner.withPropertyValues("spring.datasource.url:jdbc:hsqldb:mem:testsecdb",
this.context.setServletContext(new MockServletContext());
TestPropertyValues
.of("spring.datasource.url:jdbc:hsqldb:mem:testsecdb",
"spring.datasource.initialization-mode:never") "spring.datasource.initialization-mode:never")
.applyTo(this.context); .withUserConfiguration(EntityConfiguration.class)
this.context.register(EntityConfiguration.class, .withConfiguration(AutoConfigurations.of(HibernateJpaAutoConfiguration.class, DataSourceAutoConfiguration.class))
PropertyPlaceholderAutoConfiguration.class, .run(context -> assertThat(context.getBean(JpaTransactionManager.class)).isNotNull());
DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class,
SecurityAutoConfiguration.class);
// This can fail if security @Conditionals force early instantiation of the // This can fail if security @Conditionals force early instantiation of the
// HibernateJpaAutoConfiguration (e.g. the EntityManagerFactory is not found) // HibernateJpaAutoConfiguration (e.g. the EntityManagerFactory is not found)
this.context.refresh();
assertThat(this.context.getBean(JpaTransactionManager.class)).isNotNull();
} }
@Test @Test
public void testSecurityEvaluationContextExtensionSupport() { public void testSecurityEvaluationContextExtensionSupport() {
this.context = new AnnotationConfigWebApplicationContext(); this.contextRunner.run(context ->
this.context.setServletContext(new MockServletContext()); assertThat(context).getBean(SecurityEvaluationContextExtension.class).isNotNull());
this.context.register(SecurityAutoConfiguration.class);
this.context.refresh();
assertThat(this.context.getBean(SecurityEvaluationContextExtension.class))
.isNotNull();
} }
@Test @Test
public void defaultFilterDispatcherTypes() { public void defaultFilterDispatcherTypes() {
this.context = new AnnotationConfigWebApplicationContext(); this.contextRunner.withConfiguration(AutoConfigurations.of(SecurityFilterAutoConfiguration.class))
this.context.setServletContext(new MockServletContext()); .run(context -> {
this.context.register(SecurityAutoConfiguration.class, DelegatingFilterProxyRegistrationBean bean = context.getBean(
SecurityFilterAutoConfiguration.class, "securityFilterChainRegistration",
PropertyPlaceholderAutoConfiguration.class); DelegatingFilterProxyRegistrationBean.class);
this.context.refresh(); @SuppressWarnings("unchecked")
DelegatingFilterProxyRegistrationBean bean = this.context.getBean( EnumSet<DispatcherType> dispatcherTypes = (EnumSet<DispatcherType>) ReflectionTestUtils
"securityFilterChainRegistration", .getField(bean, "dispatcherTypes");
DelegatingFilterProxyRegistrationBean.class); assertThat(dispatcherTypes).containsOnly(DispatcherType.ASYNC,
@SuppressWarnings("unchecked") DispatcherType.ERROR, DispatcherType.REQUEST);
EnumSet<DispatcherType> dispatcherTypes = (EnumSet<DispatcherType>) ReflectionTestUtils });
.getField(bean, "dispatcherTypes");
assertThat(dispatcherTypes).containsOnly(DispatcherType.ASYNC,
DispatcherType.ERROR, DispatcherType.REQUEST);
} }
@Test @Test
public void customFilterDispatcherTypes() { public void customFilterDispatcherTypes() {
this.context = new AnnotationConfigWebApplicationContext(); this.contextRunner.withPropertyValues("spring.security.filter.dispatcher-types:INCLUDE,ERROR")
this.context.setServletContext(new MockServletContext()); .withConfiguration(AutoConfigurations.of(SecurityFilterAutoConfiguration.class))
this.context.register(SecurityAutoConfiguration.class, .run(context -> {
SecurityFilterAutoConfiguration.class, DelegatingFilterProxyRegistrationBean bean = context.getBean(
PropertyPlaceholderAutoConfiguration.class); "securityFilterChainRegistration",
TestPropertyValues.of("spring.security.filter.dispatcher-types:INCLUDE,ERROR") DelegatingFilterProxyRegistrationBean.class);
.applyTo(this.context); @SuppressWarnings("unchecked")
this.context.refresh(); EnumSet<DispatcherType> dispatcherTypes = (EnumSet<DispatcherType>) ReflectionTestUtils
DelegatingFilterProxyRegistrationBean bean = this.context.getBean( .getField(bean, "dispatcherTypes");
"securityFilterChainRegistration", assertThat(dispatcherTypes).containsOnly(DispatcherType.INCLUDE,
DelegatingFilterProxyRegistrationBean.class); DispatcherType.ERROR);
@SuppressWarnings("unchecked") });
EnumSet<DispatcherType> dispatcherTypes = (EnumSet<DispatcherType>) ReflectionTestUtils
.getField(bean, "dispatcherTypes");
assertThat(dispatcherTypes).containsOnly(DispatcherType.INCLUDE,
DispatcherType.ERROR);
} }
@Configuration @Configuration
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment