package com.ibatis.jpetstore.service;

import java.util.ArrayList;

import org.jmock.Mock;
import org.jmock.MockObjectTestCase;

import com.ibatis.common.util.PaginatedArrayList;
import com.ibatis.jpetstore.domain.Category;
import com.ibatis.jpetstore.domain.Item;
import com.ibatis.jpetstore.domain.Product;
import com.ibatis.jpetstore.persistence.iface.CategoryDao;
import com.ibatis.jpetstore.persistence.iface.ItemDao;
import com.ibatis.jpetstore.persistence.iface.ProductDao;

public class CatalogServiceTest extends MockObjectTestCase {

    public void testShouldCallGetCategoryOnCategoryDao() {

        Mock mock = mock(CategoryDao.class);

        mock.expects(once()).method("getCategory").with(NOT_NULL).will(returnValue(new Category()));

        CatalogService service = new CatalogService((CategoryDao) mock.proxy(), null, null);
        service.getCategory("DOGS");

    }

    public void testShouldCallGetCategoryListOnCategoryDao() {

        Mock mock = mock(CategoryDao.class);

        mock.expects(once()).method("getCategoryList").withNoArguments().will(returnValue(new ArrayList()));

        CatalogService service = new CatalogService((CategoryDao) mock.proxy(), null, null);
        service.getCategoryList();

    }

    public void testShouldCallGetItemOnItemDao() {
        Mock mock = mock(ItemDao.class);

        mock.expects(once()).method("getItem").with(NOT_NULL).will(returnValue(new Item()));

        CatalogService service = new CatalogService(null, (ItemDao) mock.proxy(), null);
        service.getItem("EST-1");

    }

    public void testShouldCallGetItemListByProductOnItemDao() {

        Mock mock = mock(ItemDao.class);

        mock.expects(once()).method("getItemListByProduct").with(NOT_NULL).will(returnValue(new PaginatedArrayList(5)));

        CatalogService service = new CatalogService(null, (ItemDao) mock.proxy(), null);
        service.getItemListByProduct("FI-SW-01");

    }

    public void testShouldCallGetProductOnProductDao() {

        Mock mock = mock(ProductDao.class);

        mock.expects(once()).method("getProduct").with(NOT_NULL).will(returnValue(new Product()));

        CatalogService service = new CatalogService(null, null, (ProductDao) mock.proxy());
        service.getProduct("FI-SW-01");

    }

    public void testShouldCallGetProductListByCategoryOnProductDao() {

        Mock mock = mock(ProductDao.class);

        mock.expects(once()).method("getProductListByCategory").with(NOT_NULL).will(returnValue(new PaginatedArrayList(5)));

        CatalogService service = new CatalogService(null, null, (ProductDao) mock.proxy());
        service.getProductListByCategory("DOGS");

    }

    public void testShouldFindProductIsInStock() {
        Mock mock = mock(ItemDao.class);

        mock.expects(once()).method("isItemInStock").with(NOT_NULL).will(returnValue(true));

        CatalogService service = new CatalogService(null, (ItemDao) mock.proxy(), null);

        assertTrue("Expected item to be in stock.", service.isItemInStock("EST-1"));

    }

    public void testCallSearchProductsOnProductDao() {
        Mock mock = mock(ProductDao.class);

        mock.expects(once()).method("searchProductList").with(NOT_NULL).will(returnValue(new PaginatedArrayList(5)));

        CatalogService service = new CatalogService(null, null, (ProductDao) mock.proxy());
        service.searchProductList("dog");

    }

}
