@@ -473,7 +473,7 @@ defmodule CadetWeb.AssessmentsControllerTest do
473473 end
474474 end
475475
476- test "it renders contest leaderboards " , % {
476+ test "renders open leaderboard for all roles " , % {
477477 conn: conn ,
478478 course_regs: course_regs ,
479479 courses: % { course1: course1 } ,
@@ -510,17 +510,16 @@ defmodule CadetWeb.AssessmentsControllerTest do
510510 } )
511511 end
512512
513- expected_leaderboard = [ ]
514- # temporary fix to hide the leaderboard
515- # for answer <- contest_answers do
516- # %{
517- # "answer" => %{"code" => answer.answer.code},
518- # "score" => answer.relative_score,
519- # "student_name" => answer.submission.student.user.name,
520- # "submission_id" => answer.submission.id
521- # }
522- # end
523- # |> Enum.sort_by(& &1["score"], &>=/2)
513+ expected_leaderboard =
514+ for answer <- contest_answers do
515+ % {
516+ "answer" => % { "code" => answer . answer . code } ,
517+ "final_score" => answer . relative_score ,
518+ "student_name" => answer . submission . student . user . name ,
519+ "submission_id" => answer . submission . id
520+ }
521+ end
522+ |> Enum . sort_by ( & & 1 [ "final_score" ] , & >= / 2 )
524523
525524 for role <- Role . __enum_map__ ( ) do
526525 course_reg = Map . get ( role_crs , role )
@@ -538,6 +537,139 @@ defmodule CadetWeb.AssessmentsControllerTest do
538537 end
539538 end
540539
540+ test "renders close leaderboard for staff and admin" , % {
541+ conn: conn ,
542+ course_regs: course_regs ,
543+ courses: % { course1: course1 } ,
544+ role_crs: role_crs ,
545+ assessments: assessments
546+ } do
547+ voting_assessment = assessments [ "practical" ] . assessment
548+
549+ voting_assessment
550+ |> Assessment . changeset ( % {
551+ open_at: Timex . shift ( Timex . now ( ) , days: - 30 ) ,
552+ close_at: Timex . shift ( Timex . now ( ) , days: - 20 )
553+ } )
554+ |> Repo . update ( )
555+
556+ voting_question = assessments [ "practical" ] . voting_questions |> List . first ( )
557+ contest_assessment_number = voting_question . question . contest_number
558+
559+ contest_assessment = Repo . get_by ( Assessment , number: contest_assessment_number )
560+
561+ # insert contest question
562+ contest_question =
563+ insert ( :programming_question , % {
564+ display_order: 1 ,
565+ assessment: contest_assessment ,
566+ max_xp: 1000
567+ } )
568+
569+ # insert contest submissions and answers
570+ contest_submissions =
571+ for student <- Enum . take ( course_regs . students , 5 ) do
572+ insert ( :submission , % { assessment: contest_assessment , student: student } )
573+ end
574+
575+ contest_answers =
576+ for { submission , score } <- Enum . with_index ( contest_submissions , 1 ) do
577+ insert ( :answer , % {
578+ xp: 1000 ,
579+ question: contest_question ,
580+ submission: submission ,
581+ answer: build ( :programming_answer ) ,
582+ relative_score: score / 1
583+ } )
584+ end
585+
586+ expected_leaderboard =
587+ for answer <- contest_answers do
588+ % {
589+ "answer" => % { "code" => answer . answer . code } ,
590+ "final_score" => answer . relative_score ,
591+ "student_name" => answer . submission . student . user . name ,
592+ "submission_id" => answer . submission . id
593+ }
594+ end
595+ |> Enum . sort_by ( & & 1 [ "final_score" ] , & >= / 2 )
596+
597+ for role <- [ :admin , :staff ] do
598+ course_reg = Map . get ( role_crs , role )
599+
600+ resp_leaderboard =
601+ conn
602+ |> sign_in ( course_reg . user )
603+ |> get ( build_url ( course1 . id , voting_question . assessment . id ) )
604+ |> json_response ( 200 )
605+ |> Map . get ( "questions" , [ ] )
606+ |> Enum . find ( & ( & 1 [ "id" ] == voting_question . id ) )
607+ |> Map . get ( "contestLeaderboard" )
608+
609+ assert resp_leaderboard == expected_leaderboard
610+ end
611+ end
612+
613+ test "does not render close leaderboard for students" , % {
614+ conn: conn ,
615+ course_regs: course_regs ,
616+ courses: % { course1: course1 } ,
617+ role_crs: % { student: course_reg } ,
618+ assessments: assessments
619+ } do
620+ voting_assessment = assessments [ "practical" ] . assessment
621+
622+ voting_assessment
623+ |> Assessment . changeset ( % {
624+ open_at: Timex . shift ( Timex . now ( ) , days: - 30 ) ,
625+ close_at: Timex . shift ( Timex . now ( ) , days: - 20 )
626+ } )
627+ |> Repo . update ( )
628+
629+ voting_question = assessments [ "practical" ] . voting_questions |> List . first ( )
630+ contest_assessment_number = voting_question . question . contest_number
631+
632+ contest_assessment = Repo . get_by ( Assessment , number: contest_assessment_number )
633+
634+ # insert contest question
635+ contest_question =
636+ insert ( :programming_question , % {
637+ display_order: 1 ,
638+ assessment: contest_assessment ,
639+ max_xp: 1000
640+ } )
641+
642+ # insert contest submissions and answers
643+ contest_submissions =
644+ for student <- Enum . take ( course_regs . students , 5 ) do
645+ insert ( :submission , % { assessment: contest_assessment , student: student } )
646+ end
647+
648+ _contest_answers =
649+ for { submission , score } <- Enum . with_index ( contest_submissions , 1 ) do
650+ insert ( :answer , % {
651+ xp: 1000 ,
652+ question: contest_question ,
653+ submission: submission ,
654+ answer: build ( :programming_answer ) ,
655+ relative_score: score / 1
656+ } )
657+ end
658+
659+ expected_leaderboard = [ ]
660+
661+ resp_leaderboard =
662+ conn
663+ |> sign_in ( course_reg . user )
664+ |> get ( build_url ( course1 . id , voting_question . assessment . id ) )
665+ |> json_response ( 200 )
666+ |> Map . get ( "questions" , [ ] )
667+ |> Enum . find ( & ( & 1 [ "id" ] == voting_question . id ) )
668+ |> Map . get ( "contestLeaderboard" )
669+
670+ assert resp_leaderboard == expected_leaderboard
671+ end
672+
541673 test "it renders assessment question libraries" , % {
542674 conn: conn ,
543675 courses: % { course1: course1 } ,
0 commit comments