From 5468fddf900cc20a286d67e353da54335436cddf Mon Sep 17 00:00:00 2001 From: Eduard Heimbuch Date: Mon, 30 Nov 2020 12:04:03 +0100 Subject: [PATCH] improve event handling --- .../resources/RepositoryImportResource.java | 21 ++++++++++--------- .../resources/RepositoryRootResourceTest.java | 15 ++++++++----- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryImportResource.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryImportResource.java index 8cc0e500ba..cfc9bdcaef 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryImportResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryImportResource.java @@ -39,7 +39,6 @@ import lombok.Setter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import sonia.scm.HandlerEventType; -import sonia.scm.NotFoundException; import sonia.scm.Type; import sonia.scm.event.ScmEventBus; import sonia.scm.repository.InternalRepositoryException; @@ -215,10 +214,17 @@ public class RepositoryImportResource { logger.info("start {} import for external url {}", type, request.getUrl()); - Repository repository = manager.create( - new Repository(null, type, request.getNamespace(), request.getName()), - pullChangesFromRemoteUrl(request) - ); + Repository repository = null; + try { + repository = manager.create( + new Repository(null, type, request.getNamespace(), request.getName()), + pullChangesFromRemoteUrl(request) + ); + } catch (Exception e) { + eventBus.post(new RepositoryImportEvent(HandlerEventType.MODIFY, repository, true)); + throw e; + } + eventBus.post(new RepositoryImportEvent(HandlerEventType.MODIFY, repository, false)); return Response.created(URI.create(resourceLinks.repository().self(repository.getNamespace(), repository.getName()))).build(); } @@ -236,13 +242,8 @@ public class RepositoryImportResource { pullCommand.pull(request.getUrl()); } catch (IOException e) { - eventBus.post(new RepositoryImportEvent(HandlerEventType.MODIFY, repository, true)); throw new InternalRepositoryException(repository, "Failed to import from remote url", e); - } catch (Exception e) { - eventBus.post(new RepositoryImportEvent(HandlerEventType.MODIFY, repository, true)); - throw e; } - eventBus.post(new RepositoryImportEvent(HandlerEventType.MODIFY, repository, false)); }; } diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/RepositoryRootResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/RepositoryRootResourceTest.java index 8b7dee5eab..3ad6e7ae2a 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/RepositoryRootResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/RepositoryRootResourceTest.java @@ -466,6 +466,7 @@ public class RepositoryRootResourceTest extends RepositoryTestBase { @Test public void shouldImportRepositoryFromUrl() throws URISyntaxException, IOException { + ArgumentCaptor captor = ArgumentCaptor.forClass(RepositoryImportEvent.class); when(manager.getHandler("git")).thenReturn(repositoryHandler); when(repositoryHandler.getType()).thenReturn(new RepositoryType("git", "git", ImmutableSet.of(Command.PULL))); when(manager.create(any(Repository.class), any())).thenReturn(RepositoryTestData.create42Puzzle()); @@ -482,10 +483,14 @@ public class RepositoryRootResourceTest extends RepositoryTestBase { dispatcher.invoke(request, response); assertEquals(SC_CREATED, response.getStatus()); + verify(eventBus).post(captor.capture()); + + assertThat(captor.getValue().isFailed()).isFalse(); } @Test public void shouldFailOnImportRepositoryFromUrl() throws URISyntaxException, IOException { + ArgumentCaptor captor = ArgumentCaptor.forClass(RepositoryImportEvent.class); when(manager.getHandler("git")).thenReturn(repositoryHandler); when(repositoryHandler.getType()).thenReturn(new RepositoryType("git", "git", ImmutableSet.of(Command.PULL))); doThrow(ImportFailedException.class).when(manager).create(any(Repository.class), any()); @@ -502,10 +507,13 @@ public class RepositoryRootResourceTest extends RepositoryTestBase { dispatcher.invoke(request, response); assertEquals(500, response.getStatus()); + verify(eventBus).post(captor.capture()); + + assertThat(captor.getValue().isFailed()).isTrue(); } @Test - public void shouldPullChangesFromRemoteUrl() { + public void shouldPullChangesFromRemoteUrl() throws IOException { PullCommandBuilder pullCommandBuilder = mock(PullCommandBuilder.class, RETURNS_SELF); when(service.getPullCommand()).thenReturn(pullCommandBuilder); @@ -518,7 +526,7 @@ public class RepositoryRootResourceTest extends RepositoryTestBase { Consumer repositoryConsumer = repositoryImportResource.pullChangesFromRemoteUrl(repositoryImportDto); repositoryConsumer.accept(repository); - verify(eventBus).post(new RepositoryImportEvent(HandlerEventType.MODIFY, repository, false)); + verify(pullCommandBuilder).pull("https://scm-manager.org/scm/repo/scmadmin/scm-manager.git"); } @Test @@ -539,7 +547,6 @@ public class RepositoryRootResourceTest extends RepositoryTestBase { verify(pullCommandBuilder).withUsername("trillian"); verify(pullCommandBuilder).withPassword("secret"); - verify(eventBus).post(new RepositoryImportEvent(HandlerEventType.MODIFY, repository, false)); } @Test @@ -556,8 +563,6 @@ public class RepositoryRootResourceTest extends RepositoryTestBase { Consumer repositoryConsumer = repositoryImportResource.pullChangesFromRemoteUrl(repositoryImportDto); assertThrows(ImportFailedException.class, () -> repositoryConsumer.accept(repository)); - - verify(eventBus).post(new RepositoryImportEvent(HandlerEventType.MODIFY, repository, true)); } private PageResult createSingletonPageResult(Repository repository) {