|
|
@@ -1,5 +1,6 @@
|
|
1
|
1
|
from random import randint
|
|
2
|
2
|
from sys import maxint
|
|
|
3
|
+
|
|
3
|
4
|
from django.test import TestCase, Client
|
|
4
|
5
|
from django.core.exceptions import ValidationError
|
|
5
|
6
|
from django.contrib.auth.models import User, AnonymousUser
|
|
|
@@ -7,8 +8,8 @@ from django.db import IntegrityError
|
|
7
|
8
|
from django.core.urlresolvers import reverse
|
|
8
|
9
|
from django.utils import unittest
|
|
9
|
10
|
|
|
10
|
|
-from oscar.apps.product.models import Item, ItemClass
|
|
11
|
|
-from oscar.apps.reviews.models import ProductReview, Vote
|
|
|
11
|
+from oscar.apps.product.reviews.models import ProductReview, Vote
|
|
|
12
|
+from oscar.test.helpers import create_product
|
|
12
|
13
|
|
|
13
|
14
|
|
|
14
|
15
|
class ProductReviewTests(unittest.TestCase):
|
|
|
@@ -19,43 +20,33 @@ class ProductReviewTests(unittest.TestCase):
|
|
19
|
20
|
username = str(randint(0, maxint))
|
|
20
|
21
|
self.user = User.objects.create_user(username, '%s@users.com'%username, '%spass123'%username)
|
|
21
|
22
|
self.anon_user = AnonymousUser()
|
|
22
|
|
- self.item_class,_ = ItemClass.objects.get_or_create(name='Books')
|
|
23
|
|
- self.item,_ = Item.objects.get_or_create(title='Django Book v2', item_class=self.item_class)
|
|
24
|
|
- self.review,_ = ProductReview.objects.get_or_create(title='Django Book v2 Review',\
|
|
25
|
|
- product=self.item, user=self.user, score=3, approved=True)
|
|
26
|
|
-
|
|
|
23
|
+ self.item = create_product()
|
|
|
24
|
+ self.review = ProductReview.objects.create(product=self.item,
|
|
|
25
|
+ title="Dummy review",
|
|
|
26
|
+ score=3,
|
|
|
27
|
+ user=self.user)
|
|
27
|
28
|
|
|
28
|
|
-class TopLevelProductReviewTests(ProductReviewTests):
|
|
29
|
|
- u"""
|
|
30
|
|
- Basic tests for ProductReview model
|
|
31
|
|
- """
|
|
32
|
29
|
def test_top_level_reviews_must_have_titles_and_scores(self):
|
|
33
|
|
- self.assertRaises(ValidationError, ProductReview.objects.create, product=self.item,\
|
|
34
|
|
- user=self.user)
|
|
|
30
|
+ self.assertRaises(ValidationError, ProductReview.objects.create, product=self.item,
|
|
|
31
|
+ user=self.user)
|
|
35
|
32
|
|
|
36
|
33
|
def test_top_level_anonymous_reviews_must_have_names_and_emails(self):
|
|
37
|
|
- self.assertRaises(ValidationError, ProductReview.objects.create, product=self.item,\
|
|
38
|
|
- user=None, title="Anonymous review", score=3)
|
|
|
34
|
+ self.assertRaises(ValidationError, ProductReview.objects.create, product=self.item,
|
|
|
35
|
+ user=None, title="Anonymous review", score=3)
|
|
39
|
36
|
|
|
40
|
37
|
|
|
41
|
38
|
class TopLevelProductReviewVoteTests(ProductReviewTests):
|
|
42
|
|
- u"""
|
|
|
39
|
+ """
|
|
43
|
40
|
Basic tests for Vote model
|
|
44
|
41
|
"""
|
|
45
|
|
- def setUp(self):
|
|
46
|
|
- super(TopLevelProductReviewVoteTests, self).setUp()
|
|
47
|
|
-
|
|
48
|
|
- def test_top_level_vote_must_have_choice(self):
|
|
49
|
|
- self.assertRaises(ValidationError, Vote.objects.create, review=self.review,\
|
|
50
|
|
- user=self.user)
|
|
51
|
42
|
|
|
52
|
43
|
def test_try_vote_without_login(self):
|
|
53
|
|
- self.assertRaises(ValueError, Vote.objects.create, review=self.review, choice =-1, user=self.anon_user)
|
|
|
44
|
+ self.assertRaises(ValueError, Vote.objects.create, review=self.review, delta=-1, user=self.anon_user)
|
|
54
|
45
|
|
|
55
|
46
|
def test_try_vote_more_than_once(self):
|
|
56
|
|
- vote1 = Vote.objects.create(review=self.review, user=self.user, choice=1)
|
|
|
47
|
+ vote1 = Vote.objects.create(review=self.review, user=self.user, delta=1)
|
|
57
|
48
|
self.assertTrue(vote1)
|
|
58
|
|
- self.assertRaises(IntegrityError, Vote.objects.create, review=self.review, choice=-1, user=self.user)
|
|
|
49
|
+ self.assertRaises(IntegrityError, Vote.objects.create, review=self.review, delta=-1, user=self.user)
|
|
59
|
50
|
|
|
60
|
51
|
|
|
61
|
52
|
class SingleProductReviewViewTest(ProductReviewTests, TestCase):
|
|
|
@@ -87,63 +78,4 @@ class SingleProductReviewViewTest(ProductReviewTests, TestCase):
|
|
87
|
78
|
response = self.client.get(url)
|
|
88
|
79
|
self.assertContains(response, 'name')
|
|
89
|
80
|
self.assertContains(response, 'email')
|
|
90
|
|
-
|
|
91
|
|
- def test_each_review_has_own_page(self): # FIXME: broken for reverse
|
|
92
|
|
- self.kwargs['review_id'] = self.review.id
|
|
93
|
|
- url = reverse('oscar-product-review', kwargs = self.kwargs)
|
|
94
|
|
- response = self.client.get(url)
|
|
95
|
|
- self.assertEquals(200, response.status_code)
|
|
96
|
|
-
|
|
97
|
|
-
|
|
98
|
|
-class SingleProductReviewVoteViewTest(ProductReviewTests, TestCase):
|
|
99
|
|
- u"""
|
|
100
|
|
- Each product review can be voted up or down
|
|
101
|
|
- """
|
|
102
|
|
- def setUp(self):
|
|
103
|
|
- self.client = Client()
|
|
104
|
|
- super(SingleProductReviewVoteViewTest, self).setUp()
|
|
105
|
|
- self.kwargs = {'item_class_slug': self.item.get_item_class().slug,
|
|
106
|
|
- 'item_slug': self.item.slug,
|
|
107
|
|
- 'item_id': self.item.id,
|
|
108
|
|
- 'review_id': self.review.id}
|
|
109
|
|
-
|
|
110
|
|
- def test_vote_up_product_review(self):
|
|
111
|
|
- url = reverse('oscar-vote-review', kwargs=self.kwargs)
|
|
112
|
|
- self.client.login(username='testuser', password='secret')
|
|
113
|
|
- response = self.client.get(url)
|
|
114
|
|
- self.assertEquals(200, response.status_code)
|
|
115
|
|
-
|
|
116
|
81
|
|
|
117
|
|
-class ProductReviewVotingActionTests(TestCase):
|
|
118
|
|
- u"""
|
|
119
|
|
- Includes the behaviour tests after voting on a review
|
|
120
|
|
- """
|
|
121
|
|
- fixtures = ['sample-product', 'sample-reviews']
|
|
122
|
|
-
|
|
123
|
|
- def setUp(self):
|
|
124
|
|
- # get reviews
|
|
125
|
|
- self.reviews = ProductReview.objects.all()
|
|
126
|
|
- # dummy voters
|
|
127
|
|
- self.voters = 10
|
|
128
|
|
- self.users = []
|
|
129
|
|
- for i in xrange(self.voters):
|
|
130
|
|
- u = User.objects.create_user('user%d'%i, 'user%d@users.com'%i, 'userpass%d'%i)
|
|
131
|
|
- self.users.append(u)
|
|
132
|
|
-
|
|
133
|
|
- def test_upvote_can_boost_up_review(self):
|
|
134
|
|
- # get a review
|
|
135
|
|
- old_rank = 1
|
|
136
|
|
- self.assertTrue(self.reviews)
|
|
137
|
|
- self.review = self.reviews[old_rank]
|
|
138
|
|
- review_id = self.review.id
|
|
139
|
|
- old_votes = self.review.total_votes
|
|
140
|
|
- # vote up
|
|
141
|
|
- for i in xrange(self.voters):
|
|
142
|
|
- vote = Vote.objects.create(review=self.review, user=self.users[i], choice=1)
|
|
143
|
|
- self.assertTrue(vote)
|
|
144
|
|
- # test vote count
|
|
145
|
|
- self.failUnlessEqual(self.review.total_votes, (self.voters + old_votes))
|
|
146
|
|
- # test rank
|
|
147
|
|
- reviews = ProductReview.top_voted.all()
|
|
148
|
|
- new_rank = list(reviews.values_list('id', flat=True)).index(review_id)
|
|
149
|
|
- self.failUnless(new_rank < old_rank)
|