/*******************************************************************************
* Copyright (c) 2012-2017 Codenvy, S.A.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.api.core.rest;
import org.eclipse.che.api.core.NotFoundException;
import org.eclipse.che.api.core.ServerException;
import org.eclipse.che.api.core.rest.annotations.Description;
import org.eclipse.che.api.core.rest.annotations.GenerateLink;
import org.eclipse.che.api.core.rest.annotations.Required;
import org.eclipse.che.api.core.rest.annotations.Valid;
import org.eclipse.che.api.core.rest.shared.dto.Link;
import org.eclipse.che.api.core.rest.shared.dto.ServiceDescriptor;
import org.eclipse.che.commons.test.mockito.answer.SelfReturningAnswer;
import org.everrest.assured.EverrestJetty;
import org.mockito.Mock;
import org.mockito.Spy;
import org.mockito.testng.MockitoTestNGListener;
import org.testng.ITestContext;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Listeners;
import org.testng.annotations.Test;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.GET;
import javax.ws.rs.HttpMethod;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import java.util.List;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertNull;
import static org.testng.Assert.assertTrue;
/**
* @author Alexander Garagatyi
*/
@Listeners({MockitoTestNGListener.class, EverrestJetty.class})
public class RemoteServiceDescriptorTest {
@SuppressWarnings("unused") // used by EverrestJetty
private static final EchoService service = new EchoService();
private static final String SERVICE_PATH = "/test";
private static final String SERVICE_DESCRIPTION = "test service";
@Spy
private DefaultHttpJsonRequestFactory requestFactory;
private HttpJsonRequest request;
@Mock
private HttpJsonResponse response;
private String serverUrl;
private RemoteServiceDescriptor remoteServiceDescriptor;
@BeforeClass
public void setUp(ITestContext ctx) throws Exception {
serverUrl = getServerUrl(ctx);
request = mock(HttpJsonRequest.class, new SelfReturningAnswer());
when(request.request()).thenReturn(response);
}
@Test
public void shouldBeAbleToReturnServiceDescriptors() throws Exception {
remoteServiceDescriptor = new RemoteServiceDescriptor(serverUrl + SERVICE_PATH, requestFactory);
final ServiceDescriptor serviceDescriptor = remoteServiceDescriptor.getServiceDescriptor();
assertNotNull(serviceDescriptor);
assertEquals(serviceDescriptor.getHref(), serverUrl + SERVICE_PATH);
assertEquals(serviceDescriptor.getDescription(), SERVICE_DESCRIPTION);
assertEquals(serviceDescriptor.getLinks().size(), 1);
}
@Test(expectedExceptions = ServerException.class, expectedExceptionsMessageRegExp = "test error")
public void shouldThrowServerExceptionIfServiceNotFound() throws Exception {
doReturn(request).when(requestFactory).fromUrl(anyString());
when(request.request()).thenThrow(new NotFoundException("test error"));
remoteServiceDescriptor = new RemoteServiceDescriptor(serverUrl + "/non/existing/path", requestFactory);
remoteServiceDescriptor.getServiceDescriptor();
}
@Test
public void shouldBeAbleToConfirmAvailability() throws Exception {
remoteServiceDescriptor = new RemoteServiceDescriptor(serverUrl + SERVICE_PATH, requestFactory);
assertTrue(remoteServiceDescriptor.isAvailable());
}
@Test
public void shouldReturnFalseOnNonAvailableServiceAvailabilityCheck() {
remoteServiceDescriptor = new RemoteServiceDescriptor(serverUrl + "/non/existing/path", requestFactory);
assertFalse(remoteServiceDescriptor.isAvailable());
}
@Test
public void shouldReturnNullIfLinkWithRequiredRelDoesNotExist() throws Exception {
remoteServiceDescriptor = new RemoteServiceDescriptor(serverUrl + SERVICE_PATH, requestFactory);
assertNull(remoteServiceDescriptor.getLink("echo2"));
}
@Test
public void shouldBeAbleToReturnLinks() throws Exception {
remoteServiceDescriptor = new RemoteServiceDescriptor(serverUrl + SERVICE_PATH, requestFactory);
final List<Link> links = remoteServiceDescriptor.getLinks();
assertEquals(links.size(), 1);
assertEquals(links.get(0).getMethod(), HttpMethod.GET);
assertEquals(links.get(0).getHref(), serverUrl + SERVICE_PATH + "/my_method");
assertEquals(links.get(0).getProduces(), MediaType.TEXT_PLAIN);
}
@Description(SERVICE_DESCRIPTION)
@Path(SERVICE_PATH)
public static class EchoService extends Service {
@GET
@Path("my_method")
@GenerateLink(rel = "echo")
@Produces(MediaType.TEXT_PLAIN)
public String echo(@Description("some text") @Required @Valid({"a", "b"}) @DefaultValue("a") @QueryParam("text") String test) {
return test;
}
}
private String getServerUrl(ITestContext ctx) {
return "http://localhost:" + ctx.getAttribute(EverrestJetty.JETTY_PORT) + "/rest";
}
}