diff --git a/scm-webapp/src/main/java/sonia/scm/group/update/XmlGroupV1UpdateStep.java b/scm-webapp/src/main/java/sonia/scm/update/group/XmlGroupV1UpdateStep.java similarity index 78% rename from scm-webapp/src/main/java/sonia/scm/group/update/XmlGroupV1UpdateStep.java rename to scm-webapp/src/main/java/sonia/scm/update/group/XmlGroupV1UpdateStep.java index 146a709e7f..9622af0f34 100644 --- a/scm-webapp/src/main/java/sonia/scm/group/update/XmlGroupV1UpdateStep.java +++ b/scm-webapp/src/main/java/sonia/scm/update/group/XmlGroupV1UpdateStep.java @@ -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 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 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 properties; + private V1Properties properties; private long creationDate; private String description; private Long lastModified; diff --git a/scm-webapp/src/main/java/sonia/scm/update/properties/V1Properties.java b/scm-webapp/src/main/java/sonia/scm/update/properties/V1Properties.java new file mode 100644 index 0000000000..3c8555a76e --- /dev/null +++ b/scm-webapp/src/main/java/sonia/scm/update/properties/V1Properties.java @@ -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 properties; +} diff --git a/scm-webapp/src/main/java/sonia/scm/update/properties/V1Property.java b/scm-webapp/src/main/java/sonia/scm/update/properties/V1Property.java new file mode 100644 index 0000000000..c92c15188d --- /dev/null +++ b/scm-webapp/src/main/java/sonia/scm/update/properties/V1Property.java @@ -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; +} diff --git a/scm-webapp/src/main/java/sonia/scm/repository/update/BaseMigrationStrategy.java b/scm-webapp/src/main/java/sonia/scm/update/repository/BaseMigrationStrategy.java similarity index 97% rename from scm-webapp/src/main/java/sonia/scm/repository/update/BaseMigrationStrategy.java rename to scm-webapp/src/main/java/sonia/scm/update/repository/BaseMigrationStrategy.java index 3ac0a6fd68..adb903af51 100644 --- a/scm-webapp/src/main/java/sonia/scm/repository/update/BaseMigrationStrategy.java +++ b/scm-webapp/src/main/java/sonia/scm/update/repository/BaseMigrationStrategy.java @@ -1,4 +1,4 @@ -package sonia.scm.repository.update; +package sonia.scm.update.repository; import sonia.scm.SCMContextProvider; import sonia.scm.migration.UpdateException; diff --git a/scm-webapp/src/main/java/sonia/scm/repository/update/CopyMigrationStrategy.java b/scm-webapp/src/main/java/sonia/scm/update/repository/CopyMigrationStrategy.java similarity index 97% rename from scm-webapp/src/main/java/sonia/scm/repository/update/CopyMigrationStrategy.java rename to scm-webapp/src/main/java/sonia/scm/update/repository/CopyMigrationStrategy.java index c5550b29af..060ed6704e 100644 --- a/scm-webapp/src/main/java/sonia/scm/repository/update/CopyMigrationStrategy.java +++ b/scm-webapp/src/main/java/sonia/scm/update/repository/CopyMigrationStrategy.java @@ -1,4 +1,4 @@ -package sonia.scm.repository.update; +package sonia.scm.update.repository; import sonia.scm.SCMContextProvider; import sonia.scm.repository.RepositoryDirectoryHandler; diff --git a/scm-webapp/src/main/java/sonia/scm/repository/update/InlineMigrationStrategy.java b/scm-webapp/src/main/java/sonia/scm/update/repository/InlineMigrationStrategy.java similarity index 97% rename from scm-webapp/src/main/java/sonia/scm/repository/update/InlineMigrationStrategy.java rename to scm-webapp/src/main/java/sonia/scm/update/repository/InlineMigrationStrategy.java index ace6a63ab8..62dd67d86a 100644 --- a/scm-webapp/src/main/java/sonia/scm/repository/update/InlineMigrationStrategy.java +++ b/scm-webapp/src/main/java/sonia/scm/update/repository/InlineMigrationStrategy.java @@ -1,4 +1,4 @@ -package sonia.scm.repository.update; +package sonia.scm.update.repository; import sonia.scm.SCMContextProvider; import sonia.scm.repository.RepositoryDirectoryHandler; diff --git a/scm-webapp/src/main/java/sonia/scm/repository/update/MigrationStrategy.java b/scm-webapp/src/main/java/sonia/scm/update/repository/MigrationStrategy.java similarity index 93% rename from scm-webapp/src/main/java/sonia/scm/repository/update/MigrationStrategy.java rename to scm-webapp/src/main/java/sonia/scm/update/repository/MigrationStrategy.java index 6ff631208c..c7bb2cba86 100644 --- a/scm-webapp/src/main/java/sonia/scm/repository/update/MigrationStrategy.java +++ b/scm-webapp/src/main/java/sonia/scm/update/repository/MigrationStrategy.java @@ -1,4 +1,4 @@ -package sonia.scm.repository.update; +package sonia.scm.update.repository; import com.google.inject.Injector; diff --git a/scm-webapp/src/main/java/sonia/scm/repository/update/MigrationStrategyDao.java b/scm-webapp/src/main/java/sonia/scm/update/repository/MigrationStrategyDao.java similarity index 95% rename from scm-webapp/src/main/java/sonia/scm/repository/update/MigrationStrategyDao.java rename to scm-webapp/src/main/java/sonia/scm/update/repository/MigrationStrategyDao.java index f98e697468..15c931bf31 100644 --- a/scm-webapp/src/main/java/sonia/scm/repository/update/MigrationStrategyDao.java +++ b/scm-webapp/src/main/java/sonia/scm/update/repository/MigrationStrategyDao.java @@ -1,4 +1,4 @@ -package sonia.scm.repository.update; +package sonia.scm.update.repository; import sonia.scm.store.ConfigurationStore; import sonia.scm.store.ConfigurationStoreFactory; diff --git a/scm-webapp/src/main/java/sonia/scm/repository/update/MoveMigrationStrategy.java b/scm-webapp/src/main/java/sonia/scm/update/repository/MoveMigrationStrategy.java similarity index 98% rename from scm-webapp/src/main/java/sonia/scm/repository/update/MoveMigrationStrategy.java rename to scm-webapp/src/main/java/sonia/scm/update/repository/MoveMigrationStrategy.java index e42d4138bb..08d71dd376 100644 --- a/scm-webapp/src/main/java/sonia/scm/repository/update/MoveMigrationStrategy.java +++ b/scm-webapp/src/main/java/sonia/scm/update/repository/MoveMigrationStrategy.java @@ -1,4 +1,4 @@ -package sonia.scm.repository.update; +package sonia.scm.update.repository; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/scm-webapp/src/main/java/sonia/scm/repository/update/RepositoryMigrationPlan.java b/scm-webapp/src/main/java/sonia/scm/update/repository/RepositoryMigrationPlan.java similarity index 98% rename from scm-webapp/src/main/java/sonia/scm/repository/update/RepositoryMigrationPlan.java rename to scm-webapp/src/main/java/sonia/scm/update/repository/RepositoryMigrationPlan.java index 126bca8a23..f2b2dc9788 100644 --- a/scm-webapp/src/main/java/sonia/scm/repository/update/RepositoryMigrationPlan.java +++ b/scm-webapp/src/main/java/sonia/scm/update/repository/RepositoryMigrationPlan.java @@ -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; diff --git a/scm-webapp/src/main/java/sonia/scm/repository/update/XmlRepositoryFileNameUpdateStep.java b/scm-webapp/src/main/java/sonia/scm/update/repository/XmlRepositoryFileNameUpdateStep.java similarity index 98% rename from scm-webapp/src/main/java/sonia/scm/repository/update/XmlRepositoryFileNameUpdateStep.java rename to scm-webapp/src/main/java/sonia/scm/update/repository/XmlRepositoryFileNameUpdateStep.java index 765f3c6317..62902713f0 100644 --- a/scm-webapp/src/main/java/sonia/scm/repository/update/XmlRepositoryFileNameUpdateStep.java +++ b/scm-webapp/src/main/java/sonia/scm/update/repository/XmlRepositoryFileNameUpdateStep.java @@ -1,4 +1,4 @@ -package sonia.scm.repository.update; +package sonia.scm.update.repository; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/scm-webapp/src/main/java/sonia/scm/repository/update/XmlRepositoryV1UpdateStep.java b/scm-webapp/src/main/java/sonia/scm/update/repository/XmlRepositoryV1UpdateStep.java similarity index 92% rename from scm-webapp/src/main/java/sonia/scm/repository/update/XmlRepositoryV1UpdateStep.java rename to scm-webapp/src/main/java/sonia/scm/update/repository/XmlRepositoryV1UpdateStep.java index 813d42818f..34c08fb16b 100644 --- a/scm-webapp/src/main/java/sonia/scm/repository/update/XmlRepositoryV1UpdateStep.java +++ b/scm-webapp/src/main/java/sonia/scm/update/repository/XmlRepositoryV1UpdateStep.java @@ -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 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 properties; - } - @XmlAccessorType(XmlAccessType.FIELD) @XmlRootElement(name = "repositories") private static class V1Repository { diff --git a/scm-webapp/src/main/java/sonia/scm/security/update/XmlSecurityV1UpdateStep.java b/scm-webapp/src/main/java/sonia/scm/update/security/XmlSecurityV1UpdateStep.java similarity index 99% rename from scm-webapp/src/main/java/sonia/scm/security/update/XmlSecurityV1UpdateStep.java rename to scm-webapp/src/main/java/sonia/scm/update/security/XmlSecurityV1UpdateStep.java index 52bf8124e3..f62b81b5df 100644 --- a/scm-webapp/src/main/java/sonia/scm/security/update/XmlSecurityV1UpdateStep.java +++ b/scm-webapp/src/main/java/sonia/scm/update/security/XmlSecurityV1UpdateStep.java @@ -1,4 +1,4 @@ -package sonia.scm.security.update; +package sonia.scm.update.security; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/scm-webapp/src/main/java/sonia/scm/user/update/XmlUserV1UpdateStep.java b/scm-webapp/src/main/java/sonia/scm/update/user/XmlUserV1UpdateStep.java similarity index 87% rename from scm-webapp/src/main/java/sonia/scm/user/update/XmlUserV1UpdateStep.java rename to scm-webapp/src/main/java/sonia/scm/update/user/XmlUserV1UpdateStep.java index 8c5e760710..24d96d3654 100644 --- a/scm-webapp/src/main/java/sonia/scm/user/update/XmlUserV1UpdateStep.java +++ b/scm-webapp/src/main/java/sonia/scm/update/user/XmlUserV1UpdateStep.java @@ -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 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 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 properties; + private V1Properties properties; private boolean admin; private long creationDate; private String displayName; diff --git a/scm-webapp/src/test/java/sonia/scm/update/UpdateStepTestUtil.java b/scm-webapp/src/test/java/sonia/scm/update/UpdateStepTestUtil.java new file mode 100644 index 0000000000..88b09fc086 --- /dev/null +++ b/scm-webapp/src/test/java/sonia/scm/update/UpdateStepTestUtil.java @@ -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 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())); + } +} diff --git a/scm-webapp/src/test/java/sonia/scm/group/update/XmlGroupV1UpdateStepTest.java b/scm-webapp/src/test/java/sonia/scm/update/group/XmlGroupV1UpdateStepTest.java similarity index 65% rename from scm-webapp/src/test/java/sonia/scm/group/update/XmlGroupV1UpdateStepTest.java rename to scm-webapp/src/test/java/sonia/scm/update/group/XmlGroupV1UpdateStepTest.java index 552298ed77..394dc44109 100644 --- a/scm-webapp/src/test/java/sonia/scm/group/update/XmlGroupV1UpdateStepTest.java +++ b/scm-webapp/src/test/java/sonia/scm/update/group/XmlGroupV1UpdateStepTest.java @@ -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 groupCaptor; XmlGroupV1UpdateStep updateStep; - ConfigurationEntryStore 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( + "normals", + "", + "", + "mostly", + "humans", + "", + ""); + } } @Test diff --git a/scm-webapp/src/test/java/sonia/scm/repository/update/CopyMigrationStrategyTest.java b/scm-webapp/src/test/java/sonia/scm/update/repository/CopyMigrationStrategyTest.java similarity index 98% rename from scm-webapp/src/test/java/sonia/scm/repository/update/CopyMigrationStrategyTest.java rename to scm-webapp/src/test/java/sonia/scm/update/repository/CopyMigrationStrategyTest.java index d7217bec48..b40283ae79 100644 --- a/scm-webapp/src/test/java/sonia/scm/repository/update/CopyMigrationStrategyTest.java +++ b/scm-webapp/src/test/java/sonia/scm/update/repository/CopyMigrationStrategyTest.java @@ -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; diff --git a/scm-webapp/src/test/java/sonia/scm/repository/update/InlineMigrationStrategyTest.java b/scm-webapp/src/test/java/sonia/scm/update/repository/InlineMigrationStrategyTest.java similarity index 97% rename from scm-webapp/src/test/java/sonia/scm/repository/update/InlineMigrationStrategyTest.java rename to scm-webapp/src/test/java/sonia/scm/update/repository/InlineMigrationStrategyTest.java index ed0d7eeb40..6abddae3fb 100644 --- a/scm-webapp/src/test/java/sonia/scm/repository/update/InlineMigrationStrategyTest.java +++ b/scm-webapp/src/test/java/sonia/scm/update/repository/InlineMigrationStrategyTest.java @@ -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; diff --git a/scm-webapp/src/test/java/sonia/scm/repository/update/MigrationStrategyDaoTest.java b/scm-webapp/src/test/java/sonia/scm/update/repository/MigrationStrategyDaoTest.java similarity index 90% rename from scm-webapp/src/test/java/sonia/scm/repository/update/MigrationStrategyDaoTest.java rename to scm-webapp/src/test/java/sonia/scm/update/repository/MigrationStrategyDaoTest.java index a7365ce656..e3fd4457b6 100644 --- a/scm-webapp/src/test/java/sonia/scm/repository/update/MigrationStrategyDaoTest.java +++ b/scm-webapp/src/test/java/sonia/scm/update/repository/MigrationStrategyDaoTest.java @@ -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) diff --git a/scm-webapp/src/test/java/sonia/scm/repository/update/MigrationStrategyMock.java b/scm-webapp/src/test/java/sonia/scm/update/repository/MigrationStrategyMock.java similarity index 85% rename from scm-webapp/src/test/java/sonia/scm/repository/update/MigrationStrategyMock.java rename to scm-webapp/src/test/java/sonia/scm/update/repository/MigrationStrategyMock.java index e0ee39880f..e0018f584f 100644 --- a/scm-webapp/src/test/java/sonia/scm/repository/update/MigrationStrategyMock.java +++ b/scm-webapp/src/test/java/sonia/scm/update/repository/MigrationStrategyMock.java @@ -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; diff --git a/scm-webapp/src/test/java/sonia/scm/repository/update/MoveMigrationStrategyTest.java b/scm-webapp/src/test/java/sonia/scm/update/repository/MoveMigrationStrategyTest.java similarity index 98% rename from scm-webapp/src/test/java/sonia/scm/repository/update/MoveMigrationStrategyTest.java rename to scm-webapp/src/test/java/sonia/scm/update/repository/MoveMigrationStrategyTest.java index ce894516df..b55315d85f 100644 --- a/scm-webapp/src/test/java/sonia/scm/repository/update/MoveMigrationStrategyTest.java +++ b/scm-webapp/src/test/java/sonia/scm/update/repository/MoveMigrationStrategyTest.java @@ -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; diff --git a/scm-webapp/src/test/java/sonia/scm/repository/update/V1RepositoryFileSystem.java b/scm-webapp/src/test/java/sonia/scm/update/repository/V1RepositoryFileSystem.java similarity index 96% rename from scm-webapp/src/test/java/sonia/scm/repository/update/V1RepositoryFileSystem.java rename to scm-webapp/src/test/java/sonia/scm/update/repository/V1RepositoryFileSystem.java index 146953d790..5baf5200fc 100644 --- a/scm-webapp/src/test/java/sonia/scm/repository/update/V1RepositoryFileSystem.java +++ b/scm-webapp/src/test/java/sonia/scm/update/repository/V1RepositoryFileSystem.java @@ -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 { * */ 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"); } } diff --git a/scm-webapp/src/test/java/sonia/scm/repository/update/XmlRepositoryFileNameUpdateStepTest.java b/scm-webapp/src/test/java/sonia/scm/update/repository/XmlRepositoryFileNameUpdateStepTest.java similarity index 93% rename from scm-webapp/src/test/java/sonia/scm/repository/update/XmlRepositoryFileNameUpdateStepTest.java rename to scm-webapp/src/test/java/sonia/scm/update/repository/XmlRepositoryFileNameUpdateStepTest.java index 6314e02783..51be47fc82 100644 --- a/scm-webapp/src/test/java/sonia/scm/repository/update/XmlRepositoryFileNameUpdateStepTest.java +++ b/scm-webapp/src/test/java/sonia/scm/update/repository/XmlRepositoryFileNameUpdateStepTest.java @@ -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")); diff --git a/scm-webapp/src/test/java/sonia/scm/repository/update/XmlRepositoryV1UpdateStepTest.java b/scm-webapp/src/test/java/sonia/scm/update/repository/XmlRepositoryV1UpdateStepTest.java similarity index 92% rename from scm-webapp/src/test/java/sonia/scm/repository/update/XmlRepositoryV1UpdateStepTest.java rename to scm-webapp/src/test/java/sonia/scm/update/repository/XmlRepositoryV1UpdateStepTest.java index 773d7bd447..2102d296ea 100644 --- a/scm-webapp/src/test/java/sonia/scm/repository/update/XmlRepositoryV1UpdateStepTest.java +++ b/scm-webapp/src/test/java/sonia/scm/update/repository/XmlRepositoryV1UpdateStepTest.java @@ -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 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")); diff --git a/scm-webapp/src/test/java/sonia/scm/security/update/XmlSecurityV1UpdateStepTest.java b/scm-webapp/src/test/java/sonia/scm/update/security/XmlSecurityV1UpdateStepTest.java similarity index 95% rename from scm-webapp/src/test/java/sonia/scm/security/update/XmlSecurityV1UpdateStepTest.java rename to scm-webapp/src/test/java/sonia/scm/update/security/XmlSecurityV1UpdateStepTest.java index 62e82ce168..f8949d73a5 100644 --- a/scm-webapp/src/test/java/sonia/scm/security/update/XmlSecurityV1UpdateStepTest.java +++ b/scm-webapp/src/test/java/sonia/scm/update/security/XmlSecurityV1UpdateStepTest.java @@ -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)); } diff --git a/scm-webapp/src/test/java/sonia/scm/user/update/XmlUserV1UpdateStepTest.java b/scm-webapp/src/test/java/sonia/scm/update/user/XmlUserV1UpdateStepTest.java similarity index 62% rename from scm-webapp/src/test/java/sonia/scm/user/update/XmlUserV1UpdateStepTest.java rename to scm-webapp/src/test/java/sonia/scm/update/user/XmlUserV1UpdateStepTest.java index 764fda2c5d..19d37d542d 100644 --- a/scm-webapp/src/test/java/sonia/scm/user/update/XmlUserV1UpdateStepTest.java +++ b/scm-webapp/src/test/java/sonia/scm/update/user/XmlUserV1UpdateStepTest.java @@ -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 userCaptor; XmlUserV1UpdateStep updateStep; - ConfigurationEntryStore 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 = assignedPermissionStore.getAll().values().stream().filter(a -> a.getName().equals("scmadmin")).findFirst(); + Optional 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( + "dent", + "", + "", + "born.on", + "earth", + "", + "", + "last.seen", + "end of the universe", + "", + ""); + } } @Test diff --git a/scm-webapp/src/test/resources/sonia/scm/repository/update/scm-home.v1.zip b/scm-webapp/src/test/resources/sonia/scm/repository/update/scm-home.v1.zip deleted file mode 100644 index 0d43f2f4d6..0000000000 Binary files a/scm-webapp/src/test/resources/sonia/scm/repository/update/scm-home.v1.zip and /dev/null differ diff --git a/scm-webapp/src/test/resources/sonia/scm/group/update/groups.xml b/scm-webapp/src/test/resources/sonia/scm/update/group/groups.xml similarity index 82% rename from scm-webapp/src/test/resources/sonia/scm/group/update/groups.xml rename to scm-webapp/src/test/resources/sonia/scm/update/group/groups.xml index f058a01e7a..97cd98c17c 100644 --- a/scm-webapp/src/test/resources/sonia/scm/group/update/groups.xml +++ b/scm-webapp/src/test/resources/sonia/scm/update/group/groups.xml @@ -11,7 +11,12 @@ xml - + + + mostly + humans + + 1559548942457 Normal people normals diff --git a/scm-webapp/src/test/resources/sonia/scm/repository/update/formerV2RepositoryFile.xml b/scm-webapp/src/test/resources/sonia/scm/update/repository/formerV2RepositoryFile.xml similarity index 100% rename from scm-webapp/src/test/resources/sonia/scm/repository/update/formerV2RepositoryFile.xml rename to scm-webapp/src/test/resources/sonia/scm/update/repository/formerV2RepositoryFile.xml diff --git a/scm-webapp/src/test/resources/sonia/scm/update/repository/scm-home.v1.zip b/scm-webapp/src/test/resources/sonia/scm/update/repository/scm-home.v1.zip new file mode 100644 index 0000000000..5d936db5e2 Binary files /dev/null and b/scm-webapp/src/test/resources/sonia/scm/update/repository/scm-home.v1.zip differ diff --git a/scm-webapp/src/test/resources/sonia/scm/security/update/config.xml b/scm-webapp/src/test/resources/sonia/scm/update/security/config.xml similarity index 100% rename from scm-webapp/src/test/resources/sonia/scm/security/update/config.xml rename to scm-webapp/src/test/resources/sonia/scm/update/security/config.xml diff --git a/scm-webapp/src/test/resources/sonia/scm/user/update/users.xml b/scm-webapp/src/test/resources/sonia/scm/update/user/users.xml similarity index 87% rename from scm-webapp/src/test/resources/sonia/scm/user/update/users.xml rename to scm-webapp/src/test/resources/sonia/scm/update/user/users.xml index f586996384..d82b2fcb1d 100644 --- a/scm-webapp/src/test/resources/sonia/scm/user/update/users.xml +++ b/scm-webapp/src/test/resources/sonia/scm/update/user/users.xml @@ -24,7 +24,16 @@ xml - + + + born.on + earth + + + last.seen + end of the universe + + false 1558597107621 Arthur Dent