public void NormalizesVersion(string version, string normalized)
            {
                ParsedQuery.Grouping[QueryField.PackageId] = new HashSet <string>(new[] { Id });
                ParsedQuery.Grouping[QueryField.Version]   = new HashSet <string>(new[] { version });

                var actual = Build();

                Assert.Equal(IndexOperationType.Get, actual.Type);
                Assert.Equal(
                    DocumentUtilities.GetHijackDocumentKey(Id, normalized),
                    actual.DocumentKey);
            }
            public void BuildsGetOperationForSingleValidPackageIdAndSingleValidVersion(string id)
            {
                ParsedQuery.Grouping[QueryField.PackageId] = new HashSet <string>(new[] { id });
                ParsedQuery.Grouping[QueryField.Version]   = new HashSet <string>(new[] { Version });

                var actual = Build();

                Assert.Equal(IndexOperationType.Get, actual.Type);
                Assert.Equal(
                    DocumentUtilities.GetHijackDocumentKey(id, Version),
                    actual.DocumentKey);
            }
            public void IgnoresFiltersWithSpecificPackageIdAndVersion()
            {
                V2SearchRequest.IncludePrerelease = false;
                V2SearchRequest.IncludeSemVer2    = false;
                var prereleaseSemVer2 = "1.0.0-beta.1";

                ParsedQuery.Grouping[QueryField.PackageId] = new HashSet <string>(new[] { Id });
                ParsedQuery.Grouping[QueryField.Version]   = new HashSet <string>(new[] { prereleaseSemVer2 });

                var actual = Build();

                Assert.Equal(IndexOperationType.Get, actual.Type);
                Assert.Equal(
                    DocumentUtilities.GetHijackDocumentKey(Id, prereleaseSemVer2),
                    actual.DocumentKey);
            }
        private bool TryGetHijackDocumentByKey(
            SearchRequest request,
            ParsedQuery parsed,
            out IndexOperation indexOperation)
        {
            if (PagedToFirstItem(request) &&
                parsed.Grouping.Count == 2 &&
                TryGetSinglePackageId(parsed, out var packageId) &&
                TryGetSingleVersion(parsed, out var normalizedVersion))
            {
                var documentKey = DocumentUtilities.GetHijackDocumentKey(packageId, normalizedVersion);

                indexOperation = IndexOperation.Get(documentKey);
                return(true);
            }

            indexOperation = null;
            return(false);
        }
Пример #5
0
        public async Task DowngradeDueToDelete()
        {
            var identity1 = new PackageIdentity("NuGet.Versioning", NuGetVersion.Parse("1.0.0"));
            var identity2 = new PackageIdentity("NuGet.Versioning", NuGetVersion.Parse("2.0.0-alpha"));
            var leafUrl1  = "https://example/catalog/0/nuget.versioning.1.0.0.json";

            // Step #1 - add two versions
            {
                // Arrange
                var commitTimestamp = new DateTimeOffset(2018, 12, 10, 0, 0, 0, TimeSpan.Zero);
                var commitId        = "76d0014c-60f8-427f-8eac-3dfbf8369296";
                var leafUrl2        = "https://example/catalog/0/nuget.versioning.2.0.0-alpha.json";
                _catalogClient.PackageDetailsLeaves[leafUrl1] = CreatePackageDetailsLeaf(
                    commitTimestamp,
                    commitId,
                    leafUrl1,
                    identity1,
                    listed: true);
                _catalogClient.PackageDetailsLeaves[leafUrl2] = CreatePackageDetailsLeaf(
                    commitTimestamp,
                    commitId,
                    leafUrl2,
                    identity2,
                    listed: true);
                var items = new[]
                {
                    CreatePackageDetailsItem(commitTimestamp, commitId, leafUrl1, identity1),
                    CreatePackageDetailsItem(commitTimestamp, commitId, leafUrl2, identity2),
                };

                // Act
                await _collector.OnProcessBatchAsync(items);

                // Assert
                // Hijack documents
                var hijackBatch = Assert.Single(_hijackDocuments.Batches);
                var actions     = hijackBatch.Actions.OrderBy(x => x.Document.Key).ToList();
                Assert.Equal(2, actions.Count);
                Assert.Equal(
                    DocumentUtilities.GetHijackDocumentKey(identity1.Id, identity1.Version.ToNormalizedString()),
                    actions[0].Document.Key);
                Assert.Equal(IndexActionType.MergeOrUpload, actions[0].ActionType);
                Assert.IsType <HijackDocument.Full>(actions[0].Document);
                Assert.Equal(
                    DocumentUtilities.GetHijackDocumentKey(identity2.Id, identity2.Version.ToNormalizedString()),
                    actions[1].Document.Key);
                Assert.Equal(IndexActionType.MergeOrUpload, actions[1].ActionType);
                Assert.IsType <HijackDocument.Full>(actions[1].Document);

                // Search documents
                var searchBatch = Assert.Single(_searchDocuments.Batches);
                AssertSearchBatch(
                    identity1.Id,
                    searchBatch,
                    exDefault: IndexActionType.MergeOrUpload,
                    exIncludePrerelease: IndexActionType.MergeOrUpload,
                    exIncludeSemVer2: IndexActionType.MergeOrUpload,
                    exIncludePrereleaseAndSemVer2: IndexActionType.MergeOrUpload);

                // Version list
                var containerPair = Assert.Single(_cloudBlobClient.Containers);
                Assert.Equal("integration-tests-container", containerPair.Key);
                var blobPair = Assert.Single(containerPair.Value.Blobs);
                Assert.Equal("integration-tests-path/version-lists/nuget.versioning.json", blobPair.Key);
                Assert.Equal(@"{
  ""VersionProperties"": {
    ""1.0.0"": {
      ""Listed"": true
    },
    ""2.0.0-alpha"": {
      ""Listed"": true
    }
  }
}", blobPair.Value.AsString);
            }

            ClearBatches();

            // Step #2 - delete the latest version
            {
                // Arrange
                var commitTimestamp = new DateTimeOffset(2018, 12, 11, 0, 0, 0, TimeSpan.Zero);
                var commitId        = "68131297-699f-4d68-952e-c0a4eacbd6da";
                var leafUrl         = "https://example/catalog/1/nuget.versioning.2.0.0-alpha.json";
                var items           = new[]
                {
                    CreatePackageDeleteItem(
                        commitTimestamp,
                        commitId,
                        leafUrl,
                        identity2),
                };
                var registrationIndexUrl = "https://example/registrations/nuget.versioning/index.json";
                var registrationPageUrl  = "https://example/registrations/nuget.versioning/page/0.json";
                _registrationClient.Indexes[registrationIndexUrl] = new RegistrationIndex
                {
                    Items = new List <RegistrationPage>
                    {
                        new RegistrationPage
                        {
                            Lower = identity1.Version.ToNormalizedString(),
                            Upper = identity1.Version.ToNormalizedString(),
                            Url   = registrationPageUrl,
                        },
                    },
                };
                _registrationClient.Pages[registrationPageUrl] = new RegistrationPage
                {
                    Items = new List <RegistrationLeafItem>
                    {
                        new RegistrationLeafItem
                        {
                            CatalogEntry = new RegistrationCatalogEntry
                            {
                                Url     = leafUrl1,
                                Version = identity1.Version.ToNormalizedString(),
                            }
                        }
                    }
                };

                // Act
                await _collector.OnProcessBatchAsync(items);

                // Assert
                // Hijack documents
                var hijackBatch = Assert.Single(_hijackDocuments.Batches);
                var actions     = hijackBatch.Actions.OrderBy(x => x.Document.Key).ToList();
                Assert.Equal(2, actions.Count);
                Assert.Equal(
                    DocumentUtilities.GetHijackDocumentKey(identity1.Id, identity1.Version.ToNormalizedString()),
                    actions[0].Document.Key);
                Assert.Equal(IndexActionType.MergeOrUpload, actions[0].ActionType);
                Assert.IsType <HijackDocument.Full>(actions[0].Document);
                Assert.Equal(
                    DocumentUtilities.GetHijackDocumentKey(identity2.Id, identity2.Version.ToNormalizedString()),
                    actions[1].Document.Key);
                Assert.Equal(IndexActionType.Delete, actions[1].ActionType);
                Assert.IsType <KeyedDocument>(actions[1].Document);

                // Search documents
                var searchBatch = Assert.Single(_searchDocuments.Batches);
                AssertSearchBatch(
                    identity1.Id,
                    searchBatch,
                    exDefault: IndexActionType.MergeOrUpload,
                    exIncludePrerelease: IndexActionType.MergeOrUpload,
                    exIncludeSemVer2: IndexActionType.MergeOrUpload,
                    exIncludePrereleaseAndSemVer2: IndexActionType.MergeOrUpload);

                // Version list
                var containerPair = Assert.Single(_cloudBlobClient.Containers);
                Assert.Equal("integration-tests-container", containerPair.Key);
                var blobPair = Assert.Single(containerPair.Value.Blobs);
                Assert.Equal("integration-tests-path/version-lists/nuget.versioning.json", blobPair.Key);
                Assert.Equal(@"{
  ""VersionProperties"": {
    ""1.0.0"": {
      ""Listed"": true
    }
  }
}", blobPair.Value.AsString);
            }
        }
Пример #6
0
        public async Task AddTwoVersionsThenUnlist()
        {
            var identity1 = new PackageIdentity("NuGet.Versioning", NuGetVersion.Parse("1.0.0.0-alpha"));
            var identity2 = new PackageIdentity("NuGet.Versioning", NuGetVersion.Parse("2.0.0+git"));

            // Step #1 - add a version
            {
                // Arrange
                var commitTimestamp = new DateTimeOffset(2018, 12, 10, 0, 0, 0, TimeSpan.Zero);
                var commitId        = "3998eda6-3931-4d0f-9975-d9893648d89c";
                var leafUrl         = "https://example/catalog/0/nuget.versioning.1.0.0-alpha.json";
                _catalogClient.PackageDetailsLeaves[leafUrl] = CreatePackageDetailsLeaf(
                    commitTimestamp,
                    commitId,
                    leafUrl,
                    identity1,
                    listed: true);
                var items = new[]
                {
                    CreatePackageDetailsItem(
                        commitTimestamp,
                        commitId,
                        leafUrl,
                        identity1)
                };

                // Act
                await _collector.OnProcessBatchAsync(items);

                // Assert
                // Hijack documents
                var hijackBatch  = Assert.Single(_hijackDocuments.Batches);
                var hijackAction = Assert.Single(hijackBatch.Actions);
                Assert.Equal(IndexActionType.MergeOrUpload, hijackAction.ActionType);
                Assert.Equal(
                    DocumentUtilities.GetHijackDocumentKey(identity1.Id, identity1.Version.ToNormalizedString()),
                    hijackAction.Document.Key);
                Assert.IsType <HijackDocument.Full>(hijackAction.Document);

                // Search documents
                var searchBatch = Assert.Single(_searchDocuments.Batches);
                AssertSearchBatch(
                    identity1.Id,
                    searchBatch,
                    exDefault: IndexActionType.Delete,
                    exIncludePrerelease: IndexActionType.MergeOrUpload,
                    exIncludeSemVer2: IndexActionType.Delete,
                    exIncludePrereleaseAndSemVer2: IndexActionType.MergeOrUpload);

                // Version list
                var containerPair = Assert.Single(_cloudBlobClient.Containers);
                Assert.Equal("integration-tests-container", containerPair.Key);
                var blobPair = Assert.Single(containerPair.Value.Blobs);
                Assert.Equal("integration-tests-path/version-lists/nuget.versioning.json", blobPair.Key);
                Assert.Equal(@"{
  ""VersionProperties"": {
    ""1.0.0-alpha"": {
      ""Listed"": true
    }
  }
}", blobPair.Value.AsString);
            }

            ClearBatches();

            // Step #2 - add another version
            {
                // Arrange
                var commitTimestamp = new DateTimeOffset(2018, 12, 11, 0, 0, 0, TimeSpan.Zero);
                var commitId        = "00c01b51-ffd4-4f55-b212-0c10d2a06dbc";
                var leafUrl         = "https://example/catalog/0/nuget.versioning.2.0.0.json";
                _catalogClient.PackageDetailsLeaves[leafUrl] = CreatePackageDetailsLeaf(
                    commitTimestamp,
                    commitId,
                    leafUrl,
                    identity2,
                    listed: true);
                var items = new[]
                {
                    CreatePackageDetailsItem(
                        commitTimestamp,
                        commitId,
                        leafUrl,
                        identity2)
                };

                // Act
                await _collector.OnProcessBatchAsync(items);

                // Assert
                // Hijack documents
                var hijackBatch = Assert.Single(_hijackDocuments.Batches);
                var actions     = hijackBatch.Actions.OrderBy(x => x.Document.Key).ToList();
                Assert.Equal(2, actions.Count);
                Assert.Equal(
                    DocumentUtilities.GetHijackDocumentKey(identity2.Id, identity1.Version.ToNormalizedString()),
                    actions[0].Document.Key);
                Assert.Equal(IndexActionType.Merge, actions[0].ActionType);
                Assert.IsType <HijackDocument.Latest>(actions[0].Document);
                Assert.Equal(
                    DocumentUtilities.GetHijackDocumentKey(identity2.Id, identity2.Version.ToNormalizedString()),
                    actions[1].Document.Key);
                Assert.Equal(IndexActionType.MergeOrUpload, actions[1].ActionType);
                Assert.IsType <HijackDocument.Full>(actions[1].Document);

                // Search documents
                var searchBatch = Assert.Single(_searchDocuments.Batches);
                AssertSearchBatch(
                    identity2.Id,
                    searchBatch,
                    exDefault: IndexActionType.Delete,
                    exIncludePrerelease: IndexActionType.Merge,
                    exIncludeSemVer2: IndexActionType.MergeOrUpload,
                    exIncludePrereleaseAndSemVer2: IndexActionType.MergeOrUpload);

                // Version list
                var containerPair = Assert.Single(_cloudBlobClient.Containers);
                Assert.Equal("integration-tests-container", containerPair.Key);
                var blobPair = Assert.Single(containerPair.Value.Blobs);
                Assert.Equal("integration-tests-path/version-lists/nuget.versioning.json", blobPair.Key);
                Assert.Equal(@"{
  ""VersionProperties"": {
    ""1.0.0-alpha"": {
      ""Listed"": true
    },
    ""2.0.0+git"": {
      ""Listed"": true,
      ""SemVer2"": true
    }
  }
}", blobPair.Value.AsString);
            }

            ClearBatches();

            // Step #3 - unlist the first version
            {
                // Arrange
                var commitTimestamp = new DateTimeOffset(2018, 12, 12, 0, 0, 0, TimeSpan.Zero);
                var commitId        = "bd9599c7-4512-4094-817e-dacef6674924";
                var leafUrl         = "https://example/catalog/2/nuget.versioning.1.0.0-alpha.json";
                _catalogClient.PackageDetailsLeaves[leafUrl] = CreatePackageDetailsLeaf(
                    commitTimestamp,
                    commitId,
                    leafUrl,
                    identity1,
                    listed: false);
                var items = new[]
                {
                    CreatePackageDetailsItem(
                        commitTimestamp,
                        commitId,
                        leafUrl,
                        identity1),
                };

                // Act
                await _collector.OnProcessBatchAsync(items);

                // Assert
                // Hijack documents
                var hijackBatch = Assert.Single(_hijackDocuments.Batches);
                var actions     = hijackBatch.Actions.OrderBy(x => x.Document.Key).ToList();
                Assert.Equal(2, actions.Count);
                Assert.Equal(
                    DocumentUtilities.GetHijackDocumentKey(identity1.Id, identity1.Version.ToNormalizedString()),
                    actions[0].Document.Key);
                Assert.Equal(IndexActionType.MergeOrUpload, actions[0].ActionType);
                Assert.IsType <HijackDocument.Full>(actions[0].Document);
                Assert.Equal(
                    DocumentUtilities.GetHijackDocumentKey(identity2.Id, identity2.Version.ToNormalizedString()),
                    actions[1].Document.Key);
                Assert.Equal(IndexActionType.Merge, actions[1].ActionType);
                Assert.IsType <HijackDocument.Latest>(actions[1].Document);

                // Search documents
                var searchBatch = Assert.Single(_searchDocuments.Batches);
                AssertSearchBatch(
                    identity1.Id,
                    searchBatch,
                    exDefault: IndexActionType.Delete,
                    exIncludePrerelease: IndexActionType.Delete,
                    exIncludeSemVer2: IndexActionType.Merge,
                    exIncludePrereleaseAndSemVer2: IndexActionType.Merge);

                // Version list
                var containerPair = Assert.Single(_cloudBlobClient.Containers);
                Assert.Equal("integration-tests-container", containerPair.Key);
                var blobPair = Assert.Single(containerPair.Value.Blobs);
                Assert.Equal("integration-tests-path/version-lists/nuget.versioning.json", blobPair.Key);
                Assert.Equal(@"{
  ""VersionProperties"": {
    ""1.0.0-alpha"": {},
    ""2.0.0+git"": {
      ""Listed"": true,
      ""SemVer2"": true
    }
  }
}", blobPair.Value.AsString);
            }
        }