|
9 | 9 | using System.Web.Mvc; |
10 | 10 | using Moq; |
11 | 11 | using NuGet.Services.Entities; |
| 12 | +using NuGetGallery.TestUtils; |
12 | 13 | using Xunit; |
13 | 14 |
|
14 | 15 | namespace NuGetGallery |
@@ -262,6 +263,133 @@ public async Task WhenValid_SavesReadMeFile() |
262 | 263 | } |
263 | 264 | } |
264 | 265 |
|
| 266 | + public class TheSaveReadmeFileAsyncMethod |
| 267 | + { |
| 268 | + [Fact] |
| 269 | + public async Task WhenPackageNull_ThrowsArgumentNullException() |
| 270 | + { |
| 271 | + var service = CreateService(); |
| 272 | + |
| 273 | + await Assert.ThrowsAsync<ArgumentNullException>(async () => await service.SaveReadmeFileAsync(null, Stream.Null)); |
| 274 | + } |
| 275 | + |
| 276 | + [Fact] |
| 277 | + public async Task WhenStreamIsNull_ThrowsArgumentException() |
| 278 | + { |
| 279 | + var service = CreateService(); |
| 280 | + var package = CreatePackage(); |
| 281 | + |
| 282 | + await Assert.ThrowsAsync<ArgumentNullException>(async () => await service.SaveReadmeFileAsync(package, null)); |
| 283 | + } |
| 284 | + |
| 285 | + [Fact] |
| 286 | + public async Task WhenEmbeddedReadmeTypeIsAbsent_ThrowsArgumentException() |
| 287 | + { |
| 288 | + var service = CreateService(); |
| 289 | + var package = CreatePackage(); |
| 290 | + package.EmbeddedReadmeType = EmbeddedReadmeFileType.Absent; |
| 291 | + var packageStream = GeneratePackageWithReadmeFile("readme.md"); |
| 292 | + |
| 293 | + var ex = await Assert.ThrowsAsync<ArgumentException>(() => service.SaveReadmeFileAsync(package, packageStream)); |
| 294 | + Assert.Equal("package", ex.ParamName); |
| 295 | + Assert.Contains("embedded readme", ex.Message); |
| 296 | + } |
| 297 | + |
| 298 | + [Fact] |
| 299 | + public async Task WhenValid_SavesReadmeFile() |
| 300 | + { |
| 301 | + // Arrange. |
| 302 | + var fileServiceMock = new Mock<IFileStorageService>(); |
| 303 | + fileServiceMock.Setup(f => f.SaveFileAsync(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<Stream>(), It.IsAny<bool>())) |
| 304 | + .Returns(Task.CompletedTask) |
| 305 | + .Verifiable(); |
| 306 | + var service = CreateService(fileServiceMock); |
| 307 | + |
| 308 | + var package = new Package() |
| 309 | + { |
| 310 | + PackageRegistration = new PackageRegistration() { Id = "Foo" }, |
| 311 | + Version = "1.0.0", |
| 312 | + EmbeddedReadmeType = EmbeddedReadmeFileType.Markdown |
| 313 | + }; |
| 314 | + var packageStream = GeneratePackageWithReadmeFile("readme.md"); |
| 315 | + |
| 316 | + // Act. |
| 317 | + await service.SaveReadmeFileAsync(package, packageStream); |
| 318 | + |
| 319 | + // Assert. |
| 320 | + fileServiceMock.Verify(f => f.SaveFileAsync(CoreConstants.Folders.PackageReadMesFolderName, "active/foo/1.0.0.md", It.IsAny<Stream>(), true), |
| 321 | + Times.Once); |
| 322 | + } |
| 323 | + } |
| 324 | + |
| 325 | + public class ExtractAndSaveReadmeFileAsyncMethod |
| 326 | + { |
| 327 | + [Fact] |
| 328 | + public async Task ThrowsWhenPackageIsNull() |
| 329 | + { |
| 330 | + var service = CreateService(); |
| 331 | + var ex = await Assert.ThrowsAsync<ArgumentNullException>(() => service.ExtractAndSaveReadmeFileAsync( |
| 332 | + package: null, |
| 333 | + packageStream: Mock.Of<Stream>())); |
| 334 | + |
| 335 | + Assert.Equal("package", ex.ParamName); |
| 336 | + } |
| 337 | + |
| 338 | + [Fact] |
| 339 | + public async Task ThrowsWhenPackagesStreamIsNull() |
| 340 | + { |
| 341 | + var service = CreateService(); |
| 342 | + var ex = await Assert.ThrowsAsync<ArgumentNullException>(() => service.ExtractAndSaveReadmeFileAsync( |
| 343 | + package: Mock.Of<Package>(), |
| 344 | + packageStream: null)); |
| 345 | + |
| 346 | + Assert.Equal("packageStream", ex.ParamName); |
| 347 | + } |
| 348 | + |
| 349 | + [Fact] |
| 350 | + public async Task ThrowsOnMissingReadmeFile() |
| 351 | + { |
| 352 | + var service = CreateService(); |
| 353 | + const string readmeFileName = "readme.md"; |
| 354 | + var packageStream = GeneratePackageWithReadmeFile(readmeFileName, false); |
| 355 | + var pacakge = PackageServiceUtility.CreateTestPackage(); |
| 356 | + |
| 357 | + var ex = await Assert.ThrowsAsync<FileNotFoundException>(() => service.ExtractAndSaveReadmeFileAsync(pacakge, packageStream)); |
| 358 | + Assert.Contains(readmeFileName, ex.Message); |
| 359 | + } |
| 360 | + |
| 361 | + [Theory] |
| 362 | + [InlineData("readme.md")] |
| 363 | + [InlineData("foo\\readme.md")] |
| 364 | + [InlineData("foo/readme.md")] |
| 365 | + public async Task SavesReadmeFile(String readmeFileName) |
| 366 | + { |
| 367 | + var fileServiceMock = new Mock<IFileStorageService>(); |
| 368 | + var service = CreateService(fileServiceMock); |
| 369 | + var packageStream = GeneratePackageWithReadmeFile(readmeFileName); |
| 370 | + var package = CreatePackage(); |
| 371 | + package.HasReadMe = true; |
| 372 | + package.EmbeddedReadmeType = EmbeddedReadmeFileType.Markdown; |
| 373 | + var savedReadmeBytes = new byte[ReadmeFileContents.Length]; |
| 374 | + |
| 375 | + fileServiceMock.Setup(x => x.SaveFileAsync( |
| 376 | + CoreConstants.Folders.PackageReadMesFolderName, |
| 377 | + It.IsAny<string>(), |
| 378 | + It.IsAny<Stream>(), |
| 379 | + true)) |
| 380 | + .Completes() |
| 381 | + .Callback<string, string, Stream, bool>((_, __, s, ___) => s.Read(savedReadmeBytes, 0, savedReadmeBytes.Length)) |
| 382 | + .Verifiable(); |
| 383 | + |
| 384 | + // Act. |
| 385 | + await service.ExtractAndSaveReadmeFileAsync(package, packageStream); |
| 386 | + |
| 387 | + // Assert. |
| 388 | + fileServiceMock.VerifyAll(); |
| 389 | + Assert.Equal(ReadmeFileContents, savedReadmeBytes); |
| 390 | + } |
| 391 | + } |
| 392 | + |
265 | 393 | public class TheDownloadReadMeMdFileAsyncMethod |
266 | 394 | { |
267 | 395 | [Fact] |
@@ -353,9 +481,13 @@ static Package CreatePackage() |
353 | 481 | return package; |
354 | 482 | } |
355 | 483 |
|
356 | | - static MemoryStream CreatePackageFileStream() |
| 484 | + private static byte[] ReadmeFileContents => Encoding.UTF8.GetBytes("Sample readme md file"); |
| 485 | + |
| 486 | + private static MemoryStream GeneratePackageWithReadmeFile(string readmeFileName = null, bool saveReadmeFile = true) |
357 | 487 | { |
358 | | - return new MemoryStream(new byte[] { 0, 0, 1, 0, 1, 0, 1, 0 }, 0, 8, true, true); |
| 488 | + return PackageServiceUtility.CreateNuGetPackageStream( |
| 489 | + readmeFilename: readmeFileName, |
| 490 | + readmeFileContents: readmeFileName != null && saveReadmeFile ? ReadmeFileContents : null); |
359 | 491 | } |
360 | 492 |
|
361 | 493 | static PackageFileService CreateService(Mock<IFileStorageService> fileStorageSvc = null) |
|
0 commit comments