package liquibase.parser.core.xml;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.fail;
import static org.mockito.Mockito.when;
import java.io.InputStream;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.internal.util.reflection.Whitebox;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.xml.sax.InputSource;
import liquibase.parser.LiquibaseParser;
import liquibase.parser.NamespaceDetails;
import liquibase.parser.NamespaceDetailsFactory;
import liquibase.resource.ResourceAccessor;
import liquibase.serializer.LiquibaseSerializer;
@RunWith(PowerMockRunner.class)
@PrepareForTest(NamespaceDetailsFactory.class)
public class LiquibaseSchemaResolverTest {
private static final String SYSTEM_ID = "systemId";
private static final String PUBLIC_ID = "publicId";
private static final String XSD_FILE = "xsdFile";
private LiquibaseSchemaResolver liquibaseSchemaResolver;
@Mock
private LiquibaseParser liquibaseParser;
@Mock
private LiquibaseSerializer liquibaseSerializer;
@Mock
private NamespaceDetailsFactory namespaceDetailsFactory;
@Mock
private NamespaceDetails nameSpaceDetialsForParser, namespaceDetailsForSerializer;
@Mock
private ResourceAccessorXsdStreamResolver resourceAccessorXsdStreamResolver;
@Mock
private InputStream inputStream;
@Mock
private ResourceAccessor resourceAccessor;
@Before
public void setUp() {
PowerMockito.mockStatic(NamespaceDetailsFactory.class);
liquibaseSchemaResolver = new LiquibaseSchemaResolver(SYSTEM_ID, PUBLIC_ID, resourceAccessor);
Whitebox.setInternalState(liquibaseSchemaResolver, "resourceAccessorXsdStreamResolver", resourceAccessorXsdStreamResolver);
when(NamespaceDetailsFactory.getInstance()).thenReturn(namespaceDetailsFactory);
when(namespaceDetailsFactory.getNamespaceDetails(liquibaseParser, SYSTEM_ID)).thenReturn(nameSpaceDetialsForParser);
when(namespaceDetailsFactory.getNamespaceDetails(liquibaseSerializer, SYSTEM_ID)).thenReturn(namespaceDetailsForSerializer);
when(nameSpaceDetialsForParser.getLocalPath(SYSTEM_ID)).thenReturn(XSD_FILE);
when(namespaceDetailsForSerializer.getLocalPath(SYSTEM_ID)).thenReturn(XSD_FILE);
when(resourceAccessorXsdStreamResolver.getResourceAsStream(XSD_FILE)).thenReturn(inputStream);
}
@Test
public void shouldReturnInputSourceWhenResourceAsStreamFound() {
InputSource inputSource = liquibaseSchemaResolver.resolve(liquibaseParser);
assertThat(inputSource.getByteStream()).isEqualTo(inputStream);
assertThat(inputSource.getPublicId()).isEqualTo(PUBLIC_ID);
assertThat(inputSource.getPublicId()).isEqualTo(PUBLIC_ID);
}
@Test
public void shouldReturnNullWhenNoResourceAsStreamFound() {
when(resourceAccessorXsdStreamResolver.getResourceAsStream(XSD_FILE)).thenReturn(null);
InputSource inputSource = liquibaseSchemaResolver.resolve(liquibaseParser);
assertThat(inputSource).isNull();
}
@Test
public void shouldReturnNullWhenSystemIdIsNull() {
liquibaseSchemaResolver = new LiquibaseSchemaResolver(null, PUBLIC_ID, resourceAccessor);
InputSource inputSource = liquibaseSchemaResolver.resolve(liquibaseParser);
assertThat(inputSource).isNull();
}
@Test
public void shouldReturnNullWhenXsdFileFoundIsNull() {
when(nameSpaceDetialsForParser.getLocalPath(SYSTEM_ID)).thenReturn(null);
InputSource inputSource = liquibaseSchemaResolver.resolve(liquibaseParser);
assertThat(inputSource).isNull();
}
@Test
public void shouldThrowExceptionWhenSerializerGivenIsNull() {
try {
liquibaseSchemaResolver.resolve((LiquibaseSerializer) null);
fail("Excepted RuntimeException. But no Exception was thrown");
} catch (RuntimeException e){
assertThat(e.getMessage()).isEqualTo("Serializer can not be null");
}
}
@Test
public void shouldThrowExceptionWhenParserGivenIsNull() {
try {
liquibaseSchemaResolver.resolve((LiquibaseParser) null);
fail("Excepted RuntimeException. But no Exception was thrown");
} catch (RuntimeException e){
assertThat(e.getMessage()).isEqualTo("Parser can not be null");
}
}
@Test
public void shouldReturnNullWhenExceptionOccurs() {
when(resourceAccessorXsdStreamResolver.getResourceAsStream(XSD_FILE)).thenThrow(new RuntimeException());
InputSource inputSource = liquibaseSchemaResolver.resolve(liquibaseParser);
assertThat(inputSource).isNull();
}
}