package com.restbucks.ordering.resources;
//eoneil note: kept in sources but commented out
//because dependence on mockito causes build problems

import static com.restbucks.ordering.domain.OrderBuilder.order;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
//import static org.mockito.Mockito.mock;
//import static org.mockito.Mockito.when;

import java.net.URI;

import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;

import org.junit.Test;

import com.restbucks.ordering.domain.Order;
import com.restbucks.ordering.representations.OrderRepresentation;

// Unit test that tests server actions (try it with tomcat down, see it still work)
public class PlaceOrderTest {

    private String baseUri = "http://restbucks.com/order/";
    
    @Test
    public void shouldRespondPositivelyOnSuccessfulOrderCreation() throws Exception {
//        UriInfo mockUriInfo = mock(UriInfo.class);
//        when(mockUriInfo.getRequestUri()).thenReturn(new URI(baseUri));
//        OrderResource orderResource = new OrderResource(mockUriInfo); 
//        
//        Order order = order().build();  // call OrderBuilder.order: see import static
//        // do server action--
//        Response response = orderResource.createOrder(new OrderRepresentation(order,null));
//        
//        String location = response.getMetadata().getFirst("Location").toString();
//        
//        assertEquals(201, response.getStatus());
//        assertNotNull(location);
//        assertTrue(location.startsWith(baseUri));
//        assertTrue(location.length() > baseUri.length());
    }
    
    @Test
    public void shouldRespondWithOrderRepresentationOnSuccessfulOrderCreation() throws Exception {
         
//        UriInfo mockUriInfo = mock(UriInfo.class);
//        String baseUri = "http://restbucks.com/order";
//        when(mockUriInfo.getRequestUri()).thenReturn(new URI(baseUri));
//        OrderResource orderResource = new OrderResource(mockUriInfo);
//        
//        Order order = order().build();
//        Response response = orderResource.createOrder(new OrderRepresentation(order, null));
//        OrderRepresentation or = (OrderRepresentation)response.getEntity();  
//        Order responseOrder = or.getOrder();
//        assertNotNull(responseOrder);
//        assertEquals(order.getItems().size(), responseOrder.getItems().size());
        
    }

    @Test
    // Note: this depends on the fact that createOrder uses uriInfo, i.e.,
    // an implementation detail
    public void shouldRespondWith500IfSomethingGoesWrong() throws Exception {
//        UriInfo mockUriInfo = mock(UriInfo.class);
//        when(mockUriInfo.getRequestUri()).thenThrow(new RuntimeException("No-one expects the Spanish inquisition!"));
//        OrderResource orderResource = new OrderResource(mockUriInfo);
//        
//        Order order = order().build();
//        Response response = orderResource.createOrder(new OrderRepresentation(order, null));
//        assertEquals(500, response.getStatus());
    }
    
    @Test
    public void shouldRespondWith400IfClientDoesSomethingWrong() throws Exception {
//        UriInfo mockUriInfo = mock(UriInfo.class);
//        when(mockUriInfo.getRequestUri()).thenReturn(new URI(baseUri));
//        OrderResource orderResource = new OrderResource(mockUriInfo);
//        
//        Order order = order().withCorruptedValues().build();
//        
//        Response response = orderResource.createOrder(new OrderRepresentation(order, null));
//
//        assertEquals(400, response.getStatus());
    }
}
