Skip to content

Commit 57ecf0a

Browse files
committed
Split AssesmentsController#unlock out of AssessmentsController#show
`AssesmentsController#unlock` unlocks password-protected assessments and creates a Submission for them, following which the assessments do not require requests with the password.
1 parent d431ba4 commit 57ecf0a

File tree

3 files changed

+59
-29
lines changed

3 files changed

+59
-29
lines changed

lib/cadet_web/controllers/assessments_controller.ex

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,17 @@ defmodule CadetWeb.AssessmentsController do
4444
render(conn, "index.json", assessments: assessments)
4545
end
4646

47-
def show(conn, params = %{"assessmentid" => assessment_id}) when is_ecto_id(assessment_id) do
47+
def show(conn, %{"assessmentid" => assessment_id}) when is_ecto_id(assessment_id) do
48+
user = conn.assigns[:current_user]
49+
50+
case Assessments.assessment_with_questions_and_answers(assessment_id, user) do
51+
{:ok, assessment} -> render(conn, "show.json", assessment: assessment)
52+
{:error, {status, message}} -> send_resp(conn, status, message)
53+
end
54+
end
55+
56+
def unlock(conn, %{"assessmentid" => assessment_id, "password" => password }) when is_ecto_id(assessment_id) do
4857
user = conn.assigns[:current_user]
49-
password = params |> Map.get("password")
5058

5159
case Assessments.assessment_with_questions_and_answers(assessment_id, user, password) do
5260
{:ok, assessment} -> render(conn, "show.json", assessment: assessment)
@@ -88,7 +96,7 @@ defmodule CadetWeb.AssessmentsController do
8896
end
8997

9098
swagger_path :show do
91-
post("/assessments/{assessmentId}")
99+
get("/assessments/{assessmentId}")
92100

93101
summary("Get information about one particular assessment.")
94102

@@ -97,6 +105,25 @@ defmodule CadetWeb.AssessmentsController do
97105
consumes("application/json")
98106
produces("application/json")
99107

108+
parameters do
109+
assessmentId(:path, :integer, "Assessment ID", required: true)
110+
end
111+
112+
response(200, "OK", Schema.ref(:Assessment))
113+
response(400, "Missing parameter(s) or invalid assessmentId")
114+
response(401, "Unauthorised")
115+
end
116+
117+
swagger_path :unlock do
118+
post("/assessments/{assessmentId}/unlock")
119+
120+
summary("Unlocks a password-protected assessment and returns its information")
121+
122+
security([%{JWT: []}])
123+
124+
consumes("application/json")
125+
produces("application/json")
126+
100127
parameters do
101128
assessmentId(:path, :integer, "Assessment ID", required: true)
102129
password(:body, :string, "Password", required: false)

lib/cadet_web/router.ex

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,8 @@ defmodule CadetWeb.Router do
117117
pipe_through([:api, :auth, :ensure_auth])
118118

119119
get("/assessments", AssessmentsController, :index)
120-
post("/assessments/:assessmentid", AssessmentsController, :show)
120+
get("/assessments/:assessmentid", AssessmentsController, :show)
121+
post("/assessments/:assessmentid/unlock", AssessmentsController, :unlock)
121122
post("/assessments/:assessmentid/submit", AssessmentsController, :submit)
122123
post("/assessments/question/:questionid/answer", AnswerController, :submit)
123124

test/cadet_web/controllers/assessments_controller_test.exs

Lines changed: 27 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ defmodule CadetWeb.AssessmentsControllerTest do
3030
AssessmentsController.swagger_definitions()
3131
AssessmentsController.swagger_path_index(nil)
3232
AssessmentsController.swagger_path_show(nil)
33+
AssessmentsController.swagger_path_unlock(nil)
3334
AssessmentsController.swagger_path_submit(nil)
3435
end
3536

@@ -40,9 +41,9 @@ defmodule CadetWeb.AssessmentsControllerTest do
4041
end
4142
end
4243

43-
describe "POST /:assessment_id, unauthenticated" do
44+
describe "GET /:assessment_id, unauthenticated" do
4445
test "unauthorized", %{conn: conn} do
45-
conn = post(conn, build_url(1))
46+
conn = get(conn, build_url(1))
4647
assert response(conn, 401) =~ "Unauthorised"
4748
end
4849
end
@@ -290,7 +291,7 @@ defmodule CadetWeb.AssessmentsControllerTest do
290291
end
291292
end
292293

293-
describe "POST /assessment_id, all roles" do
294+
describe "GET /assessment_id, all roles" do
294295
test "it renders assessment details", %{
295296
conn: conn,
296297
users: users,
@@ -314,7 +315,7 @@ defmodule CadetWeb.AssessmentsControllerTest do
314315
resp_assessments =
315316
conn
316317
|> sign_in(user)
317-
|> post(build_url(assessment.id))
318+
|> get(build_url(assessment.id))
318319
|> json_response(200)
319320
|> Map.delete("questions")
320321

@@ -403,7 +404,7 @@ defmodule CadetWeb.AssessmentsControllerTest do
403404
resp_questions =
404405
conn
405406
|> sign_in(user)
406-
|> post(build_url(assessment.id))
407+
|> get(build_url(assessment.id))
407408
|> json_response(200)
408409
|> Map.get("questions", [])
409410
|> Enum.map(&Map.delete(&1, "answer"))
@@ -457,7 +458,7 @@ defmodule CadetWeb.AssessmentsControllerTest do
457458
resp_libraries =
458459
conn
459460
|> sign_in(user)
460-
|> post(build_url(assessment.id))
461+
|> get(build_url(assessment.id))
461462
|> json_response(200)
462463
|> Map.get("questions", [])
463464
|> Enum.map(&Map.get(&1, "library"))
@@ -492,7 +493,7 @@ defmodule CadetWeb.AssessmentsControllerTest do
492493
resp_solutions =
493494
conn
494495
|> sign_in(user)
495-
|> post(build_url(assessment.id))
496+
|> get(build_url(assessment.id))
496497
|> json_response(200)
497498
|> Map.get("questions", [])
498499
|> Enum.map(&Map.take(&1, ["solution"]))
@@ -534,7 +535,7 @@ defmodule CadetWeb.AssessmentsControllerTest do
534535
resp =
535536
conn
536537
|> sign_in(user)
537-
|> post(build_url(assessment.id))
538+
|> get(build_url(assessment.id))
538539
|> json_response(200)
539540
|> Map.get("questions", [])
540541
|> Enum.map(&Map.take(&1, ~w(xp grade)))
@@ -559,7 +560,7 @@ defmodule CadetWeb.AssessmentsControllerTest do
559560
resp_solutions =
560561
conn
561562
|> sign_in(user)
562-
|> post(build_url(assessment.id))
563+
|> get(build_url(assessment.id))
563564
|> json_response(200)
564565
|> Map.get("questions", [])
565566
|> Enum.map(&Map.get(&1, ["solution"]))
@@ -570,7 +571,7 @@ defmodule CadetWeb.AssessmentsControllerTest do
570571
end
571572
end
572573

573-
describe "POST /assessment_id, student" do
574+
describe "GET /assessment_id, student" do
574575
test "it renders previously submitted answers", %{
575576
conn: conn,
576577
users: %{student: student},
@@ -593,7 +594,7 @@ defmodule CadetWeb.AssessmentsControllerTest do
593594
resp_answers =
594595
conn
595596
|> sign_in(student)
596-
|> post(build_url(assessment.id))
597+
|> get(build_url(assessment.id))
597598
|> json_response(200)
598599
|> Map.get("questions", [])
599600
|> Enum.map(&Map.take(&1, ["answer"]))
@@ -617,7 +618,7 @@ defmodule CadetWeb.AssessmentsControllerTest do
617618
conn =
618619
conn
619620
|> sign_in(student)
620-
|> post(build_url(mission.assessment.id))
621+
|> get(build_url(mission.assessment.id))
621622

622623
assert response(conn, 401) == "Assessment not open"
623624
end
@@ -635,13 +636,13 @@ defmodule CadetWeb.AssessmentsControllerTest do
635636
conn =
636637
conn
637638
|> sign_in(student)
638-
|> post(build_url(mission.assessment.id))
639+
|> get(build_url(mission.assessment.id))
639640

640641
assert response(conn, 400) == "Assessment not found"
641642
end
642643
end
643644

644-
describe "POST /assessment_id, non-students" do
645+
describe "GET /assessment_id, non-students" do
645646
test "it renders empty answers", %{
646647
conn: conn,
647648
users: users,
@@ -654,7 +655,7 @@ defmodule CadetWeb.AssessmentsControllerTest do
654655
resp_answers =
655656
conn
656657
|> sign_in(user)
657-
|> post(build_url(assessment.id))
658+
|> get(build_url(assessment.id))
658659
|> json_response(200)
659660
|> Map.get("questions", [])
660661
|> Enum.map(&Map.get(&1, ["answer"]))
@@ -682,7 +683,7 @@ defmodule CadetWeb.AssessmentsControllerTest do
682683
resp =
683684
conn
684685
|> sign_in(user)
685-
|> post(build_url(mission.assessment.id))
686+
|> get(build_url(mission.assessment.id))
686687
|> json_response(200)
687688

688689
assert resp["id"] == mission.assessment.id
@@ -705,22 +706,22 @@ defmodule CadetWeb.AssessmentsControllerTest do
705706
resp =
706707
conn
707708
|> sign_in(user)
708-
|> post(build_url(mission.assessment.id))
709+
|> get(build_url(mission.assessment.id))
709710
|> json_response(200)
710711

711712
assert resp["id"] == mission.assessment.id
712713
end
713714
end
714715
end
715716

716-
describe "POST /assessment_id/submit unauthenticated" do
717+
describe "GET /assessment_id/submit unauthenticated" do
717718
test "is not permitted", %{conn: conn, assessments: %{"mission" => %{assessment: assessment}}} do
718719
conn = post(conn, build_url_submit(assessment.id))
719720
assert response(conn, 401) == "Unauthorised"
720721
end
721722
end
722723

723-
describe "POST /assessment_id/submit students" do
724+
describe "GET /assessment_id/submit students" do
724725
for role <- ~w(student staff admin)a do
725726
@tag role: role
726727
test "is successful for attempted assessments for #{role}", %{
@@ -1062,7 +1063,7 @@ defmodule CadetWeb.AssessmentsControllerTest do
10621063
|> Repo.update!()
10631064

10641065
for {_role, user} <- users do
1065-
conn = conn |> sign_in(user) |> post(build_url(assessment.id))
1066+
conn = conn |> sign_in(user) |> get(build_url(assessment.id))
10661067
assert response(conn, 403) == "Missing Password."
10671068
end
10681069
end
@@ -1085,7 +1086,7 @@ defmodule CadetWeb.AssessmentsControllerTest do
10851086
conn =
10861087
conn
10871088
|> sign_in(user)
1088-
|> post(build_url(assessment.id), %{:password => "wrong"})
1089+
|> post(build_url_unlock(assessment.id), %{:password => "wrong"})
10891090

10901091
assert response(conn, 403) == "Invalid Password."
10911092
end
@@ -1107,7 +1108,7 @@ defmodule CadetWeb.AssessmentsControllerTest do
11071108
|> Repo.update!()
11081109

11091110
insert(:submission, %{assessment: assessment, student: student})
1110-
conn = conn |> sign_in(student) |> post(build_url(assessment.id))
1111+
conn = conn |> sign_in(student) |> get(build_url(assessment.id))
11111112
assert response(conn, 200)
11121113
end
11131114

@@ -1122,7 +1123,7 @@ defmodule CadetWeb.AssessmentsControllerTest do
11221123
conn =
11231124
conn
11241125
|> sign_in(user)
1125-
|> post(build_url(assessment.id), %{:password => "wrong"})
1126+
|> post(build_url_unlock(assessment.id), %{:password => "wrong"})
11261127
|> json_response(200)
11271128

11281129
assert conn["id"] == assessment.id
@@ -1145,7 +1146,7 @@ defmodule CadetWeb.AssessmentsControllerTest do
11451146
conn =
11461147
conn
11471148
|> sign_in(user)
1148-
|> post(build_url(assessment.id), %{:password => "mysupersecretpassword"})
1149+
|> post(build_url_unlock(assessment.id), %{:password => "mysupersecretpassword"})
11491150
|> json_response(200)
11501151

11511152
assert conn["id"] == assessment.id
@@ -1167,7 +1168,7 @@ defmodule CadetWeb.AssessmentsControllerTest do
11671168
conn =
11681169
conn
11691170
|> sign_in(student)
1170-
|> post(build_url(mission.assessment.id))
1171+
|> get(build_url(mission.assessment.id))
11711172

11721173
assert response(conn, 200)
11731174
end
@@ -1176,6 +1177,7 @@ defmodule CadetWeb.AssessmentsControllerTest do
11761177
defp build_url, do: "/v2/assessments/"
11771178
defp build_url(assessment_id), do: "/v2/assessments/#{assessment_id}"
11781179
defp build_url_submit(assessment_id), do: "/v2/assessments/#{assessment_id}/submit"
1180+
defp build_url_unlock(assessment_id), do: "/v2/assessments/#{assessment_id}/unlock"
11791181

11801182
defp open_at_asc_comparator(x, y), do: Timex.before?(x.open_at, y.open_at)
11811183

0 commit comments

Comments
 (0)