@@ -64,7 +64,8 @@ defmodule CadetWeb.AssessmentsControllerTest do
64
64
"maxXp" => 4500 ,
65
65
"status" => get_assessment_status ( user , & 1 ) ,
66
66
"gradingStatus" => "excluded" ,
67
- "private" => false
67
+ "private" => false ,
68
+ "isPublished" => & 1 . is_published
68
69
}
69
70
)
70
71
@@ -80,7 +81,7 @@ defmodule CadetWeb.AssessmentsControllerTest do
80
81
end
81
82
end
82
83
83
- test "does not render unpublished assessments" , % {
84
+ test "render password protected assessments properly " , % {
84
85
conn: conn ,
85
86
users: users ,
86
87
assessments: assessments
@@ -90,74 +91,73 @@ defmodule CadetWeb.AssessmentsControllerTest do
90
91
91
92
{ :ok , _ } =
92
93
mission . assessment
93
- |> Assessment . changeset ( % { is_published: false } )
94
+ |> Assessment . changeset ( % { password: "mysupersecretpassword" } )
94
95
|> Repo . update ( )
95
96
96
- expected =
97
- assessments
98
- |> Map . delete ( :mission )
99
- |> Map . values ( )
100
- |> Enum . map ( fn a -> a . assessment end )
101
- |> Enum . sort ( & open_at_asc_comparator / 2 )
102
- |> Enum . map (
103
- & % {
104
- "id" => & 1 . id ,
105
- "title" => & 1 . title ,
106
- "shortSummary" => & 1 . summary_short ,
107
- "story" => & 1 . story ,
108
- "number" => & 1 . number ,
109
- "reading" => & 1 . reading ,
110
- "openAt" => format_datetime ( & 1 . open_at ) ,
111
- "closeAt" => format_datetime ( & 1 . close_at ) ,
112
- "type" => "#{ & 1 . type } " ,
113
- "coverImage" => & 1 . cover_picture ,
114
- "maxGrade" => 720 ,
115
- "maxXp" => 4500 ,
116
- "status" => get_assessment_status ( user , & 1 ) ,
117
- "gradingStatus" => "excluded" ,
118
- "private" => false
119
- }
120
- )
121
-
122
97
resp =
123
98
conn
124
99
|> sign_in ( user )
125
100
|> get ( build_url ( ) )
126
101
|> json_response ( 200 )
127
- |> Enum . map ( & Map . delete ( & 1 , "xp ") )
128
- |> Enum . map ( & Map . delete ( & 1 , "grade" ) )
102
+ |> Enum . find ( & ( & 1 [ "type" ] == "mission ") )
103
+ |> Map . get ( "private" )
129
104
130
- assert expected == resp
105
+ assert resp == true
131
106
end
132
107
end
108
+ end
133
109
134
- test "render password protected assessments properly" , % {
110
+ describe "GET /, student only" do
111
+ test "does not render unpublished assessments" , % {
135
112
conn: conn ,
136
- users: users ,
113
+ users: % { student: student } ,
137
114
assessments: assessments
138
115
} do
139
- for { _role , user } <- users do
140
- mission = assessments . mission
116
+ mission = assessments . mission
141
117
142
- { :ok , _ } =
143
- mission . assessment
144
- |> Assessment . changeset ( % { password: "mysupersecretpassword" } )
145
- |> Repo . update ( )
118
+ { :ok , _ } =
119
+ mission . assessment
120
+ |> Assessment . changeset ( % { is_published: false } )
121
+ |> Repo . update ( )
146
122
147
- resp =
148
- conn
149
- |> sign_in ( user )
150
- |> get ( build_url ( ) )
151
- |> json_response ( 200 )
152
- |> Enum . find ( & ( & 1 [ "type" ] == "mission" ) )
153
- |> Map . get ( "private" )
123
+ expected =
124
+ assessments
125
+ |> Map . delete ( :mission )
126
+ |> Map . values ( )
127
+ |> Enum . map ( fn a -> a . assessment end )
128
+ |> Enum . sort ( & open_at_asc_comparator / 2 )
129
+ |> Enum . map (
130
+ & % {
131
+ "id" => & 1 . id ,
132
+ "title" => & 1 . title ,
133
+ "shortSummary" => & 1 . summary_short ,
134
+ "story" => & 1 . story ,
135
+ "number" => & 1 . number ,
136
+ "reading" => & 1 . reading ,
137
+ "openAt" => format_datetime ( & 1 . open_at ) ,
138
+ "closeAt" => format_datetime ( & 1 . close_at ) ,
139
+ "type" => "#{ & 1 . type } " ,
140
+ "coverImage" => & 1 . cover_picture ,
141
+ "maxGrade" => 720 ,
142
+ "maxXp" => 4500 ,
143
+ "status" => get_assessment_status ( student , & 1 ) ,
144
+ "gradingStatus" => "excluded" ,
145
+ "private" => false ,
146
+ "isPublished" => & 1 . is_published
147
+ }
148
+ )
154
149
155
- assert resp == true
156
- end
150
+ resp =
151
+ conn
152
+ |> sign_in ( student )
153
+ |> get ( build_url ( ) )
154
+ |> json_response ( 200 )
155
+ |> Enum . map ( & Map . delete ( & 1 , "xp" ) )
156
+ |> Enum . map ( & Map . delete ( & 1 , "grade" ) )
157
+
158
+ assert expected == resp
157
159
end
158
- end
159
160
160
- describe "GET /, student only" do
161
161
test "renders student submission status in overview" , % {
162
162
conn: conn ,
163
163
users: % { student: student } ,
@@ -220,6 +220,65 @@ defmodule CadetWeb.AssessmentsControllerTest do
220
220
end
221
221
end
222
222
223
+ describe "GET /, non-students" do
224
+ test "renders unpublished assessments" , % {
225
+ conn: conn ,
226
+ users: users ,
227
+ assessments: assessments
228
+ } do
229
+ for role <- ~w( staff admin) a do
230
+ user = Map . get ( users , role )
231
+ mission = assessments . mission
232
+
233
+ { :ok , _ } =
234
+ mission . assessment
235
+ |> Assessment . changeset ( % { is_published: false } )
236
+ |> Repo . update ( )
237
+
238
+ resp =
239
+ conn
240
+ |> sign_in ( user )
241
+ |> get ( build_url ( ) )
242
+ |> json_response ( 200 )
243
+ |> Enum . map ( & Map . delete ( & 1 , "xp" ) )
244
+ |> Enum . map ( & Map . delete ( & 1 , "grade" ) )
245
+
246
+ expected =
247
+ assessments
248
+ |> Map . values ( )
249
+ |> Enum . map ( fn a -> a . assessment end )
250
+ |> Enum . sort ( & open_at_asc_comparator / 2 )
251
+ |> Enum . map (
252
+ & % {
253
+ "id" => & 1 . id ,
254
+ "title" => & 1 . title ,
255
+ "shortSummary" => & 1 . summary_short ,
256
+ "story" => & 1 . story ,
257
+ "number" => & 1 . number ,
258
+ "reading" => & 1 . reading ,
259
+ "openAt" => format_datetime ( & 1 . open_at ) ,
260
+ "closeAt" => format_datetime ( & 1 . close_at ) ,
261
+ "type" => "#{ & 1 . type } " ,
262
+ "coverImage" => & 1 . cover_picture ,
263
+ "maxGrade" => 720 ,
264
+ "maxXp" => 4500 ,
265
+ "status" => get_assessment_status ( user , & 1 ) ,
266
+ "gradingStatus" => "excluded" ,
267
+ "private" => false ,
268
+ "isPublished" =>
269
+ if & 1 . type == :mission do
270
+ false
271
+ else
272
+ & 1 . is_published
273
+ end
274
+ }
275
+ )
276
+
277
+ assert expected == resp
278
+ end
279
+ end
280
+ end
281
+
223
282
describe "POST /assessment_id, all roles" do
224
283
test "it renders assessment details" , % {
225
284
conn: conn ,
@@ -499,28 +558,6 @@ defmodule CadetWeb.AssessmentsControllerTest do
499
558
end
500
559
end
501
560
end
502
-
503
- test "it does not permit access to unpublished assessments" , % {
504
- conn: conn ,
505
- users: users ,
506
- assessments: % { mission: mission }
507
- } do
508
- for role <- Role . __enum_map__ ( ) do
509
- user = Map . get ( users , role )
510
-
511
- { :ok , _ } =
512
- mission . assessment
513
- |> Assessment . changeset ( % { is_published: false } )
514
- |> Repo . update ( )
515
-
516
- conn =
517
- conn
518
- |> sign_in ( user )
519
- |> post ( build_url ( mission . assessment . id ) )
520
-
521
- assert response ( conn , 400 ) == "Assessment not found"
522
- end
523
- end
524
561
end
525
562
526
563
describe "POST /assessment_id, student" do
@@ -601,6 +638,24 @@ defmodule CadetWeb.AssessmentsControllerTest do
601
638
602
639
assert response ( conn , 401 ) == "Assessment not open"
603
640
end
641
+
642
+ test "it does not permit access to unpublished assessments" , % {
643
+ conn: conn ,
644
+ users: % { student: student } ,
645
+ assessments: % { mission: mission }
646
+ } do
647
+ { :ok , _ } =
648
+ mission . assessment
649
+ |> Assessment . changeset ( % { is_published: false } )
650
+ |> Repo . update ( )
651
+
652
+ conn =
653
+ conn
654
+ |> sign_in ( student )
655
+ |> post ( build_url ( mission . assessment . id ) )
656
+
657
+ assert response ( conn , 400 ) == "Assessment not found"
658
+ end
604
659
end
605
660
606
661
describe "POST /assessment_id, non-students" do
@@ -650,6 +705,29 @@ defmodule CadetWeb.AssessmentsControllerTest do
650
705
assert resp [ "id" ] == mission . assessment . id
651
706
end
652
707
end
708
+
709
+ test "it permits access to unpublished assessments" , % {
710
+ conn: conn ,
711
+ users: users ,
712
+ assessments: % { mission: mission }
713
+ } do
714
+ for role <- ~w( staff admin) a do
715
+ user = Map . get ( users , role )
716
+
717
+ { :ok , _ } =
718
+ mission . assessment
719
+ |> Assessment . changeset ( % { is_published: false } )
720
+ |> Repo . update ( )
721
+
722
+ resp =
723
+ conn
724
+ |> sign_in ( user )
725
+ |> post ( build_url ( mission . assessment . id ) )
726
+ |> json_response ( 200 )
727
+
728
+ assert resp [ "id" ] == mission . assessment . id
729
+ end
730
+ end
653
731
end
654
732
655
733
describe "POST /assessment_id/submit unauthenticated" do
0 commit comments