Example #1
0
 def test_get_refundable_amount__refunded(self):
     txn = TransactionFactory(amount=Decimal("2.00"), )
     TransactionFactory(
         related_transaction=txn,
         transaction_type=Transaction.REFUND,
         amount=Decimal("-2.00"),
     )
     self.assertEqual(txn.get_refundable_amount(), Decimal("0.00"))
Example #2
0
class ItemOptionViewSetTestCase(TestCase):
    def setUp(self):
        self.factory = RequestFactory()

        event = EventFactory()
        self.order = OrderFactory(event=event, email='*****@*****.**')
        self.transaction = TransactionFactory(
            event=event, order=self.order, amount=130,
            method=Transaction.CHECK, is_confirmed=False)
        item = ItemFactory(event=event, name='Multipass')
        item_option1 = ItemOptionFactory(price=100, item=item, name='Gold')
        item_option2 = ItemOptionFactory(price=60, item=item, name='Silver')

        discount = DiscountFactory(amount=30, discount_type='percent',
                                   event=event, item_options=[item_option1])

        self.order.add_to_cart(item_option1)
        self.order.add_to_cart(item_option2)
        self.order.add_discount(discount)
        self.order.mark_cart_paid(self.transaction)

        order2 = OrderFactory(event=event, email='*****@*****.**')
        order2.add_to_cart(item_option2)
        transaction2 = TransactionFactory(event=event, order=self.order,
                                          amount=130, method=Transaction.CHECK,
                                          is_confirmed=True)
        order2.mark_cart_paid(transaction2)

        self.order3 = OrderFactory(event=event, email='*****@*****.**')
        self.order3.add_to_cart(item_option1)
        transaction3 = TransactionFactory(event=event, order=self.order3,
                                          amount=130, method=Transaction.CHECK,
                                          is_confirmed=True)
        self.order3.mark_cart_paid(transaction3)

        self.viewset = ItemOptionViewSet()
        self.viewset.request = self.factory.get('/')
        self.viewset.request.user = self.order.person

    def test_taken_counts(self):
        qs = self.viewset.get_queryset()
        self.assertEqual([2, 2], [int(p.taken) for p in qs])

    def test_exclude_refunded(self):
        """should exclude refunded items from the taken count"""
        self.transaction.refund()
        qs = self.viewset.get_queryset()
        self.assertEqual([1, 1], [int(p.taken) for p in qs])

    def test_exclude_transferred(self):
        """should exclude transferred items from the taken count"""
        for item in self.order3.bought_items.all():
            item.status = BoughtItem.TRANSFERRED
            item.save()
        qs = self.viewset.get_queryset()
        self.assertEqual([1, 2], [int(p.taken) for p in qs])
class ItemOptionViewSetTestCase(TestCase):
    def setUp(self):
        self.factory = RequestFactory()

        event = EventFactory()
        self.order = OrderFactory(event=event, email='*****@*****.**')
        self.transaction = TransactionFactory(
            event=event, order=self.order, amount=130,
            method=Transaction.CHECK, is_confirmed=False)
        item = ItemFactory(event=event, name='Multipass')
        item_option1 = ItemOptionFactory(price=100, item=item, name='Gold')
        item_option2 = ItemOptionFactory(price=60, item=item, name='Silver')

        discount = DiscountFactory(amount=30, discount_type='percent',
                                   event=event, item_options=[item_option1])

        self.order.add_to_cart(item_option1)
        self.order.add_to_cart(item_option2)
        self.order.add_discount(discount)
        self.order.mark_cart_paid(self.transaction)

        order2 = OrderFactory(event=event, email='*****@*****.**')
        order2.add_to_cart(item_option2)
        transaction2 = TransactionFactory(event=event, order=self.order,
                                          amount=130, method=Transaction.CHECK,
                                          is_confirmed=True)
        order2.mark_cart_paid(transaction2)

        self.order3 = OrderFactory(event=event, email='*****@*****.**')
        self.order3.add_to_cart(item_option1)
        transaction3 = TransactionFactory(event=event, order=self.order3,
                                          amount=130, method=Transaction.CHECK,
                                          is_confirmed=True)
        self.order3.mark_cart_paid(transaction3)

        self.viewset = ItemOptionViewSet()
        self.viewset.request = self.factory.get('/')
        self.viewset.request.user = self.order.person

    def test_taken_counts(self):
        qs = self.viewset.get_queryset()
        self.assertEqual([2, 2], [int(p.taken) for p in qs])

    def test_exclude_refunded(self):
        """should exclude refunded items from the taken count"""
        self.transaction.refund()
        qs = self.viewset.get_queryset()
        self.assertEqual([1, 1], [int(p.taken) for p in qs])

    def test_exclude_transferred(self):
        """should exclude transferred items from the taken count"""
        for item in self.order3.bought_items.all():
            item.status = BoughtItem.TRANSFERRED
            item.save()
        qs = self.viewset.get_queryset()
        self.assertEqual([1, 2], [int(p.taken) for p in qs])
 def test_get_refundable_amount__refunded(self):
     txn = TransactionFactory(
         amount=Decimal("2.00"),
     )
     TransactionFactory(
         related_transaction=txn,
         transaction_type=Transaction.REFUND,
         amount=Decimal("-2.00"),
     )
     self.assertEqual(txn.get_refundable_amount(), Decimal("0.00"))
Example #5
0
class SendReceiptTestCase(TestCase):
    def setUp(self):
        self.factory = RequestFactory()
        owner = PersonFactory()
        self.event = EventFactory(collect_housing_data=False)
        OrganizationMember.objects.create(
            person=owner,
            organization=self.event.organization,
            role=OrganizationMember.OWNER,
        )
        order = OrderFactory(event=self.event, code='aaaaaaaa')
        self.transaction = TransactionFactory(event=self.event, order=order)
        item = ItemFactory(event=self.event)
        item_option = ItemOptionFactory(price=100, item=item)

        order.add_to_cart(item_option)
        order.add_to_cart(item_option)
        order.mark_cart_paid(self.transaction)

        AttendeeFactory(order=order, bought_items=order.bought_items.all())

        self.view = SendReceiptView()
        self.view.request = self.factory.get('/')
        self.view.request.user = owner

    def test_txn_not_found(self):
        event = self.event
        self.view.kwargs = {'payment_pk': 0}

        with self.assertRaises(Http404):
            self.view.get(self.view.request,
                          event_slug=event.slug,
                          organization_slug=event.organization.slug)

    def test_txn_not_purchase(self):
        event = self.event
        self.view.kwargs = {'payment_pk': self.transaction.pk}
        self.transaction.transaction_type = Transaction.OTHER
        self.transaction.save()

        with self.assertRaises(Http404):
            self.view.get(self.view.request,
                          event_slug=event.slug,
                          organization_slug=event.organization.slug)

    def test_successful_send(self):
        event = self.event
        self.view.kwargs = {'payment_pk': self.transaction.pk}
        SessionMiddleware().process_request(self.view.request)
        MessageMiddleware().process_request(self.view.request)

        response = self.view.get(self.view.request,
                                 event_slug=event.slug,
                                 organization_slug=event.organization.slug)
        self.assertEqual(response.status_code, 302)
class SendReceiptTestCase(TestCase):

    def setUp(self):
        self.factory = RequestFactory()
        owner = PersonFactory()
        self.event = EventFactory(collect_housing_data=False)
        OrganizationMember.objects.create(
            person=owner,
            organization=self.event.organization,
            role=OrganizationMember.OWNER,
        )
        order = OrderFactory(event=self.event, code='aaaaaaaa')
        self.transaction = TransactionFactory(event=self.event, order=order)
        item = ItemFactory(event=self.event)
        item_option = ItemOptionFactory(price=100, item=item)

        order.add_to_cart(item_option)
        order.add_to_cart(item_option)
        order.mark_cart_paid(self.transaction)

        AttendeeFactory(order=order, bought_items=order.bought_items.all())

        self.view = SendReceiptView()
        self.view.request = self.factory.get('/')
        self.view.request.user = owner

    def test_txn_not_found(self):
        event = self.event
        self.view.kwargs = {'payment_pk': 0}

        with self.assertRaises(Http404):
            self.view.get(self.view.request, event_slug=event.slug,
                          organization_slug=event.organization.slug)

    def test_txn_not_purchase(self):
        event = self.event
        self.view.kwargs = {'payment_pk': self.transaction.pk}
        self.transaction.transaction_type = Transaction.OTHER
        self.transaction.save()

        with self.assertRaises(Http404):
            self.view.get(self.view.request, event_slug=event.slug,
                          organization_slug=event.organization.slug)

    def test_successful_send(self):
        event = self.event
        self.view.kwargs = {'payment_pk': self.transaction.pk}
        SessionMiddleware().process_request(self.view.request)
        MessageMiddleware().process_request(self.view.request)

        response = self.view.get(self.view.request, event_slug=event.slug,
                                 organization_slug=event.organization.slug)
        self.assertEqual(response.status_code, 302)
Example #7
0
    def setUp(self):
        self.factory = RequestFactory()
        self.view = MergeOrderView()

        event = EventFactory(collect_housing_data=True)
        item = ItemFactory(event=event)
        item_option = ItemOptionFactory(price=100, item=item)

        self.person = PersonFactory()
        self.order1 = OrderFactory(event=event, person=self.person)
        self.order2 = OrderFactory(event=event,
                                   person=None,
                                   email=self.person.email)

        self.tr1 = TransactionFactory(event=event, order=self.order1)
        self.tr2 = TransactionFactory(event=event, order=self.order2)

        self.order1.add_to_cart(item_option)
        self.order1.mark_cart_paid(self.tr1)

        self.order2.add_to_cart(item_option)
        self.order2.add_to_cart(item_option)
        self.order2.mark_cart_paid(self.tr2)

        self.att1 = AttendeeFactory(
            order=self.order1,
            bought_items=self.order1.bought_items.all(),
            email='*****@*****.**')
        self.att2 = AttendeeFactory(
            order=self.order2,
            bought_items=self.order2.bought_items.all(),
            email='*****@*****.**')

        self.housing2 = EventHousingFactory(
            event=event,
            order=self.order2,
            contact_name='Picard',
            contact_email='*****@*****.**',
            contact_phone='111-111-1111',
            public_transit_access=True,
            person_prefer='Dr. Crusher',
            person_avoid='Wesley Crusher')

        self.attendee1 = AttendeeFactory(order=self.order1)
        self.attendee2 = AttendeeFactory(order=self.order2)

        self.view.request = self.factory.post('/', {'pk': self.order2.pk})
        self.view.request.user = self.person

        setattr(self.view.request, 'session', 'session')
        messages = FallbackStorage(self.view.request)
        setattr(self.view.request, '_messages', messages)
Example #8
0
    def test_attendee_count__home_housing(self):
        """Attendee count should be present & accurate; housing data should."""
        event = EventFactory(collect_housing_data=True)
        order = OrderFactory(event=event)
        transaction = TransactionFactory(event=event, order=order)
        item = ItemFactory(event=event)
        item_option = ItemOptionFactory(price=100, item=item)

        order.add_to_cart(item_option)
        order.add_to_cart(item_option)
        order.mark_cart_paid(transaction)

        AttendeeFactory(
            order=order,
            bought_items=order.bought_items.all(),
            housing_status=Attendee.HOME,
        )

        view = EventSummaryView()
        view.request = self.factory.get('/')
        view.request.user = AnonymousUser()
        view.event = event
        context_data = view.get_context_data()

        self.assertEqual(context_data['attendee_count'], 1)
        self.assertEqual(context_data['attendee_requesting_count'], 0)
        self.assertEqual(context_data['attendee_arranged_count'], 0)
        self.assertEqual(context_data['attendee_home_count'], 1)
Example #9
0
    def test_summary_data__discount_deleted(self):
        """
        Test that get_summary_data returns correct values for savings and
        total cost even if a discount was deleted.

        """
        event = EventFactory()
        order = OrderFactory(event=event)
        transaction = TransactionFactory(event=event, order=order)
        item = ItemFactory(event=event)
        item_option = ItemOptionFactory(price=100, item=item)
        discount = DiscountFactory(amount=20,
                                   event=event,
                                   item_options=[item_option])

        order.add_to_cart(item_option)
        order.add_discount(discount)
        order.mark_cart_paid(transaction)

        summary_data = order.get_summary_data()
        self.assertEqual(summary_data['gross_cost'], 100)
        self.assertEqual(summary_data['total_savings'], -20)
        self.assertEqual(summary_data['net_cost'], 80)

        discount.delete()

        # Make sure that the value isn't cached.
        order = Order.objects.get(pk=order.pk)

        summary_data = order.get_summary_data()
        self.assertEqual(summary_data['gross_cost'], 100)
        self.assertEqual(summary_data['total_savings'], -20)
        self.assertEqual(summary_data['net_cost'], 80)
Example #10
0
    def test_summary_data__base(self):
        """
        Test that get_summary_data returns correct values for savings and
        total cost.

        """
        event = EventFactory()
        order = OrderFactory(event=event)
        transaction = TransactionFactory(event=event, order=order)
        item = ItemFactory(event=event)
        item_option = ItemOptionFactory(price=100, item=item)
        discount = DiscountFactory(amount=20,
                                   event=event,
                                   item_options=[item_option])

        order.add_to_cart(item_option)
        order.mark_cart_paid(transaction)

        summary_data = order.get_summary_data()
        self.assertEqual(summary_data['gross_cost'], 100)
        self.assertEqual(summary_data['total_savings'], 0)
        self.assertEqual(summary_data['net_cost'], 100)

        # Discounts don't get added to BOUGHT items.
        order.add_discount(discount)

        summary_data = order.get_summary_data()
        self.assertEqual(summary_data['gross_cost'], 100)
        self.assertEqual(summary_data['total_savings'], 0)
        self.assertEqual(summary_data['net_cost'], 100)
Example #11
0
    def test_order_by_purchase_date(self):
        """
        If ordering by purchase date is selected, we should get that
        ordering even if the field isn't selected.

        """
        order2 = OrderFactory(event=self.event)
        transaction = TransactionFactory(
            event=self.event,
            order=order2,
            timestamp=timezone.now() - datetime.timedelta(days=50)
        )
        order2.add_to_cart(self.item_option)
        order2.mark_cart_paid(transaction)
        attendee2 = AttendeeFactory(
            order=order2,
            bought_items=order2.bought_items.all(),
            housing_status='have',
            email='*****@*****.**',
            other_needs='99 mattresses',
            person_avoid='Darth Vader',
            person_prefer='Han Solo',
        )

        table = AttendeeTable(
            event=self.event,
            data={
                'o': '-purchase_date',
                TABLE_COLUMN_FIELD: ['pk', 'get_full_name'],
            },
        )
        rows = list(table)
        self.assertEqual(rows[0]['pk'].value, self.attendee.pk)
        self.assertEqual(rows[1]['pk'].value, attendee2.pk)
Example #12
0
    def setUp(self):
        event = EventFactory()
        self.order = OrderFactory(event=event, email='*****@*****.**')
        transaction = TransactionFactory(event=event,
                                         order=self.order,
                                         amount=130,
                                         method=Transaction.CHECK,
                                         is_confirmed=False)
        item = ItemFactory(event=event, name='Multipass')
        item_option1 = ItemOptionFactory(price=100, item=item, name='Gold')
        item_option2 = ItemOptionFactory(price=60, item=item, name='Silver')

        discount = DiscountFactory(amount=30,
                                   discount_type='percent',
                                   event=event,
                                   item_options=[item_option1])

        self.order.add_to_cart(item_option1)
        self.order.add_to_cart(item_option2)
        self.order.add_discount(discount)
        self.order.mark_cart_paid(transaction)

        self.mailer = OrderAlertMailer(transaction,
                                       site='dancerfly.com',
                                       secure=True)
        self.event_name = event.name
Example #13
0
    def test_summary_data__itemoption_changed(self):
        """
        Test that get_summary_data returns correct values for savings and
        total cost even if an itemoption was changed.

        """
        event = EventFactory()
        order = OrderFactory(event=event)
        transaction = TransactionFactory(event=event, order=order)
        item = ItemFactory(event=event)
        item_option = ItemOptionFactory(price=100, item=item)

        order.add_to_cart(item_option)
        order.mark_cart_paid(transaction)

        summary_data = order.get_summary_data()
        self.assertEqual(summary_data['gross_cost'], 100)
        self.assertEqual(summary_data['total_savings'], 0)
        self.assertEqual(summary_data['net_cost'], 100)

        item_option.price = 200
        item_option.save()

        # Make sure that the value isn't cached.
        order = Order.objects.get(pk=order.pk)

        summary_data = order.get_summary_data()
        self.assertEqual(summary_data['gross_cost'], 100)
        self.assertEqual(summary_data['total_savings'], 0)
        self.assertEqual(summary_data['net_cost'], 100)
Example #14
0
 def setUp(self):
     self.factory = RequestFactory()
     self.person = PersonFactory(
         first_name="Conan",
         last_name="O'Brien",
     )
     self.event = EventFactory()
     self.order = OrderFactory(
         event=self.event,
         person=self.person,
     )
     TransactionFactory(
         event=self.event,
         order=self.order,
         amount=130,
     )
     self.item = ItemFactory(
         event=self.event,
         name='Multipass',
     )
     self.item_option1 = ItemOptionFactory(
         price=100,
         item=self.item,
         name='Gold',
     )
     self.order.add_to_cart(self.item_option1)
     self.bought_item = self.order.bought_items.all()[0]
Example #15
0
    def test_full_send_and_timestamp(self):
        owner = PersonFactory(notify_new_purchases=Person.NOTIFY_DAILY)
        editor = PersonFactory(notify_new_purchases=Person.NOTIFY_DAILY)
        organization = OrganizationFactory()
        OrganizationMember.objects.create(
            person=owner,
            organization=organization,
            role=OrganizationMember.OWNER,
        )
        OrganizationMember.objects.create(
            person=editor,
            organization=organization,
            role=OrganizationMember.EDIT,
        )
        event = EventFactory(organization=organization)
        TransactionFactory(event=event, transaction_type=Transaction.PURCHASE)
        self.assertEqual(len(mail.outbox), 0)
        self.command.handle()
        self.assertEqual(len(mail.outbox), 2)

        self.assertEqual(mail.outbox[0].subject,
                         '[Dancerfly] New purchases for your events!')
        self.assertIn(event.name, mail.outbox[0].body)
        self.assertIn(event.name, mail.outbox[0].alternatives[0][0])
        self.assertEqual(mail.outbox[1].subject,
                         '[Dancerfly] New purchases for your events!')
        self.assertIn(event.name, mail.outbox[1].body)
        self.assertIn(event.name, mail.outbox[1].alternatives[0][0])

        owner = Person.objects.get(pk=owner.pk)
        self.assertIsNotNone(owner.last_new_purchases_digest_sent)
        editor = Person.objects.get(pk=editor.pk)
        self.assertIsNotNone(editor.last_new_purchases_digest_sent)
Example #16
0
    def setUp(self):
        self.owner = Person.objects.create_user(email="*****@*****.**",
                                                password="******")
        self.non_owner = Person.objects.create_user(
            email="*****@*****.**", password="******")
        self.event = EventFactory(collect_housing_data=False)
        OrganizationMember.objects.create(
            person=self.owner,
            organization=self.event.organization,
            role=OrganizationMember.OWNER,
        )
        self.order = OrderFactory(event=self.event, code='aaaaaaaa')
        self.transaction = TransactionFactory(event=self.event,
                                              order=self.order)
        item = ItemFactory(event=self.event)
        item_option = ItemOptionFactory(price=100, item=item)

        self.order.add_to_cart(item_option)
        self.order.add_to_cart(item_option)
        self.order.mark_cart_paid(self.transaction)

        self.attendee = AttendeeFactory(
            order=self.order, bought_items=self.order.bought_items.all())
        self.url = reverse('brambling_event_order_detail',
                           kwargs={
                               'event_slug': self.event.slug,
                               'organization_slug':
                               self.event.organization.slug,
                               'code': self.order.code,
                           })
Example #17
0
    def test_unicode_csv(self):
        event = EventFactory(collect_housing_data=True, currency='GBP')
        order = OrderFactory(event=event)
        transaction = TransactionFactory(event=event, order=order)
        item = ItemFactory(event=event)
        item_option = ItemOptionFactory(price=100, item=item)

        order.add_to_cart(item_option)
        order.add_to_cart(item_option)
        order.mark_cart_paid(transaction)

        AttendeeFactory(
            order=order,
            bought_items=order.bought_items.all(),
            housing_status=Attendee.HOME,
        )

        view = AttendeeFilterView()
        view.event = event
        view.request = self.factory.get('/?format=csv')
        view.request.user = AnonymousUser()

        table = view.get_table(Attendee.objects.all())
        response = view.render_to_response({'table': table})
        self.assertEqual(response['content-disposition'],
                         'attachment; filename="export.csv"')
        content = list(response)
        self.assertIn('£200.00', content[1])
    def setUp(self):
        self.person = PersonFactory()
        event = EventFactory()
        self.order = OrderFactory(event=event, person=self.person)
        transaction = TransactionFactory(event=event,
                                         order=self.order,
                                         amount=130)
        item = ItemFactory(event=event, name='Multipass')
        item_option1 = ItemOptionFactory(price=100, item=item, name='Gold')
        item_option2 = ItemOptionFactory(price=60, item=item, name='Silver')

        discount = DiscountFactory(amount=30,
                                   discount_type='percent',
                                   event=event,
                                   item_options=[item_option1])

        self.order.add_to_cart(item_option1)
        self.order.add_to_cart(item_option2)
        self.order.add_discount(discount)
        self.order.mark_cart_paid(transaction)

        self.mailer = OrderReceiptMailer(transaction,
                                         site='dancerfly.com',
                                         secure=True)
        self.event_name = event.name
        self.discount_amount = format_money(discount.amount, event.currency)
        self.total_amount = format_money(transaction.amount, event.currency)
        self.option1 = '{0} ({1})'.format(item.name, item_option1.name)
        self.option2 = '{0} ({1})'.format(item.name, item_option1.name)
        self.item_price = format_money(item_option1.price, event.currency)
    def test_stripe_charge_not_found(self, charge_retrieve):
        # remote_id = STRIPE_REFUND_EVENT['data']['object']['id']
        self.txn = TransactionFactory(event=self.event,
                                      order=self.order,
                                      remote_id='charge_id')
        charge_retrieve.side_effect = stripe.error.InvalidRequestError(
            'not found', 1)

        with self.assertRaises(Http404):
            self.view(self.request)
Example #20
0
 def setUp(self):
     self.person = PersonFactory()
     self.event = EventFactory()
     self.item = ItemFactory(event=self.event, name='Multipass')
     self.order = OrderFactory(event=self.event, person=self.person)
     self.item_option1 = ItemOptionFactory(price=100, item=self.item, name='Gold')
     self.item_option2 = ItemOptionFactory(price=100, item=self.item, name='Gold')
     self.bought_item1 = BoughtItem.objects.create(item_option=self.item_option1, order=self.order, price=Decimal(0), status=BoughtItem.BOUGHT)
     self.bought_item2 = BoughtItem.objects.create(item_option=self.item_option2, order=self.order, price=Decimal(0), status=BoughtItem.BOUGHT)
     self.txn = TransactionFactory(amount=Decimal("20"), order=self.order)
     self.txn.bought_items.add(self.bought_item1, self.bought_item2)
 def setUp(self):
     self.person = PersonFactory()
     self.event = EventFactory()
     self.item = ItemFactory(event=self.event, name='Multipass')
     self.order = OrderFactory(event=self.event, person=self.person)
     self.item_option1 = ItemOptionFactory(price=100, item=self.item, name='Gold')
     self.item_option2 = ItemOptionFactory(price=100, item=self.item, name='Gold')
     self.bought_item1 = BoughtItem.objects.create(item_option=self.item_option1, order=self.order, price=Decimal(0), status=BoughtItem.BOUGHT)
     self.bought_item2 = BoughtItem.objects.create(item_option=self.item_option2, order=self.order, price=Decimal(0), status=BoughtItem.BOUGHT)
     self.txn = TransactionFactory(amount=Decimal("20"), order=self.order)
     self.txn.bought_items.add(self.bought_item1, self.bought_item2)
Example #22
0
    def setUp(self):
        self.event = EventFactory(collect_housing_data=True)
        self.item = ItemFactory(event=self.event)
        self.item_option = ItemOptionFactory(price=100, item=self.item)

        self.order = OrderFactory(event=self.event)
        self.transaction = TransactionFactory(
            event=self.event,
            order=self.order,
        )
        self.order.add_to_cart(self.item_option)
        self.order.mark_cart_paid(self.transaction)

        self.attendee = AttendeeFactory(
            order=self.order,
            bought_items=self.order.bought_items.all(),
            housing_status='have',
            email='*****@*****.**',
            other_needs='99 mattresses',
            person_avoid='Darth Vader',
            person_prefer='Lando Calrissian',
        )
        self.attendee.ef_cause = [
            EnvironmentalFactorFactory(name='Laughter'),
            EnvironmentalFactorFactory(name='Confusion'),
        ]
        self.attendee.housing_prefer = [
            HousingCategoryFactory(name='Yurt'),
        ]
        self.attendee.ef_avoid = [
            EnvironmentalFactorFactory(name='Ontology'),
            EnvironmentalFactorFactory(name='Gnosticism'),
        ]
        self.attendee.nights.add(HousingRequestNightFactory(date=self.event.start_date))

        attendee_form = CustomFormFactory(event=self.event, form_type='attendee')
        f1 = CustomFormFieldFactory(form=attendee_form, name='favorite color')
        self.custom_key1 = f1.key
        entry1 = CustomFormEntry.objects.create(
            related_ct=ContentType.objects.get(model='attendee'),
            related_id=self.attendee.id,
            form_field=f1)
        entry1.set_value('ochre')
        entry1.save()

        housing_form = CustomFormFactory(event=self.event, form_type='housing')
        f2 = CustomFormFieldFactory(form=housing_form, name='floor or bed')
        self.custom_key2 = f2.key
        entry2 = CustomFormEntry.objects.create(
            related_ct=ContentType.objects.get(model='attendee'),
            related_id=self.attendee.pk,
            form_field=f2)
        entry2.set_value('bed')
        entry2.save()
Example #23
0
 def test_send_digest__owner__two_events(self):
     owner = PersonFactory(notify_new_purchases=Person.NOTIFY_DAILY)
     organization = OrganizationFactory()
     OrganizationMember.objects.create(
         person=owner,
         organization=organization,
         role=OrganizationMember.OWNER,
     )
     event1 = EventFactory(organization=organization)
     event2 = EventFactory(organization=organization)
     TransactionFactory(event=event1, transaction_type=Transaction.PURCHASE)
     TransactionFactory(event=event2, transaction_type=Transaction.PURCHASE)
     self.assertEqual(len(mail.outbox), 0)
     self.command.send_digest(owner)
     self.assertEqual(len(mail.outbox), 1)
     self.assertEqual(mail.outbox[0].subject,
                      '[Dancerfly] New purchases for your events!')
     self.assertIn(event1.name, mail.outbox[0].body)
     self.assertIn(event1.name, mail.outbox[0].alternatives[0][0])
     self.assertIn(event2.name, mail.outbox[0].body)
     self.assertIn(event2.name, mail.outbox[0].alternatives[0][0])
Example #24
0
 def test_subject_apostrophe(self):
     event = EventFactory(name="Han & Leia's Wedding")
     self.event_name = event.name
     self.order = OrderFactory(event=event, person=self.person)
     transaction = TransactionFactory(event=event, order=self.order,
                                      amount=130)
     self.mailer = OrderReceiptMailer(transaction, site='dancerfly.com',
                                      secure=True)
     subject = self.mailer.render_subject(self.mailer.get_context_data())
     expected_subject = ('[{event_name}] Receipt for order {order_code}'
                         .format(event_name=self.event_name,
                                 order_code=self.order.code))
     self.assertEqual(subject, expected_subject)
Example #25
0
    def test_summary_data__transaction_no_items(self):
        """
        Transactions without items are included in summary data.

        """
        event = EventFactory()
        order = OrderFactory(event=event)
        TransactionFactory(event=event, order=order, amount=100)

        summary_data = order.get_summary_data()
        self.assertEqual(summary_data['total_payments'], 100)
        self.assertEqual(summary_data['total_refunds'], 0)
        self.assertEqual(summary_data['net_balance'], -100)

        TransactionFactory(event=event,
                           order=order,
                           amount=-100,
                           transaction_type=Transaction.REFUND)
        summary_data = order.get_summary_data()
        self.assertEqual(summary_data['total_payments'], 100)
        self.assertEqual(summary_data['total_refunds'], -100)
        self.assertEqual(summary_data['net_balance'], 0)
Example #26
0
    def setUp(self):
        self.factory = RequestFactory()
        self.owner = Person.objects.create_user(email="*****@*****.**",
                                                password="******")
        self.non_owner = Person.objects.create_user(
            email="*****@*****.**", password="******")
        self.event = EventFactory(collect_housing_data=False)
        OrganizationMember.objects.create(
            person=self.owner,
            organization=self.event.organization,
            role=OrganizationMember.OWNER,
        )
        order = OrderFactory(event=self.event, code='aaaaaaaa')
        self.transaction = TransactionFactory(event=self.event, order=order)
        item = ItemFactory(event=self.event)
        item_option = ItemOptionFactory(price=100, item=item)

        order.add_to_cart(item_option)
        order.add_to_cart(item_option)
        order.mark_cart_paid(self.transaction)

        AttendeeFactory(order=order, bought_items=order.bought_items.all())
Example #27
0
    def setUp(self):
        self.factory = RequestFactory()
        owner = PersonFactory()
        self.event = EventFactory(collect_housing_data=False)
        OrganizationMember.objects.create(
            person=owner,
            organization=self.event.organization,
            role=OrganizationMember.OWNER,
        )
        order = OrderFactory(event=self.event, code='aaaaaaaa')
        self.transaction = TransactionFactory(event=self.event, order=order)
        item = ItemFactory(event=self.event)
        item_option = ItemOptionFactory(price=100, item=item)

        order.add_to_cart(item_option)
        order.add_to_cart(item_option)
        order.mark_cart_paid(self.transaction)

        AttendeeFactory(order=order, bought_items=order.bought_items.all())

        self.view = SendReceiptView()
        self.view.request = self.factory.get('/')
        self.view.request.user = owner
Example #28
0
    def setUp(self):
        self.factory = RequestFactory()

        event = EventFactory()
        self.order = OrderFactory(event=event, email='*****@*****.**')
        self.transaction = TransactionFactory(
            event=event, order=self.order, amount=130,
            method=Transaction.CHECK, is_confirmed=False)
        item = ItemFactory(event=event, name='Multipass')
        item_option1 = ItemOptionFactory(price=100, item=item, name='Gold')
        item_option2 = ItemOptionFactory(price=60, item=item, name='Silver')

        discount = DiscountFactory(amount=30, discount_type='percent',
                                   event=event, item_options=[item_option1])

        self.order.add_to_cart(item_option1)
        self.order.add_to_cart(item_option2)
        self.order.add_discount(discount)
        self.order.mark_cart_paid(self.transaction)

        order2 = OrderFactory(event=event, email='*****@*****.**')
        order2.add_to_cart(item_option2)
        transaction2 = TransactionFactory(event=event, order=self.order,
                                          amount=130, method=Transaction.CHECK,
                                          is_confirmed=True)
        order2.mark_cart_paid(transaction2)

        self.order3 = OrderFactory(event=event, email='*****@*****.**')
        self.order3.add_to_cart(item_option1)
        transaction3 = TransactionFactory(event=event, order=self.order3,
                                          amount=130, method=Transaction.CHECK,
                                          is_confirmed=True)
        self.order3.mark_cart_paid(transaction3)

        self.viewset = ItemOptionViewSet()
        self.viewset.request = self.factory.get('/')
        self.viewset.request.user = self.order.person
Example #29
0
 def test_send_digest__event_editor(self):
     editor = PersonFactory(notify_new_purchases=Person.NOTIFY_DAILY)
     event = EventFactory()
     EventMember.objects.create(
         person=editor,
         event=event,
         role=EventMember.EDIT,
     )
     TransactionFactory(event=event, transaction_type=Transaction.PURCHASE)
     self.assertEqual(len(mail.outbox), 0)
     self.command.send_digest(editor)
     self.assertEqual(len(mail.outbox), 1)
     self.assertEqual(mail.outbox[0].subject,
                      '[Dancerfly] New purchases for your events!')
     self.assertIn(event.name, mail.outbox[0].body)
     self.assertIn(event.name, mail.outbox[0].alternatives[0][0])
    def set_up_view(self, orderer=None, is_confirmed=False):
        organization = OrganizationFactory(check_payment_allowed=True)
        OrganizationMember.objects.create(
            person=PersonFactory(),
            organization=organization,
            role=OrganizationMember.OWNER,
        )
        event = EventFactory(
            collect_housing_data=False,
            organization=organization,
            check_postmark_cutoff=timezone.now().date() + timedelta(1),
        )
        item = ItemFactory(event=event)
        item_option = ItemOptionFactory(price=100, item=item)

        receiver = PersonFactory()
        order_kwargs = dict(event=event)
        if orderer:
            order_kwargs['person'] = orderer
        order = OrderFactory(**order_kwargs)
        order.add_to_cart(item_option)
        transaction = TransactionFactory(event=event,
                                         order=order,
                                         is_confirmed=is_confirmed)
        order.mark_cart_paid(transaction)

        # The BoughtItem should be in the correct state if we've set up this
        # test Order correctly.
        self.assertEqual(order.bought_items.first().status, BoughtItem.BOUGHT)

        view = TransferView()
        view.kwargs = dict(
            event_slug=event.slug,
            organization_slug=organization.slug,
        )
        view.request = self.factory.post(
            '/',
            dict(
                bought_item=order.bought_items.first().pk,
                email=receiver.email,
            ))
        view.request.user = orderer if orderer else AnonymousUser()
        view.event = event
        view.order = order
        view.workflow = RegistrationWorkflow(order=order, event=event)
        view.current_step = view.workflow.steps.get(view.current_step_slug)
        return view
Example #31
0
 def test_send_digest__owner__transactions_older_than_one_day(self):
     owner = PersonFactory(notify_new_purchases=Person.NOTIFY_DAILY)
     organization = OrganizationFactory()
     OrganizationMember.objects.create(
         person=owner,
         organization=organization,
         role=OrganizationMember.OWNER,
     )
     event = EventFactory(organization=organization)
     TransactionFactory(
         event=event,
         transaction_type=Transaction.PURCHASE,
         timestamp=timezone.now() - timedelta(days=2),
     )
     self.assertEqual(len(mail.outbox), 0)
     self.command.send_digest(owner)
     self.assertEqual(len(mail.outbox), 0)
Example #32
0
    def test_confirmation(self):
        txn = TransactionFactory(remote_id=TRANSACTION_STATUS_DATA['Id'], is_confirmed=False)
        dwolla_sig = 'abcde'
        data = json.dumps(TRANSACTION_STATUS_DATA)
        request = self.factory.post(
            path='/',
            content_type='application/json',
            data=data,
            HTTP_X_DWOLLA_SIGNATURE=dwolla_sig
        )
        with mock.patch.object(webhooks, 'verify', return_value=True) as verify:
            self.view(request)

        verify.assert_called_once_with(dwolla_sig, data)

        txn = Transaction.objects.get(id=txn.id)
        self.assertTrue(txn.is_confirmed)
Example #33
0
 def test_subject_apostrophe(self):
     event = EventFactory(name="Han & Leia's Wedding!")
     self.person = PersonFactory(first_name="Ma'ayan", last_name="Plaut")
     self.event_name = event.name
     self.order = OrderFactory(event=event, person=self.person)
     transaction = TransactionFactory(event=event,
                                      order=self.order,
                                      amount=130)
     self.mailer = OrderAlertMailer(transaction,
                                    site='dancerfly.com',
                                    secure=True)
     subject = self.mailer.render_subject(self.mailer.get_context_data())
     expected_subject = (
         '[{event_name}] New purchase by {person_name}'.format(
             event_name=self.event_name,
             person_name=self.person.get_full_name()))
     self.assertEqual(subject, expected_subject)
Example #34
0
    def test_needs_housing(self):
        event = EventFactory(collect_housing_data=False)
        order = OrderFactory(event=event)
        transaction = TransactionFactory(event=event, order=order)
        item = ItemFactory(event=event)
        item_option = ItemOptionFactory(price=100, item=item)

        order.add_to_cart(item_option)
        order.add_to_cart(item_option)
        order.mark_cart_paid(transaction)

        a1 = AttendeeFactory(order=order,
                             bought_items=order.bought_items.all(),
                             housing_status=Attendee.NEED)
        a2 = AttendeeFactory(order=order,
                             bought_items=order.bought_items.all())
        self.assertTrue(a1.needs_housing())
        self.assertFalse(a2.needs_housing())
    def setUp(self):
        self.factory = RequestFactory()
        self.owner = Person.objects.create_user(email="*****@*****.**", password="******")
        self.non_owner = Person.objects.create_user(email="*****@*****.**", password="******")
        self.event = EventFactory(collect_housing_data=False)
        OrganizationMember.objects.create(
            person=self.owner,
            organization=self.event.organization,
            role=OrganizationMember.OWNER,
        )
        order = OrderFactory(event=self.event, code='aaaaaaaa')
        self.transaction = TransactionFactory(event=self.event, order=order)
        item = ItemFactory(event=self.event)
        item_option = ItemOptionFactory(price=100, item=item)

        order.add_to_cart(item_option)
        order.add_to_cart(item_option)
        order.mark_cart_paid(self.transaction)

        AttendeeFactory(order=order, bought_items=order.bought_items.all())
    def setUp(self):
        self.factory = RequestFactory()
        owner = PersonFactory()
        self.event = EventFactory(collect_housing_data=False)
        OrganizationMember.objects.create(
            person=owner,
            organization=self.event.organization,
            role=OrganizationMember.OWNER,
        )
        order = OrderFactory(event=self.event, code='aaaaaaaa')
        self.transaction = TransactionFactory(event=self.event, order=order)
        item = ItemFactory(event=self.event)
        item_option = ItemOptionFactory(price=100, item=item)

        order.add_to_cart(item_option)
        order.add_to_cart(item_option)
        order.mark_cart_paid(self.transaction)

        AttendeeFactory(order=order, bought_items=order.bought_items.all())

        self.view = SendReceiptView()
        self.view.request = self.factory.get('/')
        self.view.request.user = owner
    def setUp(self):
        self.factory = RequestFactory()

        event = EventFactory()
        self.order = OrderFactory(event=event, email='*****@*****.**')
        self.transaction = TransactionFactory(
            event=event, order=self.order, amount=130,
            method=Transaction.CHECK, is_confirmed=False)
        item = ItemFactory(event=event, name='Multipass')
        item_option1 = ItemOptionFactory(price=100, item=item, name='Gold')
        item_option2 = ItemOptionFactory(price=60, item=item, name='Silver')

        discount = DiscountFactory(amount=30, discount_type='percent',
                                   event=event, item_options=[item_option1])

        self.order.add_to_cart(item_option1)
        self.order.add_to_cart(item_option2)
        self.order.add_discount(discount)
        self.order.mark_cart_paid(self.transaction)

        order2 = OrderFactory(event=event, email='*****@*****.**')
        order2.add_to_cart(item_option2)
        transaction2 = TransactionFactory(event=event, order=self.order,
                                          amount=130, method=Transaction.CHECK,
                                          is_confirmed=True)
        order2.mark_cart_paid(transaction2)

        self.order3 = OrderFactory(event=event, email='*****@*****.**')
        self.order3.add_to_cart(item_option1)
        transaction3 = TransactionFactory(event=event, order=self.order3,
                                          amount=130, method=Transaction.CHECK,
                                          is_confirmed=True)
        self.order3.mark_cart_paid(transaction3)

        self.viewset = ItemOptionViewSet()
        self.viewset.request = self.factory.get('/')
        self.viewset.request.user = self.order.person
 def test_get_refundable_amount(self):
     txn = TransactionFactory(amount=Decimal("2.00"))
     self.assertEqual(txn.get_refundable_amount(), Decimal("2.00"))
class TransactionRefundTestCase(TestCase):
    def setUp(self):
        self.person = PersonFactory()
        self.event = EventFactory()
        self.item = ItemFactory(event=self.event, name='Multipass')
        self.order = OrderFactory(event=self.event, person=self.person)
        self.item_option1 = ItemOptionFactory(price=100, item=self.item, name='Gold')
        self.item_option2 = ItemOptionFactory(price=100, item=self.item, name='Gold')
        self.bought_item1 = BoughtItem.objects.create(item_option=self.item_option1, order=self.order, price=Decimal(0), status=BoughtItem.BOUGHT)
        self.bought_item2 = BoughtItem.objects.create(item_option=self.item_option2, order=self.order, price=Decimal(0), status=BoughtItem.BOUGHT)
        self.txn = TransactionFactory(amount=Decimal("20"), order=self.order)
        self.txn.bought_items.add(self.bought_item1, self.bought_item2)

    def test_refund_no_args(self):
        self.txn.amount = Decimal("2.00")
        self.txn.save()
        self.assertEqual(self.txn.get_refundable_amount(), Decimal("2.00"))
        self.assertEqual(self.txn.related_transaction_set.count(), 0)
        refund = self.txn.refund()
        self.assertIsInstance(refund, Transaction)
        self.assertEqual(self.txn.get_refundable_amount(), Decimal("0.00"))
        self.assertEqual(self.txn.related_transaction_set.count(), 1)

    def test_refund_no_args__refunded(self):
        self.txn.amount = Decimal("2.00")
        self.txn.save()
        self.assertEqual(self.txn.get_refundable_amount(), Decimal("2.00"))
        self.assertEqual(self.txn.related_transaction_set.count(), 0)
        refund = self.txn.refund()
        self.assertIsInstance(refund, Transaction)
        self.assertEqual(self.txn.get_refundable_amount(), Decimal("0.00"))
        self.assertEqual(self.txn.related_transaction_set.count(), 1)

        refund = self.txn.refund()
        self.assertIsNone(refund)
        self.assertEqual(self.txn.get_refundable_amount(), Decimal("0.00"))
        self.assertEqual(self.txn.related_transaction_set.count(), 1)

    def test_refund__zero_amount_with_item(self):
        self.txn.amount = Decimal("0")
        self.txn.save()
        self.assertEqual(self.txn.get_refundable_amount(), Decimal("0"))
        self.assertQuerysetEqual(self.txn.get_returnable_items(), [repr(self.bought_item1), repr(self.bought_item2)])

        refund = self.txn.refund()
        self.assertIsInstance(refund, Transaction)
        self.assertEqual(self.txn.get_refundable_amount(), Decimal("0.00"))
        self.assertEqual(len(self.txn.get_returnable_items()), 0)

    def test_refund_partial_amount(self):
        self.txn.amount = Decimal("20.00")
        self.txn.save()
        refund = self.txn.refund(amount=Decimal(10))
        self.assertEqual(refund.amount, Decimal(-10))
        self.assertEqual(self.txn.get_refundable_amount(), Decimal(10))

    def test_refund_one_item(self):
        refund = self.txn.refund(bought_items=BoughtItem.objects.filter(pk=self.bought_item1.pk))
        self.bought_item1.refresh_from_db()
        self.assertEqual(refund.bought_items.get(), self.bought_item1)
        self.assertEqual(self.bought_item1.status, BoughtItem.REFUNDED)
        self.assertNotEqual(self.bought_item2, BoughtItem.BOUGHT)

    def test_nothing_refund(self):
        refund = self.txn.refund(bought_items=BoughtItem.objects.none(), amount=Decimal("0"))
        self.assertIsNone(refund)

    def test_excessive_refund_amount(self):
        self.txn.amount = Decimal("20.00")
        self.txn.save()
        with self.assertRaises(ValueError):
            self.txn.refund(amount=Decimal("2000.00"))

    def test_alien_item_return(self):
        alien_order = OrderFactory(event=self.event, person=self.person)
        alien_item = BoughtItem.objects.create(item_option=self.item_option1, price=Decimal(0), status=BoughtItem.BOUGHT, order=alien_order)
        with self.assertRaises(ValueError):
            self.txn.refund(bought_items=BoughtItem.objects.filter(pk=alien_item.pk))

    def test_negative_refund_error(self):
        with self.assertRaises(ValueError):
            self.txn.refund(amount=Decimal("-20.00"))

    @mock.patch('brambling.models.Transaction.from_stripe_refund')
    @mock.patch('brambling.models.stripe_refund')
    def test_stripe_refund(self, stripe_refund, from_stripe_refund):
        self.txn.method = Transaction.STRIPE
        self.txn.amount = Decimal("20.00")
        self.txn.save()
        self.txn.refund()
        stripe_refund.assert_called_once_with(order=self.txn.order,
                                              event=self.txn.order.event,
                                              payment_id=self.txn.remote_id,
                                              amount=Decimal("20.00"))
class RefundViewTestCase(TestCase):
    def setUp(self):
        self.factory = RequestFactory()
        self.owner = Person.objects.create_user(email="*****@*****.**", password="******")
        self.non_owner = Person.objects.create_user(email="*****@*****.**", password="******")
        self.event = EventFactory(collect_housing_data=False)
        OrganizationMember.objects.create(
            person=self.owner,
            organization=self.event.organization,
            role=OrganizationMember.OWNER,
        )
        order = OrderFactory(event=self.event, code='aaaaaaaa')
        self.transaction = TransactionFactory(event=self.event, order=order)
        item = ItemFactory(event=self.event)
        item_option = ItemOptionFactory(price=100, item=item)

        order.add_to_cart(item_option)
        order.add_to_cart(item_option)
        order.mark_cart_paid(self.transaction)

        AttendeeFactory(order=order, bought_items=order.bought_items.all())

    def test_user_no_permissions_get(self):
        self.client.login(email="*****@*****.**", password="******")
        response = self.client.get(reverse("brambling_event_refund", kwargs={
            'organization_slug': self.event.organization.slug,
            'event_slug': self.event.slug,
            'code': self.transaction.order.code,
            'pk': self.transaction.pk
        }))
        self.assertEqual(response.status_code, 404)

    def test_user_no_permissions_post(self):
        self.client.login(email="*****@*****.**", password="******")
        response = self.client.post(reverse("brambling_event_refund", kwargs={
            'organization_slug': self.event.organization.slug,
            'event_slug': self.event.slug,
            'code': self.transaction.order.code,
            'pk': self.transaction.pk
        }))
        self.assertEqual(response.status_code, 404)  # not found

    def test_successful_refund_redirect(self):
        self.transaction.amount = '40'
        self.transaction.save()
        self.client.login(email="*****@*****.**", password="******")
        data = {
            'amount': '20'
        }
        response = self.client.post(reverse("brambling_event_refund", kwargs={
            'organization_slug': self.event.organization.slug,
            'event_slug': self.event.slug,
            'code': self.transaction.order.code,
            'pk': self.transaction.pk
        }), data)
        self.assertEqual(response.status_code, 302)  # temporary redirect
        self.assertRedirects(response, reverse("brambling_event_order_detail",
                                               kwargs={
                                                   'organization_slug': self.event.organization.slug,
                                                   'event_slug': self.event.slug,
                                                   'code': self.transaction.order.code,
                                               }))

    def test_successful_refund_message(self):
        self.transaction.amount = '40'
        self.transaction.save()
        self.client.login(email="*****@*****.**", password="******")
        data = {
            'amount': '20'
        }
        response = self.client.post(reverse("brambling_event_refund", kwargs={
            'organization_slug': self.event.organization.slug,
            'event_slug': self.event.slug,
            'code': self.transaction.order.code,
            'pk': self.transaction.pk
        }), data, follow=True)
        ctx_messages = list(response.context['messages'])
        self.assertEqual(ctx_messages[0].level, messages.SUCCESS)

    @mock.patch('brambling.models.Transaction.refund')
    def test_unsuccessful_refund_message(self, refund):
        refund.side_effect = ValueError('Terrible value.')
        self.transaction.amount = '40'
        self.transaction.save()
        self.client.login(email="*****@*****.**", password="******")
        data = {
            'amount': '20'
        }
        response = self.client.post(reverse("brambling_event_refund", kwargs={
            'organization_slug': self.event.organization.slug,
            'event_slug': self.event.slug,
            'code': self.transaction.order.code,
            'pk': self.transaction.pk
        }), data, follow=True)
        ctx_messages = list(response.context['messages'])
        self.assertEqual(ctx_messages[0].level, messages.ERROR)