def test_option_exist(self):
        """test if option sort exists"""

        # right
        serializer = OrderItemSerializer(
            data={
                'product':
                self.product2.pk,
                'choices': [{
                    'option_group_id': self.option_group1.sort,
                    'choosed_option_id': self.option1.sort
                }, {
                    'option_group_id': self.option_group2.sort,
                    'choosed_option_id': self.option3.sort
                }]
            })
        self.assertTrue(serializer.is_valid())

        # wrong option group sort
        serializer = OrderItemSerializer(
            data={
                'product':
                self.product2.pk,
                'choices': [
                    {
                        'option_group_id': self.option_group1.sort,
                        'choosed_option_id': 32
                    },  # wrong
                    {
                        'option_group_id': self.option_group2.sort,
                        'choosed_option_id': self.option3.sort
                    }
                ]
            })
        self.assertFalse(serializer.is_valid())
    def test_duplicate_choice(self):
        """test if there are any duplicate choices"""

        # right
        serializer = OrderItemSerializer(
            data={
                'product':
                self.product2.pk,
                'choices': [{
                    'option_group_id': self.option_group1.sort,
                    'choosed_option_id': self.option1.sort
                }, {
                    'option_group_id': self.option_group2.sort,
                    'choosed_option_id': self.option3.sort
                }]
            })
        self.assertTrue(serializer.is_valid())

        # wrong -- duplicate choices
        serializer = OrderItemSerializer(
            data={
                'product':
                self.product2.pk,
                'choices': [{
                    'option_group_id': self.option_group1.sort,
                    'choosed_option_id': self.option1.sort
                }, {
                    'option_group_id': self.option_group1.sort,
                    'choosed_option_id': self.option1.sort
                }]
            })
        self.assertFalse(serializer.is_valid())
    def test_addon_exist(self):
        """test for addons sort exist"""

        # right
        serializer = OrderItemSerializer(
            data={
                'product':
                self.product2.pk,
                'add_ons_sorts': [self.addon1.sort, self.addon2.sort],
                'choices': [{
                    'option_group_id': self.option_group1.sort,
                    'choosed_option_id': self.option1.sort
                }, {
                    'option_group_id': self.option_group2.sort,
                    'choosed_option_id': self.option3.sort
                }]
            })
        self.assertTrue(serializer.is_valid())

        # wrong addons sorts
        serializer = OrderItemSerializer(
            data={
                'product':
                self.product2.pk,
                'add_ons_sorts': [123, 898],
                'choices': [{
                    'option_group_id': self.option_group1.sort,
                    'choosed_option_id': self.option1.sort
                }, {
                    'option_group_id': self.option_group2.sort,
                    'choosed_option_id': self.option3.sort
                }]
            })
        self.assertFalse(serializer.is_valid())
    def test_product_exists(self):
        """test if product really exists"""

        # right
        serializer = OrderItemSerializer(data={'product': self.product.pk})
        self.assertTrue(serializer.is_valid())

        # non existing pk for a product
        serializer = OrderItemSerializer(data={'product': 12345})
        self.assertFalse(serializer.is_valid())
    def test_product_available(self):
        """test if a product is marked as not available"""

        # change it temporally
        self.product.is_available = False
        self.product.save()

        # wrong because it is not available
        serializer = OrderItemSerializer(data={'product': self.product.pk})
        self.assertFalse(serializer.is_valid())

        # revert it back
        self.product.is_available = True
        self.product.save()

        # wrong because it is not available
        serializer = OrderItemSerializer(data={'product': self.product.pk})
        self.assertTrue(serializer.is_valid())
    def test_rely_choosed(self):
        """test if a rely_on choosed or not"""

        # add rely on for test option group2
        RelyOn.objects.create(option_group=self.option_group2,
                              choosed_option_group=self.option_group1,
                              option=self.option1)

        # right and rely_on requirement for option_group2 is fulfilled
        serializer = OrderItemSerializer(
            data={
                'product':
                self.product2.pk,
                'choices': [{
                    'option_group_id': self.option_group1.sort,
                    'choosed_option_id': self.option1.sort
                }, {
                    'option_group_id': self.option_group2.sort,
                    'choosed_option_id': self.option3.sort
                }]
            })
        self.assertTrue(serializer.is_valid())

        # wrong because rely_on requirement {option_group2: option1} is not fulfilled
        serializer = OrderItemSerializer(
            data={
                'product':
                self.product2.pk,
                'choices': [
                    {
                        'option_group_id': self.option_group1.sort,
                        'choosed_option_id': self.option2.sort
                    },  # not 1
                    {
                        'option_group_id': self.option_group2.sort,
                        'choosed_option_id': self.option3.sort
                    }
                ]
            })
        self.assertFalse(serializer.is_valid())
    def test_missing_choice_for_option_group(self):
        """test if any choices missing for an option
        group in the product"""

        # right and all choices are choosed
        serializer = OrderItemSerializer(
            data={
                'product':
                self.product2.pk,
                'choices': [{
                    'option_group_id': self.option_group1.sort,
                    'choosed_option_id': self.option1.sort
                }, {
                    'option_group_id': self.option_group2.sort,
                    'choosed_option_id': self.option3.sort
                }]
            })
        self.assertTrue(serializer.is_valid())

        # missing a choice (option group2 not choosed)
        serializer = OrderItemSerializer(
            data={
                'product':
                self.product2.pk,
                'choices': [{
                    'option_group_id': self.option_group1.sort,
                    'choosed_option_id': self.option1.sort
                }]
            })
        self.assertFalse(serializer.is_valid())

        # add rely on for test option group2
        RelyOn.objects.create(option_group=self.option_group2,
                              choosed_option_group=self.option_group1,
                              option=self.option1)

        # wrong because it is not choosed and has a rely on {option_group1: option1}
        # which is choosed, which makes it required
        serializer = OrderItemSerializer(
            data={
                'product':
                self.product2.pk,
                'choices': [{
                    'option_group_id': self.option_group1.sort,
                    'choosed_option_id': self.option1.sort
                }]
            })
        self.assertFalse(serializer.is_valid())

        # right
        # missing a choice but as option group2 relys on choosing {option_group1: option1}
        # which is no choosed, which is makes it unable to be choosed,
        # no error is thrown
        serializer = OrderItemSerializer(
            data={
                'product':
                self.product2.pk,
                'choices': [{
                    'option_group_id': self.option_group1.sort,
                    'choosed_option_id': self.option2.sort
                }]
            })
        self.assertTrue(serializer.is_valid())