| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236 | import random
from django.contrib.messages.constants import SUCCESS, WARNING
from django.test import TestCase
from django.urls import reverse
from webtest.forms import Upload
from oscar.apps.dashboard.ranges import forms
from oscar.apps.offer.models import Range, RangeProductFileUpload
from oscar.test.factories import create_product
from oscar.test.testcases import WebTestCase
class RangeProductFormTests(TestCase):
    def setUp(self):
        self.range = Range.objects.create(name='dummy')
    def tearDown(self):
        Range.objects.all().delete()
    def submit_form(self, data):
        return forms.RangeProductForm(self.range, data)
    def test_either_query_or_file_must_be_submitted(self):
        form = self.submit_form({'query': ''})
        self.assertFalse(form.is_valid())
    def test_non_match_becomes_error(self):
        form = self.submit_form({'query': '123123'})
        self.assertFalse(form.is_valid())
    def test_matching_query_is_valid(self):
        create_product(partner_sku='123123')
        form = self.submit_form({'query': '123123'})
        self.assertTrue(form.is_valid())
    def test_passing_form_return_product_list(self):
        product = create_product(partner_sku='123123')
        form = self.submit_form({'query': '123123'})
        form.is_valid()
        self.assertEqual(1, len(form.get_products()))
        self.assertEqual(product.id, form.get_products()[0].id)
    def test_missing_skus_are_available(self):
        create_product(partner_sku='123123')
        form = self.submit_form({'query': '123123, 123xxx'})
        form.is_valid()
        self.assertEqual(1, len(form.get_missing_skus()))
        self.assertTrue('123xxx' in form.get_missing_skus())
    def test_only_dupes_is_invalid(self):
        product = create_product(partner_sku='123123')
        self.range.add_product(product)
        form = self.submit_form({'query': '123123'})
        self.assertFalse(form.is_valid())
    def test_dupe_skus_are_available(self):
        product = create_product(partner_sku='123123')
        create_product(partner_sku='123124')
        self.range.add_product(product)
        form = self.submit_form({'query': '123123, 123124'})
        self.assertTrue(form.is_valid())
        self.assertTrue('123123' in form.get_duplicate_skus())
class RangeProductViewTest(WebTestCase):
    is_staff = True
    def setUp(self):
        super().setUp()
        self.range = Range.objects.create(name='dummy')
        self.url = reverse('dashboard:range-products', args=(self.range.id,))
        self.product1 = create_product(
            title='Product 1', partner_sku='123123', partner_name='Partner 1'
        )
        self.product2 = create_product(
            title='Product 2', partner_sku='123123', partner_name='Partner 2'
        )
        self.product3 = create_product(partner_sku='456')
        self.product4 = create_product(partner_sku='789')
        self.parent = create_product(upc="1234", structure="parent")
        self.child1 = create_product(upc="1234.345", structure="child", parent=self.parent)
        self.child2 = create_product(upc="1234-345", structure="child", parent=self.parent)
    def test_upload_file_with_skus(self):
        range_products_page = self.get(self.url)
        form = range_products_page.form
        form['file_upload'] = Upload('new_skus.txt', b'456')
        form.submit().follow()
        all_products = self.range.all_products()
        self.assertEqual(len(all_products), 1)
        self.assertTrue(self.product3 in all_products)
        range_product_file_upload = RangeProductFileUpload.objects.get()
        self.assertEqual(range_product_file_upload.range, self.range)
        self.assertEqual(range_product_file_upload.num_new_skus, 1)
        self.assertEqual(range_product_file_upload.status, RangeProductFileUpload.PROCESSED)
        self.assertEqual(range_product_file_upload.size, 3)
    def test_dupe_skus_warning(self):
        self.range.add_product(self.product3)
        range_products_page = self.get(self.url)
        form = range_products_page.forms[0]
        form['query'] = '456'
        response = form.submit()
        self.assertEqual(list(response.context['messages']), [])
        self.assertEqual(
            response.context['form'].errors['query'],
            ['The products with SKUs or UPCs matching 456 are already in this range']
        )
        form = response.forms[0]
        form['query'] = '456, 789'
        response = form.submit().follow()
        messages = list(response.context['messages'])
        self.assertEqual(len(messages), 2)
        self.assertEqual(messages[0].level, SUCCESS)
        self.assertEqual(messages[0].message, '1 product added to range')
        self.assertEqual(messages[1].level, WARNING)
        self.assertEqual(
            messages[1].message,
            'The products with SKUs or UPCs matching 456 are already in this range'
        )
    def test_missing_skus_warning(self):
        range_products_page = self.get(self.url)
        form = range_products_page.form
        form['query'] = '321'
        response = form.submit()
        self.assertEqual(list(response.context['messages']), [])
        self.assertEqual(
            response.context['form'].errors['query'],
            ['No products exist with a SKU or UPC matching 321']
        )
        form = range_products_page.form
        form['query'] = '456, 321'
        response = form.submit().follow()
        messages = list(response.context['messages'])
        self.assertEqual(len(messages), 2)
        self.assertEqual(messages[0].level, SUCCESS)
        self.assertEqual(messages[0].message, '1 product added to range')
        self.assertEqual(messages[1].level, WARNING)
        self.assertEqual(
            messages[1].message, 'No product(s) were found with SKU or UPC matching 321'
        )
    def test_same_skus_within_different_products_warning_query(self):
        range_products_page = self.get(self.url)
        form = range_products_page.form
        form['query'] = '123123'
        response = form.submit().follow()
        messages = list(response.context['messages'])
        self.assertEqual(len(messages), 2)
        self.assertEqual(messages[1].level, WARNING)
        self.assertEqual(
            messages[1].message, 'There are more than one product with SKU 123123'
        )
    def test_same_skus_within_different_products_warning_file_upload(self):
        range_products_page = self.get(self.url)
        form = range_products_page.form
        form['file_upload'] = Upload('skus.txt', b'123123')
        response = form.submit().follow()
        messages = list(response.context['messages'])
        self.assertEqual(len(messages), 2)
        self.assertEqual(messages[1].level, WARNING)
        self.assertEqual(
            messages[1].message, 'There are more than one product with SKU 123123'
        )
    def test_adding_child_does_not_add_parent(self):
        range_products_page = self.get(self.url)
        form = range_products_page.forms[0]
        form['query'] = '1234.345'
        form.submit().follow()
        all_products = self.range.all_products()
        self.assertEqual(len(all_products), 1)
        self.assertFalse(self.range.contains_product(self.parent))
        self.assertTrue(self.range.contains_product(self.child1))
        self.assertFalse(self.range.contains_product(self.child2))
        form = range_products_page.forms[0]
        form['query'] = '1234-345'
        form.submit().follow()
        all_products = self.range.all_products()
        self.assertEqual(len(all_products), 1)
        self.assertTrue(self.range.contains_product(self.child1))
        self.assertTrue(self.range.contains_product(self.child2))
        self.assertFalse(self.range.contains_product(self.parent))
    def test_adding_multiple_children_does_not_add_parent(self):
        range_products_page = self.get(self.url)
        form = range_products_page.forms[0]
        form['query'] = '1234.345 1234-345'
        form.submit().follow()
        all_products = self.range.all_products()
        self.assertEqual(len(all_products), 2)
        self.assertTrue(self.range.contains_product(self.child1))
        self.assertTrue(self.range.contains_product(self.child2))
        self.assertFalse(self.range.contains_product(self.parent))
    def test_adding_multiple_comma_separated_children_does_not_add_parent(self):
        range_products_page = self.get(self.url)
        form = range_products_page.forms[0]
        form['query'] = '1234.345, 1234-345'
        form.submit().follow()
        all_products = self.range.all_products()
        self.assertEqual(len(all_products), 2)
        self.assertTrue(self.range.contains_product(self.child1))
        self.assertTrue(self.range.contains_product(self.child2))
        self.assertFalse(self.range.contains_product(self.parent))
class RangeReorderViewTest(WebTestCase):
    is_staff = True
    csrf_checks = False
    def setUp(self):
        super().setUp()
        self.range = Range.objects.create(name='dummy')
        self.url = reverse('dashboard:range-reorder', args=(self.range.id,))
        self.product1 = create_product()
        self.product2 = create_product()
        self.product3 = create_product()
        self.range.included_products.set([
            self.product1, self.product2, self.product3])
    def test_range_product_reordering(self):
        product_order = list(self.range.rangeproduct_set.values_list(
            'product_id', flat=True))
        random.shuffle(product_order)
        data = {'product': product_order}
        self.post(self.url, params=data)
        new_product_order = list(self.range.rangeproduct_set.values_list(
            'product_id', flat=True).order_by('display_order'))
        self.assertEqual(new_product_order, product_order)
 |