@@ -74,6 +74,128 @@ var _ = Describe("Handlers", func() {
7474 Expect (testRuns [0 ].TestProjectName ).To (Equal ("project 1" ))
7575 Expect (testRuns [1 ].TestProjectName ).To (Equal ("project 2" ))
7676 })
77+
78+ It ("should return 400 for invalid sort_by parameter" , func () {
79+ w := httptest .NewRecorder ()
80+ c , _ := gin .CreateTestContext (w )
81+
82+ c .Request , _ = http .NewRequest ("GET" , "/testruns?sort_by=invalid_field" , nil )
83+ handler := handlers .NewHandler (gormDb )
84+ handler .GetTestRunAll (c )
85+
86+ Expect (w .Code ).To (Equal (http .StatusBadRequest ))
87+ Expect (w .Body .String ()).To (ContainSubstring ("invalid sort_by field" ))
88+ })
89+
90+ It ("should return 400 for invalid order parameter" , func () {
91+ w := httptest .NewRecorder ()
92+ c , _ := gin .CreateTestContext (w )
93+
94+ c .Request , _ = http .NewRequest ("GET" , "/testruns?order=invalid_order" , nil )
95+ handler := handlers .NewHandler (gormDb )
96+ handler .GetTestRunAll (c )
97+
98+ Expect (w .Code ).To (Equal (http .StatusBadRequest ))
99+ Expect (w .Body .String ()).To (ContainSubstring ("order must be 'asc' or 'desc'" ))
100+ })
101+
102+ It ("should apply project_uuid filter" , func () {
103+ rows := sqlmock .NewRows ([]string {
104+ "id" , "test_project_name" , "project_id" , "test_seed" , "start_time" , "end_time" , "git_branch" , "git_sha" , "build_trigger_actor" , "build_url" , "status" ,
105+ }).AddRow (1 , "project 1" , 101 , 0 , time .Now (), time .Now (), "main" , "abc123" , "ci" , "url" , "PASSED" )
106+
107+ mock .ExpectQuery (`(?i)SELECT .* FROM "test_runs" JOIN project_details ON project_details\.id = test_runs\.project_id WHERE project_details\.uuid = \$1 ORDER BY test_runs\.end_time desc` ).
108+ WithArgs ("abc-123" ).
109+ WillReturnRows (rows )
110+
111+ w := httptest .NewRecorder ()
112+ c , _ := gin .CreateTestContext (w )
113+
114+ c .Request , _ = http .NewRequest ("GET" , "/testruns?project_uuid=abc-123" , nil )
115+ handler := handlers .NewHandler (gormDb )
116+ handler .GetTestRunAll (c )
117+
118+ Expect (w .Code ).To (Equal (http .StatusOK ))
119+ })
120+
121+ It ("should apply valid sort_by and order parameters" , func () {
122+ rows := sqlmock .NewRows ([]string {
123+ "id" , "test_project_name" , "project_id" , "test_seed" , "start_time" , "end_time" , "git_branch" , "git_sha" , "build_trigger_actor" , "build_url" , "status" ,
124+ }).AddRow (1 , "project 1" , 101 , 0 , time .Now (), time .Now (), "main" , "abc123" , "ci" , "url" , "PASSED" )
125+
126+ mock .ExpectQuery (`(?i)SELECT .* FROM "test_runs" ORDER BY test_runs\.start_time asc` ).
127+ WillReturnRows (rows )
128+
129+ w := httptest .NewRecorder ()
130+ c , _ := gin .CreateTestContext (w )
131+
132+ c .Request , _ = http .NewRequest ("GET" , "/testruns?sort_by=start_time&order=asc" , nil )
133+ handler := handlers .NewHandler (gormDb )
134+ handler .GetTestRunAll (c )
135+
136+ Expect (w .Code ).To (Equal (http .StatusOK ))
137+ })
138+
139+ It ("should preload fields when specified" , func () {
140+ testRunRows := sqlmock .NewRows ([]string {
141+ "id" , "test_project_name" , "project_id" , "test_seed" , "start_time" , "end_time" , "git_branch" , "git_sha" , "build_trigger_actor" , "build_url" , "status" ,
142+ }).AddRow (1 , "project 1" , 101 , 123 , time .Now (), time .Now (), "main" , "abc123" , "dev" , "url" , "PASSED" )
143+
144+ mock .ExpectQuery (regexp .QuoteMeta (`
145+ SELECT * FROM "test_runs"
146+ ORDER BY test_runs.end_time desc` )).
147+ WillReturnRows (testRunRows )
148+
149+ projectRows := sqlmock .NewRows ([]string {"id" , "uuid" , "name" , "team_name" , "comment" , "created_at" , "updated_at" }).
150+ AddRow (101 , "uuid-123" , "project-name" , "team-a" , "" , time .Now (), time .Now ())
151+
152+ mock .ExpectQuery (regexp .QuoteMeta (`SELECT * FROM "project_details" WHERE "project_details"."id" = $1` )).
153+ WithArgs (101 ).
154+ WillReturnRows (projectRows )
155+
156+ suiteRunRows := sqlmock .NewRows ([]string {"id" , "test_run_id" , "suite_name" , "start_time" , "end_time" }).
157+ AddRow (201 , 1 , "suite-1" , time .Now (), time .Now ())
158+
159+ mock .ExpectQuery (regexp .QuoteMeta (`SELECT * FROM "suite_runs" WHERE "suite_runs"."test_run_id" = $1` )).
160+ WithArgs (1 ).
161+ WillReturnRows (suiteRunRows )
162+
163+ specRunRows := sqlmock .NewRows ([]string {"id" , "suite_id" , "spec_description" , "status" , "message" , "start_time" , "end_time" }).
164+ AddRow (301 , 201 , "spec-1" , "PASSED" , "" , time .Now (), time .Now ())
165+
166+ mock .ExpectQuery (regexp .QuoteMeta (`SELECT * FROM "spec_runs" WHERE "spec_runs"."suite_id" = $1` )).
167+ WithArgs (201 ).
168+ WillReturnRows (specRunRows )
169+
170+ //tagJoinRows := sqlmock.NewRows([]string{"spec_run_id", "tag_id"}).
171+ // AddRow(301, 401)
172+ //
173+ //mock.ExpectQuery(regexp.QuoteMeta(`SELECT * FROM "spec_run_tags" WHERE "spec_run_tags"."spec_run_id" = $1`)).
174+ // WithArgs(301).
175+ // WillReturnRows(tagJoinRows)
176+ //
177+ //tagRows := sqlmock.NewRows([]string{"id", "name"}).
178+ // AddRow(401, "tag-1")
179+
180+ //mock.ExpectQuery(regexp.QuoteMeta(`SELECT * FROM "tags" WHERE "tags"."id" = $1`)).
181+ // WithArgs(401).
182+ // WillReturnRows(tagRows)
183+
184+ w := httptest .NewRecorder ()
185+ c , _ := gin .CreateTestContext (w )
186+ c .Request , _ = http .NewRequest ("GET" , "/testruns?fields=project,suiteruns" , nil )
187+
188+ handler := handlers .NewHandler (gormDb )
189+ handler .GetTestRunAll (c )
190+
191+ Expect (w .Code ).To (Equal (http .StatusOK ))
192+ var testRuns []models.TestRun
193+ Expect (json .NewDecoder (w .Body ).Decode (& testRuns )).To (Succeed ())
194+ Expect (len (testRuns )).To (Equal (1 ))
195+ Expect (testRuns [0 ].Project .Name ).To (Equal ("project-name" ))
196+ Expect (testRuns [0 ].SuiteRuns [0 ].SuiteName ).To (Equal ("suite-1" ))
197+ //Expect(testRuns[0].SuiteRuns[0].SpecRuns[0].SpecDescription).To(Equal("spec-1"))
198+ })
77199 })
78200
79201 Context ("When GetTestRunByID handler is invoked" , func () {
@@ -125,6 +247,7 @@ var _ = Describe("Handlers", func() {
125247 BuildTriggerActor : "Actor Name" ,
126248 BuildUrl : "https://someurl.com" ,
127249 TestSeed : 0 ,
250+ Status : "PASSED" ,
128251 SuiteRuns : []models.SuiteRun {
129252 {
130253 ID : 1 ,
@@ -161,8 +284,8 @@ var _ = Describe("Handlers", func() {
161284 WillReturnRows (rows )
162285
163286 mock .ExpectBegin ()
164- mock .ExpectQuery (regexp .QuoteMeta (`INSERT INTO "test_runs" ("test_project_name","project_id","test_seed","start_time","end_time","git_branch","git_sha","build_trigger_actor","build_url") VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9) RETURNING "id"` )).
165- WithArgs (expectedTestRun .TestProjectName , expectedProject .ID , expectedTestRun .TestSeed , expectedTestRun .StartTime , expectedTestRun .EndTime , expectedTestRun .GitBranch , expectedTestRun .GitSha , expectedTestRun .BuildTriggerActor , expectedTestRun .BuildUrl ).
287+ mock .ExpectQuery (regexp .QuoteMeta (`INSERT INTO "test_runs" ("test_project_name","project_id","test_seed","start_time","end_time","git_branch","git_sha","build_trigger_actor","build_url","status" ) VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10 ) RETURNING "id"` )).
288+ WithArgs (expectedTestRun .TestProjectName , expectedProject .ID , expectedTestRun .TestSeed , expectedTestRun .StartTime , expectedTestRun .EndTime , expectedTestRun .GitBranch , expectedTestRun .GitSha , expectedTestRun .BuildTriggerActor , expectedTestRun .BuildUrl , expectedTestRun . Status ).
166289 WillReturnRows (sqlmock .NewRows ([]string {"id" }).AddRow (1 ))
167290 mock .ExpectCommit ()
168291
@@ -1061,11 +1184,12 @@ var _ = Describe("Handlers", func() {
10611184 AddRow (1 , "TestSuite1" , "TestProject" , time .Date (2024 , 4 , 20 , 12 , 0 , 0 , 0 , time .UTC ), 5 , 1 , 10 ).
10621185 AddRow (2 , "TestSuite2" , "TestProject" , time .Date (2024 , 4 , 21 , 12 , 0 , 0 , 0 , time .UTC ), 7 , 2 , 12 )
10631186
1187+ //TODO: Update the expected query
10641188 mock .ExpectQuery (regexp .QuoteMeta (`SELECT suite_runs.id AS suite_run_id,
10651189 suite_runs.suite_name,
10661190 test_runs.start_time,
1067- COUNT(spec_runs.id) FILTER (WHERE spec_runs.status = 'passed') AS total_passed_spec_runs,
1068- COUNT(spec_runs.id) FILTER (WHERE spec_runs.status = 'skipped') AS total_skipped_spec_runs,
1191+ COUNT(spec_runs.id) FILTER (WHERE LOWER( spec_runs.status) = 'passed') AS total_passed_spec_runs,
1192+ COUNT(spec_runs.id) FILTER (WHERE LOWER( spec_runs.status) = 'skipped') AS total_skipped_spec_runs,
10691193 COUNT(spec_runs.id) AS total_spec_runs FROM "test_runs"
10701194 INNER JOIN suite_runs ON test_runs.id = suite_runs.test_run_id
10711195 INNER JOIN spec_runs ON suite_runs.id = spec_runs.suite_id
0 commit comments