diff --git a/scm-test/src/main/java/sonia/scm/store/InMemoryConfigurationEntryStoreFactory.java b/scm-test/src/main/java/sonia/scm/store/InMemoryConfigurationEntryStoreFactory.java index 3e5d3a8dac..1578a20751 100644 --- a/scm-test/src/main/java/sonia/scm/store/InMemoryConfigurationEntryStoreFactory.java +++ b/scm-test/src/main/java/sonia/scm/store/InMemoryConfigurationEntryStoreFactory.java @@ -17,7 +17,7 @@ public class InMemoryConfigurationEntryStoreFactory implements ConfigurationEntr return get(name); } - public InMemoryConfigurationEntryStore get(String name) { + public InMemoryConfigurationEntryStore get(String name) { return stores.computeIfAbsent(name, x -> new InMemoryConfigurationEntryStore()); } } diff --git a/scm-test/src/main/java/sonia/scm/update/UpdateStepTestUtil.java b/scm-test/src/main/java/sonia/scm/update/UpdateStepTestUtil.java index 7b4487f1a5..51899cdbee 100644 --- a/scm-test/src/main/java/sonia/scm/update/UpdateStepTestUtil.java +++ b/scm-test/src/main/java/sonia/scm/update/UpdateStepTestUtil.java @@ -42,10 +42,6 @@ public class UpdateStepTestUtil { copyTestDatabaseFile(configDir, fileName, targetFileName); } - public Path getFile(String name) { - return tempDir.resolve("config").resolve(name); - } - private void copyTestDatabaseFile(Path configDir, String fileName) throws IOException { Path targetFileName = Paths.get(fileName).getFileName(); copyTestDatabaseFile(configDir, fileName, targetFileName.toString()); 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 index 3c8555a76e..156fdae73f 100644 --- a/scm-webapp/src/main/java/sonia/scm/update/properties/V1Properties.java +++ b/scm-webapp/src/main/java/sonia/scm/update/properties/V1Properties.java @@ -6,9 +6,15 @@ import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import java.util.List; +import static java.util.Collections.unmodifiableList; + @XmlAccessorType(XmlAccessType.FIELD) @XmlRootElement(name = "properties") public class V1Properties { @XmlElement(name = "item") private List properties; + + public List getProperties() { + return unmodifiableList(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 index c92c15188d..86f16a085a 100644 --- a/scm-webapp/src/main/java/sonia/scm/update/properties/V1Property.java +++ b/scm-webapp/src/main/java/sonia/scm/update/properties/V1Property.java @@ -2,9 +2,48 @@ package sonia.scm.update.properties; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; +import java.util.Objects; @XmlAccessorType(XmlAccessType.FIELD) public class V1Property { private String key; private String value; + + public V1Property() { + } + + public V1Property(String key, String value) { + this.key = key; + this.value = value; + } + + public String getKey() { + return key; + } + + public String getValue() { + return value; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + V1Property that = (V1Property) o; + return Objects.equals(key, that.key) && + Objects.equals(value, that.value); + } + + @Override + public int hashCode() { + return Objects.hash(key, value); + } + + @Override + public String toString() { + return "V1Property{" + + "key='" + key + '\'' + + ", value='" + value + '\'' + + '}'; + } } diff --git a/scm-webapp/src/test/java/sonia/scm/update/group/XmlGroupV1UpdateStepTest.java b/scm-webapp/src/test/java/sonia/scm/update/group/XmlGroupV1UpdateStepTest.java index caa7f68fea..415bd508eb 100644 --- a/scm-webapp/src/test/java/sonia/scm/update/group/XmlGroupV1UpdateStepTest.java +++ b/scm-webapp/src/test/java/sonia/scm/update/group/XmlGroupV1UpdateStepTest.java @@ -11,9 +11,11 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import sonia.scm.group.Group; import sonia.scm.group.xml.XmlGroupDAO; -import sonia.scm.security.DefaultKeyGenerator; -import sonia.scm.store.JAXBConfigurationEntryStoreFactory; +import sonia.scm.store.ConfigurationEntryStore; +import sonia.scm.store.InMemoryConfigurationEntryStoreFactory; import sonia.scm.update.UpdateStepTestUtil; +import sonia.scm.update.properties.V1Properties; +import sonia.scm.update.properties.V1Property; import javax.xml.bind.JAXBException; import java.io.IOException; @@ -22,11 +24,11 @@ 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 sonia.scm.store.InMemoryConfigurationEntryStoreFactory.create; @ExtendWith(MockitoExtension.class) @ExtendWith(TempDirectory.class) @@ -38,6 +40,8 @@ class XmlGroupV1UpdateStepTest { @Captor ArgumentCaptor groupCaptor; + InMemoryConfigurationEntryStoreFactory storeFactory = create(); + XmlGroupV1UpdateStep updateStep; private UpdateStepTestUtil testUtil; @@ -46,7 +50,6 @@ class XmlGroupV1UpdateStepTest { @BeforeEach void mockScmHome(@TempDirectory.TempDir Path tempDir) { testUtil = new UpdateStepTestUtil(tempDir); - JAXBConfigurationEntryStoreFactory storeFactory = new JAXBConfigurationEntryStoreFactory(testUtil.getContextProvider(), null, new DefaultKeyGenerator()); updateStep = new XmlGroupV1UpdateStep(testUtil.getContextProvider(), groupDAO, storeFactory); } @@ -86,19 +89,13 @@ class XmlGroupV1UpdateStepTest { @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", - "", - ""); + ConfigurationEntryStore propertiesStore = storeFactory.get("group-properties-v1"); + assertThat(propertiesStore.get("normals")) + .isNotNull() + .extracting(V1Properties::getProperties) + .first() + .asList() + .contains(new V1Property("mostly", "humans")); } } diff --git a/scm-webapp/src/test/java/sonia/scm/update/user/XmlUserV1UpdateStepTest.java b/scm-webapp/src/test/java/sonia/scm/update/user/XmlUserV1UpdateStepTest.java index 9de169d93d..ec26db00a2 100644 --- a/scm-webapp/src/test/java/sonia/scm/update/user/XmlUserV1UpdateStepTest.java +++ b/scm-webapp/src/test/java/sonia/scm/update/user/XmlUserV1UpdateStepTest.java @@ -10,11 +10,11 @@ import org.mockito.Captor; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; 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 sonia.scm.store.InMemoryConfigurationEntryStoreFactory; import sonia.scm.update.UpdateStepTestUtil; +import sonia.scm.update.properties.V1Properties; +import sonia.scm.update.properties.V1Property; import sonia.scm.user.User; import sonia.scm.user.xml.XmlUserDAO; @@ -24,11 +24,11 @@ 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 sonia.scm.store.InMemoryConfigurationEntryStoreFactory.create; @ExtendWith(MockitoExtension.class) @ExtendWith(TempDirectory.class) @@ -40,6 +40,8 @@ class XmlUserV1UpdateStepTest { @Captor ArgumentCaptor userCaptor; + InMemoryConfigurationEntryStoreFactory storeFactory = create(); + XmlUserV1UpdateStep updateStep; private UpdateStepTestUtil testUtil; @@ -47,7 +49,6 @@ class XmlUserV1UpdateStepTest { @BeforeEach void mockScmHome(@TempDirectory.TempDir Path tempDir) { testUtil = new UpdateStepTestUtil(tempDir); - ConfigurationEntryStoreFactory storeFactory = new JAXBConfigurationEntryStoreFactory(testUtil.getContextProvider(), null, new DefaultKeyGenerator()); updateStep = new XmlUserV1UpdateStep(testUtil.getContextProvider(), userDAO, storeFactory); } @@ -68,7 +69,7 @@ class XmlUserV1UpdateStepTest { void shouldCreateNewPermissionsForV1AdminUser() throws JAXBException { updateStep.doUpdate(); Optional assignedPermission = - getStoreForConfigFile("security") + storeFactory.get("security") .getAll() .values() .stream() @@ -103,30 +104,15 @@ class XmlUserV1UpdateStepTest { @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", - "", - ""); - } - - private ConfigurationEntryStore getStoreForConfigFile(String name) { - return new JAXBConfigurationEntryStoreFactory(testUtil.getContextProvider(), null, new DefaultKeyGenerator()) - .withType(AssignedPermission.class) - .withName(name) - .build(); + ConfigurationEntryStore propertiesStore = storeFactory.get("user-properties-v1"); + assertThat(propertiesStore.get("dent")) + .isNotNull() + .extracting(V1Properties::getProperties) + .first() + .asList() + .contains( + new V1Property("born.on", "earth"), + new V1Property("last.seen", "end of the universe")); } }