@@ -707,6 +707,108 @@ async def test_lists_runs_pagination(
707707 assert len (response2_json ) == 1
708708 assert response2_json [0 ]["id" ] == str (run2 .id )
709709
710+ @pytest .mark .asyncio
711+ @pytest .mark .parametrize ("test_db" , ["sqlite" , "postgres" ], indirect = True )
712+ async def test_limits_job_submissions (
713+ self , test_db , session : AsyncSession , client : AsyncClient
714+ ):
715+ user = await create_user (session = session , global_role = GlobalRole .USER )
716+ project = await create_project (session = session , owner = user )
717+ await add_project_member (
718+ session = session , project = project , user = user , project_role = ProjectRole .USER
719+ )
720+ repo = await create_repo (
721+ session = session ,
722+ project_id = project .id ,
723+ )
724+ run_submitted_at = datetime (2023 , 1 , 2 , 3 , 4 , tzinfo = timezone .utc )
725+ run = await create_run (
726+ session = session ,
727+ project = project ,
728+ repo = repo ,
729+ user = user ,
730+ submitted_at = run_submitted_at ,
731+ )
732+ run_spec = RunSpec .parse_raw (run .run_spec )
733+ await create_job (
734+ session = session ,
735+ run = run ,
736+ submitted_at = run_submitted_at ,
737+ last_processed_at = run_submitted_at ,
738+ )
739+ job2 = await create_job (
740+ session = session ,
741+ run = run ,
742+ submitted_at = run_submitted_at ,
743+ last_processed_at = run_submitted_at ,
744+ )
745+ job2_spec = JobSpec .parse_raw (job2 .job_spec_data )
746+ response = await client .post (
747+ "/api/runs/list" ,
748+ headers = get_auth_headers (user .token ),
749+ json = {"job_submissions_limit" : 1 },
750+ )
751+ assert response .status_code == 200 , response .json ()
752+ assert response .json () == [
753+ {
754+ "id" : str (run .id ),
755+ "project_name" : project .name ,
756+ "user" : user .name ,
757+ "submitted_at" : run_submitted_at .isoformat (),
758+ "last_processed_at" : run_submitted_at .isoformat (),
759+ "status" : "submitted" ,
760+ "status_message" : "submitted" ,
761+ "run_spec" : run_spec .dict (),
762+ "jobs" : [
763+ {
764+ "job_spec" : job2_spec .dict (),
765+ "job_submissions" : [
766+ {
767+ "id" : str (job2 .id ),
768+ "submission_num" : 0 ,
769+ "deployment_num" : 0 ,
770+ "submitted_at" : run_submitted_at .isoformat (),
771+ "last_processed_at" : run_submitted_at .isoformat (),
772+ "finished_at" : None ,
773+ "inactivity_secs" : None ,
774+ "status" : "submitted" ,
775+ "status_message" : "submitted" ,
776+ "termination_reason" : None ,
777+ "termination_reason_message" : None ,
778+ "error" : None ,
779+ "exit_status" : None ,
780+ "job_provisioning_data" : None ,
781+ "job_runtime_data" : None ,
782+ }
783+ ],
784+ }
785+ ],
786+ "latest_job_submission" : {
787+ "id" : str (job2 .id ),
788+ "submission_num" : 0 ,
789+ "deployment_num" : 0 ,
790+ "submitted_at" : run_submitted_at .isoformat (),
791+ "last_processed_at" : run_submitted_at .isoformat (),
792+ "finished_at" : None ,
793+ "inactivity_secs" : None ,
794+ "status" : "submitted" ,
795+ "status_message" : "submitted" ,
796+ "termination_reason_message" : None ,
797+ "termination_reason" : None ,
798+ "error" : None ,
799+ "exit_status" : None ,
800+ "job_provisioning_data" : None ,
801+ "job_runtime_data" : None ,
802+ },
803+ "cost" : 0 ,
804+ "service" : None ,
805+ "deployment_num" : 0 ,
806+ "termination_reason" : None ,
807+ "error" : None ,
808+ "deleted" : False ,
809+ },
810+ ]
811+
710812
711813class TestGetRun :
712814 @pytest .mark .asyncio
0 commit comments