@Test
public void testCategorySiteMapGenerator() throws SiteMapException, IOException {

    Category c1 = new CategoryImpl();
    c1.setUrl("/");
    c1.setId(1l);
    Category c2 = new CategoryImpl();
    c2.setUrl("/hot-sauces");
    c2.setId(2l);
    CategoryMediaXref cmXref1 = new CategoryMediaXrefImpl();
    Media m1 = new MediaImpl();
    m1.setUrl("/img/hot-sauce-img1.png");
    cmXref1.setCategory(c2);
    cmXref1.setMedia(m1);
    c2.getCategoryMediaXref().put("image1", cmXref1);
    CategoryMediaXref cmXref2 = new CategoryMediaXrefImpl();
    Media m2 = new MediaImpl();
    m2.setUrl("/img/hot-sauce-img2.png");
    cmXref2.setCategory(c2);
    cmXref2.setMedia(m2);
    c2.getCategoryMediaXref().put("image2", cmXref2);
    Category c3 = new CategoryImpl();
    c3.setUrl("merchandise");
    c3.setId(3l);
    Category c4 = new CategoryImpl();
    c4.setUrl("/clearance");
    c4.setId(4l);
    Category c5 = new CategoryImpl();
    c5.setUrl("/mens");
    c5.setId(5l);
    Category c6 = new CategoryImpl();
    c6.setUrl("/womens");
    c6.setId(6l);
    List<Category> merchandiseSubcategories = new ArrayList<Category>();
    merchandiseSubcategories.add(c5);
    merchandiseSubcategories.add(c6);
    CategoryDao categoryDao = EasyMock.createMock(CategoryDao.class);
    EasyMock.expect(categoryDao.readActiveSubCategoriesByCategory(c1, 5, 0)).andReturn(new ArrayList<Category>())
            .atLeastOnce();
    EasyMock.expect(categoryDao.readCategoryById(c1.getId())).andReturn(c1).atLeastOnce();
    
    EasyMock.expect(categoryDao.readActiveSubCategoriesByCategory(c2, 5, 0)).andReturn(new ArrayList<Category>())
            .atLeastOnce();
    EasyMock.expect(categoryDao.readCategoryById(c2.getId())).andReturn(c2).atLeastOnce();
    
    EasyMock.expect(categoryDao.readActiveSubCategoriesByCategory(c3, 5, 0)).andReturn(merchandiseSubcategories)
            .atLeastOnce();
    EasyMock.expect(categoryDao.readCategoryById(c3.getId())).andReturn(c3).atLeastOnce();
    
    EasyMock.expect(categoryDao.readActiveSubCategoriesByCategory(c4, 5, 0)).andReturn(new ArrayList<Category>())
            .atLeastOnce();
    EasyMock.expect(categoryDao.readCategoryById(c4.getId())).andReturn(c4).atLeastOnce();
    
    EasyMock.expect(categoryDao.readActiveSubCategoriesByCategory(c5, 5, 0)).andReturn(new ArrayList<Category>())
        .atLeastOnce();
    EasyMock.expect(categoryDao.readCategoryById(c5.getId())).andReturn(c5).atLeastOnce();
    EasyMock.expect(categoryDao.readActiveSubCategoriesByCategory(c6, 5, 0)).andReturn(new ArrayList<Category>())
        .atLeastOnce();
    EasyMock.expect(categoryDao.readCategoryById(c6.getId())).andReturn(c6).atLeastOnce();
    
    // Initialize the mocks
    EasyMock.replay(categoryDao);
    CategorySiteMapGenerator csmg = new CategorySiteMapGenerator(new MockEnvironment());
    csmg.setCategoryDao(categoryDao);
    csmg.setRowLimit(5);
    List<SiteMapGeneratorConfiguration> smgcList = new ArrayList<SiteMapGeneratorConfiguration>();
    CategorySiteMapGeneratorConfiguration c1CSMGC = new CategorySiteMapGeneratorConfigurationImpl();
    c1CSMGC.setDisabled(false);
    c1CSMGC.setSiteMapGeneratorType(SiteMapGeneratorType.CATEGORY);
    c1CSMGC.setSiteMapChangeFreq(SiteMapChangeFreqType.HOURLY);
    c1CSMGC.setSiteMapPriority(SiteMapPriorityType.POINT5);
    c1CSMGC.setRootCategory(c1);
    c1CSMGC.setStartingDepth(0);
    c1CSMGC.setEndingDepth(1);
    smgcList.add(c1CSMGC);
    CategorySiteMapGeneratorConfiguration c2CSMGC = new CategorySiteMapGeneratorConfigurationImpl();
    c2CSMGC.setDisabled(false);
    c2CSMGC.setSiteMapGeneratorType(SiteMapGeneratorType.CATEGORY);
    c2CSMGC.setSiteMapChangeFreq(SiteMapChangeFreqType.HOURLY);
    c2CSMGC.setSiteMapPriority(SiteMapPriorityType.POINT5);
    c2CSMGC.setRootCategory(c2);
    c2CSMGC.setStartingDepth(0);
    c2CSMGC.setEndingDepth(1);
    smgcList.add(c2CSMGC);
    CategorySiteMapGeneratorConfiguration c3CSMGC = new CategorySiteMapGeneratorConfigurationImpl();
    c3CSMGC.setDisabled(false);
    c3CSMGC.setSiteMapGeneratorType(SiteMapGeneratorType.CATEGORY);
    c3CSMGC.setSiteMapChangeFreq(SiteMapChangeFreqType.HOURLY);
    c3CSMGC.setSiteMapPriority(SiteMapPriorityType.POINT5);
    c3CSMGC.setRootCategory(c3);
    c3CSMGC.setStartingDepth(0);
    c3CSMGC.setEndingDepth(1);
    smgcList.add(c3CSMGC);
    CategorySiteMapGeneratorConfiguration c4CSMGC = new CategorySiteMapGeneratorConfigurationImpl();
    c4CSMGC.setDisabled(false);
    c4CSMGC.setSiteMapGeneratorType(SiteMapGeneratorType.CATEGORY);
    c4CSMGC.setSiteMapChangeFreq(SiteMapChangeFreqType.HOURLY);
    c4CSMGC.setSiteMapPriority(SiteMapPriorityType.POINT5);
    c4CSMGC.setRootCategory(c4);
    c4CSMGC.setStartingDepth(0);
    c4CSMGC.setEndingDepth(1);
    smgcList.add(c4CSMGC);
    testGenerator(smgcList, csmg, 2);
    File file1 = fileService.getResource("/sitemap_index.xml");
    File file2 = fileService.getResource("/sitemap1.xml");
    File file3 = fileService.getResource("/sitemap2.xml");
    File file4 = fileService.getResource("/sitemap3.xml");
    compareFiles(file1, "src/test/resources/org/broadleafcommerce/sitemap/category/sitemap_index.xml");
    compareFiles(file2, "src/test/resources/org/broadleafcommerce/sitemap/category/sitemap1.xml");
    compareFiles(file3, "src/test/resources/org/broadleafcommerce/sitemap/category/sitemap2.xml");
    compareFiles(file4, "src/test/resources/org/broadleafcommerce/sitemap/category/sitemap3.xml");
    testGenerator(smgcList, csmg, 50000);
    File file5 = fileService.getResource("/sitemap.xml");
    compareFiles(file5, "src/test/resources/org/broadleafcommerce/sitemap/category/sitemap.xml");
}