From f1115099c954e729a50f5f6cd0c0ff317ecec61c Mon Sep 17 00:00:00 2001 From: Florian Scholdei Date: Tue, 3 Nov 2020 10:45:47 +0100 Subject: [PATCH] Create unit tests, supplement missing groupManager precondition, add createAuthenticatedGroup factory --- .../scm/lifecycle/SetupContextListener.java | 3 +- .../lifecycle/SetupContextListenerTest.java | 38 +++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/scm-webapp/src/main/java/sonia/scm/lifecycle/SetupContextListener.java b/scm-webapp/src/main/java/sonia/scm/lifecycle/SetupContextListener.java index 6bfda56c95..30d2c7a7f2 100644 --- a/scm-webapp/src/main/java/sonia/scm/lifecycle/SetupContextListener.java +++ b/scm-webapp/src/main/java/sonia/scm/lifecycle/SetupContextListener.java @@ -81,7 +81,8 @@ public class SetupContextListener implements ServletContextListener { private final ScmConfiguration scmConfiguration; private final GroupManager groupManager; - private static final String AUTHENTICATED_GROUP_DESCRIPTION = "Includes all authenticated users"; + @VisibleForTesting + static final String AUTHENTICATED_GROUP_DESCRIPTION = "Includes all authenticated users"; @Inject public SetupAction(UserManager userManager, PasswordService passwordService, PermissionAssigner permissionAssigner, ScmConfiguration scmConfiguration, GroupManager groupManager) { diff --git a/scm-webapp/src/test/java/sonia/scm/lifecycle/SetupContextListenerTest.java b/scm-webapp/src/test/java/sonia/scm/lifecycle/SetupContextListenerTest.java index fab7b789ad..d0376f53a3 100644 --- a/scm-webapp/src/test/java/sonia/scm/lifecycle/SetupContextListenerTest.java +++ b/scm-webapp/src/test/java/sonia/scm/lifecycle/SetupContextListenerTest.java @@ -37,6 +37,8 @@ import org.mockito.junit.jupiter.MockitoSettings; import org.mockito.quality.Strictness; import sonia.scm.SCMContext; import sonia.scm.config.ScmConfiguration; +import sonia.scm.group.Group; +import sonia.scm.group.GroupManager; import sonia.scm.security.AnonymousMode; import sonia.scm.security.PermissionAssigner; import sonia.scm.security.PermissionDescriptor; @@ -56,6 +58,8 @@ import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import static sonia.scm.group.GroupCollector.AUTHENTICATED; +import static sonia.scm.lifecycle.SetupContextListener.SetupAction.AUTHENTICATED_GROUP_DESCRIPTION; @ExtendWith(MockitoExtension.class) class SetupContextListenerTest { @@ -75,6 +79,9 @@ class SetupContextListenerTest { @Mock ScmConfiguration scmConfiguration; + @Mock + private GroupManager groupManager; + @Mock private PermissionAssigner permissionAssigner; @@ -96,6 +103,7 @@ class SetupContextListenerTest { @Test void shouldCreateAdminAccountIfNoUserExistsAndAssignPermissions() { + when(groupManager.get(AUTHENTICATED)).thenReturn(createAuthenticatedGroup()); when(passwordService.encryptPassword("scmadmin")).thenReturn("secret"); setupContextListener.contextInitialized(null); @@ -108,6 +116,7 @@ class SetupContextListenerTest { void shouldCreateAdminAccountIfOnlyAnonymousUserExistsAndAssignPermissions() { when(userManager.getAll()).thenReturn(Lists.newArrayList(SCMContext.ANONYMOUS)); when(userManager.contains(SCMContext.USER_ANONYMOUS)).thenReturn(true); + when(groupManager.get(AUTHENTICATED)).thenReturn(createAuthenticatedGroup()); when(passwordService.encryptPassword("scmadmin")).thenReturn("secret"); setupContextListener.contextInitialized(null); @@ -135,6 +144,7 @@ class SetupContextListenerTest { void shouldDoNothingOnSecondStart() { List users = Lists.newArrayList(UserTestData.createTrillian()); when(userManager.getAll()).thenReturn(users); + when(groupManager.get(AUTHENTICATED)).thenReturn(createAuthenticatedGroup()); setupContextListener.contextInitialized(null); @@ -146,6 +156,7 @@ class SetupContextListenerTest { void shouldCreateAnonymousUserIfRequired() { List users = Lists.newArrayList(UserTestData.createTrillian()); when(userManager.getAll()).thenReturn(users); + when(groupManager.get(AUTHENTICATED)).thenReturn(createAuthenticatedGroup()); when(scmConfiguration.getAnonymousMode()).thenReturn(AnonymousMode.FULL); setupContextListener.contextInitialized(null); @@ -157,6 +168,7 @@ class SetupContextListenerTest { void shouldNotCreateAnonymousUserIfNotRequired() { List users = Lists.newArrayList(UserTestData.createTrillian()); when(userManager.getAll()).thenReturn(users); + when(groupManager.get(AUTHENTICATED)).thenReturn(createAuthenticatedGroup()); setupContextListener.contextInitialized(null); @@ -167,6 +179,7 @@ class SetupContextListenerTest { void shouldNotCreateAnonymousUserIfAlreadyExists() { List users = Lists.newArrayList(SCMContext.ANONYMOUS); when(userManager.getAll()).thenReturn(users); + when(groupManager.get(AUTHENTICATED)).thenReturn(createAuthenticatedGroup()); when(scmConfiguration.getAnonymousMode()).thenReturn(AnonymousMode.FULL); setupContextListener.contextInitialized(null); @@ -174,6 +187,28 @@ class SetupContextListenerTest { verify(userManager, times(1)).create(SCMContext.ANONYMOUS); } + @Test + void shouldCreateAuthenticatedGroupIfMissing() { + when(groupManager.get(AUTHENTICATED)).thenReturn(null); + + setupContextListener.contextInitialized(null); + + Group authenticated = createAuthenticatedGroup(); + authenticated.setDescription(AUTHENTICATED_GROUP_DESCRIPTION); + authenticated.setExternal(true); + + verify(groupManager, times(1)).create(createAuthenticatedGroup()); + } + + @Test + void shouldNotCreateAuthenticatedGroupIfAlreadyExists() { + when(groupManager.get(AUTHENTICATED)).thenReturn(createAuthenticatedGroup()); + + setupContextListener.contextInitialized(null); + + verify(groupManager, never()).create(any()); + } + private void verifyAdminPermissionsAssigned() { ArgumentCaptor usernameCaptor = ArgumentCaptor.forClass(String.class); ArgumentCaptor> permissionCaptor = ArgumentCaptor.forClass(Collection.class); @@ -192,4 +227,7 @@ class SetupContextListenerTest { assertThat(user.getPassword()).isEqualTo("secret"); } + private Group createAuthenticatedGroup() { + return new Group("xml", AUTHENTICATED); + } }