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)
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()