@Test
  public void callsPreDestroyMethodsForSingletonComponentsOnStop() throws Exception {
    EchoResource resource = new EchoResource();
    Application application = mock(Application.class);
    when(application.getSingletons()).thenReturn(newHashSet(resource));
    when(requestHandler.getResources()).thenReturn(mock(ResourceBinder.class));

    everrestProcessor.addApplication(application);
    everrestProcessor.stop();

    assertEquals(1, resource.preDestroyActionInvocationsCounter.get());
  }
  @Test
  public void setsUpApplicationContextBeforeCallToRequestHandler() throws Exception {
    ContainerRequest containerRequest = mockContainerRequest();
    ContainerResponse containerResponse = mockContainerResponse();
    EnvironmentContext environmentContext = mock(EnvironmentContext.class);

    ApplicationContext[] applicationContextThatRequestHandlerCalledWith = new ApplicationContext[1];
    doAnswer(
            invocation -> {
              applicationContextThatRequestHandlerCalledWith[0] = ApplicationContext.getCurrent();
              return null;
            })
        .when(requestHandler)
        .handleRequest(containerRequest, containerResponse);

    everrestProcessor.process(containerRequest, containerResponse, environmentContext);
    assertNotNull(applicationContextThatRequestHandlerCalledWith[0]);
    assertSame(
        containerRequest, applicationContextThatRequestHandlerCalledWith[0].getContainerRequest());
    assertSame(
        containerResponse,
        applicationContextThatRequestHandlerCalledWith[0].getContainerResponse());
    assertSame(
        dependencySupplier,
        applicationContextThatRequestHandlerCalledWith[0].getDependencySupplier());
  }
  @Test
  public void resetsEnvironmentContextAlterCallToRequestHandler() throws Exception {
    ContainerRequest containerRequest = mockContainerRequest();
    ContainerResponse containerResponse = mockContainerResponse();
    EnvironmentContext environmentContext = mock(EnvironmentContext.class);

    everrestProcessor.process(containerRequest, containerResponse, environmentContext);

    EnvironmentContext environmentContextAfterCall = EnvironmentContext.getCurrent();
    assertNull(environmentContextAfterCall);
  }
  @Test
  public void overridesHttpMethodWhenXHTTPMethodOverrideHeaderIsSet() throws Exception {
    when(configuration.isHttpMethodOverride()).thenReturn(true);
    requestHeaders.putSingle(X_HTTP_METHOD_OVERRIDE, "PUT");
    ContainerRequest containerRequest = mockContainerRequest();
    ContainerResponse containerResponse = mockContainerResponse();
    EnvironmentContext environmentContext = mock(EnvironmentContext.class);

    everrestProcessor.process(containerRequest, containerResponse, environmentContext);

    verify(containerRequest).setMethod("PUT");
  }
  @Test
  public void processesRequest() throws Exception {
    ContainerRequest containerRequest = mockContainerRequest();
    ContainerResponse containerResponse = mockContainerResponse();
    EnvironmentContext environmentContext = mock(EnvironmentContext.class);

    doAnswer(
            invocation -> {
              Response response = mock(Response.class);
              when(response.getStatus()).thenReturn(200);
              when(response.getEntity()).thenReturn("foo");
              containerResponse.setResponse(response);
              return null;
            })
        .when(requestHandler)
        .handleRequest(containerRequest, containerResponse);

    everrestProcessor.process(containerRequest, containerResponse, environmentContext);

    ArgumentCaptor<Response> argumentCaptor = ArgumentCaptor.forClass(Response.class);
    verify(containerResponse).setResponse(argumentCaptor.capture());
    assertEquals(200, argumentCaptor.getValue().getStatus());
    assertEquals("foo", argumentCaptor.getValue().getEntity());
  }