1
+ using GovUk . Education . ExploreEducationStatistics . Common . Extensions ;
1
2
using GovUk . Education . ExploreEducationStatistics . Common . Tests . Fixtures ;
3
+ using GovUk . Education . ExploreEducationStatistics . Public . Data . Api . Constants ;
2
4
using GovUk . Education . ExploreEducationStatistics . Public . Data . Api . Security . AuthorizationHandlers ;
5
+ using GovUk . Education . ExploreEducationStatistics . Public . Data . Api . Services ;
6
+ using GovUk . Education . ExploreEducationStatistics . Public . Data . Api . Services . Security ;
3
7
using GovUk . Education . ExploreEducationStatistics . Public . Data . Api . Tests . TheoryData ;
4
8
using GovUk . Education . ExploreEducationStatistics . Public . Data . Model ;
9
+ using GovUk . Education . ExploreEducationStatistics . Public . Data . Model . Database ;
5
10
using GovUk . Education . ExploreEducationStatistics . Public . Data . Model . Tests . Fixtures ;
11
+ using Microsoft . AspNetCore . Hosting ;
12
+ using Microsoft . AspNetCore . Http ;
13
+ using Microsoft . Extensions . Primitives ;
14
+ using Moq ;
15
+ using Moq . EntityFrameworkCore ;
6
16
using static GovUk . Education . ExploreEducationStatistics . Common . Security . AuthorizationHandlerContextFactory ;
7
17
8
18
namespace GovUk . Education . ExploreEducationStatistics . Public . Data . Api . Tests . Security . AuthorizationHandlers ;
@@ -14,7 +24,7 @@ public class ViewDataSetAuthorizationHandlerTests
14
24
[ Theory ]
15
25
[ MemberData ( nameof ( DataSetStatusTheoryData . AvailableStatuses ) ,
16
26
MemberType = typeof ( DataSetStatusTheoryData ) ) ]
17
- public void Success ( DataSetStatus status )
27
+ public async Task DataSetHasAvailableStatus_Success ( DataSetStatus status )
18
28
{
19
29
DataSet dataSet = _dataFixture
20
30
. DefaultDataSet ( )
@@ -23,15 +33,15 @@ public void Success(DataSetStatus status)
23
33
var handler = BuildHandler ( ) ;
24
34
var context = CreateAnonymousAuthContext < ViewDataSetRequirement , DataSet > ( dataSet ) ;
25
35
26
- handler . HandleAsync ( context ) ;
36
+ await handler . HandleAsync ( context ) ;
27
37
28
38
Assert . True ( context . HasSucceeded ) ;
29
39
}
30
40
31
41
[ Theory ]
32
42
[ MemberData ( nameof ( DataSetStatusTheoryData . UnavailableStatuses ) ,
33
43
MemberType = typeof ( DataSetStatusTheoryData ) ) ]
34
- public void Failure ( DataSetStatus status )
44
+ public async Task DataSetHasUnavailableStatus_Failure ( DataSetStatus status )
35
45
{
36
46
DataSet dataSet = _dataFixture
37
47
. DefaultDataSet ( )
@@ -40,13 +50,219 @@ public void Failure(DataSetStatus status)
40
50
var handler = BuildHandler ( ) ;
41
51
var context = CreateAnonymousAuthContext < ViewDataSetRequirement , DataSet > ( dataSet ) ;
42
52
43
- handler . HandleAsync ( context ) ;
53
+ await handler . HandleAsync ( context ) ;
44
54
45
55
Assert . False ( context . HasSucceeded ) ;
46
56
}
57
+
58
+ [ Theory ]
59
+ [ MemberData ( nameof ( DataSetStatusTheoryData . AllStatuses ) ,
60
+ MemberType = typeof ( DataSetStatusTheoryData ) ) ]
61
+ public async Task PreviewTokenForDraftDataSetVersionActive_Success ( DataSetStatus status )
62
+ {
63
+ DataSet dataSet = _dataFixture
64
+ . DefaultDataSet ( )
65
+ . WithStatus ( status ) ;
66
+
67
+ DataSetVersion dataSetVersion = _dataFixture
68
+ . DefaultDataSetVersion ( )
69
+ . WithStatus ( DataSetVersionStatus . Draft )
70
+ . WithPreviewTokens ( ( ) => [ _dataFixture . DefaultPreviewToken ( ) ] )
71
+ . FinishWith ( dsv => dataSet . LatestDraftVersionId = dsv . Id ) ;
72
+
73
+ var publicDataDbContext = new Mock < PublicDataDbContext > ( ) ;
74
+ publicDataDbContext . SetupGet ( dbContext => dbContext . DataSets ) . ReturnsDbSet ( [ dataSet ] ) ;
75
+ publicDataDbContext . SetupGet ( dbContext => dbContext . DataSetVersions ) . ReturnsDbSet ( [ dataSetVersion ] ) ;
76
+ publicDataDbContext . SetupGet ( dbContext => dbContext . PreviewTokens ) . ReturnsDbSet ( dataSetVersion . PreviewTokens ) ;
77
+
78
+ var handler = BuildHandler (
79
+ publicDataDbContext : publicDataDbContext . Object ,
80
+ requestHeaders :
81
+ [
82
+ PreviewTokenRequestHeader ( dataSetVersion . PreviewTokens [ 0 ] )
83
+ ] ) ;
84
+ var context = CreateAnonymousAuthContext < ViewDataSetRequirement , DataSet > ( dataSet ) ;
85
+
86
+ await handler . HandleAsync ( context ) ;
87
+
88
+ Assert . True ( context . HasSucceeded ) ;
89
+ }
90
+
91
+ /// <summary>
92
+ /// Despite the Preview Token being used is expired, the DataSet's status itself is
93
+ /// available to the public, and so the auth succeeds.
94
+ /// </summary>
95
+ [ Theory ]
96
+ [ MemberData ( nameof ( DataSetStatusTheoryData . AvailableStatuses ) ,
97
+ MemberType = typeof ( DataSetStatusTheoryData ) ) ]
98
+ public async Task PreviewTokenForDraftDataSetVersionExpired_DataSetStatusAvailable_Success ( DataSetStatus status )
99
+ {
100
+ DataSet dataSet = _dataFixture
101
+ . DefaultDataSet ( )
102
+ . WithStatus ( status ) ;
103
+
104
+ DataSetVersion dataSetVersion = _dataFixture
105
+ . DefaultDataSetVersion ( )
106
+ . WithStatus ( DataSetVersionStatus . Draft )
107
+ . WithPreviewTokens ( ( ) => [ _dataFixture . DefaultPreviewToken ( expired : true ) ] )
108
+ . FinishWith ( dsv => dataSet . LatestDraftVersionId = dsv . Id ) ;
109
+
110
+ var publicDataDbContext = new Mock < PublicDataDbContext > ( ) ;
111
+ publicDataDbContext . SetupGet ( dbContext => dbContext . DataSets ) . ReturnsDbSet ( [ dataSet ] ) ;
112
+ publicDataDbContext . SetupGet ( dbContext => dbContext . DataSetVersions ) . ReturnsDbSet ( [ dataSetVersion ] ) ;
113
+ publicDataDbContext . SetupGet ( dbContext => dbContext . PreviewTokens ) . ReturnsDbSet ( dataSetVersion . PreviewTokens ) ;
114
+
115
+ var handler = BuildHandler (
116
+ publicDataDbContext : publicDataDbContext . Object ,
117
+ requestHeaders :
118
+ [
119
+ PreviewTokenRequestHeader ( dataSetVersion . PreviewTokens [ 0 ] )
120
+ ] ) ;
121
+ var context = CreateAnonymousAuthContext < ViewDataSetRequirement , DataSet > ( dataSet ) ;
122
+
123
+ await handler . HandleAsync ( context ) ;
124
+
125
+ Assert . True ( context . HasSucceeded ) ;
126
+ }
127
+
128
+ /// <summary>
129
+ /// The Preview Token being used is expired and the DataSet's status is
130
+ /// unavailable to the public, and so the auth fails.
131
+ /// </summary>
132
+ [ Theory ]
133
+ [ MemberData ( nameof ( DataSetStatusTheoryData . UnavailableStatuses ) ,
134
+ MemberType = typeof ( DataSetStatusTheoryData ) ) ]
135
+ public async Task PreviewTokenForDraftDataSetVersionExpired_DataSetStatusUnavailable_Failure ( DataSetStatus status )
136
+ {
137
+ DataSet dataSet = _dataFixture
138
+ . DefaultDataSet ( )
139
+ . WithStatus ( status ) ;
140
+
141
+ DataSetVersion dataSetVersion = _dataFixture
142
+ . DefaultDataSetVersion ( )
143
+ . WithStatus ( DataSetVersionStatus . Draft )
144
+ . WithPreviewTokens ( ( ) => [ _dataFixture . DefaultPreviewToken ( expired : true ) ] )
145
+ . FinishWith ( dsv => dataSet . LatestDraftVersionId = dsv . Id ) ;
146
+
147
+ var publicDataDbContext = new Mock < PublicDataDbContext > ( ) ;
148
+ publicDataDbContext . SetupGet ( dbContext => dbContext . DataSets ) . ReturnsDbSet ( [ dataSet ] ) ;
149
+ publicDataDbContext . SetupGet ( dbContext => dbContext . DataSetVersions ) . ReturnsDbSet ( [ dataSetVersion ] ) ;
150
+ publicDataDbContext . SetupGet ( dbContext => dbContext . PreviewTokens ) . ReturnsDbSet ( dataSetVersion . PreviewTokens ) ;
151
+
152
+ var handler = BuildHandler (
153
+ publicDataDbContext : publicDataDbContext . Object ,
154
+ requestHeaders :
155
+ [
156
+ PreviewTokenRequestHeader ( dataSetVersion . PreviewTokens [ 0 ] )
157
+ ] ) ;
158
+ var context = CreateAnonymousAuthContext < ViewDataSetRequirement , DataSet > ( dataSet ) ;
159
+
160
+ await handler . HandleAsync ( context ) ;
161
+
162
+ Assert . False ( context . HasSucceeded ) ;
163
+ }
164
+
165
+ /// <summary>
166
+ /// Despite the Preview Token being used is for a non-draft DataSetVersion, the DataSet's
167
+ /// status itself is available to the public, and so the auth succeeds.
168
+ /// </summary>
169
+ [ Theory ]
170
+ [ MemberData ( nameof ( DataSetStatusTheoryData . AvailableStatuses ) ,
171
+ MemberType = typeof ( DataSetStatusTheoryData ) ) ]
172
+ public async Task PreviewTokenActiveButForLiveDataSetVersion_DataSetStatusAvailable_Success ( DataSetStatus status )
173
+ {
174
+ DataSet dataSet = _dataFixture
175
+ . DefaultDataSet ( )
176
+ . WithStatus ( status ) ;
177
+
178
+ DataSetVersion dataSetVersion = _dataFixture
179
+ . DefaultDataSetVersion ( )
180
+ . WithStatus ( DataSetVersionStatus . Published )
181
+ . WithPreviewTokens ( ( ) => [ _dataFixture . DefaultPreviewToken ( ) ] )
182
+ . FinishWith ( dsv => dataSet . LatestLiveVersionId = dsv . Id ) ;
183
+
184
+ var publicDataDbContext = new Mock < PublicDataDbContext > ( ) ;
185
+ publicDataDbContext . SetupGet ( dbContext => dbContext . DataSets ) . ReturnsDbSet ( [ dataSet ] ) ;
186
+ publicDataDbContext . SetupGet ( dbContext => dbContext . DataSetVersions ) . ReturnsDbSet ( [ dataSetVersion ] ) ;
187
+ publicDataDbContext . SetupGet ( dbContext => dbContext . PreviewTokens ) . ReturnsDbSet ( dataSetVersion . PreviewTokens ) ;
188
+
189
+ var handler = BuildHandler (
190
+ publicDataDbContext : publicDataDbContext . Object ,
191
+ requestHeaders :
192
+ [
193
+ PreviewTokenRequestHeader ( dataSetVersion . PreviewTokens [ 0 ] )
194
+ ] ) ;
195
+ var context = CreateAnonymousAuthContext < ViewDataSetRequirement , DataSet > ( dataSet ) ;
196
+
197
+ await handler . HandleAsync ( context ) ;
198
+
199
+ Assert . True ( context . HasSucceeded ) ;
200
+ }
201
+
202
+ /// <summary>
203
+ /// The Preview Token being used is for a non-draft DataSetVersion and the DataSet's
204
+ /// status itself is unavailable to the public, and so the auth false.
205
+ /// </summary>
206
+ [ Theory ]
207
+ [ MemberData ( nameof ( DataSetStatusTheoryData . UnavailableStatuses ) ,
208
+ MemberType = typeof ( DataSetStatusTheoryData ) ) ]
209
+ public async Task PreviewTokenActiveButForLiveDataSetVersion_DataSetStatusUnavailable_Failure ( DataSetStatus status )
210
+ {
211
+ DataSet dataSet = _dataFixture
212
+ . DefaultDataSet ( )
213
+ . WithStatus ( status ) ;
214
+
215
+ DataSetVersion dataSetVersion = _dataFixture
216
+ . DefaultDataSetVersion ( )
217
+ . WithStatus ( DataSetVersionStatus . Published )
218
+ . WithPreviewTokens ( ( ) => [ _dataFixture . DefaultPreviewToken ( ) ] )
219
+ . FinishWith ( dsv => dataSet . LatestLiveVersionId = dsv . Id ) ;
220
+
221
+ var publicDataDbContext = new Mock < PublicDataDbContext > ( ) ;
222
+ publicDataDbContext . SetupGet ( dbContext => dbContext . DataSets ) . ReturnsDbSet ( [ dataSet ] ) ;
223
+ publicDataDbContext . SetupGet ( dbContext => dbContext . DataSetVersions ) . ReturnsDbSet ( [ dataSetVersion ] ) ;
224
+ publicDataDbContext . SetupGet ( dbContext => dbContext . PreviewTokens ) . ReturnsDbSet ( dataSetVersion . PreviewTokens ) ;
225
+
226
+ var handler = BuildHandler (
227
+ publicDataDbContext : publicDataDbContext . Object ,
228
+ requestHeaders :
229
+ [
230
+ PreviewTokenRequestHeader ( dataSetVersion . PreviewTokens [ 0 ] )
231
+ ] ) ;
232
+ var context = CreateAnonymousAuthContext < ViewDataSetRequirement , DataSet > ( dataSet ) ;
233
+
234
+ await handler . HandleAsync ( context ) ;
235
+
236
+ Assert . False ( context . HasSucceeded ) ;
237
+ }
238
+
239
+ private static ViewDataSetAuthorizationHandler BuildHandler (
240
+ PublicDataDbContext ? publicDataDbContext = null ,
241
+ IList < KeyValuePair < string , StringValues > > ? requestHeaders = null )
242
+ {
243
+ var dbContext = publicDataDbContext ?? Mock . Of < PublicDataDbContext > ( ) ;
244
+
245
+ var httpContextAccessor = new HttpContextAccessor
246
+ {
247
+ HttpContext = new DefaultHttpContext ( )
248
+ } ;
249
+
250
+ var headers = httpContextAccessor . HttpContext . Request . Headers ;
251
+ requestHeaders ? . ForEach ( header =>
252
+ headers . Append ( header . Key , header . Value ) ) ;
253
+
254
+ var previewTokenService = new PreviewTokenService ( dbContext ) ;
255
+
256
+ var authorizationHandlerService = new AuthorizationHandlerService (
257
+ httpContextAccessor : httpContextAccessor ,
258
+ environment : Mock . Of < IWebHostEnvironment > ( ) ,
259
+ previewTokenService ) ;
260
+
261
+ return new ViewDataSetAuthorizationHandler ( authorizationHandlerService ) ;
262
+ }
47
263
48
- private static ViewDataSetAuthorizationHandler BuildHandler ( )
264
+ private static KeyValuePair < string , StringValues > PreviewTokenRequestHeader ( PreviewToken previewToken )
49
265
{
50
- return new ViewDataSetAuthorizationHandler ( ) ;
266
+ return new KeyValuePair < string , StringValues > ( RequestHeaderNames . PreviewToken , previewToken . Id . ToString ( ) ) ;
51
267
}
52
268
}
0 commit comments