1+ from io import BytesIO
2+
13import pytest
24import requests
35from django .contrib import messages
@@ -64,6 +66,14 @@ def test_workspace_view_with_file(client_with_permission, ui_options):
6466 assert "foobar" in response .rendered_content
6567
6668
69+ def test_workspace_view_with_html_file (client_with_permission , ui_options ):
70+ factories .write_workspace_file (
71+ "workspace" , "file.html" , "<html><body>foobar</body></html>"
72+ )
73+ response = client_with_permission .get ("/workspaces/view/workspace/file.html" )
74+ assert "foobar" in response .rendered_content
75+
76+
6777def test_workspace_view_with_404 (client_with_permission ):
6878 factories .create_workspace ("workspace" )
6979 response = client_with_permission .get ("/workspaces/view/workspace/no_such_file.txt" )
@@ -78,6 +88,14 @@ def test_workspace_view_redirects_to_directory(client_with_permission):
7888 assert response .headers ["Location" ] == "/workspaces/view/workspace/some_dir/"
7989
8090
91+ def test_workspace_view_directory_with_sub_directory (client_with_permission ):
92+ workspace = factories .create_workspace ("workspace" )
93+ factories .write_workspace_file (workspace , "sub_dir/file.txt" )
94+ response = client_with_permission .get ("/workspaces/view/workspace" , follow = True )
95+ assert "sub_dir" in response .rendered_content
96+ assert "file.txt" in response .rendered_content
97+
98+
8199def test_workspace_view_redirects_to_file (client_with_permission ):
82100 factories .write_workspace_file ("workspace" , "file.txt" )
83101 response = client_with_permission .get ("/workspaces/view/workspace/file.txt/" )
@@ -305,13 +323,45 @@ def test_request_view_with_directory(client_with_permission, ui_options):
305323
306324def test_request_view_with_file (client_with_permission , ui_options ):
307325 release_request = factories .create_release_request ("workspace" )
308- factories .write_request_file (release_request , "file.txt" , "foobar" )
326+ factories .write_workspace_file ("workspace" , "file.txt" , "foobar" )
327+ factories .create_filegroup (
328+ release_request , group_name = "default_group" , filepaths = ["file.txt" ]
329+ )
330+
309331 response = client_with_permission .get (
310332 f"/requests/view/{ release_request .id } /file.txt"
311333 )
334+ assert "default_group" in response .rendered_content
312335 assert "foobar" in response .rendered_content
313336
314337
338+ def test_request_view_with_submitted_request (client_with_permission , ui_options ):
339+ release_request = factories .create_release_request (
340+ "workspace" , status = Status .SUBMITTED
341+ )
342+ response = client_with_permission .get (
343+ f"/requests/view/{ release_request .id } " , follow = True
344+ )
345+ assert "Reject Request" in response .rendered_content
346+ assert "Release Files" in response .rendered_content
347+
348+
349+ def test_request_view_with_authored_request_file (client_with_permission , ui_options ):
350+ release_request = factories .create_release_request (
351+ "workspace" ,
352+ user = User .from_session (client_with_permission .session ),
353+ status = Status .SUBMITTED ,
354+ )
355+ factories .write_workspace_file ("workspace" , "file.txt" , "foobar" )
356+ factories .create_filegroup (
357+ release_request , group_name = "default_group" , filepaths = ["file.txt" ]
358+ )
359+ response = client_with_permission .get (
360+ f"/requests/view/{ release_request .id } /file.txt" , follow = True
361+ )
362+ assert "Remove this file" in response .rendered_content
363+
364+
315365def test_request_view_with_404 (client_with_permission ):
316366 release_request = factories .create_release_request ("workspace" )
317367 response = client_with_permission .get (
@@ -499,6 +549,45 @@ def test_requests_release_jobserver_403(client_with_permission, release_files_st
499549 assert response .status_code == 403
500550
501551
552+ @pytest .mark .parametrize (
553+ "content_type,content,should_contain_iframe" ,
554+ [
555+ ("text/plain" , b"An error from job-server" , False ),
556+ ("text/html" , b"<p>An error from job-server</p>" , True ),
557+ ],
558+ )
559+ def test_requests_release_jobserver_403_with_debug (
560+ client_with_permission ,
561+ release_files_stubber ,
562+ settings ,
563+ content_type ,
564+ content ,
565+ should_contain_iframe ,
566+ ):
567+ settings .DEBUG = True
568+ release_request = factories .create_release_request (
569+ "workspace" ,
570+ id = "request_id" ,
571+ status = Status .SUBMITTED ,
572+ )
573+ factories .write_request_file (release_request , "test/file.txt" , "test" )
574+
575+ response = requests .Response ()
576+ response .status_code = 403
577+ response .headers = {"Content-Type" : content_type }
578+ response .raw = BytesIO (content )
579+ api403 = requests .HTTPError (response = response )
580+ release_files_stubber (release_request , body = api403 )
581+
582+ # test 403 is handled
583+ response = client_with_permission .post ("/requests/release/request_id" )
584+ # DEBUG is on, so we return the job-server error
585+ assert response .status_code == 200
586+ assert "An error from job-server" in response .rendered_content
587+ contains_iframe = "<iframe" in response .rendered_content
588+ assert contains_iframe == should_contain_iframe
589+
590+
502591def test_requests_release_files_404 (client_with_permission , release_files_stubber ):
503592 release_request = factories .create_release_request (
504593 "workspace" ,
0 commit comments