def setUp(self):
     self.warehouseSnapshotDao = WarehouseSnapshotDaoMemoryImpl()
     self.inventoryReportManager = InventoryReportManager(self.warehouseSnapshotDao)
class InventoryReportManagerTests(TestCase):
    CURRENT_MONTH = 5
    CURRENT_YEAR = 2013
    def _addWarehouseSnapshot(self, warehouseName, year, month,
                              appleQuantity, appleUnitValue,
                              boseQuantity, boseUnitValue):
        warehouseSnapshot = self.warehouseSnapshotDao.addWarehouseSnapshot(warehouseName, year, month)
        warehouseSnapshot.skus.append(Sku(TestNames.SKU_APPLE, appleQuantity, appleUnitValue))
        warehouseSnapshot.skus.append(Sku(TestNames.SKU_BOSE, boseQuantity, boseUnitValue))
    
    def _addCurrentMonthSnapshot(self, warehouseName):
        self._addWarehouseSnapshot(warehouseName, self.CURRENT_YEAR,
                self.CURRENT_MONTH, 20, 32000, 5, 18000)

    def _addTwoMonthsSnapshot(self, warehouseName):
        self._addWarehouseSnapshot(warehouseName, self.CURRENT_YEAR,
                self.CURRENT_MONTH - 1, 12, 35000, 5, 19000)
        self._addCurrentMonthSnapshot(warehouseName)

    def setUp(self):
        self.warehouseSnapshotDao = WarehouseSnapshotDaoMemoryImpl()
        self.inventoryReportManager = InventoryReportManager(self.warehouseSnapshotDao)

    def tearDown(self):
        self.inventoryReportManager = None

    def testShouldGenerateWarehouseReport(self):
        self._addTwoMonthsSnapshot(TestNames.WAREHOUSE_AGRA)

        warehouseReport = self.inventoryReportManager.generateWarehouseReport(
                TestNames.WAREHOUSE_AGRA, self.CURRENT_YEAR, self.CURRENT_MONTH)
        self.assertIsNotNone(warehouseReport)
        self.assertEqual(2, warehouseReport.skus)
        self.assertEqual(25, warehouseReport.units)
        self.assertEqual(730000, warehouseReport.value)
        self.assertEqual(215000, warehouseReport.changeInValue)

    def testShouldGenerateNullWarehouseReportIfMissingData(self):
        warehouseReport = self.inventoryReportManager.generateWarehouseReport(
                TestNames.WAREHOUSE_AGRA, self.CURRENT_YEAR, self.CURRENT_MONTH)
        self.assertIsNone(warehouseReport)
        
        self._addCurrentMonthSnapshot(TestNames.WAREHOUSE_AGRA)
        warehouseReport = self.inventoryReportManager.generateWarehouseReport(
                TestNames.WAREHOUSE_AGRA, self.CURRENT_YEAR, self.CURRENT_MONTH)
        self.assertIsNone(warehouseReport)
    
    def testShouldGenerateSkuReport(self):
        self._addTwoMonthsSnapshot(TestNames.WAREHOUSE_AGRA)
        self._addTwoMonthsSnapshot(TestNames.WAREHOUSE_BANGALORE)
        
        skuReport = self.inventoryReportManager.generateSkuReport(
                TestNames.SKU_APPLE, self.CURRENT_YEAR, self.CURRENT_MONTH)
        self.assertIsNotNone(skuReport)
        self.assertEqual(40, skuReport.units)
        self.assertEqual(1280000, skuReport.value)
        self.assertEqual(440000, skuReport.changeInValue)
    
    def testShouldGenerateSkuWarehouseReport(self):
        self._addTwoMonthsSnapshot(TestNames.WAREHOUSE_AGRA)
        self._addTwoMonthsSnapshot(TestNames.WAREHOUSE_BANGALORE)
        
        skuWarehouseReport = \
                self.inventoryReportManager.generateSkuWarehouseReport(
                        TestNames.SKU_APPLE, TestNames.WAREHOUSE_AGRA,
                        self.CURRENT_YEAR, self.CURRENT_MONTH)
        self.assertIsNotNone(skuWarehouseReport)
        self.assertEqual(20, skuWarehouseReport.units)
        self.assertEqual(640000, skuWarehouseReport.value)
        self.assertEqual(220000, skuWarehouseReport.changeInValue)