@@ -77,7 +77,7 @@ public void ComputeDevelopmentManifest_ReplacesAssetTokens(string fingerprintExp
77
77
78
78
var expectedManifest = CreateExpectedManifest (
79
79
CreateIntermediateNode (
80
- ( path , CreateMatchNode ( 0 , fileName ) ) ) ,
80
+ ( path , CreateMatchNode ( 0 , path ) ) ) ,
81
81
Environment . CurrentDirectory ) ;
82
82
83
83
var task = new GenerateStaticWebAssetsDevelopmentManifest ( )
@@ -95,6 +95,133 @@ public void ComputeDevelopmentManifest_ReplacesAssetTokens(string fingerprintExp
95
95
manifest . Should ( ) . BeEquivalentTo ( expectedManifest ) ;
96
96
}
97
97
98
+ [ Theory ]
99
+ [ InlineData ( "#[.{fingerprint}]?" , "index.html" , "optional.html" ) ]
100
+ [ InlineData ( "#[.{fingerprint}]!" , "index.fingerprint.html" , "preferred.html" ) ]
101
+ [ InlineData ( "#[.{fingerprint}]" , "index.fingerprint.html" , "required.html" ) ]
102
+ public void ComputeDevelopmentManifest_ReplacesAssetTokens_FileExists ( string fingerprintExpression , string path , string subPath )
103
+ {
104
+ // Arrange
105
+ var messages = new List < string > ( ) ;
106
+ var buildEngine = new Mock < IBuildEngine > ( ) ;
107
+ buildEngine . Setup ( e => e . LogMessageEvent ( It . IsAny < BuildMessageEventArgs > ( ) ) )
108
+ . Callback < BuildMessageEventArgs > ( args => messages . Add ( args . Message ) ) ;
109
+
110
+ var expectedManifest = CreateExpectedManifest (
111
+ CreateIntermediateNode (
112
+ ( path , CreateMatchNode ( 0 , subPath ) ) ) ,
113
+ Environment . CurrentDirectory ) ;
114
+
115
+ var task = new GenerateStaticWebAssetsDevelopmentManifest ( )
116
+ {
117
+ BuildEngine = buildEngine . Object ,
118
+ } ;
119
+
120
+ var assets = new [ ] { CreateAsset ( subPath , $ "index{ fingerprintExpression } .html", assetKind : StaticWebAsset . AssetKinds . All ) } ;
121
+ var patterns = Array . Empty < StaticWebAssetsDiscoveryPattern > ( ) ;
122
+
123
+ var fileName = Path . Combine ( Environment . CurrentDirectory , subPath ) ;
124
+ try
125
+ {
126
+ File . WriteAllText ( fileName , "content" ) ;
127
+ // Act
128
+ var manifest = task . ComputeDevelopmentManifest ( assets , patterns ) ;
129
+
130
+ // Assert
131
+ manifest . Should ( ) . BeEquivalentTo ( expectedManifest ) ;
132
+ }
133
+ finally
134
+ {
135
+ if ( File . Exists ( fileName ) )
136
+ {
137
+ File . Delete ( fileName ) ;
138
+ }
139
+ }
140
+ }
141
+
142
+ [ Fact ]
143
+ public void ComputeDevelopmentManifest_UsesIdentitySubpath_WhenFileExists_AndContentRoot_IsPrefix ( )
144
+ {
145
+ // Arrange
146
+ var messages = new List < string > ( ) ;
147
+ var buildEngine = new Mock < IBuildEngine > ( ) ;
148
+ buildEngine . Setup ( e => e . LogMessageEvent ( It . IsAny < BuildMessageEventArgs > ( ) ) )
149
+ . Callback < BuildMessageEventArgs > ( args => messages . Add ( args . Message ) ) ;
150
+
151
+ var expectedManifest = CreateExpectedManifest (
152
+ CreateIntermediateNode (
153
+ ( "_framework" ,
154
+ CreateIntermediateNode (
155
+ ( "dotnet.native.fingerprint.js.gz" , CreateMatchNode ( 0 , "blob-hash.gz" ) ) ) ) ) ,
156
+ Environment . CurrentDirectory ) ;
157
+
158
+ var task = new GenerateStaticWebAssetsDevelopmentManifest ( )
159
+ {
160
+ BuildEngine = buildEngine . Object ,
161
+ } ;
162
+
163
+ var fileName = Path . Combine ( Environment . CurrentDirectory , "blob-hash.gz" ) ;
164
+ try
165
+ {
166
+ File . WriteAllText ( fileName , "content" ) ;
167
+ var assets = new [ ] { CreateAsset (
168
+ fileName ,
169
+ $$ """ _framework/dotnet.native#[.{fingerprint}]!.js.gz""" ,
170
+ contentRoot : Environment . CurrentDirectory ,
171
+ assetKind : StaticWebAsset . AssetKinds . All ) } ;
172
+ var patterns = Array . Empty < StaticWebAssetsDiscoveryPattern > ( ) ;
173
+
174
+ // Act
175
+ var manifest = task . ComputeDevelopmentManifest ( assets , patterns ) ;
176
+
177
+ // Assert
178
+ manifest . Should ( ) . BeEquivalentTo ( expectedManifest ) ;
179
+ }
180
+ finally
181
+ {
182
+ if ( File . Exists ( fileName ) )
183
+ {
184
+ File . Delete ( fileName ) ;
185
+ }
186
+ }
187
+ }
188
+
189
+ [ Fact ]
190
+ public void ComputeDevelopmentManifest_UsesRelativePath_ReplacesAssetTokens_WhenFileDoesNotExist_AtIdentity ( )
191
+ {
192
+ // Arrange
193
+ var messages = new List < string > ( ) ;
194
+ var buildEngine = new Mock < IBuildEngine > ( ) ;
195
+ buildEngine . Setup ( e => e . LogMessageEvent ( It . IsAny < BuildMessageEventArgs > ( ) ) )
196
+ . Callback < BuildMessageEventArgs > ( args => messages . Add ( args . Message ) ) ;
197
+
198
+ var expectedManifest = CreateExpectedManifest (
199
+ CreateIntermediateNode (
200
+ ( "_framework" ,
201
+ CreateIntermediateNode (
202
+ ( "dotnet.native.fingerprint.js" , CreateMatchNode ( 0 , "_framework/dotnet.native.fingerprint.js" ) ) ) ) ) ,
203
+ Environment . CurrentDirectory ) ;
204
+
205
+ var task = new GenerateStaticWebAssetsDevelopmentManifest ( )
206
+ {
207
+ BuildEngine = buildEngine . Object ,
208
+ } ;
209
+
210
+ var fileName = Path . Combine ( Environment . CurrentDirectory , "dotnet.native.js" ) ;
211
+ var assets = new [ ] { CreateAsset (
212
+ fileName ,
213
+ $$ """ _framework/dotnet.native#[.{fingerprint}]!.js""" ,
214
+ contentRoot : Environment . CurrentDirectory ,
215
+ assetKind : StaticWebAsset . AssetKinds . All ) } ;
216
+ var patterns = Array . Empty < StaticWebAssetsDiscoveryPattern > ( ) ;
217
+
218
+ // Act
219
+ var manifest = task . ComputeDevelopmentManifest ( assets , patterns ) ;
220
+
221
+ // Assert
222
+ manifest . Should ( ) . BeEquivalentTo ( expectedManifest ) ;
223
+ }
224
+
98
225
[ Fact ]
99
226
public void ComputeDevelopmentManifest_IncludesAllAssets ( )
100
227
{
@@ -205,11 +332,23 @@ public void ComputeDevelopmentManifest_PrefersBuildAssetsOverAllAssets()
205
332
} ;
206
333
var patterns = Array . Empty < StaticWebAssetsDiscoveryPattern > ( ) ;
207
334
208
- // Act
209
- var manifest = task . ComputeDevelopmentManifest ( assets , patterns ) ;
210
-
211
- // Assert
212
- manifest . Should ( ) . BeEquivalentTo ( expectedManifest ) ;
335
+ var fileName = Path . Combine ( Environment . CurrentDirectory , "index.build.html" ) ;
336
+ try
337
+ {
338
+ File . WriteAllText ( fileName , "content" ) ;
339
+ // Act
340
+ var manifest = task . ComputeDevelopmentManifest ( assets , patterns ) ;
341
+
342
+ // Assert
343
+ manifest . Should ( ) . BeEquivalentTo ( expectedManifest ) ;
344
+ }
345
+ finally
346
+ {
347
+ if ( File . Exists ( fileName ) )
348
+ {
349
+ File . Delete ( fileName ) ;
350
+ }
351
+ }
213
352
}
214
353
215
354
[ Fact ]
@@ -221,9 +360,10 @@ public void ComputeDevelopmentManifest_UsesIdentityWhenContentRootStartsByIdenti
221
360
buildEngine . Setup ( e => e . LogMessageEvent ( It . IsAny < BuildMessageEventArgs > ( ) ) )
222
361
. Callback < BuildMessageEventArgs > ( args => messages . Add ( args . Message ) ) ;
223
362
363
+ var filePath = Path . Combine ( "some" , "subfolder" , "index.build.html" ) ;
224
364
var expectedManifest = CreateExpectedManifest (
225
365
CreateIntermediateNode (
226
- ( "index.html" , CreateMatchNode ( 0 , StaticWebAsset . Normalize ( Path . Combine ( "some" , "subfolder" , "index.build.html" ) ) ) ) ) ,
366
+ ( "index.html" , CreateMatchNode ( 0 , StaticWebAsset . Normalize ( filePath ) ) ) ) ,
227
367
Environment . CurrentDirectory ) ;
228
368
229
369
var task = new GenerateStaticWebAssetsDevelopmentManifest ( )
@@ -233,15 +373,28 @@ public void ComputeDevelopmentManifest_UsesIdentityWhenContentRootStartsByIdenti
233
373
} ;
234
374
235
375
var assets = new [ ] {
236
- CreateAsset ( Path . Combine ( "some" , "subfolder" , "index.build.html" ) , "index.html" ) ,
376
+ CreateAsset ( filePath , "index.html" ) ,
237
377
} ;
238
378
var patterns = Array . Empty < StaticWebAssetsDiscoveryPattern > ( ) ;
239
379
240
- // Act
241
- var manifest = task . ComputeDevelopmentManifest ( assets , patterns ) ;
380
+ try
381
+ {
382
+ Directory . CreateDirectory ( Path . GetDirectoryName ( filePath ) ) ;
383
+ File . WriteAllText ( filePath , "content" ) ;
242
384
243
- // Assert
244
- manifest . Should ( ) . BeEquivalentTo ( expectedManifest ) ;
385
+ // Act
386
+ var manifest = task . ComputeDevelopmentManifest ( assets , patterns ) ;
387
+
388
+ // Assert
389
+ manifest . Should ( ) . BeEquivalentTo ( expectedManifest ) ;
390
+ }
391
+ finally
392
+ {
393
+ if ( File . Exists ( filePath ) )
394
+ {
395
+ File . Delete ( filePath ) ;
396
+ }
397
+ }
245
398
}
246
399
247
400
[ Fact ]
0 commit comments