package org.zalando.baigan.proxy;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.zalando.baigan.BaiganSpringContext;
import org.zalando.baigan.annotation.BaiganConfig;
import org.zalando.baigan.annotation.ConfigurationServiceScan;
import org.zalando.baigan.context.SpringTestContext;
import org.zalando.baigan.service.ConfigurationRepository;
import org.zalando.baigan.service.github.GitConfig;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {ConfigurationServiceBeanFactoryIT.TestContext.class})
public class ConfigurationServiceBeanFactoryIT {
@Configuration
@ComponentScan(
basePackageClasses = {BaiganSpringContext.class},
excludeFilters = @ComponentScan.Filter(
classes = SpringTestContext.class,
type = FilterType.ASSIGNABLE_TYPE))
@ConfigurationServiceScan(basePackages = "org.zalando.baigan.proxy")
static class TestContext {
@Bean
ConfigurationRepository configurationRepository(final GitConfig configuration) {
return mock(ConfigurationRepository.class);
}
@Bean(name = "gitConfiguration")
GitConfig gitConfiguration() {
final GitConfig config = mock(GitConfig.class);
when(config.getGitHost()).thenReturn("raw.com");
return config;
}
@Bean
static TestPostProcessor testPostProcessor() {
return new TestPostProcessor();
}
}
static class TestPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(final Object bean, final String beanName) throws BeansException {
return bean;
}
@Override
public Object postProcessAfterInitialization(final Object bean, final String beanName) throws BeansException {
if ("gitConfiguration".equals(beanName)) {
when(((GitConfig) bean).getGitHost()).thenReturn("post-processed.com");
}
return bean;
}
}
@BaiganConfig
public interface TestFeature {
Boolean enabled();
}
@Autowired
private GitConfig gitConfig;
@Test
public void allowsPostProcessingOfBeans() throws Exception {
assertThat(gitConfig.getGitHost(), is("post-processed.com"));
}
}