@@ -382,6 +382,94 @@ def test_path_traversal_rejected(self):
382382 self .assertEqual (response .status_code , 403 )
383383
384384
385+ class GetHelperFileViewTests (TestCase ):
386+ """Tests for get_helper_file and get_helper_file_list endpoints."""
387+
388+ def setUp (self ):
389+ self .tmp = tempfile .mkdtemp ()
390+ self .fal = FAL_RA (self .tmp , self .tmp )
391+ from academy import error_handler
392+
393+ self ._orig_fal = error_handler .local_fal
394+ error_handler .local_fal = FAL_RA (self .tmp , self .tmp )
395+ Exercise .objects .create (
396+ exercise_id = "helper_test_ex" ,
397+ name = "Helper Test Exercise" ,
398+ description = "Test" ,
399+ url = "helper_test_ex" ,
400+ )
401+ helper_dir = os .path .join (self .tmp , "helper_test_ex" , "python_template" )
402+ os .makedirs (helper_dir , exist_ok = True )
403+ with open (os .path .join (helper_dir , "helper.py" ), "w" ) as f :
404+ f .write ("# helper content" )
405+ with open (os .path .join (helper_dir , "model.onnx" ), "wb" ) as f :
406+ f .write (b"TESTBIN" )
407+
408+ def tearDown (self ):
409+ from academy import error_handler
410+
411+ error_handler .local_fal = self ._orig_fal
412+ shutil .rmtree (self .tmp , ignore_errors = True )
413+
414+ def test_get_helper_file_missing_project_returns_400 (self ):
415+ response = self .client .get (
416+ "/academy/get_helper_file/" ,
417+ {"language" : "python" , "filename" : "helper.py" },
418+ )
419+ self .assertEqual (response .status_code , 400 )
420+
421+ def test_get_helper_file_missing_filename_returns_text_file (self ):
422+ response = self .client .get (
423+ "/academy/get_helper_file/" ,
424+ {
425+ "project" : "helper_test_ex" ,
426+ "language" : "python" ,
427+ "filename" : "helper.py" ,
428+ },
429+ )
430+ self .assertEqual (response .status_code , 200 )
431+ self .assertIn ("content" , response .json ())
432+
433+ def test_get_helper_file_binary_returns_base64 (self ):
434+ response = self .client .get (
435+ "/academy/get_helper_file/" ,
436+ {
437+ "project" : "helper_test_ex" ,
438+ "language" : "python" ,
439+ "filename" : "model.onnx" ,
440+ "binary" : "true" ,
441+ },
442+ )
443+ self .assertEqual (response .status_code , 200 )
444+ self .assertIn ("content" , response .json ())
445+
446+ def test_get_helper_file_text_without_binary_flag (self ):
447+ response = self .client .get (
448+ "/academy/get_helper_file/" ,
449+ {
450+ "project" : "helper_test_ex" ,
451+ "language" : "python" ,
452+ "filename" : "helper.py" ,
453+ },
454+ )
455+ self .assertEqual (response .status_code , 200 )
456+ self .assertEqual (response .json ()["content" ], "# helper content" )
457+
458+ def test_get_helper_file_list_missing_project_returns_400 (self ):
459+ response = self .client .get (
460+ "/academy/get_helper_file_list/" ,
461+ {"language" : "python" },
462+ )
463+ self .assertEqual (response .status_code , 400 )
464+
465+ def test_get_helper_file_list_valid_returns_200 (self ):
466+ response = self .client .get (
467+ "/academy/get_helper_file_list/" ,
468+ {"project" : "helper_test_ex" , "language" : "python" },
469+ )
470+ self .assertEqual (response .status_code , 200 )
471+
472+
385473class TemplateTests (TestCase ):
386474 """Tests for academy/templates.py select_template function."""
387475
0 commit comments