private static PackageDeprecationItem GetPackageDeprecationItemFromState(PackageDeprecationItemState deprecationState)
        {
            if (deprecationState == PackageDeprecationItemState.NotDeprecated)
            {
                return(null);
            }

            var    reasons    = new[] { "first", "second" };
            string message    = null;
            string altId      = null;
            string altVersion = null;

            if (deprecationState == PackageDeprecationItemState.DeprecatedWithSingleReason)
            {
                reasons = reasons.Take(1).ToArray();
            }

            if (deprecationState == PackageDeprecationItemState.DeprecatedWithMessage)
            {
                message = "this is the message";
            }

            if (deprecationState == PackageDeprecationItemState.DeprecatedWithAlternate)
            {
                altId      = "theId";
                altVersion = "[2.4.5, 2.4.5]";
            }

            return(new PackageDeprecationItem(reasons, message, altId, altVersion));
        }
            public async Task WithOnePackage_UpdatesStorage(bool createdPackages, bool updateCreatedFromEdited, PackageDeprecationItemState deprecationState, int vulnerabilityCount)
            {
                // Arrange
                using (var test = new WritePackageDetailsToCatalogAsyncTest())
                {
                    test.CreatedPackages         = createdPackages;
                    test.UpdateCreatedFromEdited = updateCreatedFromEdited;
                    test.Packages.Add(test.UtcNow, new List <FeedPackageDetails>()
                    {
                        test.FeedPackageDetails
                    });

                    NupkgMetadata nupkgMetadata = GetNupkgMetadata("Newtonsoft.Json.9.0.2-beta1.nupkg.testdata");

                    var deprecationItem    = GetPackageDeprecationItemFromState(deprecationState);
                    var vulnerabilities    = CreateTestPackageVulnerabilityItems(vulnerabilityCount);
                    var packageCatalogItem = new PackageCatalogItem(
                        nupkgMetadata,
                        test.FeedPackageDetails.CreatedDate,
                        test.FeedPackageDetails.LastEditedDate,
                        test.FeedPackageDetails.PublishedDate,
                        deprecation: deprecationItem,
                        vulnerabilities: vulnerabilities);

                    test.PackageCatalogItemCreator.Setup(x => x.CreateAsync(
                                                             It.Is <FeedPackageDetails>(details => details == test.FeedPackageDetails),
                                                             It.Is <DateTime>(timestamp => timestamp == test.UtcNow),
                                                             It.IsAny <CancellationToken>()))
                    .ReturnsAsync(packageCatalogItem);

                    test.Storage.SetupGet(x => x.BaseAddress)
                    .Returns(test.CatalogBaseUri);

                    var blobs = new List <CatalogBlob>();

                    test.Storage.Setup(x => x.SaveAsync(
                                           It.IsNotNull <Uri>(),
                                           It.IsNotNull <StorageContent>(),
                                           It.IsAny <CancellationToken>()))
                    .Callback <Uri, StorageContent, CancellationToken>((uri, content, token) =>
                    {
                        blobs.Add(new CatalogBlob(uri, content));
                    })
                    .Returns(Task.FromResult(0));

                    test.Storage.Setup(x => x.LoadStringAsync(
                                           It.Is <Uri>(uri => uri == test.CatalogIndexUri),
                                           It.IsAny <CancellationToken>()))
                    .ReturnsAsync(CatalogTestData.GetBeforeIndex(test.CatalogIndexUri).ToString());

                    test.TelemetryService.Setup(x => x.TrackCatalogIndexWriteDuration(
                                                    It.Is <TimeSpan>(duration => duration > TimeSpan.Zero),
                                                    It.Is <Uri>(uri => uri == test.CatalogIndexUri)));

                    // Act
                    var result = await test.WritePackageDetailsToCatalogAsync();

                    // Assert
                    Assert.Equal(test.UtcNow, result);

                    Assert.Equal(3, blobs.Count);

                    var catalogPackageDetailsUri = new Uri($"{test.CatalogBaseUri}data/{packageCatalogItem.TimeStamp.ToString("yyyy.MM.dd.HH.mm.ss")}/newtonsoft.json.9.0.2-beta1.json");
                    var catalogPageUri           = new Uri($"{test.CatalogBaseUri}page0.json");

                    // Verify package details blob
                    Assert.Equal(catalogPackageDetailsUri, blobs[0].Uri);
                    Assert.IsType <StringStorageContent>(blobs[0].Content);

                    var stringContent = (StringStorageContent)blobs[0].Content;

                    Assert.Equal("no-store", stringContent.CacheControl);
                    Assert.Equal("application/json", stringContent.ContentType);

                    var expectedContent = CatalogTestData.GetPackageDetails(
                        catalogPackageDetailsUri,
                        packageCatalogItem.CommitId,
                        packageCatalogItem.TimeStamp,
                        packageCatalogItem.CreatedDate.Value,
                        packageCatalogItem.LastEditedDate.Value,
                        packageCatalogItem.PublishedDate.Value,
                        deprecationItem,
                        vulnerabilities);

                    var actualContent = JObject.Parse(stringContent.Content);

                    Assert.Equal(expectedContent.ToString(), actualContent.ToString());

                    // Verify page blob
                    Assert.Equal(catalogPageUri, blobs[1].Uri);
                    Assert.IsType <JTokenStorageContent>(blobs[1].Content);

                    var jtokenContent = (JTokenStorageContent)blobs[1].Content;

                    expectedContent = CatalogTestData.GetPage(
                        catalogPageUri,
                        packageCatalogItem.CommitId,
                        packageCatalogItem.TimeStamp,
                        test.CatalogIndexUri,
                        catalogPackageDetailsUri);

                    Assert.Equal("no-store", jtokenContent.CacheControl);
                    Assert.Equal("application/json", jtokenContent.ContentType);
                    Assert.Equal(expectedContent.ToString(), jtokenContent.Content.ToString());

                    // Verify index blob
                    Assert.Equal(test.CatalogIndexUri, blobs[2].Uri);
                    Assert.IsType <JTokenStorageContent>(blobs[2].Content);

                    jtokenContent = (JTokenStorageContent)blobs[2].Content;

                    var lastEdited  = createdPackages ? test.LastEdited : test.UtcNow;
                    var lastCreated = updateCreatedFromEdited ? lastEdited : (createdPackages ? test.UtcNow : test.LastCreated);

                    expectedContent = CatalogTestData.GetAfterIndex(
                        test.CatalogIndexUri,
                        packageCatalogItem.CommitId,
                        packageCatalogItem.TimeStamp,
                        lastCreated,
                        test.LastDeleted,
                        lastEdited,
                        catalogPageUri);

                    Assert.Equal("no-store", jtokenContent.CacheControl);
                    Assert.Equal("application/json", jtokenContent.ContentType);
                    Assert.Equal(expectedContent.ToString(), jtokenContent.Content.ToString());
                }
            }