test_article.py 13 KB
Newer Older
1
2
import json

3
from django.test import TestCase, Client
4
from django.contrib.auth.models import User, Permission
Okhin's avatar
Okhin committed
5
from rest_framework.test import APIClient
luxcem's avatar
luxcem committed
6

luxcem's avatar
luxcem committed
7
8
9
from rp.models import Article
from rp.factories import ArticleFactory
from rp.apps import RpConfig
10
from rp.views.articles import ArticleList
luxcem's avatar
luxcem committed
11
12


13
class TestArticle(TestCase):
luxcem's avatar
luxcem committed
14
    def setUp(self):
15
        self.article = ArticleFactory(archive=False, quote=False, speak=False)
16
17
18
19
        self.newarticle = ArticleFactory(status='NEW',
                                         archive=False,
                                         quote=False,
                                         speak=False)
luxcem's avatar
luxcem committed
20

luxcem's avatar
luxcem committed
21
22
    def test_init(self):
        assert RpConfig.name == "rp"
luxcem's avatar
luxcem committed
23

luxcem's avatar
luxcem committed
24
25
    def test_article(self):
        assert type(self.article) == Article
luxcem's avatar
luxcem committed
26
        assert str(self.article) == self.article.title
27

28
29
30
31
32
33
34
35
36
    def test_recover(self):
        article = ArticleFactory(status='NEW')
        article.recover()
        assert article.status == 'DRAFT'

        article = ArticleFactory(status='REJECTED')
        article.recover()
        assert article.status == 'DRAFT'

37
38
39
40
41
    def test_add_new_url(self):
        article = Article.add_new_url(url='https://www.example.org/article')
        assert article.status == 'NEW'
        assert article.score == 1

42
43
44
        article2 = Article.add_new_url(url='https://www.example.org/article')
        assert article2.status == 'NEW'
        assert article2.score == 2
45

46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
    def test_flags(self):
        assert not self.article.archive
        assert not self.article.quote
        assert not self.article.speak

    def test_toggle_flags(self):
        self.newarticle.toggle_archive()
        assert self.newarticle.archive
        self.newarticle.toggle_archive()
        assert not self.newarticle.archive

        self.newarticle.toggle_quote()
        assert self.newarticle.quote
        self.newarticle.toggle_quote()
        assert not self.newarticle.quote

        self.newarticle.toggle_speak()
        assert self.newarticle.speak
        self.newarticle.toggle_speak()
        assert not self.newarticle.speak

    def test_set_flags(self):
        # Method signature is set_flags(boolean: archive = False,
        #                               boolean: speak = False,
        #                               boolean: quote = False)
        # All falsg set to their default values
        self.newarticle.set_flags()
        assert not self.newarticle.archive
        assert not self.newarticle.speak
        assert not self.newarticle.quote

        self.newarticle.set_flags(speak=True)
        assert not self.newarticle.archive
        assert self.newarticle.speak
        assert not self.newarticle.quote

        self.newarticle.set_flags(quote=True)
        assert not self.newarticle.archive
        assert not self.newarticle.speak
        assert self.newarticle.quote

        self.newarticle.set_flags(quote=True, speak=True)
        assert not self.newarticle.archive
        assert self.newarticle.speak
        assert self.newarticle.quote

Okhin's avatar
Okhin committed
92
93
94
95
96
97
98
    def test_update(self):
        old_title = self.article.title
        self.article.title = old_title[::-1]
        self.article.save()
        self.article.refresh_from_db()
        assert self.article.title != old_title

99

100
101
102
class TestArticleViews(TestCase):
    def setUp(self):
        self.client = Client()
Okhin's avatar
Okhin committed
103
104
105
106
107
        self.articles = [ArticleFactory(tags=['Tag 1', 'Tag2'])
                         for i in range(0, 2 * ArticleList.paginate_by)]
        self.user = User.objects.create(username="test",
                                        email="test@example.org",
                                        password="test")
108
109
110
111
112
113
114
115
116
117
118
        for a in self.articles:
            a.save()

    def test_list_fr(self):
        # ArticleFactory use english by default, so we should have
        # no objects
        r = self.client.get('/rp/')
        assert len(r.context['object_list']) == 0

    def test_list_en(self):
        r = self.client.get('/rp/international')
119
120
121
122
        if r.context['is_paginated']:
            assert len(r.context['object_list']) == ArticleList.paginate_by
        else:
            assert len(r.context['object_list']) == 0
123
124
125
126
127

    def test_filter_tag(self):
        tag = self.articles[0].tags.all()[1]

        r = self.client.get('/rp/by-tag/{}'.format(tag.name))
128
129
130
131
        if r.context['is_paginated']:
            assert len(r.context['object_list']) == ArticleList.paginate_by
        else:
            assert len(r.context['object_list']) == 0
132
133
134
135
        r = self.client.get('/rp/by-tag/zogzog')
        assert len(r.context['object_list']) == 0

    def test_search_view(self):
136
        article = ArticleFactory(title=u'Zog Zog chez les schtroumphs',
Okhin's avatar
Okhin committed
137
138
139
                                 lang='FR',
                                 archive=False,
                                 status='PUBLISHED')
140
141
142
143
144
145
146
        article.save()

        r = self.client.get('/rp/', {'q': 'Zog Zog'})
        assert len(r.context['article_list']) == 1
        r = self.client.get('/rp/', {'q': 'Gargamel was here'})
        assert len(r.context['article_list']) == 0

147
    def test_search_view_archived(self):
Okhin's avatar
Okhin committed
148
149
150
        archive = ArticleFactory(archive=True,
                                 lang='FR',
                                 status='PUBLISHED')
151
152
153
154
155
156
157
158

        r = self.client.get('/rp/', {'q': '', 'archive': 'true'})
        assert len(r.context['article_list']) == 1
        assert r.context['article_list'][0] == archive

        r = self.client.get('/rp/', {'archive': 'false'})
        assert len(r.context['article_list']) == 0

159
    def test_search_view_speaks(self):
Okhin's avatar
Okhin committed
160
161
162
163
        speak = ArticleFactory(speak=True,
                               archive=False,
                               lang='FR',
                               status='PUBLISHED')
164
165
166
167
168
169
170
171
172

        r = self.client.get('/rp/', {'q': '', 'speak': 'true'})
        assert len(r.context['article_list']) == 1
        assert r.context['article_list'][0] == speak

        r = self.client.get('/rp/', {'speak': 'false'})
        assert len(r.context['article_list']) == 0

    def test_search_view_quoted(self):
Okhin's avatar
Okhin committed
173
174
175
176
        quote = ArticleFactory(quote=True,
                               archive=False,
                               lang='FR',
                               status='PUBLISHED')
177
178
179
180
181
182
183
184

        r = self.client.get('/rp/', {'q': '', 'quote': 'true'})
        assert len(r.context['article_list']) == 1
        assert r.context['article_list'][0] == quote

        r = self.client.get('/rp/', {'quote': 'false'})
        assert len(r.context['article_list']) == 0

185
186
187
188
189
190
    def test_detail_view(self):
        # Let's find a published article
        self.client.force_login(user=self.user)
        a = self.articles[0]
        r = self.client.get('/rp/article/view/{}'.format(a.pk))
        assert r.context['object'] == a
Okhin's avatar
Okhin committed
191

Okhin's avatar
Okhin committed
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
    def test_article_edit_unauth(self):
        a = self.articles[0]
        r = self.client.post('/rp/article/edit/{}'.format(a.pk))
        assert r.status_code == 403

    def test_article_edit(self):
        self.user.user_permissions.add(Permission.objects.get(
            codename='can_edit'))
        self.client.force_login(user=self.user)
        a = self.articles[0]
        a.title = 'Zog Zog'
        a.screenshot = '/tmp/{}.png'.format(a.pk)
        r = self.client.post('/rp/article/edit/{}'.format(a.pk),
                             a.__dict__)
        a.refresh_from_db()
        assert r.status_code == 302
        assert a.title == 'Zog Zog'

Okhin's avatar
Okhin committed
210
211
212
213
214
215
216
217
218

class TestArticleApi(TestCase):
    def setUp(self):
        self.client = APIClient()
        self.articles = [ArticleFactory(tags=['Tag 1', 'Tag2'])
                         for i in range(0, 2 * ArticleList.paginate_by)]
        self.user = User.objects.create(username="test",
                                        email="test@example.org",
                                        password="test")
219
220
221
        self.jedi = User.objects.create(username="obiwan",
                                        email="o.kennoby@example.org",
                                        password="Thisaintthedroidyourelookin")
Okhin's avatar
Okhin committed
222
223
224
225
226
227
228
229
230
231
232
233
234
        for a in self.articles:
            a.save()

    def test_api_get(self):
        r = self.client.get('/api/articles/1/', {})
        assert r.status_code == 200
        assert r.data['id'] == 1

    def test_api_list(self):
        r = self.client.get('/api/articles/', {})
        assert r.status_code == 200
        assert r.data['count'] == 2 * ArticleList.paginate_by

235
236
237
238
239
240
241
242
243
244
245
246
247
    def test_api_edit(self):
        self.user.user_permissions.add(Permission.objects.get(
            codename='can_edit'))
        self.client.force_login(user=self.user)

        a = self.articles[0]
        a.title = 'Zog Zog'
        a.screenshot = "test.png"
        r = self.client.put('/api/articles/{}/'.format(a.pk), a.__dict__)
        assert r.status_code == 200
        a.refresh_from_db()
        assert a.title == 'Zog Zog'

Okhin's avatar
Okhin committed
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
    def test_api_filter_tag(self):
        tag = self.articles[0].tags.all()[1]

        # All articles have Tag2 as a tag
        r = self.client.get('/api/articles-by-tag/{}/'.format(tag.name))
        assert r.status_code == 200
        assert r.data['count'] == 2 * ArticleList.paginate_by

        # Case sensitivity checking - tags are sensitive to case
        r = self.client.get('/api/articles-by-tag/{}/'.format(tag.name.lower()))
        assert r.status_code == 200
        assert r.data['count'] == 0

        # No article should have the ZogZog tag
        r = self.client.get('/api/articles-by-tag/zogzog/')
        assert r.status_code == 200
        assert r.data['count'] == 0

    def test_api_filter_search(self):
267
        # text = ' '.join(self.articles[0].extracts.split(' ')[:10])
268
        text = self.articles[0].title
269
        r = self.client.get('/api/articles/', {'q': text})
Okhin's avatar
Okhin committed
270
271
272
        assert r.status_code == 200
        assert r.data['count'] == 1
        assert r.data['results'][0]['id'] == self.articles[0].id
273

274
275
276
277
278
    def test_api_filter_flag_search(self):
        r = self.client.get('/api/articles/', {'quote': 'both'})
        assert r.status_code == 200
        assert r.data['count'] == len(self.articles)

279
280
281
282
    def test_api_tag_push_unauth(self):
        a = ArticleFactory(tags=['ZogZog'],)
        r = self.client.post('/api/articles/',
                             {'url': a.url, 'title': a.title,
283
284
                              'tags': a.tags.all().values('name')},
                             format='json')
285
286
287
288
        assert r.status_code == 401

    def test_api_tag_push_auth(self):
        self.client.force_login(user=self.user)
289
        a = ArticleFactory(tags=['ZogZog', 'Blip Blop'], status='NEW')
290
291
        r = self.client.post('/api/articles/',
                             {'url': a.url, 'title': a.title,
292
293
                              'tags': a.tags.all().values('name')},
                             format='json')
294
        assert r.status_code == 201
295
        assert list(a.tags.all().values('name')) == [json.loads(t) for t in r.data['tags']]
296
297
298
299

        # Need to test if we keep the tags
        r = self.client.post('/api/articles/',
                             {'url': a.url, 'title': a.title,
Okhin's avatar
Okhin committed
300
301
                              },
                             format='json')
302
        assert list(a.tags.all().values('name')) == [json.loads(t) for t in r.data['tags']]
303
304
305
306
307
308
309
310

    def test_api_recover(self):
        # Can we recover if we're no Jedis
        self.client.force_login(user=self.user)
        a = ArticleFactory(status='NEW')
        r = self.client.post('/api/articles/{}/recover/'.format(a.id))
        assert r.status_code == 403

Okhin's avatar
Okhin committed
311
        # Can we recover a NEW article and force it to DRAFT?
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
        self.user.user_permissions.add(Permission.objects.get(
            codename='can_change_status'))
        self.client.force_login(user=self.user)
        a = ArticleFactory(status='NEW')
        r = self.client.post('/api/articles/{}/recover/'.format(a.id))
        assert r.status_code == 200
        assert r.data['status'] == 'DRAFT'

        # Can we recovr a REJECTED article and force it to DRAFT?
        a = ArticleFactory(status='REJECTED')
        r = self.client.post('/api/articles/{}/recover/'.format(a.id))
        assert r.status_code == 200
        assert r.data['status'] == 'DRAFT'

        # We cannot recover a published article
        a = ArticleFactory(status='PUBLISHED')
        r = self.client.post('/api/articles/{}/recover/'.format(a.id))
        assert r.status_code == 403
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349

    def test_api_set_priority(self):
        self.user.user_permissions.add(Permission.objects.get(
            codename='can_change_priority'))
        self.client.force_login(user=self.user)
        a = ArticleFactory(status='DRAFT')
        assert a.priority is False
        r = self.client.post('/api/articles/{}/set_priority/'.format(a.id))
        assert r.status_code == 200
        assert r.data['priority']

    def test_api_unset_priority(self):
        self.user.user_permissions.add(Permission.objects.get(
            codename='can_change_priority'))
        self.client.force_login(user=self.user)
        a = ArticleFactory(status='DRAFT', priority=True)
        assert a.priority
        r = self.client.post('/api/articles/{}/unset_priority/'.format(a.id))
        assert r.status_code == 200
        assert r.data['priority'] is False