def test_get_customer__no_create(self):
     user = PersonFactory()
     self.assertEqual(user.stripe_test_customer_id, '')
     customer = stripe_get_customer(user, TEST, create=False)
     self.assertIsNone(customer)
     user.refresh_from_db()
     self.assertEqual(user.stripe_test_customer_id, '')
 def test_saved_card_payment_form(self, stripe_prep, stripe_charge):
     stripe_charge.return_value = STRIPE_CHARGE
     person = PersonFactory(stripe_test_customer_id='FAKE_CUSTOMER_ID')
     order = OrderFactory(person=person)
     event = order.event
     card = CardFactory(is_saved=True)
     person.cards.add(card)
     person.save()
     form = SavedCardPaymentForm(order, Decimal('42.15'), data={'card': card.pk})
     self.assertTrue(form.is_bound)
     self.assertFalse(form.errors)
     stripe_charge.assert_called_once_with(
         card.stripe_card_id,
         amount=Decimal('42.15'),
         event=event,
         order=order,
         customer='FAKE_CUSTOMER_ID'
     )
     self.assertEqual(stripe_prep.call_count, 0)
     txn = form.save()
     self.assertIsInstance(txn, Transaction)
     self.assertEqual(txn.event, event)
     self.assertEqual(txn.amount, Decimal('42.15'))
     self.assertEqual(txn.application_fee, Decimal('1.05'))
     self.assertEqual(txn.processing_fee, Decimal('1.52'))
Exemple #3
0
 def test_dwolla_payment_form_handles_valueerror(self, oauth_refresh,
                                                 dwolla_get_sources):
     oauth_refresh.return_value = {
         'error': 'access_denied',
         'error_description': 'Arbitrary error code.'
     }
     dwolla_get_sources.return_value = DWOLLA_SOURCES
     order = OrderFactory()
     order.event.organization.dwolla_test_account = DwollaOrganizationAccountFactory(
         access_token_expires=timezone.now() - timedelta(1))
     order.event.organization.save()
     person = PersonFactory()
     person.dwolla_test_account = DwollaUserAccountFactory()
     person.save()
     pin = '1234'
     source = 'Balance'
     form = DwollaPaymentForm(order=order,
                              amount=Decimal('42.15'),
                              data={
                                  'dwolla_pin': pin,
                                  'source': source
                              },
                              user=person)
     self.assertTrue(form.is_bound)
     self.assertTrue(form.errors)
     self.assertEqual(form.errors['__all__'],
                      [oauth_refresh.return_value['error_description']])
Exemple #4
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]
 def test_get_customer__no_create(self):
     user = PersonFactory()
     self.assertEqual(user.stripe_test_customer_id, '')
     customer = stripe_get_customer(user, TEST, create=False)
     self.assertIsNone(customer)
     user.refresh_from_db()
     self.assertEqual(user.stripe_test_customer_id, '')
Exemple #6
0
 def setUp(self):
     self.person = PersonFactory(stripe_test_customer_id='FAKE_CUSTOMER_ID')
     self.order = OrderFactory(person=self.person)
     self.event = self.order.event
     self.card = CardFactory(is_saved=True)
     self.person.cards.add(self.card)
     self.person.save()
Exemple #7
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)
Exemple #8
0
    def test_dwolla_charge__user(self):
        event = EventFactory(api_type=Event.TEST,
                             application_fee_percent=Decimal('2.5'))
        event.organization.dwolla_test_account = DwollaOrganizationAccountFactory(
        )
        event.organization.save()
        self.assertTrue(event.dwolla_connected())
        dwolla_prep(Event.TEST)

        person = PersonFactory()
        person.dwolla_test_account = DwollaUserAccountFactory()
        person.save()
        order = OrderFactory(person=person, event=event, code='dwoll1')
        charge = dwolla_charge(
            account=person.dwolla_test_account,
            amount=42.15,
            order=order,
            event=event,
            pin=settings.DWOLLA_TEST_USER_PIN,
            source='Balance',
        )

        self.assertIsInstance(charge, dict)
        self.assertEqual(charge["Type"], "money_received")
        self.assertEqual(len(charge['Fees']), 1)
        self.assertEqual(charge["Notes"],
                         "Order {} for {}".format(order.code, event.name))

        txn = Transaction.from_dwolla_charge(charge, event=event)
        # 42.15 * 0.025 = 1.05
        self.assertEqual(Decimal(txn.application_fee), Decimal('1.05'))
        # 0.25
        self.assertEqual(Decimal(txn.processing_fee), Decimal('0'))

        refund = dwolla_refund(order=order,
                               event=event,
                               payment_id=txn.remote_id,
                               amount=txn.amount,
                               pin=settings.DWOLLA_TEST_ORGANIZATION_PIN)

        self.assertIsInstance(refund, dict)
        self.assertEqual(refund["Amount"], txn.amount)

        refund_info = transactions.info(
            tid=str(refund['TransactionId']),
            alternate_token=event.organization.get_dwolla_account(
                event.api_type).get_token())
        self.assertEqual(refund_info["Notes"],
                         "Order {} for {}".format(order.code, event.name))

        refund_txn = Transaction.from_dwolla_refund(refund, txn, event=event)
        self.assertEqual(refund_txn.amount, -1 * txn.amount)
        self.assertEqual(refund_txn.application_fee, 0)
        self.assertEqual(refund_txn.processing_fee, 0)
Exemple #9
0
 def test_for_request__code__authed_other_authed(self):
     """An authenticated user can't access orders created by anyone else."""
     event = EventFactory()
     person = PersonFactory()
     person2 = PersonFactory()
     order = OrderFactory(event=event, person=person2)
     request = self.factory.get('/')
     self._add_session(request)
     Order.objects._set_session_code(request, event, order.code)
     request.user = person
     with self.assertRaises(Order.DoesNotExist):
         Order.objects.for_request(event, request, create=False)
Exemple #10
0
 def test_not_member(self):
     person = PersonFactory()
     event = EventFactory()
     with self.assertNumQueries(1):
         self.assertEqual(
             person.get_all_permissions(event.organization),
             set(),
         )
     with self.assertNumQueries(0):
         self.assertFalse(person.has_perm('view', event.organization))
         self.assertFalse(person.has_perm('edit', event.organization))
         self.assertFalse(person.has_perm('change_permissions', event.organization))
Exemple #11
0
 def test_superuser(self):
     person = PersonFactory(is_superuser=True)
     event = EventFactory()
     with self.assertNumQueries(0):
         self.assertEqual(
             person.get_all_permissions(event.organization),
             set(('view', 'edit', 'change_permissions')),
         )
     with self.assertNumQueries(0):
         self.assertTrue(person.has_perm('view', event.organization))
         self.assertTrue(person.has_perm('edit', event.organization))
         self.assertTrue(person.has_perm('change_permissions', event.organization))
    def test_get_customer(self):
        user = PersonFactory()
        self.assertEqual(user.stripe_test_customer_id, '')
        customer = stripe_get_customer(user, TEST)
        user.refresh_from_db()
        self.assertEqual(user.stripe_test_customer_id, customer.id)
        self.assertEqual(customer.email, user.email)

        new_customer = stripe_get_customer(user, TEST)
        self.assertEqual(new_customer.id, customer.id)
        user.refresh_from_db()
        self.assertEqual(user.stripe_test_customer_id, customer.id)
Exemple #13
0
    def test_comped__sends_email(self):
        """A successful completion with fully-comped items should send a receipt email and an alert email."""
        organization = OrganizationFactory()
        owner = PersonFactory()
        OrganizationMember.objects.create(
            person=owner,
            organization=organization,
            role=OrganizationMember.OWNER,
        )
        event = EventFactory(
            collect_housing_data=False,
            organization=organization,
        )
        order = OrderFactory(event=event)
        item = ItemFactory(event=event)
        item_option = ItemOptionFactory(price=100, item=item)
        discount = DiscountFactory(amount=100,
                                   discount_type='percent',
                                   event=event,
                                   item_options=[item_option])

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

        view = SummaryView()
        view.request = self.factory.post('/')
        view.request.user = AnonymousUser()
        view.event = event
        view.order = order

        self.assertEqual(len(mail.outbox), 0)
        response = view.post(view.request)
        self.assertEqual(response.status_code, 302)
        self.assertEqual(len(mail.outbox), 2)
    def setUp(self):
        self.person = PersonFactory()
        event = EventFactory()
        owner = PersonFactory()
        OrganizationMember.objects.create(
            person=owner,
            organization=event.organization,
            role=OrganizationMember.OWNER,
        )
        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 = OrderAlertMailer(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 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 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]
Exemple #17
0
    def test_payment__sends_email(self):
        """A successful payment should send a receipt email and an alert email."""
        organization = OrganizationFactory(check_payment_allowed=True)
        owner = PersonFactory()
        OrganizationMember.objects.create(
            person=owner,
            organization=organization,
            role=OrganizationMember.OWNER,
        )
        event = EventFactory(
            collect_housing_data=False,
            organization=organization,
            check_postmark_cutoff=timezone.now().date(),
        )
        order = OrderFactory(event=event)
        item = ItemFactory(event=event)
        item_option = ItemOptionFactory(price=100, item=item)

        order.add_to_cart(item_option)
        order.add_to_cart(item_option)

        view = SummaryView()
        view.request = self.factory.post('/', {'check': 1})
        view.request.user = AnonymousUser()
        view.event = event
        view.order = order

        self.assertEqual(len(mail.outbox), 0)
        response = view.post(view.request)
        self.assertEqual(response.status_code, 302)
        self.assertEqual(len(mail.outbox), 2)
 def setUp(self):
     self.person = PersonFactory(stripe_test_customer_id='FAKE_CUSTOMER_ID')
     self.order = OrderFactory(person=self.person)
     self.event = self.order.event
     self.card = CardFactory(is_saved=True)
     self.person.cards.add(self.card)
     self.person.save()
    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
Exemple #20
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)
 def test_organization__view(self):
     person = PersonFactory()
     event = EventFactory()
     OrganizationMember.objects.create(
         person=person,
         organization=event.organization,
         role=OrganizationMember.VIEW,
     )
     with self.assertNumQueries(2):
         self.assertEqual(
             person.get_all_permissions(event),
             set(('view',)),
         )
     with self.assertNumQueries(0):
         self.assertTrue(person.has_perm('view', event))
         self.assertFalse(person.has_perm('edit', event))
         self.assertFalse(person.has_perm('change_permissions', event))
Exemple #22
0
 def test_organization__edit(self):
     person = PersonFactory()
     event = EventFactory()
     OrganizationMember.objects.create(
         person=person,
         organization=event.organization,
         role=OrganizationMember.EDIT,
     )
     with self.assertNumQueries(1):
         self.assertEqual(
             person.get_all_permissions(event),
             set(('view', 'edit', 'change_permissions')),
         )
     with self.assertNumQueries(0):
         self.assertTrue(person.has_perm('view', event))
         self.assertTrue(person.has_perm('edit', event))
         self.assertTrue(person.has_perm('change_permissions', event))
Exemple #23
0
 def test_event__edit(self):
     person = PersonFactory()
     event = EventFactory()
     EventMember.objects.create(
         person=person,
         event=event,
         role=EventMember.EDIT,
     )
     with self.assertNumQueries(2):
         self.assertEqual(
             person.get_all_permissions(event),
             set(('view', 'edit')),
         )
     with self.assertNumQueries(0):
         self.assertTrue(person.has_perm('view', event))
         self.assertTrue(person.has_perm('edit', event))
         self.assertFalse(person.has_perm('change_permissions', event))
Exemple #24
0
 def test_event__view(self):
     person = PersonFactory()
     event = EventFactory()
     EventMember.objects.create(
         person=person,
         event=event,
         role=EventMember.VIEW,
     )
     with self.assertNumQueries(1):
         self.assertEqual(
             person.get_all_permissions(event.organization),
             set(),
         )
     with self.assertNumQueries(0):
         self.assertFalse(person.has_perm('view', event.organization))
         self.assertFalse(person.has_perm('edit', event.organization))
         self.assertFalse(person.has_perm('change_permissions', event.organization))
Exemple #25
0
    def test_queryset_distinct(self):
        """
        For authenticated users, make sure the qs is distinct.
        Specifically, having multiple additional editors on
        the event shouldn't cause duplication issues.
        """
        person = PersonFactory()
        editor1 = PersonFactory()
        editor2 = PersonFactory()
        editor3 = PersonFactory()
        event = EventFactory(collect_housing_data=False)
        EventMember.objects.create(
            person=editor1,
            event=event,
            role=EventMember.EDIT,
        )
        EventMember.objects.create(
            person=editor2,
            event=event,
            role=EventMember.EDIT,
        )
        EventMember.objects.create(
            person=editor3,
            event=event,
            role=EventMember.EDIT,
        )
        order = OrderFactory(event=event, person=person)
        # Set up three attendees to trigger duplication.
        AttendeeFactory(order=order)
        AttendeeFactory(order=order)
        AttendeeFactory(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)

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

        qs = viewset.get_queryset()
        self.assertEqual(len(qs), 2)
        self.assertEqual(set(qs), set(order.bought_items.all()))
    def test_pending_payment_transfer_fails(self):
        """A transfer on an item with unconfirmed transactions should be prohibited."""
        view = self.set_up_view(
            orderer=PersonFactory(),
            is_confirmed=False,
        )
        view.post(view.request)

        self.assertEqual(len(mail.outbox), 0)
Exemple #27
0
 def test_viewable_by__public_unpublished__owner(self):
     event = EventFactory(is_published=False, privacy=Event.PUBLIC)
     person = PersonFactory()
     OrganizationMember.objects.create(
         person=person,
         organization=event.organization,
         role=OrganizationMember.OWNER,
     )
     self.assertTrue(event.viewable_by(person))
 def test_adjust_datetime(self):
     request = self.factory.get('/')
     request.user = PersonFactory()
     td = timedelta(days=3)
     old_date = datetime(2015, 10, 2, 5, 5, 5)
     old_event = EventFactory(start_date=date(2015, 10, 5))
     new_event = EventFactory(start_date=old_event.start_date + td)
     form = EventCreateForm(request)
     new_date = form._adjust_date(old_event, new_event, old_date)
     self.assertEqual(new_date, old_date + td)
Exemple #29
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)
Exemple #30
0
 def test_for_request__code__authed_anon(self):
     """Authenticated users cannot access orders created by anonymous users
     without the code stored in the session.
     """
     event = EventFactory()
     person = PersonFactory()
     OrderFactory(event=event, person=None)
     request = self.factory.get('/')
     self._add_session(request)
     request.user = person
     with self.assertRaises(Order.DoesNotExist):
         Order.objects.for_request(event, request, create=False)
Exemple #31
0
 def test_for_request__authed(self):
     """An authenticated user will automatically get their own order."""
     event = EventFactory()
     person = PersonFactory()
     order = OrderFactory(event=event, person=person)
     request = self.factory.get('/')
     request.user = person
     fetched, created = Order.objects.for_request(event,
                                                  request,
                                                  create=False)
     self.assertFalse(created)
     self.assertEqual(fetched, order)
    def setUp(self):
        self.factory = RequestFactory()
        self.organization = OrganizationFactory()
        self.owner = PersonFactory()
        self.owner_member = OrganizationMember.objects.create(
            organization=self.organization,
            person=self.owner,
            role=OrganizationMember.OWNER,
        )
        self.editor = PersonFactory()
        self.editor_member = OrganizationMember.objects.create(
            organization=self.organization,
            person=self.editor,
            role=OrganizationMember.EDIT,
        )
        self.request = self.factory.get('/')
        self.request.user = self.owner
        SessionMiddleware().process_request(self.request)
        MessageMiddleware().process_request(self.request)

        self.view = OrganizationRemoveMemberView()
Exemple #33
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)
Exemple #34
0
 def test_subject__transfer(self):
     person = PersonFactory(first_name="Conan", last_name="O'Brien")
     event = EventFactory()
     order = OrderFactory(event=event, person=person)
     TransactionFactory(event=event, order=order, amount=130)
     item = ItemFactory(event=event, name='Multipass')
     item_option1 = ItemOptionFactory(price=100, item=item, name='Gold')
     order.add_to_cart(item_option1)
     boughtitem = order.bought_items.all()[0]
     request = self.factory.get('/')
     request.user = person
     invite, created = TransferInvite.get_or_create(
         request=request,
         email='*****@*****.**',
         content=boughtitem,
     )
     invite.send()
     self.assertEqual(len(mail.outbox), 1)
     self.assertEqual(
         mail.outbox[0].subject,
         "{} wants to transfer an item to you".format(
             person.get_full_name()))
 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)
Exemple #36
0
 def test_invite(self):
     view = InviteAcceptView()
     event = EventFactory()
     invite = InviteFactory(content_id=event.pk,
                            kind=EventInvite.slug,
                            user=PersonFactory(first_name="Conan",
                                               last_name="O'Brien"))
     view.content = event
     view.request = RequestFactory().get('/')
     view.request.user = PersonFactory(email=invite.email,
                                       confirmed_email=invite.email)
     self._add_session(view.request)
     with mock.patch.object(wraps=Order.objects.for_request,
                            target=Order.objects,
                            attribute='for_request') as for_request:
         view.get(view.request, code=invite.code)
     for_request.assert_called_once_with(create=True,
                                         request=view.request,
                                         event=view.content)
     orders = Order.objects.all()
     self.assertEqual(len(orders), 1)
     self.assertEqual(orders[0].person, view.request.user)
Exemple #37
0
    def test_dolla_charge__negative(self):
        event = EventFactory(api_type=Event.TEST,
                             application_fee_percent=Decimal('2.5'))
        event.organization.dwolla_test_account = DwollaOrganizationAccountFactory(
        )
        event.organization.save()
        self.assertTrue(event.dwolla_connected())
        dwolla_prep(Event.TEST)

        person = PersonFactory()
        person.dwolla_test_account = DwollaUserAccountFactory()
        person.save()
        order = OrderFactory(person=person, event=event, code='dwoll1')
        with self.assertRaises(InvalidAmountException):
            dwolla_charge(
                account=person.dwolla_test_account,
                amount=-1.00,
                order=order,
                event=event,
                pin=settings.DWOLLA_TEST_USER_PIN,
                source='Balance',
            )
class OrderSearchTestCase(APITestCase):
    def setUp(self):
        self.person = PersonFactory(password='******', is_superuser=True)
        self.client.login(username=self.person.email, password='******')
        self.event = EventFactory()
        self.order = OrderFactory(event=self.event)

    def test_get__no_permissions(self):
        self.person.is_superuser = False
        self.person.save()

        response = self.client.get(
            '/api/v1/ordersearch/', {
                'event': self.event.pk,
            },
        )

        self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)

    def test_get__no_event(self):
        response = self.client.get(
            '/api/v1/ordersearch/',
        )

        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(len(response.data), 0)

    def test_get__with_event(self):
        event2 = EventFactory()
        OrderFactory(event=event2)
        response = self.client.get(
            '/api/v1/ordersearch/', {
                'event': self.event.pk,
            },
        )

        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(len(response.data), 1)
        self.assertEqual(response.data[0]['id'], self.order.pk)
Exemple #39
0
    def test_queryset_distinct(self):
        """
        For authenticated users, make sure the qs is distinct.
        Specifically, having multiple additional editors on
        the event shouldn't cause duplication issues.
        """
        person = PersonFactory()
        editor1 = PersonFactory()
        editor2 = PersonFactory()
        editor3 = PersonFactory()
        event = EventFactory(collect_housing_data=False)
        EventMember.objects.create(
            person=editor1,
            event=event,
            role=EventMember.EDIT,
        )
        EventMember.objects.create(
            person=editor2,
            event=event,
            role=EventMember.EDIT,
        )
        EventMember.objects.create(
            person=editor3,
            event=event,
            role=EventMember.EDIT,
        )
        order = OrderFactory(event=event, person=person)
        att1 = AttendeeFactory(order=order)
        att2 = AttendeeFactory(order=order)
        att3 = AttendeeFactory(order=order)

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

        qs = viewset.get_queryset()
        self.assertEqual(len(qs), 3)
        self.assertEqual(set(qs), set((att1, att2, att3)))
 def test_organization__view__event__edit(self):
     """Max permission level takes precedence."""
     person = PersonFactory()
     event = EventFactory()
     OrganizationMember.objects.create(
         person=person,
         organization=event.organization,
         role=OrganizationMember.VIEW,
     )
     EventMember.objects.create(
         person=person,
         event=event,
         role=EventMember.EDIT,
     )
     with self.assertNumQueries(2):
         self.assertEqual(
             person.get_all_permissions(event),
             set(('view', 'edit')),
         )
     with self.assertNumQueries(0):
         self.assertTrue(person.has_perm('view', event))
         self.assertTrue(person.has_perm('edit', event))
         self.assertFalse(person.has_perm('change_permissions', event))
class TransferInviteTestCase(TestCase):
    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]

    def test_email_subject__transfer(self):
        request = self.factory.get('/')
        request.user = self.person
        invite, created = TransferInvite.get_or_create(
            request=request,
            email='*****@*****.**',
            content=self.bought_item,
        )
        invite.send()
        self.assertEqual(len(mail.outbox), 1)
        self.assertEqual(
            mail.outbox[0].subject,
            "{} wants to transfer an item to you".format(
                self.person.get_full_name()
            ),
        )

    def test_manage_not_allowed__no_order(self):
        # A person who isn't signed up for the event
        # shouldn't be able to manage it.
        person2 = PersonFactory()
        request = self.factory.get('/')
        request.user = person2

        session_middleware = SessionMiddleware()
        session_middleware.process_request(request)

        instance = Invite.objects.create(
            email=person2.email,
            user=self.person,
            kind='transfer',
            content_id=self.bought_item.id,
        )
        invite = get_invite(request, instance.code, self.bought_item)
        self.assertFalse(invite.manage_allowed())

    def test_manage_not_allowed__wrong_order(self):
        # A person who doesn't have the originating order
        # shouldn't be able to manage it.
        person2 = PersonFactory()
        OrderFactory(
            person=person2,
            event=self.event,
        )
        request = self.factory.get('/')
        request.user = person2

        instance = Invite.objects.create(
            email=person2.email,
            user=self.person,
            kind='transfer',
            content_id=self.bought_item.id,
        )
        invite = get_invite(request, instance.code, self.bought_item)
        self.assertFalse(invite.manage_allowed())

    def test_manage_allowed(self):
        # Owner of a bought item should be able to manage transfer invites.
        person2 = PersonFactory()
        request = self.factory.get('/')
        request.user = self.person

        instance = Invite.objects.create(
            email=person2.email,
            user=self.person,
            kind='transfer',
            content_id=self.bought_item.id,
        )
        invite = get_invite(request, instance.code, self.bought_item)
        self.assertTrue(invite.manage_allowed())
 def setUp(self):
     self.person = PersonFactory(password='******', is_superuser=True)
     self.client.login(username=self.person.email, password='******')
     self.event = EventFactory()
     self.order = OrderFactory(event=self.event)
class SavedCardPaymentFormTestCase(TestCase):

    def setUp(self):
        self.person = PersonFactory(stripe_test_customer_id='FAKE_CUSTOMER_ID')
        self.order = OrderFactory(person=self.person)
        self.event = self.order.event
        self.card = CardFactory(is_saved=True)
        self.person.cards.add(self.card)
        self.person.save()

    @patch('brambling.forms.orders.stripe_charge')
    def test_successful_charge(self, stripe_charge):
        stripe_charge.return_value = STRIPE_CHARGE
        form = SavedCardPaymentForm(self.order, Decimal('42.15'),
                                    data={'card': self.card.pk})
        self.assertTrue(form.is_bound)
        self.assertFalse(form.errors)
        stripe_charge.assert_called_once_with(
            self.card.stripe_card_id,
            amount=Decimal('42.15'),
            event=self.event,
            order=self.order,
            customer='FAKE_CUSTOMER_ID'
        )
        txn = form.save()
        self.assertIsInstance(txn, Transaction)
        self.assertEqual(txn.event, self.event)
        self.assertEqual(txn.amount, Decimal('42.15'))
        self.assertEqual(txn.application_fee, Decimal('1.05'))
        self.assertEqual(txn.processing_fee, Decimal('1.52'))

    def test_negative_amount_adds_errors(self):
        form = SavedCardPaymentForm(self.order, Decimal('-1.00'),
                                    data={'card': self.card.pk})

        self.assertTrue(form.is_bound)
        self.assertTrue(form.errors)
        self.assertEqual(form.errors['__all__'],
                         ["Cannot charge an amount less than zero."])

    @patch('brambling.forms.orders.stripe_charge')
    def test_handles_carderror(self, stripe_charge):
        error_message = "Hi"
        stripe_charge.side_effect = stripe.error.CardError(error_message, 1, 1)
        form = SavedCardPaymentForm(order=self.order, amount=Decimal('42.15'),
                                    data={'card': self.card.pk})
        self.assertTrue(form.is_bound)
        self.assertTrue(form.errors)
        self.assertEqual(form.errors['__all__'], [error_message])

    @patch('brambling.forms.orders.stripe_charge')
    def test_handles_apierror(self, stripe_charge):
        error_message = "Hi"
        stripe_charge.side_effect = stripe.error.APIError(error_message, 1, 1)
        form = SavedCardPaymentForm(order=self.order, amount=Decimal('42.15'),
                                    data={'card': self.card.pk})
        self.assertTrue(form.is_bound)
        self.assertTrue(form.errors)
        self.assertEqual(form.errors['__all__'], [STRIPE_API_ERROR])

    @patch('brambling.forms.orders.stripe_charge')
    def test_handles_invalidamountexception(self, stripe_charge):
        error_message = "Hi"
        stripe_charge.side_effect = InvalidAmountException(error_message)
        form = SavedCardPaymentForm(order=self.order, amount=Decimal('42.15'),
                                    data={'card': self.card.pk})
        self.assertTrue(form.is_bound)
        self.assertTrue(form.errors)
        self.assertEqual(form.errors['__all__'], [error_message])

    @patch('brambling.forms.orders.stripe_charge')
    def test_handles_invalidrequesterror(self, stripe_charge):
        error_message = "Hi"
        stripe_charge.side_effect = stripe.error.InvalidRequestError(error_message, 1)
        form = SavedCardPaymentForm(order=self.order, amount=Decimal('42.15'),
                                    data={'card': self.card.pk})
        self.assertTrue(form.is_bound)
        self.assertTrue(form.errors)
        self.assertEqual(form.errors['__all__'], [error_message])
class OrderReceiptMailerTestCase(TestCase):

    def setUp(self):
        self.person = PersonFactory()
        event = EventFactory()
        owner = PersonFactory()
        OrganizationMember.objects.create(
            person=owner,
            organization=event.organization,
            role=OrganizationMember.OWNER,
        )
        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 = OrderAlertMailer(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_render_plaintext(self):
        body = self.mailer.render_body(self.mailer.get_context_data(),
                                       plaintext=True)
        self.assertIn(self.total_amount, body)
        self.assertIn(self.option1, body)
        self.assertIn(self.option2, body)
        self.assertNotIn("outstanding check payments", body)

    def test_render_inlined(self):
        body = self.mailer.render_body(self.mailer.get_context_data(),
                                       inlined=True)
        self.assertIn(self.option1, body)
        self.assertIn(self.option2, body)
        self.assertIn(self.total_amount, body)

    def test_recipients(self):
        self.assertSequenceEqual(self.mailer.get_recipients(),
                                 [self.order.event.organization.members.get().email])

    def test_recipients__notify_never(self):
        person = self.order.event.organization.members.get()
        person.notify_new_purchases = 'never'
        person.save()
        self.assertSequenceEqual(self.mailer.get_recipients(),
                                 [])

    def test_recipients__notify_daily(self):
        person = self.order.event.organization.members.get()
        person.notify_new_purchases = 'daily'
        person.save()
        self.assertSequenceEqual(self.mailer.get_recipients(),
                                 [])

    def test_subject(self):
        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)

    def test_body_non_inlined_non_plaintext(self):
        body = self.mailer.render_body(self.mailer.get_context_data(),
                                       inlined=False, plaintext=False)
        self.assertIn(self.option1, body)
        self.assertIn(self.option2, body)
        self.assertIn(self.total_amount, body)

    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)