Exemplo n.º 1
0
    def post(self, request, pk=None, sector_slug=None):
        product = None

        org = request.user.org_set.first()
        sector = self.get_sector(sector_slug)
        if pk:
            product = Product.objects.get(pk=pk)

        form = self.form(request.POST, instance=product)
        tag_formset = formset_factory(form=TagForm)
        formset = tag_formset(request.POST)

        tags = []
        for tag_form in formset.forms:
            raw_tag = tag_form['predicate'].data
            if raw_tag:
                tag = Concept.objects.get(pk=raw_tag)
                tags.append(tag)
        if form.is_valid():
            d = form.cleaned_data
            d['org'] = org
            d['sector'] = sector
            if not product:
                product = Product(**d)
            product.save()
            for tag in tags:
                _tag, _created = Tag.objects.get_or_create(product=product,
                                                           concept=tag)
            response = redirect(product.get_absolute_url())
            return response
        return render(
            request, self.template_name, {
                'product': product,
                'form': form,
                'formset': formset,
                'forms_and_set': zip(formset.forms, tags),
                'base_url': 'https://unilexicon.com'
            })
Exemplo n.º 2
0
class ProductTest(TestCase):
    _product_name = u"product name"
    _product_description = u"product description"
    _product_slug = u"slug"
    _product_price = 1
    _user_password = u"password"
    _user_email = u"*****@*****.**"

    def setUp(self):
        self.client = Client()
        self.product = Product(
            name=self._product_name,
            slug=self._product_slug,
            price=self._product_price,
            description=self._product_description,
        )
        self.product.save()
        self.user = User.objects.create_user(self._user_email, self._user_email, self._user_password)

    def assert_message_contains(self, response, text, level=None):
        """
        Asserts that there is exactly one message containing the given text.
        """
        messages = response.context["messages"]
        matches = [m for m in messages if text in m.message]
        if len(matches) == 1:
            msg = matches[0]
            if level is not None and msg.level != level:
                self.fail("There was one matching message but with different" "level: %s != %s" % (msg.level, level))
            return
        elif len(matches) == 0:
            messages_str = ", ".join('"%s"' % m for m in messages)
            self.fail('No message contained text "%s", messages were: %s' % (text, messages_str))
        else:
            self.fail('Multiple messages contained text "%s": %s' % (text, ", ".join(('"%s"' % m) for m in matches)))

    def test_product_detail(self):
        """
        Test /products/<slug>/ page
        """
        response = self.client.get(self.product.get_absolute_url())
        self.assertEqual(response.status_code, 200)
        self.assertTemplateUsed(response, "product/product_detail.html")
        self.assertContains(response, self.product.name)
        self.assertContains(response, self.product.description)
        self.assertContains(response, self.product.price)
        return response

    def test_product_comment(self):
        url = reverse("comment")
        """
        Test product's comment creating
        """
        # Send request with empty text field
        response = self.client.post(url, {"product": self.product.id}, follow=True)
        self.assertEqual(response.status_code, 200)
        self.assert_message_contains(response, "This field is required.")

        # Send request with params
        response = self.client.post(url, {"product": self.product.id, "text": "test"}, follow=True)
        self.assertEqual(response.status_code, 200)
        self.assert_message_contains(response, CreateCommentView._success_message)

    def test_product_like(self):
        """
        Test product's liking
        """
        url = reverse("like-product", args=[self.product.slug])
        # Send request with unauthorised user
        response = self.client.get(url, follow=True)
        self.assertEqual(response.status_code, 404)

        self.client.login(username=self._user_email, password=self._user_password)

        # Like firstly succesfully
        response = self.client.get(url, follow=True)
        self.assertEqual(response.status_code, 200)
        self.assert_message_contains(response, ProductLikeView._success_message)

        # Like firstly succesfully with error
        response = self.client.get(url, follow=True)
        self.assertEqual(response.status_code, 200)
        self.assert_message_contains(response, ProductLikeView._error_message)