@@ -1406,6 +1406,9 @@ def _client_for_user(self, user):
14061406 client .credentials (HTTP_AUTHORIZATION = "Token " + token .key )
14071407 return client
14081408
1409+ def _authorize_reader_user (self ):
1410+ self .product .authorized_users .add (self .reader_user )
1411+
14091412 def setUp (self ):
14101413 super ().setUp ()
14111414 # Legacy auth collapses Reader/Writer/Maintainer/Owner into
@@ -1493,11 +1496,13 @@ def test_engagement_notes_post_writer_allowed(self):
14931496
14941497 # ── Engagement: files ──────────────────────────────────────────────
14951498
1496- def test_engagement_files_post_reader_denied (self ):
1499+ def test_engagement_files_post_member_allowed (self ):
1500+ self ._authorize_reader_user ()
14971501 client = self ._client_for_user (self .reader_user )
14981502 url = reverse ("engagement-files" , args = (self .engagement .id ,))
1499- response = client .post (url , data = {}, format = "json" )
1500- self .assertEqual (response .status_code , 403 , response .content )
1503+ test_file = SimpleUploadedFile ("reader-proof.txt" , b"engagement file content" , content_type = "text/plain" )
1504+ response = client .post (url , data = {"title" : "reader proof" , "file" : test_file }, format = "multipart" )
1505+ self .assertEqual (response .status_code , 201 , response .content )
15011506
15021507 def test_engagement_files_post_writer_allowed (self ):
15031508 client = self ._client_for_user (self .writer_user )
@@ -1587,11 +1592,13 @@ def test_finding_notes_post_writer_allowed(self):
15871592
15881593 # ── Finding: files ─────────────────────────────────────────────────
15891594
1590- def test_finding_files_post_reader_denied (self ):
1595+ def test_finding_files_post_member_allowed (self ):
1596+ self ._authorize_reader_user ()
15911597 client = self ._client_for_user (self .reader_user )
15921598 url = reverse ("finding-files" , args = (self .finding .id ,))
1593- response = client .post (url , data = {}, format = "json" )
1594- self .assertEqual (response .status_code , 403 , response .content )
1599+ test_file = SimpleUploadedFile ("reader-evidence.txt" , b"finding file content" , content_type = "text/plain" )
1600+ response = client .post (url , data = {"title" : "reader evidence" , "file" : test_file }, format = "multipart" )
1601+ self .assertEqual (response .status_code , 201 , response .content )
15951602
15961603 def test_finding_files_post_writer_allowed (self ):
15971604 client = self ._client_for_user (self .writer_user )
@@ -1600,6 +1607,26 @@ def test_finding_files_post_writer_allowed(self):
16001607 response = client .post (url , data = {"title" : "test evidence" , "file" : test_file }, format = "multipart" )
16011608 self .assertEqual (response .status_code , 201 , response .content )
16021609
1610+ def test_manage_files_member_can_upload_to_finding (self ):
1611+ self ._authorize_reader_user ()
1612+ client = Client ()
1613+ client .login (username = "relobjperm_reader" , password = "testTEST1234!@#$" ) # noqa: S106
1614+ test_file = SimpleUploadedFile ("reader-ui-evidence.txt" , b"finding file content" , content_type = "text/plain" )
1615+ response = client .post (
1616+ reverse ("manage_files" , args = (self .finding .id , "Finding" )),
1617+ data = {
1618+ "form-TOTAL_FORMS" : "3" ,
1619+ "form-INITIAL_FORMS" : "0" ,
1620+ "form-MIN_NUM_FORMS" : "0" ,
1621+ "form-MAX_NUM_FORMS" : "10" ,
1622+ "form-0-title" : "reader ui evidence" ,
1623+ "form-0-file" : test_file ,
1624+ },
1625+ )
1626+
1627+ self .assertEqual (response .status_code , 302 , response .content )
1628+ self .assertTrue (self .finding .files .filter (title = "reader ui evidence" ).exists ())
1629+
16031630 # ── Finding: remove_note (NotePermission — PATCH uses Edit) ────────
16041631
16051632 def test_finding_remove_note_reader_denied (self ):
@@ -1691,11 +1718,13 @@ def test_test_notes_post_writer_allowed(self):
16911718
16921719 # ── Test: files ────────────────────────────────────────────────────
16931720
1694- def test_test_files_post_reader_denied (self ):
1721+ def test_test_files_post_member_allowed (self ):
1722+ self ._authorize_reader_user ()
16951723 client = self ._client_for_user (self .reader_user )
16961724 url = reverse ("test-files" , args = (self .test .id ,))
1697- response = client .post (url , data = {}, format = "json" )
1698- self .assertEqual (response .status_code , 403 , response .content )
1725+ test_file = SimpleUploadedFile ("reader-results.txt" , b"test file content" , content_type = "text/plain" )
1726+ response = client .post (url , data = {"title" : "reader results" , "file" : test_file }, format = "multipart" )
1727+ self .assertEqual (response .status_code , 201 , response .content )
16991728
17001729 def test_test_files_post_writer_allowed (self ):
17011730 client = self ._client_for_user (self .writer_user )
0 commit comments