Skip to content

Commit

Permalink
#3686 Filter SemVer v2.0.0 packages from v2 curated endpoints + unit …
Browse files Browse the repository at this point in the history
…tests
  • Loading branch information
xavierdecoster committed Mar 24, 2017
1 parent b143666 commit a850e96
Show file tree
Hide file tree
Showing 8 changed files with 239 additions and 157 deletions.
5 changes: 4 additions & 1 deletion src/NuGetGallery/Controllers/ODataV2CuratedFeedController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ public IHttpActionResult Get(ODataQueryOptions<V2FeedPackage> options, string cu
}

var queryable = _curatedFeedService.GetPackages(curatedFeedName)
.Where(p => p.SemVerLevelKey == SemVerLevelKey.Unknown)
.ToV2FeedPackageQuery(_configurationService.GetSiteRoot(UseHttps()), _configurationService.Features.FriendlyLicenses)
.InterceptWith(new NormalizeVersionInterceptor());

Expand Down Expand Up @@ -101,7 +102,8 @@ private async Task<IHttpActionResult> GetCore(ODataQueryOptions<V2FeedPackage> o
}

var packages = _curatedFeedService.GetPackages(curatedFeedName)
.Where(p => p.PackageRegistration.Id.Equals(id, StringComparison.OrdinalIgnoreCase));
.Where(p => p.SemVerLevelKey == SemVerLevelKey.Unknown
&& p.PackageRegistration.Id.Equals(id, StringComparison.OrdinalIgnoreCase));

if (!string.IsNullOrEmpty(version))
{
Expand Down Expand Up @@ -201,6 +203,7 @@ public async Task<IHttpActionResult> Search(
// Perform actual search
var curatedFeed = _curatedFeedService.GetFeedByName(curatedFeedName, includePackages: false);
var packages = _curatedFeedService.GetPackages(curatedFeedName)
.Where(p => p.SemVerLevelKey == SemVerLevelKey.Unknown)
.OrderBy(p => p.PackageRegistration.Id).ThenBy(p => p.Version);

// todo: search hijack should take queryOptions instead of manually parsing query options
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,40 +30,33 @@ public abstract class ODataFeedControllerFactsBase<TController>
protected readonly IReadOnlyCollection<Package> NonSemVer2Packages;
protected readonly IReadOnlyCollection<Package> SemVer2Packages;
protected readonly IEntityRepository<Package> PackagesRepository;
protected readonly IQueryable<Package> AllPackages;

protected ODataFeedControllerFactsBase()
{
// Arrange
var packagesQueryable = CreatePackagesQueryable();
NonSemVer2Packages = packagesQueryable.Where(p => p.SemVerLevelKey == SemVerLevelKey.Unknown).ToList();
SemVer2Packages = packagesQueryable.Where(p => p.SemVerLevelKey == SemVerLevelKey.SemVer2).ToList();

AllPackages = CreatePackagesQueryable();
NonSemVer2Packages = AllPackages.Where(p => p.SemVerLevelKey == SemVerLevelKey.Unknown).ToList();
SemVer2Packages = AllPackages.Where(p => p.SemVerLevelKey == SemVerLevelKey.SemVer2).ToList();

var packagesRepositoryMock = new Mock<IEntityRepository<Package>>(MockBehavior.Strict);
packagesRepositoryMock.Setup(m => m.GetAll()).Returns(packagesQueryable).Verifiable();
packagesRepositoryMock.Setup(m => m.GetAll()).Returns(AllPackages).Verifiable();
PackagesRepository = packagesRepositoryMock.Object;
}

protected abstract TController CreateController(
IEntityRepository<Package> packagesRepository,
IGalleryConfigurationService configurationService,
IGalleryConfigurationService configurationService,
ISearchService searchService);

protected TController CreateTestableODataFeedController(HttpRequestMessage request)
{
var searchService = new Mock<ISearchService>().Object;
var configurationService = new TestGalleryConfigurationService();
configurationService.Current.SiteRoot = _siteRoot;

var controller = CreateController(PackagesRepository, configurationService, searchService);

InitializeRequestContext(request, controller);

return controller;
}

private static void InitializeRequestContext(HttpRequestMessage request, TController controller)
{

var httpRequest = new HttpRequest(string.Empty, request.RequestUri.AbsoluteUri, request.RequestUri.Query);
var httpResponse = new HttpResponse(new StringWriter());
var httpContext = new HttpContext(httpRequest, httpResponse);
Expand All @@ -75,6 +68,48 @@ private static void InitializeRequestContext(HttpRequestMessage request, TContro

controller.ControllerContext.Controller = controller;
controller.ControllerContext.Configuration = new HttpConfiguration();

return controller;
}

protected async Task<IReadOnlyCollection<TFeedPackage>> GetCollection<TFeedPackage>(
Func<TController, ODataQueryOptions<TFeedPackage>, IHttpActionResult> controllerAction,
string requestPath)
where TFeedPackage : class
{
var queryResult = InvokeODataFeedControllerAction(controllerAction, requestPath);

return await GetValueFromQueryResult(queryResult);
}

protected async Task<IReadOnlyCollection<TFeedPackage>> GetCollection<TFeedPackage>(
Func<TController, ODataQueryOptions<TFeedPackage>, Task<IHttpActionResult>> asyncControllerAction,
string requestPath)
where TFeedPackage : class
{
var queryResult = await InvokeODataFeedControllerActionAsync(asyncControllerAction, requestPath);

return await GetValueFromQueryResult(queryResult);
}

protected async Task<int> GetInt<TFeedPackage>(
Func<TController, ODataQueryOptions<TFeedPackage>, IHttpActionResult> controllerAction,
string requestPath)
where TFeedPackage : class
{
var queryResult = InvokeODataFeedControllerAction(controllerAction, requestPath);

return int.Parse(await GetValueFromQueryResult(queryResult));
}

protected async Task<int> GetInt<TFeedPackage>(
Func<TController, ODataQueryOptions<TFeedPackage>, Task<IHttpActionResult>> asyncControllerAction,
string requestPath)
where TFeedPackage : class
{
var queryResult = await InvokeODataFeedControllerActionAsync(asyncControllerAction, requestPath);

return int.Parse(await GetValueFromQueryResult(queryResult));
}

private static IQueryable<Package> CreatePackagesQueryable()
Expand Down Expand Up @@ -130,16 +165,16 @@ private static IQueryable<Package> CreatePackagesQueryable()
return list.AsQueryable();
}

protected static ODataQueryContext CreateODataQueryContext<TFeedPackage>()
private static ODataQueryContext CreateODataQueryContext<TFeedPackage>()
where TFeedPackage : class
{
var oDataModelBuilder = new ODataConventionModelBuilder();
oDataModelBuilder.EntitySet<TFeedPackage>("Packages");

return new ODataQueryContext(oDataModelBuilder.GetEdmModel(), typeof(TFeedPackage));
}
protected static async Task<dynamic> GetValueFromQueryResult<TEntity>(QueryResult<TEntity> queryResult)

private static async Task<dynamic> GetValueFromQueryResult<TEntity>(QueryResult<TEntity> queryResult)
{
var httpResponseMessage = await queryResult.ExecuteAsync(CancellationToken.None);

Expand All @@ -159,8 +194,8 @@ protected static async Task<dynamic> GetValueFromQueryResult<TEntity>(QueryResul
return ((IQueryable<TEntity>)objectContent.Value).ToList();
}
}
protected async Task<QueryResult<TFeedPackage>> InvokeODataFeedControllerActionAsync<TFeedPackage>(

private async Task<QueryResult<TFeedPackage>> InvokeODataFeedControllerActionAsync<TFeedPackage>(
Func<TController, ODataQueryOptions<TFeedPackage>, Task<IHttpActionResult>> asyncControllerAction,
string requestPath)
where TFeedPackage : class
Expand All @@ -172,9 +207,9 @@ protected async Task<QueryResult<TFeedPackage>> InvokeODataFeedControllerActionA
new ODataQueryOptions<TFeedPackage>(CreateODataQueryContext<TFeedPackage>(), request));
}

protected QueryResult<TFeedPackage> InvokeODataFeedControllerAction<TFeedPackage>(
private QueryResult<TFeedPackage> InvokeODataFeedControllerAction<TFeedPackage>(
Func<TController, ODataQueryOptions<TFeedPackage>, IHttpActionResult> controllerAction,
string requestPath)
string requestPath)
where TFeedPackage : class
{
var request = new HttpRequestMessage(HttpMethod.Get, $"{_siteRoot}{requestPath}");
Expand Down
59 changes: 0 additions & 59 deletions tests/NuGetGallery.Facts/Controllers/ODataV1ControllerFactsBase.cs

This file was deleted.

20 changes: 14 additions & 6 deletions tests/NuGetGallery.Facts/Controllers/ODataV1FeedControllerFacts.cs
Original file line number Diff line number Diff line change
@@ -1,20 +1,22 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.

using NuGetGallery.Configuration;
using NuGetGallery.OData;
using System.Linq;
using System.Threading.Tasks;
using Xunit;

namespace NuGetGallery.Controllers
{
public class ODataV1FeedControllerFacts
: ODataV1ControllerFactsBase
: ODataFeedControllerFactsBase<ODataV1FeedController>
{
[Fact]
public async Task Get_FiltersSemVerV2PackageVersions()
{
// Act
var resultSet = await GetCollection(
var resultSet = await GetCollection<V1FeedPackage>(
(controller, options) => controller.Get(options),
"/api/v1/Packages");

Expand All @@ -37,7 +39,7 @@ public async Task Get_FiltersSemVerV2PackageVersions()
public async Task GetCount_FiltersSemVerV2PackageVersions()
{
// Act
var count = await GetInt(
var count = await GetInt<V1FeedPackage>(
(controller, options) => controller.GetCount(options),
"/api/v1/Packages/$count");

Expand All @@ -49,7 +51,7 @@ public async Task GetCount_FiltersSemVerV2PackageVersions()
public async Task FindPackagesById_FiltersSemVerV2PackageVersions()
{
// Act
var resultSet = await GetCollectionAsync(
var resultSet = await GetCollection<V1FeedPackage>(
async (controller, options) => await controller.FindPackagesById(options, TestPackageId),
$"/api/v1/FindPackagesById?id='{TestPackageId}'");

Expand All @@ -72,7 +74,7 @@ public async Task FindPackagesById_FiltersSemVerV2PackageVersions()
public async Task Search_FiltersSemVerV2PackageVersions()
{
// Act
var resultSet = await GetCollectionAsync(
var resultSet = await GetCollection<V1FeedPackage>(
async (controller, options) => await controller.Search(options, TestPackageId),
$"/api/v1/Search?searchTerm='{TestPackageId}'");

Expand All @@ -95,12 +97,18 @@ public async Task Search_FiltersSemVerV2PackageVersions()
public async Task SearchCount_FiltersSemVerV2PackageVersions()
{
// Act
var searchCount = await GetIntAsync(
var searchCount = await GetInt<V1FeedPackage>(
async (controller, options) => await controller.SearchCount(options, TestPackageId),
$"/api/v1/Search/$count?searchTerm='{TestPackageId}'");

// Assert
Assert.Equal(NonSemVer2Packages.Count, searchCount);
}

protected override ODataV1FeedController CreateController(IEntityRepository<Package> packagesRepository,
IGalleryConfigurationService configurationService, ISearchService searchService)
{
return new ODataV1FeedController(packagesRepository, configurationService, searchService);
}
}
}
61 changes: 0 additions & 61 deletions tests/NuGetGallery.Facts/Controllers/ODataV2ControllerFactsBase.cs

This file was deleted.

Loading

0 comments on commit a850e96

Please sign in to comment.