You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

test_voucher_views.py 4.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. import pytest
  2. from django.contrib.messages import get_messages
  3. from django.urls import reverse
  4. from oscar.apps.dashboard.vouchers import views
  5. from oscar.core.loading import get_model
  6. from oscar.test.factories import voucher
  7. from oscar.test.factories.offer import ConditionalOfferFactory
  8. from tests.fixtures import RequestFactory
  9. ConditionalOffer = get_model('offer', 'ConditionalOffer')
  10. Voucher = get_model('voucher', 'Voucher')
  11. VoucherSet = get_model('voucher', 'VoucherSet')
  12. @pytest.fixture
  13. def many_voucher_sets():
  14. voucher.VoucherSetFactory.create_batch(30)
  15. return VoucherSet.objects.all()
  16. @pytest.mark.django_db
  17. class TestDashboardVouchers:
  18. def test_voucher_update_view_for_voucher_in_set(self):
  19. vs = voucher.VoucherSetFactory(count=10)
  20. v = vs.vouchers.first()
  21. view = views.VoucherUpdateView.as_view()
  22. request = RequestFactory().get('/')
  23. response = view(request, pk=v.pk)
  24. assert response.status_code == 302
  25. assert response.url == reverse('dashboard:voucher-set-update', kwargs={'pk': vs.pk})
  26. assert [(m.level_tag, str(m.message)) for m in get_messages(request)][0] == (
  27. 'warning', "The voucher can only be edited as part of its set")
  28. data = {
  29. 'code': v.code,
  30. 'name': "New name",
  31. 'start_datetime': v.start_datetime,
  32. 'end_datetime': v.end_datetime,
  33. 'usage': v.usage,
  34. 'offers': [v.offers],
  35. }
  36. request = RequestFactory().post('/', data=data)
  37. response = view(request, pk=v.pk)
  38. assert response.status_code == 302
  39. assert response.url == reverse('dashboard:voucher-set-update', kwargs={'pk': vs.pk})
  40. assert [(m.level_tag, str(m.message)) for m in get_messages(request)][0] == (
  41. 'warning', "The voucher can only be edited as part of its set")
  42. v.refresh_from_db()
  43. assert v.name != "New name"
  44. def test_voucher_delete_view(self):
  45. v = voucher.VoucherFactory()
  46. v.offers.add(ConditionalOfferFactory(offer_type=ConditionalOffer.VOUCHER))
  47. assert Voucher.objects.count() == 1
  48. assert ConditionalOffer.objects.count() == 1
  49. request = RequestFactory().post('/')
  50. response = views.VoucherDeleteView.as_view()(request, pk=v.pk)
  51. assert Voucher.objects.count() == 0
  52. # Related offer is not deleted
  53. assert ConditionalOffer.objects.count() == 1
  54. assert response.status_code == 302
  55. assert response.url == reverse('dashboard:voucher-list')
  56. assert [(m.level_tag, str(m.message)) for m in get_messages(request)][0] == ('warning', "Voucher deleted")
  57. def test_voucher_delete_view_for_voucher_in_set(self):
  58. vs = voucher.VoucherSetFactory(count=10)
  59. assert Voucher.objects.count() == 10
  60. request = RequestFactory().post('/')
  61. response = views.VoucherDeleteView.as_view()(request, pk=vs.vouchers.first().pk)
  62. vs.refresh_from_db()
  63. assert vs.count == 9 # "count" is updated
  64. assert Voucher.objects.count() == 9
  65. assert response.status_code == 302
  66. assert response.url == reverse('dashboard:voucher-set-detail', kwargs={'pk': vs.pk})
  67. assert [(m.level_tag, str(m.message)) for m in get_messages(request)][0] == ('warning', "Voucher deleted")
  68. @pytest.mark.django_db
  69. class TestDashboardVoucherSets:
  70. def test_voucher_set_list_view(self, rf, many_voucher_sets):
  71. view = views.VoucherSetListView.as_view()
  72. request = rf.get('/')
  73. response = view(request)
  74. # if these are missing the pagination is broken
  75. assert response.context_data['paginator']
  76. assert response.context_data['page_obj']
  77. assert response.status_code == 200
  78. def test_voucher_set_detail_view(self, rf):
  79. voucher.VoucherSetFactory(count=10)
  80. vs2 = voucher.VoucherSetFactory(count=15)
  81. request = rf.get('/')
  82. response = views.VoucherSetDetailView.as_view()(request, pk=vs2.pk)
  83. # The view should only list vouchers for vs2
  84. assert len(response.context_data['vouchers']) == 15
  85. assert response.status_code == 200
  86. def test_voucher_set_delete_view(self):
  87. vs = voucher.VoucherSetFactory(count=10)
  88. assert VoucherSet.objects.count() == 1
  89. assert Voucher.objects.count() == 10
  90. request = RequestFactory().post('/')
  91. response = views.VoucherSetDeleteView.as_view()(request, pk=vs.pk)
  92. assert VoucherSet.objects.count() == 0
  93. assert Voucher.objects.count() == 0
  94. assert response.status_code == 302
  95. assert response.url == reverse('dashboard:voucher-set-list')
  96. assert [(m.level_tag, str(m.message)) for m in get_messages(request)][0] == ('warning', "Voucher set deleted")