Ejemplo n.º 1
0
 def setUp(self):
     self.task = PaypalTransactionsByDayTask(
         date=luigi.DateParameter().parse(self.DEFAULT_DATE),
         output_root='/fake/output',
         account_id='testing'
     )
     self.output_target = FakeTarget()
     self.task.output = MagicMock(return_value=self.output_target)
Ejemplo n.º 2
0
class TestPaypalTransactionsByDayTask(unittest.TestCase):

    DEFAULT_DATE = "2015-08-28"

    RESPONSES = ["""\
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<reportingEngineResponse>
    <baseResponse>
        <responseCode>100</responseCode>
        <responseMsg>Request has completed successfully</responseMsg>
    </baseResponse>
    <runReportResponse>
        <reportId>RE1234567890</reportId>
        <statusCode>3</statusCode>
        <statusMsg>Report has completed successfully</statusMsg>
    </runReportResponse>
</reportingEngineResponse>
""", """\
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<reportingEngineResponse>
    <baseResponse>
        <responseCode>100</responseCode>
        <responseMsg>Request has completed successfully</responseMsg>
    </baseResponse>
    <getMetaDataResponse>
        <reportId>RE1234567890</reportId>
        <numberOfRows>1</numberOfRows>
        <numberOfPages>1</numberOfPages>
        <pageSize>50</pageSize>
        <numberOfColumns>23</numberOfColumns>
        <columnMetaData colNum="1">
            <dataName>Transaction ID</dataName>
            <dataType>string</dataType>
        </columnMetaData>
        <columnMetaData colNum="2">
            <dataName>Time</dataName>
            <dataType>date</dataType>
        </columnMetaData>
        <columnMetaData colNum="3">
            <dataName>Type</dataName>
            <dataType>string</dataType>
        </columnMetaData>
        <columnMetaData colNum="4">
            <dataName>Tender Type</dataName>
            <dataType>string</dataType>
        </columnMetaData>
        <columnMetaData colNum="5">
            <dataName>Account Number</dataName>
            <dataType>string</dataType>
        </columnMetaData>
        <columnMetaData colNum="6">
            <dataName>Expires</dataName>
            <dataType>string</dataType>
        </columnMetaData>
        <columnMetaData colNum="7">
            <dataName>Amount</dataName>
            <dataType>currency</dataType>
        </columnMetaData>
        <columnMetaData colNum="8">
            <dataName>Result Code</dataName>
            <dataType>number</dataType>
        </columnMetaData>
        <columnMetaData colNum="9">
            <dataName>Response Msg</dataName>
            <dataType>string</dataType>
        </columnMetaData>
        <columnMetaData colNum="10">
            <dataName>Comment1</dataName>
            <dataType>string</dataType>
        </columnMetaData>
        <columnMetaData colNum="11">
            <dataName>Comment2</dataName>
            <dataType>string</dataType>
        </columnMetaData>
        <columnMetaData colNum="12">
            <dataName>Batch ID</dataName>
            <dataType>number</dataType>
        </columnMetaData>
        <columnMetaData colNum="13">
            <dataName>Currency Symbol</dataName>
            <dataType>string</dataType>
        </columnMetaData>
        <columnMetaData colNum="14">
            <dataName>PayPal Transaction ID</dataName>
            <dataType>string</dataType>
        </columnMetaData>
        <columnMetaData colNum="15">
            <dataName>PayPal Fees</dataName>
            <dataType>currency</dataType>
        </columnMetaData>
        <columnMetaData colNum="16">
            <dataName>PayPal Email ID</dataName>
            <dataType>string</dataType>
        </columnMetaData>
        <columnMetaData colNum="17">
            <dataName>Original PNREF</dataName>
            <dataType>string</dataType>
        </columnMetaData>
        <columnMetaData colNum="18">
            <dataName>Original Type</dataName>
            <dataType>string</dataType>
        </columnMetaData>
        <columnMetaData colNum="19">
            <dataName>Original Amount</dataName>
            <dataType>currency</dataType>
        </columnMetaData>
        <columnMetaData colNum="20">
            <dataName>Original Time</dataName>
            <dataType>date</dataType>
        </columnMetaData>
        <columnMetaData colNum="21">
            <dataName>Invoice Number</dataName>
            <dataType>string</dataType>
        </columnMetaData>
        <columnMetaData colNum="22">
            <dataName>Purchase Order</dataName>
            <dataType>string</dataType>
        </columnMetaData>
        <columnMetaData colNum="23">
            <dataName>Customer Ref</dataName>
            <dataType>string</dataType>
        </columnMetaData>
    </getMetaDataResponse>
</reportingEngineResponse>
""", """\
<?xml version="1.0" encoding="utf8"?>
<reportingEngineResponse>
    <baseResponse>
        <responseCode>100</responseCode>
        <responseMsg>Request has completed successfully</responseMsg>
    </baseResponse>
    <getDataResponse>
        <reportId>RE0949581809</reportId>
        <reportDataRow rowNum="1">
            <columnData colNum="1">
                <data>BTP123456</data>
            </columnData>
            <columnData colNum="2">
                <data>2015-08-28 00:14:27</data>
            </columnData>
            <columnData colNum="3">
                <data>Sale</data>
            </columnData>
            <columnData colNum="4">
                <data>PayPal</data>
            </columnData>
            <columnData colNum="5">
                <data>[email protected]</data>
            </columnData>
            <columnData colNum="6">
                <data/>
            </columnData>
            <columnData colNum="7">
                <data>5000</data>
            </columnData>
            <columnData colNum="8">
                <data>0</data>
            </columnData>
            <columnData colNum="9">
                <data>Approved</data>
            </columnData>
            <columnData colNum="10">
                <data/>
            </columnData>
            <columnData colNum="11">
                <data/>
            </columnData>
            <columnData colNum="12">
                <data>0</data>
            </columnData>
            <columnData colNum="13">
                <data>USD</data>
            </columnData>
            <columnData colNum="14">
                <data>1FW12345678901234</data>
            </columnData>
            <columnData colNum="15">
                <data>140</data>
            </columnData>
            <columnData colNum="16">
                <data>[email protected]</data>
            </columnData>
            <columnData colNum="17">
                <data/>
            </columnData>
            <columnData colNum="18">
                <data/>
            </columnData>
            <columnData colNum="19">
                <data/>
            </columnData>
            <columnData colNum="20">
                <data/>
            </columnData>
            <columnData colNum="21">
                <data>EDX-123456</data>
            </columnData>
            <columnData colNum="22">
                <data/>
            </columnData>
            <columnData colNum="23">
                <data/>
            </columnData>
        </reportDataRow>
        <pageNum>1</pageNum>
    </getDataResponse>
</reportingEngineResponse>
"""]

    def setUp(self):
        self.task = PaypalTransactionsByDayTask(
            date=luigi.DateParameter().parse(self.DEFAULT_DATE),
            output_root='/fake/output',
            account_id='testing'
        )
        self.output_target = FakeTarget()
        self.task.output = MagicMock(return_value=self.output_target)

    def test_normal_run(self):
        httpretty.register_uri(
            httpretty.POST,
            TEST_URL,
            responses=[
                httpretty.Response(body=r)
                for r in self.RESPONSES
            ]
        )

        self.task.run()

        expected_record = ['2015-08-28', 'paypal', 'testing', 'EDX-123456', 'USD', '50.00', '1.40', 'sale',
                           'instant_transfer', 'paypal', '1FW12345678901234']
        self.assertEquals(self.output_target.value.strip(), '\t'.join(expected_record))

    @data(
        (4, 'Report has failed'),
        (5, 'Report has expired'),
        (6, 'Report has expired')
    )
    @unpack
    def test_failed_report(self, status_code, status_message):
        httpretty.register_uri(
            httpretty.POST,
            TEST_URL,
            body=self.create_runreport_response(status_code, status_message)
        )

        with self.assertRaisesRegexp(
                PaypalApiRequestFailedError, 'report request failed with code {0}: {1}'.format(
                    status_code,
                    status_message
                )
        ):
            self.task.run()

    def create_runreport_response(self, status_code, status_message):
            return """\
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<reportingEngineResponse>
    <baseResponse>
        <responseCode>100</responseCode>
        <responseMsg>Request has completed successfully</responseMsg>
    </baseResponse>
    <runReportResponse>
        <reportId>RE1234567890</reportId>
        <statusCode>{status_code}</statusCode>
        <statusMsg>{status_message}</statusMsg>
    </runReportResponse>
</reportingEngineResponse>
""".format(status_code=status_code, status_message=status_message)

    @patch('edx.analytics.tasks.reports.paypal.time')
    def test_delayed_report(self, mock_time):
        responses = list(self.RESPONSES)

        responses.insert(0, self.create_runreport_response(1, 'Report has been created'))
        responses.insert(1, self.create_results_response())
        httpretty.register_uri(
            httpretty.POST,
            TEST_URL,
            responses=[
                httpretty.Response(body=r)
                for r in responses
            ]
        )
        mock_time.time.return_value = 123456789012.1
        self.task.run()

        self.assertEqual(mock_time.time.call_count, 1)
        mock_time.sleep.assert_has_calls([
            call(5),
            call(5)
        ])

        expected_record = ['2015-08-28', 'paypal', 'testing', 'EDX-123456', 'USD', '50.00', '1.40', 'sale',
                           'instant_transfer', 'paypal', '1FW12345678901234']
        self.assertEquals(self.output_target.value.strip(), '\t'.join(expected_record))

    def create_results_response(self):
        return """\
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<reportingEngineResponse>
    <baseResponse>
        <responseCode>100</responseCode>
        <responseMsg>Request has completed successfully</responseMsg>
    </baseResponse>
    <getResultsResponse>
        <Results>
            <reportId>RE1234567890</reportId>
            <statusCode>2</statusCode>
            <statusMsg>Report is currently executing</statusMsg>
        </Results>
    </getResultsResponse>
</reportingEngineResponse>
"""

    @patch('edx.analytics.tasks.reports.paypal.time')
    def test_delayed_report(self, mock_time):
        responses = list(self.RESPONSES)

        responses.insert(0, self.create_runreport_response(1, 'Report has been created'))
        responses.insert(1, self.create_results_response())
        httpretty.register_uri(
            httpretty.POST,
            TEST_URL,
            responses=[
                httpretty.Response(body=r)
                for r in responses
            ]
        )
        mock_time.time.return_value = 123456789012.1
        self.task.run()

        self.assertEqual(mock_time.time.call_count, 1)
        mock_time.sleep.assert_has_calls([
            call(5),
            call(5)
        ])

        expected_record = ['2015-08-28', 'paypal', 'testing', 'EDX-123456', 'USD', '50.00', '1.40', 'sale',
                           'instant_transfer', 'paypal', '1FW12345678901234']
        self.assertEquals(self.output_target.value.strip(), '\t'.join(expected_record))

    @with_luigi_config('paypal', 'timeout', '1')
    @patch('edx.analytics.tasks.reports.paypal.time')
    def test_report_timeout(self, mock_time):
        responses = list(self.RESPONSES)

        responses.insert(0, self.create_runreport_response(1, 'Report has been created'))
        httpretty.register_uri(
            httpretty.POST,
            TEST_URL,
            responses=[
                httpretty.Response(body=r)
                for r in responses
            ]
        )
        arbitrary_time = 123456789012.1234
        mock_time.time.side_effect = [arbitrary_time, arbitrary_time + 5]

        with self.assertRaises(PaypalTimeoutError):
            self.task.run()