Bootstrap migration strategies

This commit is contained in:
René Pfeuffer
2019-05-22 14:28:53 +02:00
parent 3d28f800be
commit 1674bc2e7d
11 changed files with 335 additions and 10 deletions

View File

@@ -0,0 +1,75 @@
package sonia.scm.repository.update;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.junitpioneer.jupiter.TempDirectory;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import sonia.scm.SCMContextProvider;
import sonia.scm.store.ConfigurationStoreFactory;
import sonia.scm.store.JAXBConfigurationStoreFactory;
import javax.xml.bind.JAXBException;
import java.nio.file.Path;
import java.util.Optional;
import static org.mockito.Mockito.when;
import static sonia.scm.repository.update.MigrationStrategy.INLINE;
@ExtendWith(MockitoExtension.class)
@ExtendWith(TempDirectory.class)
class MigrationStrategyDaoTest {
@Mock
SCMContextProvider contextProvider;
private ConfigurationStoreFactory storeFactory;
@BeforeEach
void initStore(@TempDirectory.TempDir Path tempDir) {
when(contextProvider.getBaseDirectory()).thenReturn(tempDir.toFile());
storeFactory = new JAXBConfigurationStoreFactory(contextProvider, null);
}
@Test
void shouldReturnEmptyOptionalWhenStoreIsEmpty() throws JAXBException {
MigrationStrategyDao dao = new MigrationStrategyDao(storeFactory);
Optional<MigrationStrategy> strategy = dao.get("any");
Assertions.assertThat(strategy).isEmpty();
}
@Test
void shouldReturnNewValue() throws JAXBException {
MigrationStrategyDao dao = new MigrationStrategyDao(storeFactory);
dao.set("id", INLINE);
Optional<MigrationStrategy> strategy = dao.get("id");
Assertions.assertThat(strategy).contains(INLINE);
}
@Nested
class WithExistingDatabase {
@BeforeEach
void initExistingDatabase() throws JAXBException {
MigrationStrategyDao dao = new MigrationStrategyDao(storeFactory);
dao.set("id", INLINE);
}
@Test
void shouldFindExistingValue() throws JAXBException {
MigrationStrategyDao dao = new MigrationStrategyDao(storeFactory);
Optional<MigrationStrategy> strategy = dao.get("id");
Assertions.assertThat(strategy).contains(INLINE);
}
}
}

View File

@@ -0,0 +1,24 @@
package sonia.scm.repository.update;
import com.google.inject.Injector;
import java.util.HashMap;
import java.util.Map;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
class MigrationStrategyMock {
static Injector init() {
Map<Class, MigrationStrategy.Instance> mocks = new HashMap<>();
Injector mock = mock(Injector.class);
when(
mock.getInstance(any(Class.class)))
.thenAnswer(
invocationOnMock -> mocks.getOrDefault(invocationOnMock.getArgument(0), mock(invocationOnMock.getArgument(0)))
);
return mock;
}
}

View File

@@ -1,5 +1,6 @@
package sonia.scm.repository.update;
import com.google.inject.Injector;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
@@ -21,21 +22,30 @@ import java.io.IOException;
import java.nio.file.Path;
import java.util.Optional;
import static java.util.Optional.of;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.lenient;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static sonia.scm.repository.update.MigrationStrategy.COPY;
import static sonia.scm.repository.update.MigrationStrategy.INLINE;
import static sonia.scm.repository.update.MigrationStrategy.MOVE;
@ExtendWith(MockitoExtension.class)
@ExtendWith(TempDirectory.class)
class XmlRepositoryV1UpdateStepTest {
Injector injectorMock = MigrationStrategyMock.init();
@Mock
SCMContextProvider contextProvider;
@Mock
XmlRepositoryDAO dao;
XmlRepositoryDAO repositoryDAO;
@Mock()
MigrationStrategyDao migrationStrategyDao;
@Captor
ArgumentCaptor<Repository> storeCaptor;
@@ -58,13 +68,20 @@ class XmlRepositoryV1UpdateStepTest {
@BeforeEach
void captureStoredRepositories() {
doNothing().when(dao).add(storeCaptor.capture());
doNothing().when(repositoryDAO).add(storeCaptor.capture());
}
@BeforeEach
void createMigrationPlan(@TempDirectory.TempDir Path tempDir) {
lenient().when(migrationStrategyDao.get("3b91caa5-59c3-448f-920b-769aaa56b761")).thenReturn(of(MOVE));
lenient().when(migrationStrategyDao.get("c1597b4f-a9f0-49f7-ad1f-37d3aae1c55f")).thenReturn(of(COPY));
lenient().when(migrationStrategyDao.get("454972da-faf9-4437-b682-dc4a4e0aa8eb")).thenReturn(of(INLINE));
}
@Test
void shouldCreateNewRepositories() throws JAXBException {
updateStep.doUpdate();
verify(dao, times(3)).add(any());
verify(repositoryDAO, times(3)).add(any());
}
@Test