def test_success(self, UrlFetchClassMock):
        # Pre conditions
        pagseguro_facade.create_or_update_access_data_cmd(
            '*****@*****.**', 'abc123')()
        payment = mommy.save_one(PagSegPayment,
                                 code=None,
                                 net_amount=None,
                                 status=STATUS_SENT_TO_PAGSEGURO)

        # Mocking fetch
        fetch_cmd_obj = Mock()
        fetch_cmd_obj.result.content = generate_xml(payment.key.id(), '2',
                                                    '18.99')
        UrlFetchClassMock.return_value = fetch_cmd_obj

        # Command execution
        cmd = FetchNotificationDetail('12345')

        cmd()

        # Assertions

        UrlFetchClassMock.assert_called_once_with(
            'https://ws.pagseguro.uol.com.br/v3/transactions/notifications/12345?token=abc123&email=foo%40bar.com'
        )

        self.assertEqual(cmd.result, str(payment.key.id()))
        self.assertEqual(cmd.code, CODE)
        self.assertEqual(cmd.net_amount, '18.99')
        self.assertEqual(
            cmd.status,
            STATUS_ANALYSIS)  # status respective to number 2 coming from xml
    def test_success(self, UrlFetchClassMock):
        # Pre conditions
        pagseguro_facade.create_or_update_access_data_cmd('*****@*****.**', 'abc123')()
        payment = mommy.save_one(PagSegPayment, code=None, net_amount=None, status=STATUS_SENT_TO_PAGSEGURO)

        # Mocking fetch
        fetch_cmd_obj = Mock()
        fetch_cmd_obj.result.content = generate_xml(payment.key.id(), '2', '18.99')
        UrlFetchClassMock.return_value = fetch_cmd_obj

        # Command execution
        cmd = FetchNotificationDetail('12345')

        cmd()

        # Assertions

        UrlFetchClassMock.assert_called_once_with(
            'https://ws.pagseguro.uol.com.br/v3/transactions/notifications/12345?token=abc123&email=foo%40bar.com')

        self.assertEqual(cmd.result, str(payment.key.id()))
        self.assertEqual(cmd.code, CODE)
        self.assertEqual(cmd.net_amount, '18.99')
        self.assertEqual(cmd.status, STATUS_ANALYSIS)  # status respective to number 2 coming from xml
Example #3
0
    def test_create_or_update_access_data(self):
        data = FindAccessDataCmd().execute().result
        self.assertIsNone(data)
        pagseguro_facade.create_or_update_access_data_cmd('*****@*****.**', 'abc').execute()
        data = FindAccessDataCmd().execute().result
        self.assertEqual('*****@*****.**', data.email)
        self.assertEqual('abc', data.token)
        pagseguro_facade.create_or_update_access_data_cmd('*****@*****.**', '123').execute()
        data2 = FindAccessDataCmd().execute().result
        self.assertEqual(data.key, data2.key)
        self.assertEqual('*****@*****.**', data2.email)
        self.assertEqual('123', data2.token)

        # Another change to assure data is not cached
        pagseguro_facade.create_or_update_access_data_cmd('*****@*****.**', 'xpto').execute()
        data3 = FindAccessDataCmd().execute().result
        self.assertEqual(data.key, data3.key)
        self.assertEqual('*****@*****.**', data3.email)
        self.assertEqual('xpto', data3.token)
Example #4
0
    def test_succesfull_call(self, UrlFetchCommandMock):
        # Mocking call to pagseguro
        UrlFetchCommandMock.return_value = _build_mock()

        # Before making a payment, email and token must be saved
        pagseguro_facade.create_or_update_access_data_cmd('*****@*****.**', 'abc123')()

        # Creating the address validation cmd that will be used on payment
        validate_address_cmd = pagseguro_facade.validate_address_cmd(complement='apto 4', state='SP',
                                                                     town='São Paulo',
                                                                     postalcode='12345-678',
                                                                     quarter='Jardins', number='2',
                                                                     street='Av Vicente de Carvalho')

        # Creating items included on payment
        class ProductMock(Node):
            pass

        product1 = ProductMock()
        product2 = ProductMock()
        ndb.put_multi([product1, product2])
        validate_item_cmds = [pagseguro_facade.validate_item_cmd('Python Birds', '18.99', '1', product1.key),
                              pagseguro_facade.validate_item_cmd('App Engine', '45.58', '2', product2.key)]

        # Creating payment owner. User or other mother can be payment owner

        class UserMock(Node):
            name = ndb.StringProperty(required=True)
            email = ndb.StringProperty(required=True)

        owner = UserMock(name='Renzo Nuccitelli', email='*****@*****.**')
        owner.put()

        # Generating payment

        payment_cmd = pagseguro_facade.generate_payment('http://somedomain.com/receive',
                                                        owner.name,
                                                        owner.email,
                                                        owner,
                                                        validate_address_cmd, *validate_item_cmds)

        payment = payment_cmd()

        # Payment assertions
        self.assertEqual(_SUCCESS_PAGSEGURO_CODE, payment_cmd.checkout_code)
        self.assertEqual(STATUS_SENT_TO_PAGSEGURO, payment.status)
        self.assertEqual(Decimal('110.15'), payment.total, "Should be the sum of item's totals")

        # Owner assertion

        owner_payments = pagseguro_facade.search_payments(owner, relations=['owner', 'pay_items', 'logs'])()
        self.assertListEqual([payment], owner_payments)
        payment = owner_payments[0]
        # Log assertions

        statuses = [log.status for log in payment.logs]
        self.assertEqual([STATUS_CREATED, STATUS_SENT_TO_PAGSEGURO], statuses)

        # Items assertions
        self.assertEqual(2, len(payment.pay_items))
        self.assertIsInstance(payment.pay_items[0], PagSegItem)

        # Dictionary genartion assertions

        # Items Assertions

        form = pagseguro_facade.payment_form()
        payment_dct = form.fill_with_model(payment)

        items = payment.pay_items
        items_dcts = [{u'id': items[0].key.id(), 'price': u'18.99', 'description': u'Python Birds',
                       'reference': items[0].reference.id(), 'quantity': u'1',
                       'total': '18.99'},
                      {u'id': items[1].key.id(), 'price': u'45.58', 'description': u'App Engine',
                       'reference': items[1].reference.id(), 'quantity': u'2',
                       'total': '91.16'}]
        self.assertListEqual(items_dcts, payment_dct['pay_items'])


        # Log Assertions
        self.assertListEqual([STATUS_CREATED, STATUS_SENT_TO_PAGSEGURO], [log['status'] for log in payment_dct['logs']])
    def test_success(self, UrlFetchClassMock):
        # Pre conditions
        pagseguro_facade.create_or_update_access_data_cmd(
            '*****@*****.**', 'abc123')()
        payment = mommy.save_one(PagSegPayment,
                                 code=None,
                                 net_amount=None,
                                 status=STATUS_SENT_TO_PAGSEGURO)

        # Mocking fetch
        fetch_cmd_obj = Mock()
        fetch_cmd_obj.result.content = generate_xml(payment.key.id(), '2',
                                                    '18.99')
        UrlFetchClassMock.return_value = fetch_cmd_obj

        # Command execution
        cmd = pagseguro_facade.payment_notification('12345')

        cmd()

        # Assertions for first call after payment for pagseguro

        UrlFetchClassMock.assert_called_once_with(
            'https://ws.pagseguro.uol.com.br/v3/transactions/notifications/12345?token=abc123&email=foo%40bar.com'
        )

        self.assertEqual(cmd.result, payment)
        payment = payment.key.get()  # Searching from db to see updates
        self.assertEqual(payment.code, CODE)
        self.assertEqual(payment.net_amount, Decimal('18.99'))
        self.assertEqual(
            payment.status,
            STATUS_ANALYSIS)  # status respective to number 2 coming from xml

        logs = pagseguro_facade.search_logs(payment)()

        self.assertEqual(1, len(logs))
        self.assertEqual(STATUS_ANALYSIS, logs[0].status)

        # Emulating paid status

        fetch_cmd_obj.result.content = generate_xml(payment.key.id(), '3',
                                                    '18.99')
        expected_statuses = [STATUS_ANALYSIS, STATUS_ACCEPTED]
        self.assert_payment_notification_saved(cmd, expected_statuses, payment)

        # Emulating contesting status
        fetch_cmd_obj.result.content = generate_xml(payment.key.id(), '9',
                                                    '18.99')
        expected_statuses = [
            STATUS_ANALYSIS, STATUS_ACCEPTED, STATUS_CHARGEBACK
        ]
        self.assert_payment_notification_saved(cmd, expected_statuses, payment)

        # Emulating chargeback debt status
        fetch_cmd_obj.result.content = generate_xml(payment.key.id(), '8',
                                                    '18.99')
        expected_statuses = [
            STATUS_ANALYSIS, STATUS_ACCEPTED, STATUS_CHARGEBACK,
            STATUS_CHARGEBACK_DEBT
        ]
        self.assert_payment_notification_saved(cmd, expected_statuses, payment)

        # Emulating canceled status
        fetch_cmd_obj.result.content = generate_xml(payment.key.id(), '7',
                                                    '18.99')
        expected_statuses.append(STATUS_CANCELLED)
        self.assert_payment_notification_saved(cmd, expected_statuses, payment)

        # Emulating Returned
        fetch_cmd_obj.result.content = generate_xml(payment.key.id(), '6',
                                                    '18.99')
        expected_statuses.append(STATUS_RETURNED)
        self.assert_payment_notification_saved(cmd, expected_statuses, payment)

        # Emulating dispute status
        fetch_cmd_obj.result.content = generate_xml(payment.key.id(), '5',
                                                    '18.99')
        expected_statuses.append(STATUS_DISPUTE)
        self.assert_payment_notification_saved(cmd, expected_statuses, payment)

        # Emulating created status
        fetch_cmd_obj.result.content = generate_xml(payment.key.id(), '1',
                                                    '18.99')
        expected_statuses.append(STATUS_SENT_TO_PAGSEGURO)
        self.assert_payment_notification_saved(cmd, expected_statuses, payment)

        # Emulating available status
        fetch_cmd_obj.result.content = generate_xml(payment.key.id(), '4',
                                                    '18.99')
        expected_statuses.append(STATUS_AVAILABLE)
        self.assert_payment_notification_saved(cmd, expected_statuses, payment)
    def test_success(self, UrlFetchClassMock):
        # Pre conditions
        pagseguro_facade.create_or_update_access_data_cmd('*****@*****.**', 'abc123')()
        payment = mommy.save_one(PagSegPayment, code=None, net_amount=None, status=STATUS_SENT_TO_PAGSEGURO)

        # Mocking fetch
        fetch_cmd_obj = Mock()
        fetch_cmd_obj.result.content = generate_xml(payment.key.id(), '2', '18.99')
        UrlFetchClassMock.return_value = fetch_cmd_obj

        # Command execution
        cmd = pagseguro_facade.payment_notification('12345')

        cmd()

        # Assertions for first call after payment for pagseguro

        UrlFetchClassMock.assert_called_once_with(
            'https://ws.pagseguro.uol.com.br/v3/transactions/notifications/12345?token=abc123&email=foo%40bar.com')

        self.assertEqual(cmd.result, payment)
        payment = payment.key.get()  # Searching from db to see updates
        self.assertEqual(payment.code, CODE)
        self.assertEqual(payment.net_amount, Decimal('18.99'))
        self.assertEqual(payment.status, STATUS_ANALYSIS)  # status respective to number 2 coming from xml

        logs = pagseguro_facade.search_logs(payment)()

        self.assertEqual(1, len(logs))
        self.assertEqual(STATUS_ANALYSIS, logs[0].status)

        # Emulating paid status

        fetch_cmd_obj.result.content = generate_xml(payment.key.id(), '3', '18.99')
        expected_statuses = [STATUS_ANALYSIS, STATUS_ACCEPTED]
        self.assert_payment_notification_saved(cmd, expected_statuses, payment)

        # Emulating contesting status
        fetch_cmd_obj.result.content = generate_xml(payment.key.id(), '9', '18.99')
        expected_statuses = [STATUS_ANALYSIS, STATUS_ACCEPTED, STATUS_CHARGEBACK]
        self.assert_payment_notification_saved(cmd, expected_statuses, payment)


        # Emulating chargeback debt status
        fetch_cmd_obj.result.content = generate_xml(payment.key.id(), '8', '18.99')
        expected_statuses = [STATUS_ANALYSIS, STATUS_ACCEPTED, STATUS_CHARGEBACK, STATUS_CHARGEBACK_DEBT]
        self.assert_payment_notification_saved(cmd, expected_statuses, payment)


        # Emulating canceled status
        fetch_cmd_obj.result.content = generate_xml(payment.key.id(), '7', '18.99')
        expected_statuses.append(STATUS_CANCELLED)
        self.assert_payment_notification_saved(cmd, expected_statuses, payment)

        # Emulating Returned
        fetch_cmd_obj.result.content = generate_xml(payment.key.id(), '6', '18.99')
        expected_statuses.append(STATUS_RETURNED)
        self.assert_payment_notification_saved(cmd, expected_statuses, payment)

        # Emulating dispute status
        fetch_cmd_obj.result.content = generate_xml(payment.key.id(), '5', '18.99')
        expected_statuses.append(STATUS_DISPUTE)
        self.assert_payment_notification_saved(cmd, expected_statuses, payment)

        # Emulating created status
        fetch_cmd_obj.result.content = generate_xml(payment.key.id(), '1', '18.99')
        expected_statuses.append(STATUS_SENT_TO_PAGSEGURO)
        self.assert_payment_notification_saved(cmd, expected_statuses, payment)

        # Emulating available status
        fetch_cmd_obj.result.content = generate_xml(payment.key.id(), '4', '18.99')
        expected_statuses.append(STATUS_AVAILABLE)
        self.assert_payment_notification_saved(cmd, expected_statuses, payment)