def test_product_caching_object(): shop_product = get_default_shop_product() product = shop_product.product another_product = create_product("PCOTestProduct") pco = ProductCachingObject() pco.product = product assert pco.product is product assert pco.product_id == product.pk assert ProductCachingObject().product != pco.product # Assert PCOs are separate assert pco._product_cache == pco.product # This private property is courtesy of ModelCachingDescriptor pco = ProductCachingObject() pco.product_id = product.pk assert pco.product == product assert pco.product_id == product.pk # Not creating a new PCO here pco.product = another_product assert pco.product == another_product assert pco.product_id == another_product.pk # Nor here pco.product_id = product.pk assert pco.product == product assert pco.product_id == product.pk
def test_product_query(admin_user, regular_user): anon_contact = AnonymousContact() shop_product = get_default_shop_product() shop = shop_product.shop product = shop_product.product regular_contact = get_person_contact(regular_user) admin_contact = get_person_contact(admin_user) with modify(shop_product, save=True, listed=True, visible=True, visibility_limit=ProductVisibility.VISIBLE_TO_ALL ): assert Product.objects.list_visible(shop=shop, customer=anon_contact).filter(pk=product.pk).exists() with modify(shop_product, save=True, listed=False, visible=True, visibility_limit=ProductVisibility.VISIBLE_TO_ALL ): assert not Product.objects.list_visible(shop=shop, customer=anon_contact).filter(pk=product.pk).exists() assert not Product.objects.list_visible(shop=shop, customer=regular_contact).filter(pk=product.pk).exists() assert Product.objects.list_visible(shop=shop, customer=admin_contact).filter(pk=product.pk).exists() with modify(shop_product, save=True, listed=True, visible=True, visibility_limit=ProductVisibility.VISIBLE_TO_LOGGED_IN ): assert not Product.objects.list_visible(shop=shop, customer=anon_contact).filter(pk=product.pk).exists() assert Product.objects.list_visible(shop=shop, customer=regular_contact).filter(pk=product.pk).exists() product.soft_delete() assert not Product.objects.all_except_deleted().filter(pk=product.pk).exists()
def test_product_unsupplied(admin_user): shop_product = get_default_shop_product() fake_supplier = Supplier.objects.create(identifier="fake") admin_contact = get_person_contact(admin_user) with modify(shop_product, visibility_limit=ProductVisibility.VISIBLE_TO_ALL, orderable=True): assert any(ve.code == "invalid_supplier" for ve in shop_product.get_orderability_errors(supplier=fake_supplier, customer=admin_contact, quantity=1))
def test_product_caching_object(): shop_product = get_default_shop_product() product = shop_product.product another_product = create_product("PCOTestProduct") pco = ProductCachingObject() pco.product = product assert pco.product is product assert pco.product_id == product.pk assert ProductCachingObject( ).product != pco.product # Assert PCOs are separate assert pco._product_cache == pco.product # This private property is courtesy of ModelCachingDescriptor pco = ProductCachingObject() pco.product_id = product.pk assert pco.product == product assert pco.product_id == product.pk # Not creating a new PCO here pco.product = another_product assert pco.product == another_product assert pco.product_id == another_product.pk # Nor here pco.product_id = product.pk assert pco.product == product assert pco.product_id == product.pk
def test_default_supplier(): supplier = get_default_supplier() shop_product = get_default_shop_product() product = shop_product.product assert supplier.get_stock_statuses([product.id ])[product.id].logical_count == 0 assert not list( supplier.get_orderability_errors(shop_product, 1, customer=None))
def test_product_minimum_order_quantity(admin_user): shop_product = get_default_shop_product() supplier = get_default_supplier() admin_contact = get_person_contact(admin_user) with modify(shop_product, visibility_limit=ProductVisibility.VISIBLE_TO_ALL, orderable=True, minimum_purchase_quantity=10): assert any(ve.code == "purchase_quantity_not_met" for ve in shop_product.get_orderability_errors(supplier=supplier, customer=admin_contact, quantity=1)) assert not any(ve.code == "purchase_quantity_not_met" for ve in shop_product.get_orderability_errors(supplier=supplier, customer=admin_contact, quantity=15))
def test_product_order_multiple(admin_user): shop_product = get_default_shop_product() supplier = get_default_supplier() admin_contact = get_person_contact(admin_user) with modify(shop_product, visibility_limit=ProductVisibility.VISIBLE_TO_ALL, orderable=True, purchase_multiple=7): assert any(ve.code == "invalid_purchase_multiple" for ve in shop_product.get_orderability_errors(supplier=supplier, customer=admin_contact, quantity=4)) assert any(ve.code == "invalid_purchase_multiple" for ve in shop_product.get_orderability_errors(supplier=supplier, customer=admin_contact, quantity=25)) assert not any(ve.code == "invalid_purchase_multiple" for ve in shop_product.get_orderability_errors(supplier=supplier, customer=admin_contact, quantity=49))
def test_product_unsupplied(admin_user): shop_product = get_default_shop_product() fake_supplier = Supplier.objects.create(identifier="fake") admin_contact = get_person_contact(admin_user) with modify(shop_product, visibility_limit=ProductVisibility.VISIBLE_TO_ALL, orderable=True): assert any( ve.code == "invalid_supplier" for ve in shop_product.get_orderability_errors( supplier=fake_supplier, customer=admin_contact, quantity=1))
def test_product_orderability(): anon_contact = AnonymousContact() shop_product = get_default_shop_product() supplier = get_default_supplier() with modify(shop_product, visibility_limit=ProductVisibility.VISIBLE_TO_ALL, orderable=True): shop_product.raise_if_not_orderable(supplier=supplier, customer=anon_contact, quantity=1) assert shop_product.is_orderable(supplier=supplier, customer=anon_contact, quantity=1) with modify(shop_product, visibility_limit=ProductVisibility.VISIBLE_TO_LOGGED_IN, orderable=True): with pytest.raises(ProductNotOrderableProblem): shop_product.raise_if_not_orderable(supplier=supplier, customer=anon_contact, quantity=1) assert not shop_product.is_orderable(supplier=supplier, customer=anon_contact, quantity=1)
def test_get_suppliable_products(): customer = create_random_person() shop_product = get_default_shop_product() shop = get_default_shop() supplier = get_default_supplier() # Check for default orderable shop product with unstocked behavior assert len(list(supplier.get_suppliable_products(shop, customer=customer))) == 1 product = shop_product.product product.stock_behavior = StockBehavior.STOCKED product.save() # Make sure supplier now omits unorderable product assert not list(supplier.get_suppliable_products(shop, customer=customer))
def test_get_suppliable_products(): customer = create_random_person() shop_product = get_default_shop_product() shop = get_default_shop() supplier = get_default_supplier() # Check for default orderable shop product with unstocked behavior assert len(list(supplier.get_suppliable_products(shop, customer=customer))) == 1 product = shop_product.product product.stock_behavior = StockBehavior.STOCKED product.save() # Make sure supplier now omits unorderable product assert not list(supplier.get_suppliable_products(shop, customer=customer))
def test_product_minimum_order_quantity(admin_user): shop_product = get_default_shop_product() supplier = get_default_supplier() admin_contact = get_person_contact(admin_user) with modify(shop_product, visibility_limit=ProductVisibility.VISIBLE_TO_ALL, orderable=True, minimum_purchase_quantity=10): assert any(ve.code == "purchase_quantity_not_met" for ve in shop_product.get_orderability_errors( supplier=supplier, customer=admin_contact, quantity=1)) assert not any( ve.code == "purchase_quantity_not_met" for ve in shop_product.get_orderability_errors( supplier=supplier, customer=admin_contact, quantity=15))
def test_product_query(admin_user, regular_user): anon_contact = AnonymousContact() shop_product = get_default_shop_product() shop = shop_product.shop product = shop_product.product regular_contact = get_person_contact(regular_user) admin_contact = get_person_contact(admin_user) with modify(shop_product, save=True, listed=True, visible=True, visibility_limit=ProductVisibility.VISIBLE_TO_ALL): assert Product.objects.list_visible( shop=shop, customer=anon_contact).filter(pk=product.pk).exists() with modify(shop_product, save=True, listed=False, visible=True, visibility_limit=ProductVisibility.VISIBLE_TO_ALL): assert not Product.objects.list_visible( shop=shop, customer=anon_contact).filter(pk=product.pk).exists() assert not Product.objects.list_visible( shop=shop, customer=regular_contact).filter(pk=product.pk).exists() assert Product.objects.list_visible( shop=shop, customer=admin_contact).filter(pk=product.pk).exists() with modify(shop_product, save=True, listed=True, visible=True, visibility_limit=ProductVisibility.VISIBLE_TO_LOGGED_IN): assert not Product.objects.list_visible( shop=shop, customer=anon_contact).filter(pk=product.pk).exists() assert Product.objects.list_visible( shop=shop, customer=regular_contact).filter(pk=product.pk).exists() product.soft_delete() assert not Product.objects.all_except_deleted().filter( pk=product.pk).exists()
def test_product_order_multiple(admin_user): shop_product = get_default_shop_product() supplier = get_default_supplier() admin_contact = get_person_contact(admin_user) with modify(shop_product, visibility_limit=ProductVisibility.VISIBLE_TO_ALL, orderable=True, purchase_multiple=7): assert any(ve.code == "invalid_purchase_multiple" for ve in shop_product.get_orderability_errors( supplier=supplier, customer=admin_contact, quantity=4)) assert any(ve.code == "invalid_purchase_multiple" for ve in shop_product.get_orderability_errors( supplier=supplier, customer=admin_contact, quantity=25)) assert not any( ve.code == "invalid_purchase_multiple" for ve in shop_product.get_orderability_errors( supplier=supplier, customer=admin_contact, quantity=49))
def test_product_visibility(rf, admin_user, regular_user): anon_contact = get_person_contact(AnonymousUser()) shop_product = get_default_shop_product() admin_contact = get_person_contact(admin_user) regular_contact = get_person_contact(regular_user) with modify(shop_product.product, deleted=True): # NB: assigning to `product` here works because `get_shop_instance` populates `_product_cache` assert error_exists(shop_product.get_visibility_errors(customer=anon_contact), "product_deleted") assert error_exists(shop_product.get_visibility_errors(customer=admin_contact), "product_deleted") with pytest.raises(ProductNotVisibleProblem): shop_product.raise_if_not_visible(anon_contact) assert not shop_product.is_list_visible() with modify(shop_product, visibility_limit=ProductVisibility.VISIBLE_TO_ALL, visible=False): assert error_exists(shop_product.get_visibility_errors(customer=anon_contact), "product_not_visible") assert error_does_not_exist(shop_product.get_visibility_errors(customer=admin_contact), "product_not_visible") assert not shop_product.is_list_visible() with modify(shop_product, visibility_limit=ProductVisibility.VISIBLE_TO_LOGGED_IN, visible=True): assert error_exists(shop_product.get_visibility_errors(customer=anon_contact), "product_not_visible_to_anonymous") assert error_does_not_exist(shop_product.get_visibility_errors(customer=admin_contact), "product_not_visible_to_anonymous") customer_group = get_default_customer_group() grouped_user = get_user_model().objects.create_user(username=printable_gibberish(20)) grouped_contact = get_person_contact(grouped_user) with modify(shop_product, visibility_limit=ProductVisibility.VISIBLE_TO_GROUPS, visible=True): shop_product.visibility_groups.add(customer_group) customer_group.members.add(grouped_contact) customer_group.members.remove(get_person_contact(regular_user)) assert error_does_not_exist(shop_product.get_visibility_errors(customer=grouped_contact), "product_not_visible_to_group") assert error_does_not_exist(shop_product.get_visibility_errors(customer=admin_contact), "product_not_visible_to_group") assert error_exists(shop_product.get_visibility_errors(customer=regular_contact), "product_not_visible_to_group") with modify(shop_product, listed=False): assert not shop_product.is_list_visible() with modify(shop_product, listed=True): assert shop_product.is_list_visible()
def test_product_orderability(): anon_contact = AnonymousContact() shop_product = get_default_shop_product() supplier = get_default_supplier() with modify(shop_product, visibility_limit=ProductVisibility.VISIBLE_TO_ALL, orderable=True): shop_product.raise_if_not_orderable(supplier=supplier, customer=anon_contact, quantity=1) assert shop_product.is_orderable(supplier=supplier, customer=anon_contact, quantity=1) with modify(shop_product, visibility_limit=ProductVisibility.VISIBLE_TO_LOGGED_IN, orderable=True): with pytest.raises(ProductNotOrderableProblem): shop_product.raise_if_not_orderable(supplier=supplier, customer=anon_contact, quantity=1) assert not shop_product.is_orderable( supplier=supplier, customer=anon_contact, quantity=1)
def test_product_visibility(rf, admin_user, regular_user): anon_contact = get_person_contact(AnonymousUser()) shop_product = get_default_shop_product() admin_contact = get_person_contact(admin_user) regular_contact = get_person_contact(regular_user) with modify( shop_product.product, deleted=True ): # NB: assigning to `product` here works because `get_shop_instance` populates `_product_cache` assert error_exists( shop_product.get_visibility_errors(customer=anon_contact), "product_deleted") assert error_exists( shop_product.get_visibility_errors(customer=admin_contact), "product_deleted") with pytest.raises(ProductNotVisibleProblem): shop_product.raise_if_not_visible(anon_contact) assert not shop_product.is_list_visible() with modify(shop_product, visibility_limit=ProductVisibility.VISIBLE_TO_ALL, visible=False): assert error_exists( shop_product.get_visibility_errors(customer=anon_contact), "product_not_visible") assert error_does_not_exist( shop_product.get_visibility_errors(customer=admin_contact), "product_not_visible") assert not shop_product.is_list_visible() with modify(shop_product, visibility_limit=ProductVisibility.VISIBLE_TO_LOGGED_IN, visible=True): assert error_exists( shop_product.get_visibility_errors(customer=anon_contact), "product_not_visible_to_anonymous") assert error_does_not_exist( shop_product.get_visibility_errors(customer=admin_contact), "product_not_visible_to_anonymous") customer_group = get_default_customer_group() grouped_user = get_user_model().objects.create_user( username=printable_gibberish(20)) grouped_contact = get_person_contact(grouped_user) with modify(shop_product, visibility_limit=ProductVisibility.VISIBLE_TO_GROUPS, visible=True): shop_product.visibility_groups.add(customer_group) customer_group.members.add(grouped_contact) customer_group.members.remove(get_person_contact(regular_user)) assert error_does_not_exist( shop_product.get_visibility_errors(customer=grouped_contact), "product_not_visible_to_group") assert error_does_not_exist( shop_product.get_visibility_errors(customer=admin_contact), "product_not_visible_to_group") assert error_exists( shop_product.get_visibility_errors(customer=regular_contact), "product_not_visible_to_group") with modify(shop_product, listed=False): assert not shop_product.is_list_visible() with modify(shop_product, listed=True): assert shop_product.is_list_visible()
def test_default_supplier(): supplier = get_default_supplier() shop_product = get_default_shop_product() product = shop_product.product assert supplier.get_stock_statuses([product.id])[product.id].logical_count == 0 assert not list(supplier.get_orderability_errors(shop_product, 1, customer=None))