package liquibase.parser.core.xml; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.when; import java.io.IOException; import java.io.InputStream; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; 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 org.xml.sax.SAXException; import liquibase.resource.ResourceAccessor; import liquibase.serializer.LiquibaseSerializer; import liquibase.util.StreamUtil; import liquibase.util.file.FilenameUtils; @RunWith(PowerMockRunner.class) @PrepareForTest({ LiquibaseEntityResolver.class, StreamUtil.class }) public class LiquibaseEntityResolverTest { private static final String SYSTEM_ID = "http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd"; private static final String SYSTEM_ID_WITH_MIGRATOR_PATH = "http://www.liquibase.org/xml/ns/migrator/dbchangelog-1.0.xsd"; private static final String SYSTEM_ID_FROM_MIGRATOR_PATH = "http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-1.0.xsd"; private static final String PUBLIC_ID = "publicId"; private static final String NAME = "name"; private static final String BASE_URI = "baseUri"; private static final String BASE_PATH = "basePath"; private static final String FILE_SYSTEM_ID = "fileSystemId"; private static final String PATH_AND_SYSTEM_ID = FilenameUtils.concat(BASE_PATH, FILE_SYSTEM_ID); private LiquibaseEntityResolver liquibaseEntityResolver; @Mock private LiquibaseSchemaResolver liquibaseSchemaResolver; @Mock private ResourceAccessor resourceAccessor; @Mock private InputSource inputSource; @Mock private XMLChangeLogSAXParser parser; @Mock private InputStream inputStream; @Mock private LiquibaseSerializer serializer; @Before public void setUp() throws Exception { PowerMockito.mockStatic(StreamUtil.class); PowerMockito.whenNew(LiquibaseSchemaResolver.class).withArguments(SYSTEM_ID, PUBLIC_ID, resourceAccessor).thenReturn(liquibaseSchemaResolver); when(liquibaseSchemaResolver.resolve(parser)).thenReturn(inputSource); when(liquibaseSchemaResolver.resolve(serializer)).thenReturn(inputSource); liquibaseEntityResolver = new LiquibaseEntityResolver(parser); liquibaseEntityResolver.useResoureAccessor(resourceAccessor, BASE_PATH); } @Test public void shouldReturnNullSystemIdIsNull() throws Exception { InputSource result = liquibaseEntityResolver.resolveEntity(NAME, PUBLIC_ID, BASE_URI, null); assertThat(result).isNull(); } @Test public void systemIdStartingWithMigratorShouldBeReplacedByDbChangelog() throws Exception { PowerMockito.whenNew(LiquibaseSchemaResolver.class).withArguments(SYSTEM_ID_FROM_MIGRATOR_PATH, PUBLIC_ID, resourceAccessor).thenReturn(liquibaseSchemaResolver); InputSource result = liquibaseEntityResolver.resolveEntity(NAME, PUBLIC_ID, BASE_URI, SYSTEM_ID_WITH_MIGRATOR_PATH); assertThat(result).isSameAs(inputSource); } @Test public void shouldReturnSchemaResolverResultWhenSystemIdIsValidXsd() throws IOException, SAXException { InputSource result = liquibaseEntityResolver.resolveEntity(NAME, PUBLIC_ID, BASE_URI, SYSTEM_ID); assertThat(result).isSameAs(inputSource); } @Test public void shouldReturnSchemaResolverResultWhenSystemIdIsValidXsdAndSerializerIsNotNull() throws IOException, SAXException { liquibaseEntityResolver = new LiquibaseEntityResolver(serializer); liquibaseEntityResolver.useResoureAccessor(resourceAccessor, BASE_PATH); InputSource result = liquibaseEntityResolver.resolveEntity(NAME, PUBLIC_ID, BASE_URI, SYSTEM_ID); assertThat(result).isSameAs(inputSource); } @Test public void whenSystemIdIsNotXsdLoadResourceFromBasepathWithResourceAccessor() throws IOException, SAXException { PowerMockito.when(StreamUtil.singleInputStream(PATH_AND_SYSTEM_ID, resourceAccessor)).thenReturn(inputStream); InputSource result = liquibaseEntityResolver.resolveEntity(NAME, PUBLIC_ID, BASE_URI, FILE_SYSTEM_ID); assertThat(result.getByteStream()).isEqualTo(inputStream); } @Test public void whenSystemIdIsNotXsdAndResourceCouldNotBeLoadedFromResourceAccessorReturnNull() throws IOException, SAXException { PowerMockito.when(StreamUtil.singleInputStream(PATH_AND_SYSTEM_ID, resourceAccessor)).thenReturn(null); InputSource result = liquibaseEntityResolver.resolveEntity(NAME, PUBLIC_ID, BASE_URI, FILE_SYSTEM_ID); assertThat(result).isEqualTo(null); } @Test public void whenSystemIdIsNotXsdAndResourceExceptionOccursReturnNull() throws IOException, SAXException { PowerMockito.when(StreamUtil.singleInputStream(PATH_AND_SYSTEM_ID, resourceAccessor)).thenThrow(new RuntimeException()); InputSource result = liquibaseEntityResolver.resolveEntity(NAME, PUBLIC_ID, BASE_URI, FILE_SYSTEM_ID); assertThat(result).isEqualTo(null); } @Test public void resolveEntityWithOnlyPublicIdAndSystemIdDelegatesToSchemResolver() throws IOException, SAXException { InputSource result = liquibaseEntityResolver.resolveEntity(PUBLIC_ID, SYSTEM_ID); assertThat(result).isSameAs(inputSource); } @Test public void getExternalSubsetShouldReturnNull() throws IOException, SAXException { InputSource externalSubset = liquibaseEntityResolver.getExternalSubset(NAME, BASE_URI); assertThat(externalSubset).isNull(); } }