|
| 1 | +from datetime import datetime, timedelta |
1 | 2 | from logging import getLogger |
2 | 3 |
|
3 | 4 | import stripe |
| 5 | +from membership.models import Span |
4 | 6 | from shop.transactions import CartItem, Purchase |
5 | 7 | from test_aid.systest_base import VALID_3DS_CARD_NO, VALID_NON_3DS_CARD_NO, ApiShopTestMixin, ApiTest, retry |
6 | 8 |
|
@@ -94,3 +96,99 @@ def test_empty_cart_fails_purchase(self) -> None: |
94 | 96 | ) |
95 | 97 |
|
96 | 98 | self.post(f"/webshop/pay", purchase.to_dict(), token=self.token).expect(code=400, what="empty_cart") |
| 99 | + |
| 100 | + def test_labaccess_purchase_fails_without_base_membership(self): |
| 101 | + category = self.db.create_category() |
| 102 | + lab_access_product = self.db.create_product( |
| 103 | + price=575, |
| 104 | + unit="mån", |
| 105 | + category_id=category.id, |
| 106 | + product_metadata={ |
| 107 | + "allowed_price_levels": ["low_income_discount"], |
| 108 | + "special_product_id": "single_labaccess_month", |
| 109 | + }, |
| 110 | + ) |
| 111 | + purchase = Purchase( |
| 112 | + cart=[CartItem(lab_access_product.id, 1)], |
| 113 | + expected_sum=lab_access_product.price, |
| 114 | + stripe_payment_method_id="not_used", |
| 115 | + ) |
| 116 | + self.db.create_member() |
| 117 | + self.post("/webshop/pay", purchase.to_dict(), token=self.token).expect(code=400) |
| 118 | + |
| 119 | + def test_labaccess_purchase_allowed_together_with_base_membership(self): |
| 120 | + category = self.db.create_category() |
| 121 | + base_membership = self.db.create_product( |
| 122 | + price=200, |
| 123 | + unit="år", |
| 124 | + category_id=category.id, |
| 125 | + product_metadata={ |
| 126 | + "allowed_price_levels": ["low_income_discount"], |
| 127 | + "special_product_id": "single_membership_year", |
| 128 | + }, |
| 129 | + ) |
| 130 | + lab_access_product = self.db.create_product( |
| 131 | + price=575, |
| 132 | + unit="mån", |
| 133 | + category_id=category.id, |
| 134 | + product_metadata={ |
| 135 | + "allowed_price_levels": ["low_income_discount"], |
| 136 | + "special_product_id": "single_labaccess_month", |
| 137 | + }, |
| 138 | + ) |
| 139 | + payment_method = stripe.PaymentMethod.create(type="card", card=self.card(VALID_NON_3DS_CARD_NO)) |
| 140 | + purchase = Purchase( |
| 141 | + cart=[CartItem(lab_access_product.id, 1), CartItem(base_membership.id, 1)], |
| 142 | + expected_sum=lab_access_product.price + base_membership.price, |
| 143 | + stripe_payment_method_id=payment_method.id, |
| 144 | + ) |
| 145 | + self.db.create_member() |
| 146 | + self.post("/webshop/pay", purchase.to_dict(), token=self.token).expect(code=200) |
| 147 | + |
| 148 | + def test_labaccess_purchase_allowed_while_membership_active(self): |
| 149 | + category = self.db.create_category() |
| 150 | + lab_access_product = self.db.create_product( |
| 151 | + price=575, |
| 152 | + unit="mån", |
| 153 | + category_id=category.id, |
| 154 | + product_metadata={ |
| 155 | + "allowed_price_levels": ["low_income_discount"], |
| 156 | + "special_product_id": "single_labaccess_month", |
| 157 | + }, |
| 158 | + ) |
| 159 | + payment_method = stripe.PaymentMethod.create(type="card", card=self.card(VALID_NON_3DS_CARD_NO)) |
| 160 | + purchase = Purchase( |
| 161 | + cart=[CartItem(lab_access_product.id, 1)], |
| 162 | + expected_sum=lab_access_product.price, |
| 163 | + stripe_payment_method_id=payment_method.id, |
| 164 | + ) |
| 165 | + member = self.db.create_member() |
| 166 | + token = self.db.create_access_token(user_id=member.member_id) |
| 167 | + startdate = datetime.utcnow() |
| 168 | + enddate = startdate + timedelta(days=30) |
| 169 | + self.db.create_span(member=member, type=Span.MEMBERSHIP, startdate=startdate, enddate=enddate) |
| 170 | + self.post("/webshop/pay", purchase.to_dict(), token=token.access_token).expect(code=200) |
| 171 | + |
| 172 | + def test_labaccess_purchase_not_allowed_when_membership_expired(self): |
| 173 | + category = self.db.create_category() |
| 174 | + lab_access_product = self.db.create_product( |
| 175 | + price=575, |
| 176 | + unit="mån", |
| 177 | + category_id=category.id, |
| 178 | + product_metadata={ |
| 179 | + "allowed_price_levels": ["low_income_discount"], |
| 180 | + "special_product_id": "single_labaccess_month", |
| 181 | + }, |
| 182 | + ) |
| 183 | + payment_method = stripe.PaymentMethod.create(type="card", card=self.card(VALID_NON_3DS_CARD_NO)) |
| 184 | + purchase = Purchase( |
| 185 | + cart=[CartItem(lab_access_product.id, 1)], |
| 186 | + expected_sum=lab_access_product.price, |
| 187 | + stripe_payment_method_id=payment_method.id, |
| 188 | + ) |
| 189 | + member = self.db.create_member() |
| 190 | + token = self.db.create_access_token(user_id=member.member_id) |
| 191 | + startdate = datetime.utcnow() |
| 192 | + enddate = startdate - timedelta(days=30) |
| 193 | + self.db.create_span(member=member, type=Span.MEMBERSHIP, startdate=startdate, enddate=enddate) |
| 194 | + self.post("/webshop/pay", purchase.to_dict(), token=token.access_token).expect(code=400) |
0 commit comments