From 9a18facbf520906315acaced4cefbc5e284e30d8 Mon Sep 17 00:00:00 2001 From: Eduard Heimbuch Date: Thu, 23 May 2019 17:19:34 +0200 Subject: [PATCH] Tests for user migration V1 to V2 --- .../user/update/XmlUserV1UpdateStepTest.java | 103 ++++++++++++++++++ .../resources/sonia/scm/user/update/users.xml | 37 +++++++ 2 files changed, 140 insertions(+) create mode 100644 scm-webapp/src/test/java/sonia/scm/user/update/XmlUserV1UpdateStepTest.java create mode 100644 scm-webapp/src/test/resources/sonia/scm/user/update/users.xml diff --git a/scm-webapp/src/test/java/sonia/scm/user/update/XmlUserV1UpdateStepTest.java b/scm-webapp/src/test/java/sonia/scm/user/update/XmlUserV1UpdateStepTest.java new file mode 100644 index 0000000000..03bbbebf9e --- /dev/null +++ b/scm-webapp/src/test/java/sonia/scm/user/update/XmlUserV1UpdateStepTest.java @@ -0,0 +1,103 @@ +package sonia.scm.user.update; + +import com.google.common.io.Resources; +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.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.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.mockito.Mockito.doNothing; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import static org.assertj.core.api.Assertions.assertThat; + +@ExtendWith(MockitoExtension.class) +@ExtendWith(TempDirectory.class) +class XmlUserV1UpdateStepTest { + + @Mock + SCMContextProvider contextProvider; + @Mock + XmlUserDAO userDAO; + + @Captor + ArgumentCaptor userCaptor; + + XmlUserV1UpdateStep updateStep; + ConfigurationEntryStore assignedPermissionStore; + + @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); + } + + @Nested + class WithExistingDatabase { + + @BeforeEach + void captureStoredRepositories() { + doNothing().when(userDAO).add(userCaptor.capture()); + } + + @BeforeEach + void createUserV1XML(@TempDirectory.TempDir Path tempDir) throws IOException { + URL url = Resources.getResource("sonia/scm/user/update/users.xml"); + Path configDir = tempDir.resolve("config"); + Files.createDirectories(configDir); + Files.copy(url.openStream(), configDir.resolve("users.xml")); + } + + @Test + void shouldCreateNewPermissionsForV1AdminUser() throws JAXBException { + updateStep.doUpdate(); + Optional assignedPermission = assignedPermissionStore.getAll().values().stream().filter(a -> a.getName().equals("scmadmin")).findFirst(); + assertThat(assignedPermission.get().getPermission().getValue()).contains("*"); + assertThat(assignedPermission.get().isGroupPermission()).isFalse(); + } + + @Test + void shouldCreateNewUserFromUsersV1Xml() throws JAXBException { + updateStep.doUpdate(); + verify(userDAO, times(3)).add(any()); + } + + @Test + void shouldMapAttributesFromUsersV1Xml() throws JAXBException { + updateStep.doUpdate(); + Optional user = userCaptor.getAllValues().stream().filter(u -> u.getName().equals("scmadmin")).findFirst(); + assertThat(user) + .get() + .hasFieldOrPropertyWithValue("name","scmadmin") + .hasFieldOrPropertyWithValue("mail", "scm-admin@scm-manager.com") + .hasFieldOrPropertyWithValue("displayName", "SCM Administrator") + .hasFieldOrPropertyWithValue("active", false) + .hasFieldOrPropertyWithValue("password", "ff8f5c593a01f9fcd3ed48b09a4b013e8d8f3be7") + .hasFieldOrPropertyWithValue("type", "xml"); + } + } +} diff --git a/scm-webapp/src/test/resources/sonia/scm/user/update/users.xml b/scm-webapp/src/test/resources/sonia/scm/user/update/users.xml new file mode 100644 index 0000000000..1c579389e8 --- /dev/null +++ b/scm-webapp/src/test/resources/sonia/scm/user/update/users.xml @@ -0,0 +1,37 @@ + + + 1558597074729 + 1558597185919 + + + + true + 1558597074732 + SCM Administrator + scm-admin@scm-manager.com + scmadmin + ff8f5c593a01f9fcd3ed48b09a4b013e8d8f3be7 + xml + + + + false + 1558597074734 + SCM Anonymous + scm-anonymous@scm-manager.com + anonymous + xml + + + + true + 1558597107621 + edii + 1558597185919 + edi@edi.de + edi + 30f0d7632401710a20719ec21d21bc4ec232aa31 + xml + + +