content: package fr.mmarie.resources;
  
  import com.codahale.metrics.MetricRegistry;
  import com.fasterxml.jackson.databind.ObjectMapper;
  import fr.mmarie.api.gitlab.Event;
  import fr.mmarie.core.IntegrationService;
  import fr.mmarie.core.auth.GitLabAuthFilter;
  import fr.mmarie.core.auth.GitLabAuthenticator;
  import io.dropwizard.auth.AuthDynamicFeature;
  import io.dropwizard.auth.AuthValueFactoryProvider;
  import io.dropwizard.setup.Environment;
  import io.dropwizard.testing.junit.ResourceTestRule;
  import org.junit.After;
  import org.junit.ClassRule;
  import org.junit.Test;
  
  import javax.validation.Validation;
  import javax.ws.rs.client.Entity;
  import javax.ws.rs.core.Response;
  import java.security.Principal;
  import java.util.Base64;
  
  import static org.assertj.core.api.Assertions.assertThat;
  import static org.mockito.Mockito.mock;
  import static org.mockito.Mockito.reset;
  import static org.mockito.Mockito.timeout;
  import static org.mockito.Mockito.times;
  import static org.mockito.Mockito.verify;
  
  public class HookResourceTestIT {
  
      private static final IntegrationService INTEGRATION_SERVICE = mock(IntegrationService.class);
  
      private static final String PASSWORD = "test-password";
  
      private static final Environment ENVIRONMENT = new Environment("mocked-env",
              new ObjectMapper(),
              Validation.buildDefaultValidatorFactory().getValidator(),
              new MetricRegistry(),
              ClassLoader.getSystemClassLoader());
  
      @ClassRule
      public static final ResourceTestRule resources = ResourceTestRule.builder()
              .addResource(new HookResource(INTEGRATION_SERVICE, ENVIRONMENT))
              .addProvider(new AuthDynamicFeature(new GitLabAuthFilter.Builder()
                      .setAuthenticator(new GitLabAuthenticator(PASSWORD))
                      .setUnauthorizedHandler((s, s1) -> Response.status(Response.Status.UNAUTHORIZED).build())
                      .setRealm("GitLab HOOK")
                      .buildAuthFilter()))
              .addProvider(new AuthValueFactoryProvider.Binder<>(Principal.class))
              .build();
  
      @After
      public void tearDown() throws Exception {
          reset(INTEGRATION_SERVICE);
      }
  
      @Test
      public void hook_WithPushEvent_ShouldPerformIt() throws Exception {
          Event event = new Event(Event.Type.PUSH);
          Response response = resources.client().target("/hook")
                  .queryParam("token", Base64.getEncoder().encodeToString(String.format("%s:%s", "test-svc", PASSWORD).getBytes()))
                  .request()
                  .post(Entity.json(event));
  
          verify(INTEGRATION_SERVICE, timeout(100)).performPushEvent(event);
          assertThat(response).isNotNull();
          assertThat(response.getStatus()).isEqualTo(204);
      }
  
      @Test
      public void hook_WithTagPushEvent_ShouldPerformIt() throws Exception {
          Event event = new Event(Event.Type.TAG_PUSH);
          Response response = resources.client().target("/hook")
                  .queryParam("token", Base64.getEncoder().encodeToString(String.format("%s:%s", "test-svc", PASSWORD).getBytes()))
                  .request()
                  .post(Entity.json(event));
  
          verify(INTEGRATION_SERVICE, timeout(100)).performPushEvent(event);
          assertThat(response).isNotNull();
          assertThat(response.getStatus()).isEqualTo(204);
      }
  
      @Test
      public void hook_WithMergeEvent_ShouldDoNothing() throws Exception {
          Event event = new Event(Event.Type.MERGE_REQUEST);
          Response response = resources.client().target("/hook")
                  .queryParam("token", Base64.getEncoder().encodeToString(String.format("%s:%s", "test-svc", PASSWORD).getBytes()))
                  .request()
                  .post(Entity.json(event));
  
          verify(INTEGRATION_SERVICE, times(0)).performPushEvent(event);
          assertThat(response).isNotNull();
          assertThat(response.getStatus()).isEqualTo(204);
      }
  }