package com.ctrip.framework.apollo.spi;
import static org.hamcrest.core.Is.is;
import static org.hamcrest.core.IsInstanceOf.instanceOf;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
import java.util.Properties;
import org.junit.Before;
import org.junit.Test;
import org.springframework.test.util.ReflectionTestUtils;
import com.ctrip.framework.apollo.Config;
import com.ctrip.framework.apollo.ConfigFile;
import com.ctrip.framework.apollo.build.MockInjector;
import com.ctrip.framework.apollo.core.enums.ConfigFileFormat;
import com.ctrip.framework.apollo.core.enums.Env;
import com.ctrip.framework.apollo.internals.DefaultConfig;
import com.ctrip.framework.apollo.internals.JsonConfigFile;
import com.ctrip.framework.apollo.internals.LocalFileConfigRepository;
import com.ctrip.framework.apollo.internals.PropertiesConfigFile;
import com.ctrip.framework.apollo.internals.XmlConfigFile;
import com.ctrip.framework.apollo.internals.YamlConfigFile;
import com.ctrip.framework.apollo.internals.YmlConfigFile;
import com.ctrip.framework.apollo.util.ConfigUtil;
/**
* @author Jason Song(song_s@ctrip.com)
*/
public class DefaultConfigFactoryTest {
private DefaultConfigFactory defaultConfigFactory;
private static String someAppId;
private static Env someEnv;
@Before
public void setUp() throws Exception {
someAppId = "someId";
someEnv = Env.DEV;
MockInjector.reset();
MockInjector.setInstance(ConfigUtil.class, new MockConfigUtil());
defaultConfigFactory = spy(new DefaultConfigFactory());
}
@Test
public void testCreate() throws Exception {
String someNamespace = "someName";
Properties someProperties = new Properties();
String someKey = "someKey";
String someValue = "someValue";
someProperties.setProperty(someKey, someValue);
LocalFileConfigRepository someLocalConfigRepo = mock(LocalFileConfigRepository.class);
when(someLocalConfigRepo.getConfig()).thenReturn(someProperties);
doReturn(someLocalConfigRepo).when(defaultConfigFactory).createLocalConfigRepository(someNamespace);
Config result = defaultConfigFactory.create(someNamespace);
assertThat("DefaultConfigFactory should create DefaultConfig", result,
is(instanceOf(DefaultConfig.class)));
assertEquals(someValue, result.getProperty(someKey, null));
}
@Test
public void testCreateLocalConfigRepositoryInLocalDev() throws Exception {
String someNamespace = "someName";
someEnv = Env.LOCAL;
LocalFileConfigRepository localFileConfigRepository =
defaultConfigFactory.createLocalConfigRepository(someNamespace);
assertNull(ReflectionTestUtils.getField(localFileConfigRepository, "m_upstream"));
}
@Test
public void testCreateConfigFile() throws Exception {
String someNamespace = "someName";
String anotherNamespace = "anotherName";
String yetAnotherNamespace = "yetAnotherNamespace";
Properties someProperties = new Properties();
LocalFileConfigRepository someLocalConfigRepo = mock(LocalFileConfigRepository.class);
when(someLocalConfigRepo.getConfig()).thenReturn(someProperties);
doReturn(someLocalConfigRepo).when(defaultConfigFactory).createLocalConfigRepository(someNamespace);
doReturn(someLocalConfigRepo).when(defaultConfigFactory).createLocalConfigRepository(anotherNamespace);
doReturn(someLocalConfigRepo).when(defaultConfigFactory).createLocalConfigRepository(yetAnotherNamespace);
ConfigFile propertyConfigFile =
defaultConfigFactory.createConfigFile(someNamespace, ConfigFileFormat.Properties);
ConfigFile xmlConfigFile =
defaultConfigFactory.createConfigFile(anotherNamespace, ConfigFileFormat.XML);
ConfigFile jsonConfigFile =
defaultConfigFactory.createConfigFile(yetAnotherNamespace, ConfigFileFormat.JSON);
ConfigFile ymlConfigFile = defaultConfigFactory.createConfigFile(someNamespace,
ConfigFileFormat.YML);
ConfigFile yamlConfigFile = defaultConfigFactory.createConfigFile(someNamespace,
ConfigFileFormat.YAML);
assertThat("Should create PropertiesConfigFile for properties format", propertyConfigFile, is(instanceOf(
PropertiesConfigFile.class)));
assertEquals(someNamespace, propertyConfigFile.getNamespace());
assertThat("Should create XmlConfigFile for xml format", xmlConfigFile, is(instanceOf(
XmlConfigFile.class)));
assertEquals(anotherNamespace, xmlConfigFile.getNamespace());
assertThat("Should create JsonConfigFile for json format", jsonConfigFile, is(instanceOf(
JsonConfigFile.class)));
assertEquals(yetAnotherNamespace, jsonConfigFile.getNamespace());
assertThat("Should create YmlConfigFile for yml format", ymlConfigFile, is(instanceOf(
YmlConfigFile.class)));
assertEquals(someNamespace, ymlConfigFile.getNamespace());
assertThat("Should create YamlConfigFile for yaml format", yamlConfigFile, is(instanceOf(
YamlConfigFile.class)));
assertEquals(someNamespace, yamlConfigFile.getNamespace());
}
public static class MockConfigUtil extends ConfigUtil {
@Override
public String getAppId() {
return someAppId;
}
@Override
public Env getApolloEnv() {
return someEnv;
}
}
}