예제 #1
0
    def test_19paypal_payment_was_successful_email_error(self):
        """
        Test that the error is logged when mail sending fails,
        but cards are still successfully granted.
        """
        from django.core import mail
        from decimal import Decimal
        from website.cardstories import models
        from django.contrib.auth.models import User
        from paypal.standard.ipn.models import PayPalIPN

        user = User.objects.create(username='******')
        user_id = user.id

        def ipn_object():
            """Returns a valid IPN object."""
            return PayPalIPN(business=settings.PAYPAL_RECEIVER_EMAIL,
                             payment_status='Completed',
                             mc_gross=Decimal(
                                 settings.CS_EXTRA_CARD_PACK_PRICE),
                             mc_currency=settings.CS_EXTRA_CARD_PACK_CURRENCY,
                             custom='{"player_id":%d}' % user.id)

        class MockCardstoriesService(object):
            """Pretends to be the CS webservice."""
            def read(self):
                return '{"status":"success"}'

        def mock_cardstories_successful_service(url):
            return MockCardstoriesService()

        models.urlopen = mock_cardstories_successful_service

        # Mock out the mail sending function to fail with an error.
        orig_send_bought_cards_confirmation_mail = models.send_bought_cards_confirmation_mail

        def fail_send_bought_cards_confirmation_mail(player_id):
            raise Exception('Oh noes!')

        models.send_bought_cards_confirmation_mail = fail_send_bought_cards_confirmation_mail

        success = models.paypal_payment_was_successful_handler(ipn_object())
        # Even though mail sending fails, the handler should still report success.
        self.assertTrue(success)
        # A purchase item should still be created.
        self.assertEquals(
            user.purchase_set.filter(
                item_code=settings.CS_EXTRA_CARD_PACK_ITEM_ID).count(), 1)
        # No mail should have been sent.
        self.assertEquals(len(mail.outbox), 0)

        models.send_bought_cards_confirmation_mail = orig_send_bought_cards_confirmation_mail
예제 #2
0
파일: tests.py 프로젝트: B-Rich/cardstories
    def test_19paypal_payment_was_successful_email_error(self):
        """
        Test that the error is logged when mail sending fails,
        but cards are still successfully granted.
        """
        from django.core import mail
        from decimal import Decimal
        from website.cardstories import models
        from django.contrib.auth.models import User
        from paypal.standard.ipn.models import PayPalIPN

        user = User.objects.create(username='******')
        user_id = user.id

        def ipn_object():
            """Returns a valid IPN object."""
            return PayPalIPN(business = settings.PAYPAL_RECEIVER_EMAIL,
                             payment_status = 'Completed',
                             mc_gross = Decimal(settings.CS_EXTRA_CARD_PACK_PRICE),
                             mc_currency = settings.CS_EXTRA_CARD_PACK_CURRENCY,
                             custom = '{"player_id":%d}' % user.id)

        class MockCardstoriesService(object):
            """Pretends to be the CS webservice."""
            def read(self):
                return '{"status":"success"}'
        def mock_cardstories_successful_service(url):
            return MockCardstoriesService()
        models.urlopen = mock_cardstories_successful_service

        # Mock out the mail sending function to fail with an error.
        orig_send_bought_cards_confirmation_mail = models.send_bought_cards_confirmation_mail
        def fail_send_bought_cards_confirmation_mail(player_id):
            raise Exception('Oh noes!')
        models.send_bought_cards_confirmation_mail = fail_send_bought_cards_confirmation_mail

        success = models.paypal_payment_was_successful_handler(ipn_object())
        # Even though mail sending fails, the handler should still report success.
        self.assertTrue(success)
        # A purchase item should still be created.
        self.assertEquals(user.purchase_set.filter(item_code=settings.CS_EXTRA_CARD_PACK_ITEM_ID).count(), 1)
        # No mail should have been sent.
        self.assertEquals(len(mail.outbox), 0)

        models.send_bought_cards_confirmation_mail = orig_send_bought_cards_confirmation_mail
예제 #3
0
파일: tests.py 프로젝트: B-Rich/cardstories
    def test_19paypal_payment_was_successful_handler(self):
        """
        Test the paypal IPN handler.
        """
        from django.core import mail
        from decimal import Decimal
        from website.cardstories import models
        from django.contrib.auth.models import User
        from paypal.standard.ipn.models import PayPalIPN

        user = User.objects.create(username='******')
        user_id = user.id

        def ipn_object():
            """Returns a valid IPN object."""
            return PayPalIPN(business = settings.PAYPAL_RECEIVER_EMAIL,
                             payment_status = 'Completed',
                             mc_gross = Decimal(settings.CS_EXTRA_CARD_PACK_PRICE),
                             mc_currency = settings.CS_EXTRA_CARD_PACK_CURRENCY,
                             custom = '{"player_id":%d}' % user.id)

        # IPN requests with invalid data shouldn't succeed.
        obj = ipn_object()
        obj.business = '*****@*****.**'
        self.assertFalse(models.paypal_payment_was_successful_handler(obj))

        obj = ipn_object()
        obj.payment_status = 'Pending'
        self.assertFalse(models.paypal_payment_was_successful_handler(obj))

        obj = ipn_object()
        obj.mc_gross = Decimal('0.01')
        self.assertFalse(models.paypal_payment_was_successful_handler(obj))

        obj = ipn_object()
        obj.mc_currency = 'THB'
        self.assertFalse(models.paypal_payment_was_successful_handler(obj))

        obj = ipn_object()
        obj.custom = "ohOh {I am a baaaad JSON]"
        self.assertFalse(models.paypal_payment_was_successful_handler(obj))

        default_webservice_internal_secret = settings.WEBSERVICE_INTERNAL_SECRET
        fake_secret = 'ohMySecret123'
        settings.WEBSERVICE_INTERNAL_SECRET = fake_secret

        # Hits the webservice if IPN request is valid.
        class MockCardstoriesService(object):
            """Pretends to be the CS webservice."""
            def __init__(self, status):
                self.status = status
            def read(self):
                return '{"status":"%s"}' % self.status
        def mock_cardstories_successful_service(url):
            self.assertTrue('player_id=%d' % user_id in url)
            self.assertTrue('secret=%s' % fake_secret in url)
            settings.WEBSERVICE_INTERNAL_SECRET = default_webservice_internal_secret
            return MockCardstoriesService('success')
        models.urlopen = mock_cardstories_successful_service

        # After IPN request is successfully handled, a new Purchase object
        # associated with the player should be created.
        # None of the IPN requests have been successful so far, so no purchase
        # object should exist at this point yet.
        self.assertEquals(user.purchase_set.filter(item_code=settings.CS_EXTRA_CARD_PACK_ITEM_ID).count(), 0)

        # Now perform a successful IPN request.
        success = models.paypal_payment_was_successful_handler(ipn_object())
        self.assertTrue(success)

        # A purchase item should be created.
        self.assertEquals(user.purchase_set.filter(item_code=settings.CS_EXTRA_CARD_PACK_ITEM_ID).count(), 1)

        # An confirmation email should have been sent.
        self.assertEquals(len(mail.outbox), 1)
        self.assertEquals('Thank you for purchasing a deck of cards!', mail.outbox[0].subject)
        self.assertEquals(mail.outbox[0].recipients(), ['*****@*****.**'])
        self.assertTrue('extra 10 cards have been added to your deck' in str(mail.outbox[0].message()))

        # Returns False if WS request doesn't succeed.
        def mock_cardstories_fail_service(url):
            return MockCardstoriesService('fail')
        models.urlopen = mock_cardstories_fail_service

        success = models.paypal_payment_was_successful_handler(ipn_object())
        self.assertFalse(success)

        # Returns False if WS reqeuest acts weird.
        def MockCardstoriesDrunkService(object):
            """Pretends to be the CS webservice on vodka"""
            def read(self):
                return "]]] lolzzz} cAts!11!!!"
        models.urlopen = lambda url: MockCardstoriesDrunkService()

        success = models.paypal_payment_was_successful_handler(ipn_object())
        self.assertFalse(success)

        # Since the IPN handler didn't succeed this time, we should still be left
        # with only one Purchase object by this user.
        self.assertEquals(user.purchase_set.filter(item_code=settings.CS_EXTRA_CARD_PACK_ITEM_ID).count(), 1)
예제 #4
0
    def test_19paypal_payment_was_successful_handler(self):
        """
        Test the paypal IPN handler.
        """
        from django.core import mail
        from decimal import Decimal
        from website.cardstories import models
        from django.contrib.auth.models import User
        from paypal.standard.ipn.models import PayPalIPN

        user = User.objects.create(username='******')
        user_id = user.id

        def ipn_object():
            """Returns a valid IPN object."""
            return PayPalIPN(business=settings.PAYPAL_RECEIVER_EMAIL,
                             payment_status='Completed',
                             mc_gross=Decimal(
                                 settings.CS_EXTRA_CARD_PACK_PRICE),
                             mc_currency=settings.CS_EXTRA_CARD_PACK_CURRENCY,
                             custom='{"player_id":%d}' % user.id)

        # IPN requests with invalid data shouldn't succeed.
        obj = ipn_object()
        obj.business = '*****@*****.**'
        self.assertFalse(models.paypal_payment_was_successful_handler(obj))

        obj = ipn_object()
        obj.payment_status = 'Pending'
        self.assertFalse(models.paypal_payment_was_successful_handler(obj))

        obj = ipn_object()
        obj.mc_gross = Decimal('0.01')
        self.assertFalse(models.paypal_payment_was_successful_handler(obj))

        obj = ipn_object()
        obj.mc_currency = 'THB'
        self.assertFalse(models.paypal_payment_was_successful_handler(obj))

        obj = ipn_object()
        obj.custom = "ohOh {I am a baaaad JSON]"
        self.assertFalse(models.paypal_payment_was_successful_handler(obj))

        default_webservice_internal_secret = settings.WEBSERVICE_INTERNAL_SECRET
        fake_secret = 'ohMySecret123'
        settings.WEBSERVICE_INTERNAL_SECRET = fake_secret

        # Hits the webservice if IPN request is valid.
        class MockCardstoriesService(object):
            """Pretends to be the CS webservice."""
            def __init__(self, status):
                self.status = status

            def read(self):
                return '{"status":"%s"}' % self.status

        def mock_cardstories_successful_service(url):
            self.assertTrue('player_id=%d' % user_id in url)
            self.assertTrue('secret=%s' % fake_secret in url)
            settings.WEBSERVICE_INTERNAL_SECRET = default_webservice_internal_secret
            return MockCardstoriesService('success')

        models.urlopen = mock_cardstories_successful_service

        # After IPN request is successfully handled, a new Purchase object
        # associated with the player should be created.
        # None of the IPN requests have been successful so far, so no purchase
        # object should exist at this point yet.
        self.assertEquals(
            user.purchase_set.filter(
                item_code=settings.CS_EXTRA_CARD_PACK_ITEM_ID).count(), 0)

        # Now perform a successful IPN request.
        success = models.paypal_payment_was_successful_handler(ipn_object())
        self.assertTrue(success)

        # A purchase item should be created.
        self.assertEquals(
            user.purchase_set.filter(
                item_code=settings.CS_EXTRA_CARD_PACK_ITEM_ID).count(), 1)

        # An confirmation email should have been sent.
        self.assertEquals(len(mail.outbox), 1)
        self.assertEquals('Thank you for purchasing a deck of cards!',
                          mail.outbox[0].subject)
        self.assertEquals(mail.outbox[0].recipients(),
                          ['*****@*****.**'])
        self.assertTrue('extra 10 cards have been added to your deck' in str(
            mail.outbox[0].message()))

        # Returns False if WS request doesn't succeed.
        def mock_cardstories_fail_service(url):
            return MockCardstoriesService('fail')

        models.urlopen = mock_cardstories_fail_service

        success = models.paypal_payment_was_successful_handler(ipn_object())
        self.assertFalse(success)

        # Returns False if WS reqeuest acts weird.
        def MockCardstoriesDrunkService(object):
            """Pretends to be the CS webservice on vodka"""
            def read(self):
                return "]]] lolzzz} cAts!11!!!"

        models.urlopen = lambda url: MockCardstoriesDrunkService()

        success = models.paypal_payment_was_successful_handler(ipn_object())
        self.assertFalse(success)

        # Since the IPN handler didn't succeed this time, we should still be left
        # with only one Purchase object by this user.
        self.assertEquals(
            user.purchase_set.filter(
                item_code=settings.CS_EXTRA_CARD_PACK_ITEM_ID).count(), 1)