def test_best_selling_products_with_multiple_orders(): context = get_jinja_context() supplier = get_default_supplier() shop = get_default_shop() n_products = 2 price = 10 product_1 = create_product("test-sku-1", supplier=supplier, shop=shop) product_2 = create_product("test-sku-2", supplier=supplier, shop=shop) create_order_with_product(product_1, supplier, quantity=1, taxless_base_unit_price=price, shop=shop) create_order_with_product(product_2, supplier, quantity=1, taxless_base_unit_price=price, shop=shop) cache.clear() # Two initial products sold assert product_1 in general.get_best_selling_products(context, n_products=n_products) assert product_2 in general.get_best_selling_products(context, n_products=n_products) product_3 = create_product("test-sku-3", supplier=supplier, shop=shop) create_order_with_product(product_3, supplier, quantity=2, taxless_base_unit_price=price, shop=shop) cache.clear() # Third product sold in greater quantity assert product_3 in general.get_best_selling_products(context, n_products=n_products) create_order_with_product(product_1, supplier, quantity=4, taxless_base_unit_price=price, shop=shop) create_order_with_product(product_2, supplier, quantity=4, taxless_base_unit_price=price, shop=shop) cache.clear() # Third product outsold by first two products assert product_3 not in general.get_best_selling_products(context, n_products=n_products)
def test_get_best_selling_products(): context = get_jinja_context() cache.clear() # No products sold assert len(list(general.get_best_selling_products(context, n_products=2))) == 0 supplier = get_default_supplier() shop = get_default_shop() product = get_default_product() create_order_with_product(product, supplier, quantity=1, taxless_base_unit_price=10, shop=shop) cache.clear() # One product sold assert len(list(general.get_best_selling_products(context, n_products=2))) == 1
def test_best_selling_products_with_multiple_orders(): context = get_jinja_context() supplier = get_default_supplier() shop = get_default_shop() n_products = 2 price = 10 product_1 = create_product("test-sku-1", supplier=supplier, shop=shop) product_2 = create_product("test-sku-2", supplier=supplier, shop=shop) create_order_with_product(product_1, supplier, quantity=1, taxless_base_unit_price=price, shop=shop) create_order_with_product(product_2, supplier, quantity=1, taxless_base_unit_price=price, shop=shop) cache.clear() # Two initial products sold assert product_1 in general.get_best_selling_products( context, n_products=n_products) assert product_2 in general.get_best_selling_products( context, n_products=n_products) product_3 = create_product("test-sku-3", supplier=supplier, shop=shop) create_order_with_product(product_3, supplier, quantity=2, taxless_base_unit_price=price, shop=shop) cache.clear() # Third product sold in greater quantity assert product_3 in general.get_best_selling_products( context, n_products=n_products) create_order_with_product(product_1, supplier, quantity=4, taxless_base_unit_price=price, shop=shop) create_order_with_product(product_2, supplier, quantity=4, taxless_base_unit_price=price, shop=shop) cache.clear() # Third product outsold by first two products assert product_3 not in general.get_best_selling_products( context, n_products=n_products)
def test_tracking_codes(): product = get_default_product() supplier = get_default_supplier() order = create_order_with_product( product, supplier=supplier, quantity=1, taxless_base_unit_price=10, tax_rate=decimal.Decimal("0.5") ) _add_product_to_order(order, "duck-tape-1", 3, order.shop, supplier) _add_product_to_order(order, "water-1", 2, order.shop, supplier) order.cache_prices() order.check_all_verified() order.save() # Create shipment with tracking code for every product line. product_lines = order.lines.exclude(product_id=None) assert len(product_lines) == 3 for line in product_lines: shipment = order.create_shipment(supplier, {line.product: line.quantity}) if line.quantity != 3: shipment.tracking_code = "123FI" shipment.save() tracking_codes = order.get_tracking_codes() code_count = (len(product_lines)-1) # We skipped that one assert len(tracking_codes) == code_count assert len([tracking_code for tracking_code in tracking_codes if tracking_code == "123FI"]) == code_count
def test_tracking_codes(): product = get_default_product() supplier = get_default_supplier() order = create_order_with_product(product, supplier=supplier, quantity=1, taxless_base_unit_price=10, tax_rate=decimal.Decimal("0.5")) _add_product_to_order(order, "duck-tape-1", 3, order.shop, supplier) _add_product_to_order(order, "water-1", 2, order.shop, supplier) order.cache_prices() order.check_all_verified() order.save() # Create shipment with tracking code for every product line. product_lines = order.lines.exclude(product_id=None) assert len(product_lines) == 3 for line in product_lines: shipment = order.create_shipment(supplier, {line.product: line.quantity}) if line.quantity != 3: shipment.tracking_code = "123FI" shipment.save() tracking_codes = order.get_tracking_codes() code_count = (len(product_lines) - 1) # We skipped that one assert len(tracking_codes) == code_count assert len([ tracking_code for tracking_code in tracking_codes if tracking_code == "123FI" ]) == code_count
def test_reservation_is_created_with_correct_data(self): order = create_order_with_product(self.reservable.product, Supplier.objects.first(), 3, Decimal("100"), shop=self.shop) order_line = order.lines.first() order_line.source_line = { "reservation_start": datetime.date(2016, 1, 1), "persons": 3, } self.roc.process_saved_order_line(order_line.order, order_line) order_line.refresh_from_db() reservation = Reservation.objects.first() self.assertEqual(reservation.reservable, self.reservable) self.assertEqual(reservation.order_line, order_line) start_time = make_aware( datetime.datetime.combine(datetime.date(2016, 1, 1), self.reservable.check_in_time)) self.assertEqual(reservation.start_time, start_time) end_time = make_aware( datetime.datetime.combine(datetime.date(2016, 1, 4), self.reservable.check_out_time)) self.assertEqual(reservation.end_time, end_time) self.assertEqual(reservation.persons, 3) self.assertEqual(order_line.extra_data["reservation_end"], "2016-01-04")
def test_extending_shipment_form_valid_hook(rf, admin_user): shop = get_default_shop() supplier = get_default_supplier() product = create_product(sku="test-sku", shop=shop, supplier=supplier, default_price=3.33) quantity = 1 order = create_order_with_product(product, supplier, quantity=quantity, taxless_base_unit_price=1, shop=shop) extend_form_class = "shoop_tests.admin.test_shipment_creator.ShipmentFormModifierTest" with override_provides(FORM_MODIFIER_PROVIDER_KEY, [extend_form_class]): phone_number = "+358911" data = {"q_%s" % product.pk: 1, "supplier": supplier.pk, "phone": phone_number} request = apply_request_middleware(rf.post("/", data=data), user=admin_user) view = OrderCreateShipmentView.as_view() response = view(request, pk=order.pk) assert response.status_code == 302 # Order should now have shipment, but let's re fetch it first order = Order.objects.get(pk=order.pk) assert order.shipments.count() == 1 shipment = order.shipments.first() assert order.shipping_data.get(shipment.identifier).get("phone") == phone_number assert shipment.supplier_id == supplier.id assert shipment.products.count() == 1 assert shipment.products.first().product_id == product.id
def test_custom_payment_processor_cash_service(choice_identifier, expected_payment_status): shop = get_default_shop() product = get_default_product() supplier = get_default_supplier() processor = CustomPaymentProcessor.objects.create() payment_method = PaymentMethod.objects.create( shop=shop, payment_processor=processor, choice_identifier=choice_identifier, tax_class=get_default_tax_class()) order = create_order_with_product( product=product, supplier=supplier, quantity=1, taxless_base_unit_price=Decimal('5.55'), shop=shop) order.taxful_total_price = TaxfulPrice(Decimal('5.55'), u'EUR') order.payment_method = payment_method order.save() assert order.payment_status == PaymentStatus.NOT_PAID processor.process_payment_return_request(choice_identifier, order, None) assert order.payment_status == expected_payment_status processor.process_payment_return_request(choice_identifier, order, None) assert order.payment_status == expected_payment_status
def create_fully_paid_order(shop, customer, supplier, product_sku, price_value): product = create_product(product_sku, shop=shop, supplier=supplier, default_price=price_value) order = create_order_with_product( product=product, supplier=supplier, quantity=1, taxless_base_unit_price=price_value, shop=get_default_shop()) order.customer = customer order.save() order.cache_prices() return order.create_payment(order.taxful_total_price)
def _create_order_for_stripe(): product = get_default_product() supplier = get_default_supplier() order = create_order_with_product(product, supplier=supplier, quantity=1, taxless_unit_price=100, tax_rate=0) order.cache_prices() assert order.taxless_total_price > 0 if not order.payment_data: order.payment_data = {} order.save() return order
def test_orderlinetax_tax_removal(): #todo fix product = get_product() tax_rate = 1 order = create_order_with_product( product=product, supplier=get_default_supplier(), quantity=1, taxless_base_unit_price=10, tax_rate=tax_rate, shop=get_default_shop()) tax = get_test_tax(tax_rate) with pytest.raises(ProtectedError): tax.delete()
def test_order_verification(): product = get_default_product() supplier = get_default_supplier() order = create_order_with_product(product, supplier=supplier, quantity=3, n_lines=10, taxless_base_unit_price=10) order.require_verification = True order.save() assert not order.check_all_verified(), "Nothing is verified by default" order.lines.filter(pk=order.lines.filter(verified=False).first().pk).update(verified=True) assert not order.check_all_verified(), "All is not verified even if something is" order.lines.all().update(verified=True) assert order.check_all_verified(), "All is now verified" assert not order.require_verification, "Verification complete"
def test_toolbar_button(rf, admin_user): shop = get_default_shop() supplier = get_default_supplier() product = create_product("simple-test-product", shop) order = create_order_with_product(product, supplier, 6, 6, shop=shop) view = load("shoop.admin.modules.orders.views.OrderDetailView").as_view() request = apply_request_middleware(rf.get("/"), user=admin_user) response = view(request, pk=order.pk) expected_button_class = "SimplePrintoutsToolbarButton" toolbar = response.context_data.get("toolbar") assert any(button.__class__.__name__ == expected_button_class for button in toolbar) assert response.status_code == 200
def test_orderlinetax_tax_removal(): #todo fix product = get_product() tax_rate = 1 order = create_order_with_product(product=product, supplier=get_default_supplier(), quantity=1, taxless_base_unit_price=10, tax_rate=tax_rate, shop=get_default_shop()) tax = get_test_tax(tax_rate) with pytest.raises(ProtectedError): tax.delete()
def test_basic_order(): PRODUCTS_TO_SEND = 10 product = get_default_product() supplier = get_default_supplier() order = create_order_with_product(product, supplier=supplier, quantity=PRODUCTS_TO_SEND, taxless_base_unit_price=10, tax_rate=Decimal("0.5")) assert order.shop.prices_include_tax is False price = order.shop.create_price currency = order.currency discount_order_line = OrderLine(order=order, quantity=1, type=OrderLineType.OTHER) discount_order_line.discount_amount = price(30) assert discount_order_line.price == price(-30) discount_order_line.save() order.cache_prices() order.check_all_verified() order.save() assert order.taxful_total_price == TaxfulPrice( PRODUCTS_TO_SEND * (10 + 5) - 30, currency) shipment = order.create_shipment_of_all_products(supplier=supplier) assert shipment.total_products == PRODUCTS_TO_SEND, "All products were shipped" assert shipment.weight == product.net_weight * PRODUCTS_TO_SEND, "Gravity works" assert not order.get_unshipped_products( ), "Nothing was left in the warehouse" order.shipping_status = ShippingStatus.FULLY_SHIPPED order.create_payment(order.taxful_total_price) assert order.payments.exists(), "A payment was created" with pytest.raises(NoPaymentToCreateException): order.create_payment(Money(6, currency)) assert order.is_paid(), "Order got paid" assert order.can_set_complete(), "Finalization is possible" order.status = OrderStatus.objects.get_default_complete() assert order.is_complete(), "Finalization done" summary = order.get_tax_summary() assert len(summary) == 2 assert summary[0].tax_id is None assert summary[0].tax_code == '' assert summary[0].tax_amount == Money(0, currency) assert summary[0].tax_rate == 0 assert summary[1].tax_rate * 100 == 50 assert summary[1].based_on == Money(100, currency) assert summary[1].tax_amount == Money(50, currency) assert summary[1].taxful == summary[1].based_on + summary[1].tax_amount
def create_order(): shop = get_default_shop() product = get_default_product() supplier = get_default_supplier() order = create_order_with_product( product, shop=shop, supplier=supplier, quantity=1, taxless_base_unit_price=10, ) order.cache_prices() order.save() return order
def test_basic_order(): PRODUCTS_TO_SEND = 10 product = get_default_product() supplier = get_default_supplier() order = create_order_with_product( product, supplier=supplier, quantity=PRODUCTS_TO_SEND, taxless_base_unit_price=10, tax_rate=Decimal("0.5") ) assert order.shop.prices_include_tax is False price = order.shop.create_price currency = order.currency discount_order_line = OrderLine(order=order, quantity=1, type=OrderLineType.OTHER) discount_order_line.discount_amount = price(30) assert discount_order_line.total_price == price(-30) discount_order_line.save() order.cache_prices() order.check_all_verified() order.save() assert order.taxful_total_price == TaxfulPrice(PRODUCTS_TO_SEND * (10 + 5) - 30, currency) shipment = order.create_shipment_of_all_products(supplier=supplier) assert shipment.total_products == PRODUCTS_TO_SEND, "All products were shipped" assert shipment.weight == product.net_weight * PRODUCTS_TO_SEND, "Gravity works" assert not order.get_unshipped_products(), "Nothing was left in the warehouse" order.shipping_status = ShippingStatus.FULLY_SHIPPED order.create_payment(order.taxful_total_price) assert order.payments.exists(), "A payment was created" with pytest.raises(NoPaymentToCreateException): order.create_payment(Money(6, currency)) assert order.is_paid(), "Order got paid" assert order.can_set_complete(), "Finalization is possible" order.status = OrderStatus.objects.get_default_complete() assert order.is_complete(), "Finalization done" summary = order.get_tax_summary() assert len(summary) == 2 assert summary[0].tax_id is None assert summary[0].tax_code == '' assert summary[0].tax_amount == Money(0, currency) assert summary[0].tax_rate == 0 assert summary[1].tax_rate * 100 == 50 assert summary[1].based_on == Money(100, currency) assert summary[1].tax_amount == Money(50, currency) assert summary[1].taxful == summary[1].based_on + summary[1].tax_amount
def test_shipment_creating_view_get(rf, admin_user): shop = get_default_shop() supplier = get_default_supplier() product = create_product(sku="test-sku", shop=shop, supplier=supplier, default_price=3.33) quantity = 1 order = create_order_with_product(product, supplier, quantity=quantity, taxless_base_unit_price=1, shop=shop) request = apply_request_middleware(rf.get("/"), user=admin_user) view = OrderCreateShipmentView.as_view() response = view(request, pk=order.pk).render() assert response.status_code == 200 # Should contain supplier input and input for product soup = BeautifulSoup(response.content) assert soup.find("input", {"id": "id_q_%s" % product.pk}) assert soup.find("select", {"id": "id_supplier"})
def test_printouts(rf): try: import weasyprint except ImportError: pytest.skip() shop = get_default_shop() supplier = get_default_supplier() product = create_product("simple-test-product", shop) order = create_order_with_product(product, supplier, 6, 6, shop=shop) shipment = order.create_shipment_of_all_products(supplier) request = rf.get("/") response = get_delivery_pdf(request, shipment.id) assert response.status_code == 200 response = get_confirmation_pdf(request, order.id) assert response.status_code == 200
def test_extending_shipment_clean_hook(rf, admin_user): shop = get_default_shop() supplier = get_default_supplier() product = create_product(sku="test-sku", shop=shop, supplier=supplier, default_price=3.33) quantity = 1 order = create_order_with_product(product, supplier, quantity=quantity, taxless_base_unit_price=1, shop=shop) extend_form_class = "shoop_tests.admin.test_shipment_creator.ShipmentFormModifierTest" with override_provides(FORM_MODIFIER_PROVIDER_KEY, [extend_form_class]): data = {"q_%s" % product.pk: 1, "supplier": supplier.pk, "phone": "911"} request = apply_request_middleware(rf.post("/", data=data), user=admin_user) view = OrderCreateShipmentView.as_view() response = view(request, pk=order.pk).render() assert response.status_code == 200 soup = BeautifulSoup(response.content) assert soup.body.findAll(text=re.compile("Phone number should start with country code!"))
def test_shipment_creating_view_post(rf, admin_user): shop = get_default_shop() supplier = get_default_supplier() product = create_product(sku="test-sku", shop=shop, supplier=supplier, default_price=3.33) order = create_order_with_product(product, supplier, quantity=1, taxless_base_unit_price=1, shop=shop) data = {"q_%s" % product.pk: 1, "supplier": supplier.pk} request = apply_request_middleware(rf.post("/", data=data), user=admin_user) view = OrderCreateShipmentView.as_view() response = view(request, pk=order.pk) assert response.status_code == 302 # Order should have shipment assert order.shipments.count() == 1 shipment = order.shipments.first() assert shipment.supplier_id == supplier.id assert shipment.products.count() == 1 assert shipment.products.first().product_id == product.id
def test_extending_shipment_with_extra_fields(rf, admin_user): shop = get_default_shop() supplier = get_default_supplier() product = create_product(sku="test-sku", shop=shop, supplier=supplier, default_price=3.33) quantity = 1 order = create_order_with_product(product, supplier, quantity=quantity, taxless_base_unit_price=1, shop=shop) extend_form_class = "shoop_tests.admin.test_shipment_creator.ShipmentFormModifierTest" with override_provides(FORM_MODIFIER_PROVIDER_KEY, [extend_form_class]): request = apply_request_middleware(rf.get("/"), user=admin_user) view = OrderCreateShipmentView.as_view() response = view(request, pk=order.pk).render() assert response.status_code == 200 # Should contain supplier input, input for product and input for phone soup = BeautifulSoup(response.content) assert soup.find("input", {"id": "id_q_%s" % product.pk}) assert soup.find("select", {"id": "id_supplier"}) assert soup.find("input", {"id": "id_phone"})
def test_payments(admin_user, rf): shop = get_default_shop() supplier = get_default_supplier() product = create_product("test-sku", shop=get_default_shop(), default_price=10) order = create_order_with_product(product, supplier, 1, 200, shop=shop) order.cache_prices() assert order.get_total_paid_amount().value == 0 assert order.get_total_unpaid_amount().value == order.taxful_total_price.value assert order.payment_status == PaymentStatus.NOT_PAID partial_payment_amount = order.taxful_total_price / 2 remaining_amount = order.taxful_total_price - partial_payment_amount order.create_payment(partial_payment_amount) assert order.payment_status == PaymentStatus.PARTIALLY_PAID order.create_payment(remaining_amount) assert order.payment_status == PaymentStatus.FULLY_PAID
def test_product_relations_max_quantity(rf): shop = get_default_shop() supplier = get_default_supplier() product = create_product("simple-test-product", shop) quantities = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] for i, quantity in enumerate(quantities): order = create_order_with_product(product, supplier, quantity=1, taxless_base_unit_price=6, shop=shop) add_product_to_order( order, supplier, create_product("product-%s" % i, shop), quantity=quantity, taxless_base_unit_price=6 ) assert ProductCrossSell.objects.count() == 0 add_bought_with_relations_for_product(product.pk, max_quantity=5) assert ProductCrossSell.objects.count() == 5 # Test that ordering is ok assert not ProductCrossSell.objects.filter(weight=1).exists() assert ProductCrossSell.objects.filter(weight=11).exists()
def test_simple_supplier(rf): supplier = get_simple_supplier() product = create_product("simple-test-product") ss = supplier.get_stock_status(product.pk) assert ss.product == product assert ss.logical_count == 0 num = random.randint(100, 500) supplier.adjust_stock(product.pk, +num) assert supplier.get_stock_status(product.pk).logical_count == num # Create order ... order = create_order_with_product(product, supplier, 10, 3) quantities = order.get_product_ids_and_quantities() supplier.update_stocks(product_ids=quantities.keys()) pss = supplier.get_stock_status(product.pk) assert pss.logical_count == (num - quantities[product.pk]) assert pss.physical_count == num # Create shipment ... order.create_shipment_of_all_products(supplier) supplier.update_stocks(product_ids=quantities.keys()) pss = supplier.get_stock_status(product.pk) assert pss.physical_count == (num - quantities[product.pk])
def test_payments(admin_user, rf): shop = get_default_shop() supplier = get_default_supplier() product = create_product("test-sku", shop=get_default_shop(), default_price=10) order = create_order_with_product(product, supplier, 1, 200, shop=shop) order.cache_prices() assert order.get_total_paid_amount().value == 0 assert order.get_total_unpaid_amount().value == order.taxful_total_price.value assert order.payment_status == PaymentStatus.NOT_PAID assert order.can_edit() partial_payment_amount = order.taxful_total_price / 2 remaining_amount = order.taxful_total_price - partial_payment_amount order.create_payment(partial_payment_amount) assert order.payment_status == PaymentStatus.PARTIALLY_PAID assert not order.can_edit() order.create_payment(remaining_amount) assert order.payment_status == PaymentStatus.FULLY_PAID assert not order.can_edit()
def test_computing_simple_product_relations(rf): shop = get_default_shop() supplier = get_default_supplier() product = create_product("simple-test-product", shop) related_product = create_product("simple-related-product", shop) quantities = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] for quantity in quantities: order = create_order_with_product(product, supplier, quantity=1, taxless_base_unit_price=6, shop=shop) add_product_to_order(order, supplier, related_product, quantity=quantity, taxless_base_unit_price=6) assert ProductCrossSell.objects.count() == 0 add_bought_with_relations_for_product(product.pk) assert ProductCrossSell.objects.count() == 1 cross_sell_product = ProductCrossSell.objects.filter(product1=product).first() assert cross_sell_product.product2 == related_product assert cross_sell_product.weight == sum(quantities) add_bought_with_relations_for_product(related_product.id) assert ProductCrossSell.objects.count() == 2 cross_sell_product = ProductCrossSell.objects.filter(product1=related_product).first() assert cross_sell_product.product2 == product assert cross_sell_product.weight == len(quantities)