test_package.py 12.5 KB
Newer Older
1
#   test_package.py - Test the package views
2
3
4
5
#
#   This file is part of debexpo
#   https://salsa.debian.org/mentors.debian.net-team/debexpo
#
6
#   Copyright © 2019 Baptiste Beauplat <lyknode@cilg.org>
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#
#   Permission is hereby granted, free of charge, to any person
#   obtaining a copy of this software and associated documentation
#   files (the "Software"), to deal in the Software without
#   restriction, including without limitation the rights to use,
#   copy, modify, merge, publish, distribute, sublicense, and/or sell
#   copies of the Software, and to permit persons to whom the
#   Software is furnished to do so, subject to the following
#   conditions:
#
#   The above copyright notice and this permission notice shall be
#   included in all copies or substantial portions of the Software.
#
#   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
#   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
#   OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
#   NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
#   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
#   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
#   FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
#   OTHER DEALINGS IN THE SOFTWARE.

29
from django.core import mail
30
from django.urls import reverse
31
32
from django.test import override_settings
from django.conf import settings
33

34
35
36
from tests import TestController
from debexpo.accounts.models import User
from debexpo.packages.models import Package, PackageUpload, BinaryPackage
37
from debexpo.comments.models import PackageSubscription, UploadOutcome, Comment
Jonny Lamb's avatar
Jonny Lamb committed
38
39


40
class TestPackageController(TestController):
41
42
    def setUp(self):
        self._setup_example_user()
Baptiste Beauplat's avatar
Baptiste Beauplat committed
43
        self._setup_example_package()
44
45

    def tearDown(self):
Baptiste Beauplat's avatar
Baptiste Beauplat committed
46
        self._remove_example_package()
47
48
        self._remove_example_user()

49
50
51
52
    def _test_bad_method(self, action, args=None):
        if not args:
            args = []

53
54
55
        self.client.post(reverse('login'), self._AUTHDATA)

        response = self.client.get(reverse(
56
            action, args=['testpackage'] + args))
57
58
        self.assertEquals(response.status_code, 405)

59
60
61
62
    def _test_no_auth(self, action, redirect_login=True, args=None):
        if not args:
            args = []

63
        response = self.client.post(reverse(
64
            action, args=['testpackage'] + args))
65
        self.assertEquals(response.status_code, 302)
66

67
        if (redirect_login):
68
            self.assertIn(reverse('login'), response.url)
69

70
71
72
73
    def _test_not_owned_package(self, action, method='get', args=None):
        if not args:
            args = []

74
75
76
77
78
79
80
81
82
        user = User.objects.create_user(name='Another user',
                                        email='another@example.com',
                                        password='password')
        user.save()

        self.client.post(reverse('login'), {'username': 'another@example.com',
                                            'password': 'password',
                                            'commit': 'submit'})

83
84
        response = self.client.post(reverse(action,
                                            args=['testpackage'] + args))
85
86
        self.assertEquals(response.status_code, 403)
        user.delete()
87

Jonny Lamb's avatar
Jonny Lamb committed
88
    def test_index(self):
89
90
91
        # No package redirects to package list
        response = self.client.get(reverse('package_index'))
        self.assertEquals(response.status_code, 301)
92
        self.assertEquals(reverse('packages'), response.url)
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114

        # Wrong package produce 404
        response = self.client.get(reverse('package', args=['notapackage']))
        self.assertEquals(response.status_code, 404)

        # Write package show details
        # Unauthenticated
        response = self.client.get(reverse('package', args=['testpackage']))
        self.assertEquals(response.status_code, 200)

        self.assertIn(reverse('packages_search',
                              args=['uploader', 'email@example.com']),
                      str(response.content))

        # And authenticated
        response = self.client.post(reverse('login'), self._AUTHDATA)
        response = self.client.get(reverse('package', args=['testpackage']))
        self.assertEquals(response.status_code, 200)

        self.assertIn(reverse('delete_package',
                              args=['testpackage']),
                      str(response.content))
115
116
117
        self.assertIn(reverse('comment_package',
                              args=['testpackage']),
                      str(response.content))
118
119
120
121
122
123
124
125
126
127
128
129
130

        # Without description
        package = Package.objects.get(name='testpackage')
        upload = PackageUpload.objects.get(package=package)
        binary = BinaryPackage.objects.get(upload=upload)
        binary.delete()

        response = self.client.get(reverse('package', args=['testpackage']))
        self.assertEquals(response.status_code, 200)

        self.assertNotIn('A short description here',
                         str(response.content))

131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
    def test_subscribe(self):
        # Not authenticated
        response = self.client.get(reverse('subscribe_package',
                                           args=['testpackage']))
        self.assertEquals(response.status_code, 302)
        self.assertIn(reverse('login'), response.url)

        # Authenticated
        # Get subscription page
        self.client.post(reverse('login'), self._AUTHDATA)
        response = self.client.get(reverse('subscribe_package',
                                           args=['testpackage']))

        self.assertEquals(response.status_code, 200)

        # Post to update subscription
        self._subscribe('testpackage', True, False)
        self._subscribe('testpackage', False, True)
        self._subscribe('testpackage', False, False)

    def _subscribe(self, package, on_upload, on_comment):
        response = self.client.post(reverse('subscribe_package',
                                            args=[package]), {
            'on_upload': on_upload,
            'on_comment': on_comment,
            'next': package,
            'commit': 'submit'
        })

        self.assertEquals(response.status_code, 302)
        self.assertEquals(reverse('package', args=[package]),
                          response.url)
        if not (on_upload or on_comment):
            self.assertRaises(PackageSubscription.DoesNotExist,
                              PackageSubscription.objects.get, package=package)
        else:
            subs = PackageSubscription.objects.get(package=package)
            self.assertEquals(subs.on_upload, on_upload)
            self.assertEquals(subs.on_comment, on_comment)
170
171

    def test_delete_no_auth(self):
172
        self._test_no_auth('delete_package')
173
        self._test_no_auth('delete_upload', args=['1'])
174
175

    def test_delete_not_owned_package(self):
176
        self._test_not_owned_package('delete_package')
177
        self._test_not_owned_package('delete_upload', args=['1'])
178

179
180
    def test_delete_bad_method(self):
        self._test_bad_method('delete_package')
181
        self._test_bad_method('delete_upload', args=['1'])
182

183
184
185
186
187
188
189
190
191
#    def test_delete_gitstorage_utf8(self):
#        gitdir = join(pylons.test.pylonsapp.config['debexpo.repository'],
#                      'git', 'testpackage', 'source')
#
#        makedirs(gitdir)
#        with open(join(gitdir, 'Bodø'), 'w'):
#            pass
#
#        self.test_delete_successful()
192

193
194
    def test_delete_successful(self):
        self.client.post(reverse('login'), self._AUTHDATA)
195

196
197
        response = self.client.post(reverse(
            'delete_package', args=['testpackage']))
198

199
200
201
202
        self.assertEquals(response.status_code, 302)
        self.assertTrue(reverse('packages_my'), response.url)
        self.assertRaises(Package.DoesNotExist, Package.objects.get,
                          name='testpackage')
203

204
205
206
207
    @override_settings()
    def test_delete_upload_successful_no_gitstorage(self):
        del settings.GIT_STORAGE

208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
        self.client.post(reverse('login'), self._AUTHDATA)

        response = self.client.post(reverse(
            'delete_upload', args=['testpackage', '1']))

        self.assertEquals(response.status_code, 302)
        self.assertTrue(reverse('packages_my'), response.url)
        self.assertRaises(Package.DoesNotExist, Package.objects.get,
                          name='testpackage')

    def test_delete_single_upload_successful(self):
        self._setup_example_package()
        self.client.post(reverse('login'), self._AUTHDATA)

        response = self.client.post(reverse(
            'delete_upload', args=['testpackage', '1']))

        self.assertEquals(response.status_code, 302)
        self.assertTrue(reverse('package', args=['testpackage']), response.url)
        Package.objects.get(name='testpackage')

229
230
    def test_comment_no_auth(self):
        self._test_no_auth('comment_package')
231

232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
    def test_comment_bad_method(self):
        self._test_bad_method('comment_package')

    def test_comment(self):
        self.client.post(reverse('login'), self._AUTHDATA)

        upload = PackageUpload.objects.filter(package__name='testpackage') \
            .earliest('uploaded')
        response = self.client.post(reverse('comment_package',
                                            args=['testpackage']), {
            'upload_id': upload.id,
            'text': 'This is a test comment',
            'outcome': UploadOutcome.needs_work.value,
            'commit': 'submit_comment'
        })

        self.assertEquals(response.status_code, 302)
249
250
251
        self.assertEquals(
            f"{reverse('package', args=['testpackage'])}#upload-1",
            response.url)
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282

        comment = Comment.objects.get(upload=upload)

        self.assertEquals(comment.text, 'This is a test comment')
        self.assertFalse(comment.uploaded)

        response = self.client.get(reverse('package', args=['testpackage']))
        self.assertEquals(response.status_code, 200)

        self.assertIn('This is a test comment', str(response.content))
        self.assertIn('Needs work', str(response.content))

        comment.delete()

    def test_comment_with_subscriber(self):
        # test with a subscriber
        self.client.post(reverse('login'), self._AUTHDATA)

        user = User.objects.get(email='email@example.com')
        packsub = PackageSubscription(
            package='testpackage',
            on_comment=True,
            on_upload=False,
        )
        packsub.user = user
        packsub.save()

        self.test_comment()

        self.assertEqual(len(mail.outbox), 1)
        self.assertIn('This is a test comment', mail.outbox[0].body)
283
284
        self.assertIn('From: debexpo <no-reply@example.org>',
                      str(mail.outbox[0].message()))
285
286
287

    def test_sponsor_no_auth(self):
        self._test_no_auth('sponsor_package')
288
289

    def test_sponsor_not_owned_package(self):
290
291
292
293
        self._test_not_owned_package('sponsor_package')

    def test_sponsor_bad_method(self):
        self._test_bad_method('sponsor_package')
294
295

    def test_sponsor_toggle(self, toggle=True):
296
297
298
299
300
301
302
303
304
        self.client.post(reverse('login'), self._AUTHDATA)

        response = self.client.post(reverse(
            'sponsor_package', args=['testpackage']))

        self.assertEquals(response.status_code, 302)

        package = Package.objects.get(name='testpackage')

305
        if (toggle):
306
            self.assertTrue(package.needs_sponsor)
307
308
            self.test_sponsor_toggle(toggle=False)
        else:
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
            self.assertFalse(package.needs_sponsor)

#    def test_package_info(self, data=False):
#        package = Package.objects.get(name='testpackage')
#        upload = PackageUpload.objects.filter(package__name='testpackage') \
#            .latest('uploaded')
#        textmark = 'some lintian output'
#
#        if data:
#            package_info_data = PackageInfo(
#                package_version_id=package_version.id,
#                from_plugin='LintianPlugin',
#                outcome='Package is lintian clean',
#                data=textmark,
#                severity=constants.PLUGIN_SEVERITY_INFO)
#        else:
#            package_info_data = PackageInfo(
#                package_version_id=package_version.id,
#                from_plugin='LintianPlugin',
#                outcome='Package is lintian clean',
#                rich_data=textmark,
#                severity=constants.PLUGIN_SEVERITY_INFO)
#
#        package_info_data.save()
#
#        response = self.client.get(reverse('package', args=['testpackage']))
#
#        self.assertEquals(response.status_code, 200)
#        self.assertTrue(textmark in response)
338

339
340
#    def test_package_info_data(self):
#        self.test_package_info(data=True)