22from io import BytesIO
33from unittest .mock import MagicMock , patch
44
5+ import pytest
56from django .contrib .auth .hashers import make_password
67from django .contrib .auth .models import User
78from django .contrib .messages import get_messages
9+ from django .http .response import Http404
810from django .test import Client , TestCase
911from django .urls import reverse
1012from pdf .forms import (
@@ -258,10 +260,22 @@ def setUp(self):
258260 self .pdf = None
259261 set_up (self )
260262
261- def test_get_object (self ):
263+ @patch ('pdf.services.shared_pdf_services.check_shared_access_allowed' , return_value = True )
264+ def test_get_object (self , mock_check ):
265+ # get dummy request
266+ response = self .client .get (reverse ('pdf_overview' ))
267+ shared_pdf = SharedPdf .objects .create (pdf = self .pdf , name = 'share' )
268+
269+ self .assertEqual (shared_pdf .pdf , PdfPublicMixin .get_object (response .wsgi_request , shared_pdf .id ))
270+
271+ @patch ('pdf.services.shared_pdf_services.check_shared_access_allowed' , return_value = False )
272+ def test_get_object_404 (self , mock_check ):
273+ # get dummy request
274+ response = self .client .get (reverse ('pdf_overview' ))
262275 shared_pdf = SharedPdf .objects .create (pdf = self .pdf , name = 'share' )
263276
264- self .assertEqual (shared_pdf .pdf , PdfPublicMixin .get_object (None , shared_pdf .id ))
277+ with pytest .raises (Http404 , match = 'Access to shared pdf not allowed!' ):
278+ PdfPublicMixin .get_object (response .wsgi_request , shared_pdf .id )
265279
266280
267281class TestBaseSharedPdfPublicView (TestCase ):
@@ -279,7 +293,7 @@ def test_get_object(self):
279293 self .assertEqual (shared_pdf , BaseSharedPdfPublicView .get_shared_pdf_public (None , shared_pdf .id ))
280294
281295
282- class TestLoginNotRequiredViews (TestCase ):
296+ class TestViewSharedPdf (TestCase ):
283297 username = 'user'
284298 password = '12345'
285299
@@ -289,7 +303,8 @@ def setUp(self):
289303 set_up (self )
290304 self .shared_pdf = SharedPdf .objects .create (pdf = self .pdf , name = 'shared_pdf' )
291305
292- def test_view_get_active (self ):
306+ @patch ('pdf.views.share_views.check_shared_access_allowed' , return_value = False )
307+ def test_view_get_active_no_active_session (self , mock_check ):
293308 # test without http referer
294309 response = self .client .get (reverse ('view_shared_pdf' , kwargs = {'identifier' : self .shared_pdf .id }))
295310
@@ -298,22 +313,17 @@ def test_view_get_active(self):
298313 self .assertEqual (response .context ['host' ], 'testserver' )
299314 self .assertEqual (response .context ['form' ], ViewSharedPasswordForm )
300315
301- def test_view_get_inactive (self ):
302- inactive_shared_pdf = SharedPdf .objects .create (pdf = self .pdf , name = 'inactive_shared_pdf' , views = 2 , max_views = 1 )
316+ @patch ('pdf.views.share_views.get_viewer_theme_and_color' )
317+ @patch ('pdf.views.share_views.check_shared_access_allowed' , return_value = True )
318+ def test_view_get_active_active_session (self , mock_check , mock_get_viewer_theme_and_color ):
303319 # test without http referer
304- response = self .client .get (reverse ('view_shared_pdf' , kwargs = {'identifier' : inactive_shared_pdf .id }))
305-
306- self .assertTemplateUsed (response , 'view_shared_inactive.html' )
307320
308- @patch ('pdf.views.share_views.get_viewer_theme_and_color' )
309- def test_view_post_active_no_password (self , mock_get_viewer_theme_and_color ):
310321 mock_get_viewer_theme_and_color .return_value = 'dark' , '4 4 4'
311-
312322 self .shared_pdf .pdf .revision = 2
313323 self .shared_pdf .pdf .save ()
314324 self .assertEqual (self .shared_pdf .views , 0 )
315325
316- response = self .client .post (reverse ('view_shared_pdf' , kwargs = {'identifier' : self .shared_pdf .id }))
326+ response = self .client .get (reverse ('view_shared_pdf' , kwargs = {'identifier' : self .shared_pdf .id }))
317327 self .assertEqual (response .context ['shared_pdf_id' ], self .shared_pdf .id )
318328 self .assertEqual (response .context ['current_page' ], 1 )
319329 self .assertEqual (response .context ['revision' ], 2 )
@@ -326,41 +336,47 @@ def test_view_post_active_no_password(self, mock_get_viewer_theme_and_color):
326336 shared_pdf = SharedPdf .objects .get (pk = self .shared_pdf .id )
327337 self .assertEqual (shared_pdf .views , 1 )
328338
329- @patch ('pdf.views.share_views.get_viewer_theme_and_color' )
330- def test_view_post_active_correct_password (self , mock_get_viewer_theme_and_color ):
331- mock_get_viewer_theme_and_color .return_value = 'dark' , '4 4 4'
339+ def test_view_get_inactive (self ):
340+ inactive_shared_pdf = SharedPdf .objects .create (pdf = self .pdf , name = 'inactive_shared_pdf' , views = 2 , max_views = 1 )
341+ # test without http referer
342+ response = self .client .get (reverse ('view_shared_pdf' , kwargs = {'identifier' : inactive_shared_pdf .id }))
332343
333- self .shared_pdf .pdf .revision = 2
334- self .shared_pdf .pdf .save ()
344+ self .assertTemplateUsed (response , 'view_shared_inactive.html' )
335345
346+ def test_view_post_active_no_password (self ):
347+ unprotected_shared_pdf = SharedPdf .objects .create (pdf = self .pdf , name = 'unprotected_shared_pdf' )
348+ assert unprotected_shared_pdf .sessions .count () == 0
349+
350+ response = self .client .post (reverse ('view_shared_pdf' , kwargs = {'identifier' : unprotected_shared_pdf .id }))
351+
352+ assert unprotected_shared_pdf .sessions .count () == 1
353+ self .assertRedirects (response , reverse ('view_shared_pdf' , kwargs = {'identifier' : unprotected_shared_pdf .id }))
354+
355+ def test_view_post_active_wrong_password (self ):
336356 protected_shared_pdf = SharedPdf .objects .create (
337357 pdf = self .pdf , name = 'protected_shared_pdf' , password = make_password ('some_pw' )
338358 )
339359
340360 response = self .client .post (
341- reverse ('view_shared_pdf' , kwargs = {'identifier' : protected_shared_pdf .id }),
342- data = {'password_input' : 'some_pw' },
361+ reverse ('view_shared_pdf' , kwargs = {'identifier' : protected_shared_pdf .id }), data = {'password_input' : 'wrong' }
343362 )
344363
345- self .assertEqual (response .context ['shared_pdf_id' ], protected_shared_pdf .id )
346- self .assertEqual (response .context ['theme_color' ], '4 4 4' )
347- self .assertEqual (response .context ['theme' ], 'dark' )
348- self .assertEqual (response .context ['revision' ], 2 )
349- self .assertEqual (response .context ['user_view_bool' ], False )
350- self .assertTemplateUsed (response , 'viewer.html' )
351-
352- protected_shared_pdf = SharedPdf .objects .get (pk = protected_shared_pdf .id )
353- self .assertEqual (protected_shared_pdf .views , 1 )
364+ self .assertIsInstance (response .context ['form' ], ViewSharedPasswordForm )
365+ self .assertTemplateUsed (response , 'view_shared_info.html' )
354366
355- def test_view_post_active_wrong_password (self ):
356- protected_shared_pdf = SharedPdf .objects .create (pdf = self .pdf , name = 'protected_shared_pdf' , password = 'some_pw' )
367+ def test_view_post_active_correct_password (self ):
368+ protected_shared_pdf = SharedPdf .objects .create (
369+ pdf = self .pdf , name = 'protected_shared_pdf' , password = make_password ('some_pw' )
370+ )
371+ assert protected_shared_pdf .sessions .count () == 0
357372
358373 response = self .client .post (
359- reverse ('view_shared_pdf' , kwargs = {'identifier' : protected_shared_pdf .id }), data = {'password_input' : 'wrong' }
374+ reverse ('view_shared_pdf' , kwargs = {'identifier' : protected_shared_pdf .id }),
375+ data = {'password_input' : 'some_pw' },
360376 )
361377
362- self . assertIsInstance ( response . context [ 'form' ], ViewSharedPasswordForm )
363- self .assertTemplateUsed (response , 'view_shared_info.html' )
378+ assert protected_shared_pdf . sessions . count () == 1
379+ self .assertRedirects (response , reverse ( 'view_shared_pdf' , kwargs = { 'identifier' : protected_shared_pdf . id }) )
364380
365381 def test_view_post_inactive (self ):
366382 inactive_shared_pdf = SharedPdf .objects .create (pdf = self .pdf , name = 'inactive_shared_pdf' , views = 2 , max_views = 1 )
0 commit comments