def test_purge_expired_line_items_before_date(self):
        """Test to remove line items before a provided date."""
        bill_table_name = AWS_CUR_TABLE_MAP["bill"]
        line_item_table_name = AWS_CUR_TABLE_MAP["line_item"]
        cost_entry_table_name = AWS_CUR_TABLE_MAP["cost_entry"]

        cleaner = AWSReportDBCleaner(self.schema)

        with schema_context(self.schema):
            # Verify that data is not cleared for a cutoff date < billing_period_start
            first_bill = self.accessor._get_db_obj_query(
                bill_table_name).first()
            cutoff_date = first_bill.billing_period_start
            earlier_cutoff = cutoff_date.replace(
                day=15) + relativedelta.relativedelta(months=-1)

            self.assertIsNotNone(
                self.accessor._get_db_obj_query(bill_table_name).first())
            self.assertIsNotNone(
                self.accessor._get_db_obj_query(line_item_table_name).first())
            self.assertIsNotNone(
                self.accessor._get_db_obj_query(cost_entry_table_name).first())

        removed_data = cleaner.purge_expired_line_item(earlier_cutoff)

        self.assertEqual(len(removed_data), 0)

        with schema_context(self.schema):
            self.assertIsNotNone(
                self.accessor._get_db_obj_query(bill_table_name).first())
            self.assertIsNotNone(
                self.accessor._get_db_obj_query(line_item_table_name).first())
            self.assertIsNotNone(
                self.accessor._get_db_obj_query(cost_entry_table_name).first())
    def test_purge_expired_line_items_on_date(self):
        """Test to remove line items on a provided date."""
        bill_table_name = AWS_CUR_TABLE_MAP["bill"]
        line_item_table_name = AWS_CUR_TABLE_MAP["line_item"]
        cost_entry_table_name = AWS_CUR_TABLE_MAP["cost_entry"]

        cleaner = AWSReportDBCleaner(self.schema)
        with schema_context(self.schema):
            # Verify that data is cleared for a cutoff date == billing_period_start
            first_bill = self.accessor._get_db_obj_query(
                bill_table_name).order_by("-billing_period_start").first()
            cutoff_date = first_bill.billing_period_start
            expected_count = (
                self.accessor._get_db_obj_query(bill_table_name).filter(
                    billing_period_start__lte=cutoff_date).count())

            self.assertIsNotNone(
                self.accessor._get_db_obj_query(bill_table_name).first())
            self.assertIsNotNone(
                self.accessor._get_db_obj_query(line_item_table_name).first())
            self.assertIsNotNone(
                self.accessor._get_db_obj_query(cost_entry_table_name).first())

        removed_data = cleaner.purge_expired_line_item(cutoff_date)

        self.assertEqual(len(removed_data), expected_count)
        self.assertIn(
            first_bill.payer_account_id,
            [entry.get("account_payer_id") for entry in removed_data])
        self.assertIn(
            str(first_bill.billing_period_start),
            [entry.get("billing_period_start") for entry in removed_data])
    def test_purge_expired_line_items_on_date_simulate(self):
        """Test to simulate removing report data on a provided date."""
        bill_table_name = AWS_CUR_TABLE_MAP["bill"]
        line_item_table_name = AWS_CUR_TABLE_MAP["line_item"]
        cost_entry_table_name = AWS_CUR_TABLE_MAP["cost_entry"]

        cleaner = AWSReportDBCleaner(self.schema)

        # Verify that data is cleared for a cutoff date == billing_period_start
        with schema_context(self.schema):
            first_bill = self.accessor._get_db_obj_query(
                bill_table_name).first()
            cutoff_date = first_bill.billing_period_start

            self.assertIsNotNone(
                self.accessor._get_db_obj_query(bill_table_name).first())
            self.assertIsNotNone(
                self.accessor._get_db_obj_query(line_item_table_name).first())
            self.assertIsNotNone(
                self.accessor._get_db_obj_query(cost_entry_table_name).first())

        removed_data = cleaner.purge_expired_line_item(cutoff_date,
                                                       simulate=True)

        self.assertEqual(len(removed_data), 1)
        self.assertEqual(removed_data[0].get("account_payer_id"),
                         first_bill.payer_account_id)
        self.assertEqual(removed_data[0].get("billing_period_start"),
                         str(first_bill.billing_period_start))

        with schema_context(self.schema):
            self.assertIsNotNone(
                self.accessor._get_db_obj_query(bill_table_name).first())
            self.assertIsNotNone(
                self.accessor._get_db_obj_query(line_item_table_name).first())
            self.assertIsNotNone(
                self.accessor._get_db_obj_query(cost_entry_table_name).first())
 def test_purge_expired_line_items_not_datetime_obj(self):
     """Test error raised if expired_date is not datetime.datetime."""
     cleaner = AWSReportDBCleaner(self.schema)
     with self.assertRaises(AWSReportDBCleanerError):
         cleaner.purge_expired_line_item(False)