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"))
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"))
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)
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)
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)
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)
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)
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)
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
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)
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_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)
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, })
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)
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.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()
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])
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)
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)
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_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
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)
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)
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_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 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)