package com.restbucks.ordering.activities;

import static com.restbucks.ordering.domain.OrderBuilder.order;
import static org.junit.Assert.*;

import org.junit.Test;

import com.restbucks.ordering.domain.Identifier;
import com.restbucks.ordering.domain.Order;
import com.restbucks.ordering.domain.OrderStatus;
import com.restbucks.ordering.repositories.OrderRepository;
import com.restbucks.ordering.representations.OrderRepresentation;

public class UpdateOrderActivityTest {
        
    @Test(expected = UpdateException.class)
    public void shouldNotAllowUpdatesOnReadyOrders() {
        String id = placeOrder(OrderStatus.READY);
        
        UpdateOrderActivity activity = new UpdateOrderActivity();
        Order updatedOrder = order().withRandomItems().build();
        OrderRepresentation o = new OrderRepresentation(updatedOrder, null); // no internal order#
        activity.update(o, id);
    }
    
    @Test(expected = InvalidOrderException.class)
    public void shouldNotAllowUpdatesOnUnReadyOrdersWithWrongId() {
    	 String id  = placeOrder(OrderStatus.READY);
        
        UpdateOrderActivity activity = new UpdateOrderActivity();
        Order updatedOrder = order().withRandomItems().build();
        OrderRepresentation o = new OrderRepresentation(updatedOrder, "123123"); 
        activity.update(o, id);
    }
    
  
    @Test
    public void shouldAllowUpdatesOnUnreadyOrdersWithProperId() {
    	 String id  = placeOrder(OrderStatus.PREPARING);
        
        UpdateOrderActivity activity = new UpdateOrderActivity();
        Order updatedOrder = order().withRandomItems().build();
        OrderRepresentation o = new OrderRepresentation(updatedOrder, id); // proper order#
        OrderRepresentation updatedOrderRepresentation = activity.update(o, id);  
        assertNotNull(updatedOrderRepresentation.getId());
    }
    @Test
    public void shouldAllowUpdatesOnUnreadyOrdersWithNullId() {
    	 String id  = placeOrder(OrderStatus.PREPARING);
        
        UpdateOrderActivity activity = new UpdateOrderActivity();
        Order updatedOrder = order().withRandomItems().build();
        OrderRepresentation o = new OrderRepresentation(updatedOrder, null); // no internal order#
        OrderRepresentation updatedOrderRepresentation = activity.update(o, id);  
        assertNotNull(updatedOrderRepresentation.getId());
    }

    private String placeOrder(OrderStatus status) {
    	Order order = order().withStatus(status).build();
    	Identifier id = OrderRepository.current().store(order);
        return id.toString();
    }

}
