Merged in feature/extract_properties_v1 (pull request #260)

Feature extract properties v1
This commit is contained in:
Sebastian Sdorra
2019-06-04 07:23:54 +00:00
32 changed files with 259 additions and 127 deletions

View File

@@ -1,4 +1,4 @@
package sonia.scm.group.update;
package sonia.scm.update.group;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -8,7 +8,10 @@ import sonia.scm.group.xml.XmlGroupDAO;
import sonia.scm.migration.UpdateException;
import sonia.scm.migration.UpdateStep;
import sonia.scm.plugin.Extension;
import sonia.scm.store.ConfigurationEntryStore;
import sonia.scm.store.ConfigurationEntryStoreFactory;
import sonia.scm.store.StoreConstants;
import sonia.scm.update.properties.V1Properties;
import sonia.scm.version.Version;
import javax.inject.Inject;
@@ -18,12 +21,11 @@ import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import static java.util.Optional.empty;
@@ -37,11 +39,20 @@ public class XmlGroupV1UpdateStep implements UpdateStep {
private final SCMContextProvider contextProvider;
private final XmlGroupDAO groupDAO;
private final ConfigurationEntryStore<V1Properties> propertyStore;
@Inject
public XmlGroupV1UpdateStep(SCMContextProvider contextProvider, XmlGroupDAO groupDAO) {
public XmlGroupV1UpdateStep(
SCMContextProvider contextProvider,
XmlGroupDAO groupDAO,
ConfigurationEntryStoreFactory configurationEntryStoreFactory
) {
this.contextProvider = contextProvider;
this.groupDAO = groupDAO;
this.propertyStore = configurationEntryStoreFactory
.withType(V1Properties.class)
.withName("group-properties-v1")
.build();
}
@Override
@@ -52,7 +63,7 @@ public class XmlGroupV1UpdateStep implements UpdateStep {
return;
}
XmlGroupV1UpdateStep.V1GroupDatabase v1Database = readV1Database(v1GroupsFile.get());
v1Database.groupList.groups.forEach(group -> update(group));
v1Database.groupList.groups.forEach(this::update);
}
@Override
@@ -75,6 +86,8 @@ public class XmlGroupV1UpdateStep implements UpdateStep {
group.setCreationDate(v1Group.creationDate);
group.setLastModified(v1Group.lastModified);
groupDAO.add(group);
propertyStore.put(v1Group.name, v1Group.properties);
}
private XmlGroupV1UpdateStep.V1GroupDatabase readV1Database(Path v1GroupsFile) throws JAXBException {
@@ -83,9 +96,8 @@ public class XmlGroupV1UpdateStep implements UpdateStep {
}
private Optional<Path> determineV1File() {
Path configDirectory = determineConfigDirectory();
Path existingGroupsFile = configDirectory.resolve("groups" + StoreConstants.FILE_EXTENSION);
Path groupsV1File = configDirectory.resolve("groupsV1" + StoreConstants.FILE_EXTENSION);
Path existingGroupsFile = resolveConfigFile("groups");
Path groupsV1File = resolveConfigFile("groupsV1");
if (existingGroupsFile.toFile().exists()) {
try {
Files.move(existingGroupsFile, groupsV1File);
@@ -98,14 +110,17 @@ public class XmlGroupV1UpdateStep implements UpdateStep {
return empty();
}
private Path determineConfigDirectory() {
return new File(contextProvider.getBaseDirectory(), StoreConstants.CONFIG_DIRECTORY_NAME).toPath();
private Path resolveConfigFile(String name) {
return contextProvider
.resolve(
Paths.get(StoreConstants.CONFIG_DIRECTORY_NAME).resolve(name + StoreConstants.FILE_EXTENSION)
);
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "group")
private static class V1Group {
private Map<String, String> properties;
private V1Properties properties;
private long creationDate;
private String description;
private Long lastModified;

View File

@@ -0,0 +1,14 @@
package sonia.scm.update.properties;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.List;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "properties")
public class V1Properties {
@XmlElement(name = "item")
private List<V1Property> properties;
}

View File

@@ -0,0 +1,10 @@
package sonia.scm.update.properties;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
@XmlAccessorType(XmlAccessType.FIELD)
public class V1Property {
private String key;
private String value;
}

View File

@@ -1,4 +1,4 @@
package sonia.scm.repository.update;
package sonia.scm.update.repository;
import sonia.scm.SCMContextProvider;
import sonia.scm.migration.UpdateException;

View File

@@ -1,4 +1,4 @@
package sonia.scm.repository.update;
package sonia.scm.update.repository;
import sonia.scm.SCMContextProvider;
import sonia.scm.repository.RepositoryDirectoryHandler;

View File

@@ -1,4 +1,4 @@
package sonia.scm.repository.update;
package sonia.scm.update.repository;
import sonia.scm.SCMContextProvider;
import sonia.scm.repository.RepositoryDirectoryHandler;

View File

@@ -1,4 +1,4 @@
package sonia.scm.repository.update;
package sonia.scm.update.repository;
import com.google.inject.Injector;

View File

@@ -1,4 +1,4 @@
package sonia.scm.repository.update;
package sonia.scm.update.repository;
import sonia.scm.store.ConfigurationStore;
import sonia.scm.store.ConfigurationStoreFactory;

View File

@@ -1,4 +1,4 @@
package sonia.scm.repository.update;
package sonia.scm.update.repository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

View File

@@ -1,4 +1,4 @@
package sonia.scm.repository.update;
package sonia.scm.update.repository;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;

View File

@@ -1,4 +1,4 @@
package sonia.scm.repository.update;
package sonia.scm.update.repository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

View File

@@ -1,4 +1,4 @@
package sonia.scm.repository.update;
package sonia.scm.update.repository;
import com.google.inject.Injector;
import org.slf4j.Logger;
@@ -13,6 +13,7 @@ import sonia.scm.repository.xml.XmlRepositoryDAO;
import sonia.scm.store.ConfigurationEntryStore;
import sonia.scm.store.ConfigurationEntryStoreFactory;
import sonia.scm.store.StoreConstants;
import sonia.scm.update.properties.V1Properties;
import sonia.scm.version.Version;
import javax.inject.Inject;
@@ -26,6 +27,7 @@ import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
@@ -93,7 +95,7 @@ public class XmlRepositoryV1UpdateStep implements UpdateStep {
@Override
public void doUpdate() throws JAXBException {
if (!determineV1File().exists()) {
if (!resolveV1File().exists()) {
LOG.info("no v1 repositories database file found");
return;
}
@@ -178,7 +180,7 @@ public class XmlRepositoryV1UpdateStep implements UpdateStep {
}
private Optional<V1RepositoryDatabase> readV1Database(JAXBContext jaxbContext) throws JAXBException {
Object unmarshal = jaxbContext.createUnmarshaller().unmarshal(determineV1File());
Object unmarshal = jaxbContext.createUnmarshaller().unmarshal(resolveV1File());
if (unmarshal instanceof V1RepositoryDatabase) {
return of((V1RepositoryDatabase) unmarshal);
} else {
@@ -186,9 +188,11 @@ public class XmlRepositoryV1UpdateStep implements UpdateStep {
}
}
private File determineV1File() {
File configDirectory = new File(contextProvider.getBaseDirectory(), StoreConstants.CONFIG_DIRECTORY_NAME);
return new File(configDirectory, "repositories" + StoreConstants.FILE_EXTENSION);
private File resolveV1File() {
return contextProvider
.resolve(
Paths.get(StoreConstants.CONFIG_DIRECTORY_NAME).resolve("repositories" + StoreConstants.FILE_EXTENSION)
).toFile();
}
@XmlAccessorType(XmlAccessType.FIELD)
@@ -199,19 +203,6 @@ public class XmlRepositoryV1UpdateStep implements UpdateStep {
private String type;
}
@XmlAccessorType(XmlAccessType.FIELD)
private static class V1Property {
private String key;
private String value;
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "properties")
private static class V1Properties {
@XmlElement(name = "item")
private List<V1Property> properties;
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "repositories")
private static class V1Repository {

View File

@@ -1,4 +1,4 @@
package sonia.scm.security.update;
package sonia.scm.update.security;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

View File

@@ -1,4 +1,4 @@
package sonia.scm.user.update;
package sonia.scm.update.user;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -10,6 +10,7 @@ import sonia.scm.security.AssignedPermission;
import sonia.scm.store.ConfigurationEntryStore;
import sonia.scm.store.ConfigurationEntryStoreFactory;
import sonia.scm.store.StoreConstants;
import sonia.scm.update.properties.V1Properties;
import sonia.scm.user.User;
import sonia.scm.user.xml.XmlUserDAO;
import sonia.scm.version.Version;
@@ -21,12 +22,11 @@ import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import static java.util.Optional.empty;
@@ -41,12 +41,17 @@ public class XmlUserV1UpdateStep implements UpdateStep {
private final SCMContextProvider contextProvider;
private final XmlUserDAO userDAO;
private final ConfigurationEntryStoreFactory configurationEntryStoreFactory;
private final ConfigurationEntryStore<V1Properties> propertyStore;
@Inject
public XmlUserV1UpdateStep(SCMContextProvider contextProvider, XmlUserDAO userDAO, ConfigurationEntryStoreFactory configurationEntryStoreFactory) {
this.contextProvider = contextProvider;
this.userDAO = userDAO;
this.configurationEntryStoreFactory = configurationEntryStoreFactory;
this.propertyStore = configurationEntryStoreFactory
.withType(V1Properties.class)
.withName("user-properties-v1")
.build();
}
@Override
@@ -88,6 +93,8 @@ public class XmlUserV1UpdateStep implements UpdateStep {
LOG.debug("setting admin permissions for user {}", v1User.name);
securityStore.put(new AssignedPermission(v1User.name, "*"));
}
propertyStore.put(v1User.name, v1User.properties);
}
private XmlUserV1UpdateStep.V1UserDatabase readV1Database(Path v1UsersFile) throws JAXBException {
@@ -100,9 +107,8 @@ public class XmlUserV1UpdateStep implements UpdateStep {
}
private Optional<Path> determineV1File() {
Path configDirectory = determineConfigDirectory();
Path existingUsersFile = configDirectory.resolve("users" + StoreConstants.FILE_EXTENSION);
Path usersV1File = configDirectory.resolve("usersV1" + StoreConstants.FILE_EXTENSION);
Path existingUsersFile = resolveConfigFile("users");
Path usersV1File = resolveConfigFile("usersV1");
if (existingUsersFile.toFile().exists()) {
try {
Files.move(existingUsersFile, usersV1File);
@@ -115,14 +121,17 @@ public class XmlUserV1UpdateStep implements UpdateStep {
return empty();
}
private Path determineConfigDirectory() {
return new File(contextProvider.getBaseDirectory(), StoreConstants.CONFIG_DIRECTORY_NAME).toPath();
private Path resolveConfigFile(String name) {
return contextProvider
.resolve(
Paths.get(StoreConstants.CONFIG_DIRECTORY_NAME).resolve(name + StoreConstants.FILE_EXTENSION)
);
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "user")
private static class V1User {
private Map<String, String> properties;
private V1Properties properties;
private boolean admin;
private long creationDate;
private String displayName;

View File

@@ -0,0 +1,65 @@
package sonia.scm.update;
import com.google.common.io.Resources;
import org.mockito.Mockito;
import sonia.scm.SCMContextProvider;
import sonia.scm.security.AssignedPermission;
import sonia.scm.security.DefaultKeyGenerator;
import sonia.scm.store.ConfigurationEntryStore;
import sonia.scm.store.ConfigurationEntryStoreFactory;
import sonia.scm.store.JAXBConfigurationEntryStoreFactory;
import java.io.IOException;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.lenient;
public class UpdateStepTestUtil {
private final SCMContextProvider contextProvider;
private final Path tempDir;
private final ConfigurationEntryStoreFactory storeFactory;
public UpdateStepTestUtil(Path tempDir) {
this.tempDir = tempDir;
contextProvider = Mockito.mock(SCMContextProvider.class);
storeFactory = new JAXBConfigurationEntryStoreFactory(contextProvider, null, new DefaultKeyGenerator());
lenient().when(contextProvider.getBaseDirectory()).thenReturn(tempDir.toFile());
lenient().when(contextProvider.resolve(any())).thenAnswer(invocation -> tempDir.resolve(invocation.getArgument(0).toString()));
}
public SCMContextProvider getContextProvider() {
return contextProvider;
}
public ConfigurationEntryStoreFactory getStoreFactory() {
return storeFactory;
}
public void copyConfigFile(String fileName) throws IOException {
Path configDir = tempDir.resolve("config");
Files.createDirectories(configDir);
copyTestDatabaseFile(configDir, fileName);
}
public ConfigurationEntryStore<AssignedPermission> getStoreForConfigFile(String name) {
return storeFactory
.withType(AssignedPermission.class)
.withName(name)
.build();
}
public Path getFile(String name) {
return tempDir.resolve("config").resolve(name);
}
private void copyTestDatabaseFile(Path configDir, String fileName) throws IOException {
URL url = Resources.getResource(fileName);
Files.copy(url.openStream(), configDir.resolve(Paths.get(fileName).getFileName()));
}
}

View File

@@ -1,6 +1,5 @@
package sonia.scm.group.update;
package sonia.scm.update.group;
import com.google.common.io.Resources;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
@@ -10,34 +9,27 @@ import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import sonia.scm.SCMContextProvider;
import sonia.scm.group.Group;
import sonia.scm.group.xml.XmlGroupDAO;
import sonia.scm.security.AssignedPermission;
import sonia.scm.store.ConfigurationEntryStore;
import sonia.scm.store.InMemoryConfigurationEntryStore;
import sonia.scm.update.UpdateStepTestUtil;
import javax.xml.bind.JAXBException;
import java.io.IOException;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Optional;
import static java.util.Arrays.asList;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.linesOf;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class)
@ExtendWith(TempDirectory.class)
class XmlGroupV1UpdateStepTest {
@Mock
SCMContextProvider contextProvider;
@Mock
XmlGroupDAO groupDAO;
@@ -45,13 +37,14 @@ class XmlGroupV1UpdateStepTest {
ArgumentCaptor<Group> groupCaptor;
XmlGroupV1UpdateStep updateStep;
ConfigurationEntryStore<AssignedPermission> assignedPermissionStore;
private UpdateStepTestUtil testUtil;
@BeforeEach
void mockScmHome(@TempDirectory.TempDir Path tempDir) {
when(contextProvider.getBaseDirectory()).thenReturn(tempDir.toFile());
assignedPermissionStore = new InMemoryConfigurationEntryStore<>();
updateStep = new XmlGroupV1UpdateStep(contextProvider, groupDAO);
testUtil = new UpdateStepTestUtil(tempDir);
updateStep = new XmlGroupV1UpdateStep(testUtil.getContextProvider(), groupDAO, testUtil.getStoreFactory());
}
@Nested
@@ -63,10 +56,8 @@ class XmlGroupV1UpdateStepTest {
}
@BeforeEach
void createGroupV1XML(@TempDirectory.TempDir Path tempDir) throws IOException {
Path configDir = tempDir.resolve("config");
Files.createDirectories(configDir);
copyTestDatabaseFile(configDir, "groups.xml");
void createGroupV1XML() throws IOException {
testUtil.copyConfigFile("sonia/scm/update/group/groups.xml");
}
@Test
@@ -88,11 +79,24 @@ class XmlGroupV1UpdateStepTest {
.hasFieldOrPropertyWithValue("lastModified", 1559550955883L)
.hasFieldOrPropertyWithValue("creationDate", 1559548942457L);
}
}
private void copyTestDatabaseFile(Path configDir, String groupsFileName) throws IOException {
URL url = Resources.getResource("sonia/scm/group/update/" + groupsFileName);
Files.copy(url.openStream(), configDir.resolve(groupsFileName));
@Test
void shouldExtractProperties() throws JAXBException {
updateStep.doUpdate();
Path propertiesFile = testUtil.getFile("group-properties-v1.xml");
assertThat(propertiesFile)
.exists();
assertThat(linesOf(propertiesFile.toFile()))
.extracting(String::trim)
.containsSequence(
"<key>normals</key>",
"<value>",
"<item>",
"<key>mostly</key>",
"<value>humans</value>",
"</item>",
"</value>");
}
}
@Test

View File

@@ -1,4 +1,4 @@
package sonia.scm.repository.update;
package sonia.scm.update.repository;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

View File

@@ -1,4 +1,4 @@
package sonia.scm.repository.update;
package sonia.scm.update.repository;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

View File

@@ -1,4 +1,4 @@
package sonia.scm.repository.update;
package sonia.scm.update.repository;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
@@ -11,13 +11,15 @@ import org.mockito.junit.jupiter.MockitoExtension;
import sonia.scm.SCMContextProvider;
import sonia.scm.store.ConfigurationStoreFactory;
import sonia.scm.store.JAXBConfigurationStoreFactory;
import sonia.scm.update.repository.MigrationStrategy;
import sonia.scm.update.repository.MigrationStrategyDao;
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;
import static sonia.scm.update.repository.MigrationStrategy.INLINE;
@ExtendWith(MockitoExtension.class)
@ExtendWith(TempDirectory.class)

View File

@@ -1,7 +1,7 @@
package sonia.scm.repository.update;
package sonia.scm.update.repository;
import com.google.inject.Injector;
import sonia.scm.repository.update.MigrationStrategy.Instance;
import sonia.scm.update.repository.MigrationStrategy.Instance;
import java.util.HashMap;
import java.util.Map;

View File

@@ -1,4 +1,4 @@
package sonia.scm.repository.update;
package sonia.scm.update.repository;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

View File

@@ -1,4 +1,4 @@
package sonia.scm.repository.update;
package sonia.scm.update.repository;
import sonia.scm.repository.spi.ZippedRepositoryTestBase;
@@ -62,6 +62,6 @@ class V1RepositoryFileSystem {
* </pre>
*/
static void createV1Home(Path tempDir) throws IOException {
ZippedRepositoryTestBase.extract(tempDir.toFile(), "sonia/scm/repository/update/scm-home.v1.zip");
ZippedRepositoryTestBase.extract(tempDir.toFile(), "sonia/scm/update/repository/scm-home.v1.zip");
}
}

View File

@@ -1,4 +1,4 @@
package sonia.scm.repository.update;
package sonia.scm.update.repository;
import com.google.common.io.Resources;
import org.junit.jupiter.api.BeforeEach;
@@ -31,7 +31,7 @@ class XmlRepositoryFileNameUpdateStepTest {
@Test
void shouldCopyRepositoriesFileToRepositoryPathsFile(@TempDirectory.TempDir Path tempDir) throws JAXBException, IOException {
XmlRepositoryFileNameUpdateStep updateStep = new XmlRepositoryFileNameUpdateStep(contextProvider);
URL url = Resources.getResource("sonia/scm/repository/update/formerV2RepositoryFile.xml");
URL url = Resources.getResource("sonia/scm/update/repository/formerV2RepositoryFile.xml");
Path configDir = tempDir.resolve("config");
Files.createDirectories(configDir);
Files.copy(url.openStream(), configDir.resolve("repositories.xml"));

View File

@@ -1,4 +1,4 @@
package sonia.scm.repository.update;
package sonia.scm.update.repository;
import com.google.common.io.Resources;
import com.google.inject.Injector;
@@ -11,7 +11,6 @@ import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import sonia.scm.SCMContextProvider;
import sonia.scm.repository.Repository;
import sonia.scm.repository.RepositoryPermission;
import sonia.scm.repository.xml.XmlRepositoryDAO;
@@ -19,6 +18,7 @@ import sonia.scm.store.ConfigurationEntryStore;
import sonia.scm.store.ConfigurationEntryStoreFactory;
import sonia.scm.store.InMemoryConfigurationEntryStore;
import sonia.scm.store.InMemoryConfigurationEntryStoreFactory;
import sonia.scm.update.UpdateStepTestUtil;
import javax.xml.bind.JAXBException;
import java.io.IOException;
@@ -36,9 +36,9 @@ 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;
import static sonia.scm.update.repository.MigrationStrategy.COPY;
import static sonia.scm.update.repository.MigrationStrategy.INLINE;
import static sonia.scm.update.repository.MigrationStrategy.MOVE;
@ExtendWith(MockitoExtension.class)
@ExtendWith(TempDirectory.class)
@@ -46,8 +46,6 @@ class XmlRepositoryV1UpdateStepTest {
Injector injectorMock = MigrationStrategyMock.init();
@Mock
SCMContextProvider contextProvider;
@Mock
XmlRepositoryDAO repositoryDAO;
@Mock
@@ -60,17 +58,15 @@ class XmlRepositoryV1UpdateStepTest {
@Captor
ArgumentCaptor<Path> locationCaptor;
UpdateStepTestUtil testUtil;
XmlRepositoryV1UpdateStep updateStep;
@BeforeEach
void mockScmHome(@TempDirectory.TempDir Path tempDir) {
when(contextProvider.getBaseDirectory()).thenReturn(tempDir.toFile());
}
@BeforeEach
void createUpdateStepFromMocks() {
void createUpdateStepFromMocks(@TempDirectory.TempDir Path tempDir) {
testUtil = new UpdateStepTestUtil(tempDir);
updateStep = new XmlRepositoryV1UpdateStep(
contextProvider,
testUtil.getContextProvider(),
repositoryDAO,
migrationStrategyDao,
injectorMock,
@@ -226,7 +222,7 @@ class XmlRepositoryV1UpdateStepTest {
}
private void createFormerV2RepositoriesFile(@TempDirectory.TempDir Path tempDir) throws IOException {
URL url = Resources.getResource("sonia/scm/repository/update/formerV2RepositoryFile.xml");
URL url = Resources.getResource("sonia/scm/update/repository/formerV2RepositoryFile.xml");
Path configDir = tempDir.resolve("config");
Files.createDirectories(configDir);
Files.copy(url.openStream(), configDir.resolve("repositories.xml"));

View File

@@ -1,4 +1,4 @@
package sonia.scm.security.update;
package sonia.scm.update.security;
import com.google.common.io.Resources;
import org.junit.jupiter.api.BeforeEach;
@@ -14,6 +14,7 @@ import sonia.scm.store.ConfigurationEntryStore;
import sonia.scm.store.ConfigurationEntryStoreFactory;
import sonia.scm.store.InMemoryConfigurationEntryStore;
import sonia.scm.store.InMemoryConfigurationEntryStoreFactory;
import sonia.scm.update.security.XmlSecurityV1UpdateStep;
import javax.xml.bind.JAXBException;
import java.io.IOException;
@@ -82,7 +83,7 @@ class XmlSecurityV1UpdateStepTest {
}
private void copyTestDatabaseFile(Path configDir, String fileName) throws IOException {
URL url = Resources.getResource("sonia/scm/security/update/" + fileName);
URL url = Resources.getResource("sonia/scm/update/security/" + fileName);
Files.copy(url.openStream(), configDir.resolve(fileName));
}

View File

@@ -1,6 +1,5 @@
package sonia.scm.user.update;
package sonia.scm.update.user;
import com.google.common.io.Resources;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
@@ -10,35 +9,27 @@ import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import sonia.scm.SCMContextProvider;
import sonia.scm.security.AssignedPermission;
import sonia.scm.store.ConfigurationEntryStore;
import sonia.scm.store.ConfigurationEntryStoreFactory;
import sonia.scm.store.InMemoryConfigurationEntryStore;
import sonia.scm.store.InMemoryConfigurationEntryStoreFactory;
import sonia.scm.update.UpdateStepTestUtil;
import sonia.scm.user.User;
import sonia.scm.user.xml.XmlUserDAO;
import javax.xml.bind.JAXBException;
import java.io.IOException;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Optional;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.linesOf;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class)
@ExtendWith(TempDirectory.class)
class XmlUserV1UpdateStepTest {
@Mock
SCMContextProvider contextProvider;
@Mock
XmlUserDAO userDAO;
@@ -46,14 +37,13 @@ class XmlUserV1UpdateStepTest {
ArgumentCaptor<User> userCaptor;
XmlUserV1UpdateStep updateStep;
ConfigurationEntryStore<AssignedPermission> assignedPermissionStore;
private UpdateStepTestUtil testUtil;
@BeforeEach
void mockScmHome(@TempDirectory.TempDir Path tempDir) {
when(contextProvider.getBaseDirectory()).thenReturn(tempDir.toFile());
assignedPermissionStore = new InMemoryConfigurationEntryStore<>();
ConfigurationEntryStoreFactory inMemoryConfigurationEntryStoreFactory = new InMemoryConfigurationEntryStoreFactory(assignedPermissionStore);
updateStep = new XmlUserV1UpdateStep(contextProvider, userDAO, inMemoryConfigurationEntryStoreFactory);
testUtil = new UpdateStepTestUtil(tempDir);
updateStep = new XmlUserV1UpdateStep(testUtil.getContextProvider(), userDAO, testUtil.getStoreFactory());
}
@Nested
@@ -65,16 +55,20 @@ class XmlUserV1UpdateStepTest {
}
@BeforeEach
void createUserV1XML(@TempDirectory.TempDir Path tempDir) throws IOException {
Path configDir = tempDir.resolve("config");
Files.createDirectories(configDir);
copyTestDatabaseFile(configDir, "users.xml");
void createUserV1XML() throws IOException {
testUtil.copyConfigFile("sonia/scm/update/user/users.xml");
}
@Test
void shouldCreateNewPermissionsForV1AdminUser() throws JAXBException {
updateStep.doUpdate();
Optional<AssignedPermission> assignedPermission = assignedPermissionStore.getAll().values().stream().filter(a -> a.getName().equals("scmadmin")).findFirst();
Optional<AssignedPermission> assignedPermission =
testUtil.getStoreForConfigFile("security")
.getAll()
.values()
.stream()
.filter(a -> a.getName().equals("scmadmin"))
.findFirst();
assertThat(assignedPermission.get().getPermission().getValue()).contains("*");
assertThat(assignedPermission.get().isGroupPermission()).isFalse();
}
@@ -100,11 +94,28 @@ class XmlUserV1UpdateStepTest {
.hasFieldOrPropertyWithValue("lastModified", 1558597367492L)
.hasFieldOrPropertyWithValue("creationDate", 1558597074732L);
}
}
private void copyTestDatabaseFile(Path configDir, String usersFileName) throws IOException {
URL url = Resources.getResource("sonia/scm/user/update/" + usersFileName);
Files.copy(url.openStream(), configDir.resolve(usersFileName));
@Test
void shouldExtractProperties() throws JAXBException {
updateStep.doUpdate();
Path propertiesFile = testUtil.getFile("user-properties-v1.xml");
assertThat(propertiesFile)
.exists();
assertThat(linesOf(propertiesFile.toFile()))
.extracting(String::trim)
.containsSequence(
"<key>dent</key>",
"<value>",
"<item>",
"<key>born.on</key>",
"<value>earth</value>",
"</item>",
"<item>",
"<key>last.seen</key>",
"<value>end of the universe</value>",
"</item>",
"</value>");
}
}
@Test

View File

@@ -11,7 +11,12 @@
<type>xml</type>
</group>
<group>
<properties/>
<properties>
<item>
<key>mostly</key>
<value>humans</value>
</item>
</properties>
<creationDate>1559548942457</creationDate>
<description>Normal people</description>
<name>normals</name>

View File

@@ -24,7 +24,16 @@
<type>xml</type>
</user>
<user>
<properties/>
<properties>
<item>
<key>born.on</key>
<value>earth</value>
</item>
<item>
<key>last.seen</key>
<value>end of the universe</value>
</item>
</properties>
<admin>false</admin>
<creationDate>1558597107621</creationDate>
<displayName>Arthur Dent</displayName>