|
14 | 14 | using NuGet.Server.V2.Tests.Infrastructure; |
15 | 15 | using NuGet.Server.V2.Tests.TestUtils; |
16 | 16 | using Xunit; |
| 17 | +using System.IO; |
| 18 | +using NuGet.Server.Core.Tests.Infrastructure; |
| 19 | +using NuGet.Server.Core.Tests; |
17 | 20 |
|
18 | 21 | namespace NuGet.Server.V2.Tests |
19 | 22 | { |
@@ -773,6 +776,123 @@ public void GetUpdatesFiltersIncludesHighestPrereleasePackage() |
773 | 776 | AssertPackage(new { Id = "Qux", Version = "2.0" }, result[1]); |
774 | 777 | } |
775 | 778 | } |
| 779 | + |
| 780 | + public class SearchMethod |
| 781 | + { |
| 782 | + [Theory] |
| 783 | + [InlineData("Foo", false, 1, new[] { "Foo" }, new[] { "1.0.0" })] |
| 784 | + [InlineData("Bar", false, 2, new[] { "Bar", "Bar" }, new[] { "1.0.0", "2.0.0" })] |
| 785 | + [InlineData("", false, 3, new[] { "Foo", "Bar", "Bar" }, new[] { "1.0.0", "1.0.0", "2.0.0" })] |
| 786 | + [InlineData("CommonTag", false, 3, new[] { "Foo", "Bar", "Bar" }, new[] { "1.0.0", "1.0.0", "2.0.0" })] |
| 787 | + [InlineData("", true, 5, new[] { "Foo", "Foo", "Bar", "Bar", "Bar" }, new[] { "1.0.0", "1.0.1-a", "1.0.0", "2.0.0", "2.0.1-a" })] |
| 788 | + public void SearchFiltersPackagesBySearchTermAndPrereleaseFlag(string searchTerm, bool includePrerelease, int expectedNumberOfPackages, string[] expectedIds, string[] expectedVersions) |
| 789 | + { |
| 790 | + using (var temporaryDirectory = new TemporaryDirectory()) |
| 791 | + { |
| 792 | + // Arrange |
| 793 | + ServerPackageRepository serverRepository = CreateRepositoryWithPackages(temporaryDirectory); |
| 794 | + |
| 795 | + var v2Service = new TestableNuGetODataController(serverRepository); |
| 796 | + v2Service.Request = new HttpRequestMessage(HttpMethod.Get, "https://localhost:8081/api/v2/Search()?searchTerm='" + searchTerm + "'&targetFramework=''&includePrerelease=" + includePrerelease); |
| 797 | + |
| 798 | + // Act |
| 799 | + var result = v2Service.Search( |
| 800 | + new ODataQueryOptions<ODataPackage>(new ODataQueryContext(NuGetV2WebApiEnabler.BuildNuGetODataModel(), typeof(ODataPackage)), v2Service.Request), |
| 801 | + searchTerm: searchTerm, |
| 802 | + targetFramework: null, |
| 803 | + includePrerelease: includePrerelease) |
| 804 | + .ExpectQueryResult<ODataPackage>() |
| 805 | + .GetInnerResult() |
| 806 | + .ExpectOkNegotiatedContentResult<IQueryable<ODataPackage>>() |
| 807 | + .ToArray(); |
| 808 | + |
| 809 | + |
| 810 | + // Assert |
| 811 | + Assert.Equal(expectedNumberOfPackages, result.Length); |
| 812 | + for (var i = 0; i < expectedIds.Length; i++) |
| 813 | + { |
| 814 | + var expectedId = expectedIds[i]; |
| 815 | + var expectedVersion = expectedVersions[i]; |
| 816 | + |
| 817 | + Assert.True(result.Any(p => p.Id == expectedId && p.Version == expectedVersion), string.Format("Search results did not contain {0} {1}", expectedId, expectedVersion)); |
| 818 | + } |
| 819 | + } |
| 820 | + } |
| 821 | + |
| 822 | + [Theory] |
| 823 | + [InlineData("Foo", false, 1)] |
| 824 | + [InlineData("Bar", false, 2)] |
| 825 | + [InlineData("", false, 3)] |
| 826 | + [InlineData("CommonTag", false, 3)] |
| 827 | + [InlineData("", true, 5)] |
| 828 | + public void SearchCountFiltersPackagesBySearchTermAndPrereleaseFlag(string searchTerm, bool includePrerelease, int expectedNumberOfPackages) |
| 829 | + { |
| 830 | + using (var temporaryDirectory = new TemporaryDirectory()) |
| 831 | + { |
| 832 | + // Arrange |
| 833 | + ServerPackageRepository serverRepository = CreateRepositoryWithPackages(temporaryDirectory); |
| 834 | + |
| 835 | + var v2Service = new TestableNuGetODataController(serverRepository); |
| 836 | + v2Service.Request = new HttpRequestMessage(HttpMethod.Get, "https://localhost:8081/api/v2/Search()/$count?searchTerm='" + searchTerm + "'&targetFramework=''&includePrerelease=false"); |
| 837 | + |
| 838 | + // Act |
| 839 | + var result = v2Service.SearchCount( |
| 840 | + new ODataQueryOptions<ODataPackage>(new ODataQueryContext(NuGetV2WebApiEnabler.BuildNuGetODataModel(), typeof(ODataPackage)), v2Service.Request), |
| 841 | + searchTerm: searchTerm, |
| 842 | + targetFramework: null, |
| 843 | + includePrerelease: includePrerelease) |
| 844 | + .ExpectQueryResult<ODataPackage>() |
| 845 | + .GetInnerResult() |
| 846 | + .ExpectResult<PlainTextResult>(); |
| 847 | + |
| 848 | + // Assert |
| 849 | + Assert.Equal(expectedNumberOfPackages.ToString(), result.Content); |
| 850 | + } |
| 851 | + } |
| 852 | + |
| 853 | + private ServerPackageRepository CreateRepositoryWithPackages(TemporaryDirectory temporaryDirectory) |
| 854 | + { |
| 855 | + return ServerPackageRepositoryTest.CreateServerPackageRepository(temporaryDirectory.Path, repository => |
| 856 | + { |
| 857 | + repository.AddPackage(CreatePackage("Foo", "1.0.0", new[] { "Foo", "CommonTag" })); |
| 858 | +// repository.AddPackage(CreatePackage("Foo", "1.0.1", new[] { "Foo", "CommonTag" })); |
| 859 | +// repository.AddPackage(CreatePackage("Foo", "2.0.0", new[] { "Foo", "CommonTag" })); |
| 860 | + repository.AddPackage(CreatePackage("Foo", "1.0.1-a", new[] { "Foo", "CommonTag" })); |
| 861 | + repository.AddPackage(CreatePackage("Bar", "1.0.0", new[] { "Bar", "CommonTag" })); |
| 862 | + repository.AddPackage(CreatePackage("Bar", "2.0.0", new[] { "Bar", "CommonTag" })); |
| 863 | + repository.AddPackage(CreatePackage("Bar", "2.0.1-a", new[] { "Bar", "CommonTag" })); |
| 864 | + repository.AddPackage(CreatePackage("Bar", "2.0.1-b", new[] { "Bar", "CommonTag" })); |
| 865 | + repository.AddPackage(CreatePackage("Baz", "1.0.0", new[] { "Baz", "CommonTag" })); |
| 866 | + }); |
| 867 | + } |
| 868 | + |
| 869 | + private IPackage CreatePackage(string id, string version, IEnumerable<string> tags) |
| 870 | + { |
| 871 | + var package = new PackageBuilder |
| 872 | + { |
| 873 | + Id = id, |
| 874 | + Version = new SemanticVersion(version), |
| 875 | + Authors = { "Test" }, |
| 876 | + Owners = { "Test" }, |
| 877 | + Description = id, |
| 878 | + Summary = id, |
| 879 | + }; |
| 880 | + |
| 881 | + package.Tags.AddRange(tags); |
| 882 | + |
| 883 | + var mockFile = new Mock<IPackageFile>(); |
| 884 | + mockFile.Setup(m => m.Path).Returns("foo"); |
| 885 | + mockFile.Setup(m => m.GetStream()).Returns(new MemoryStream()); |
| 886 | + package.Files.Add(mockFile.Object); |
| 887 | + |
| 888 | + var packageStream = new MemoryStream(); |
| 889 | + package.Save(packageStream); |
| 890 | + packageStream.Seek(0, SeekOrigin.Begin); |
| 891 | + |
| 892 | + return new ZipPackage(packageStream); |
| 893 | + } |
| 894 | + } |
| 895 | + |
776 | 896 | } |
777 | 897 |
|
778 | 898 |
|
|
0 commit comments