Skip to content

Commit

Permalink
Merge pull request #973 from NuGet/staging
Browse files Browse the repository at this point in the history
Merge staging to master
  • Loading branch information
bhuvak committed Mar 28, 2013
2 parents cd4631c + 2f6d9c0 commit 0c2b5da
Show file tree
Hide file tree
Showing 94 changed files with 5,186 additions and 824 deletions.
20 changes: 20 additions & 0 deletions Changelog.md
@@ -0,0 +1,20 @@
# Deployment 2013.03.28-CommitID #

*Support for MinClientVersion*:

You can now upload packages with "[minclientVersion](http://nuget.codeplex.com/wikipage?title=NuGet%202.5%20list%20of%20features%20for%20Testing%20days%203%2f27%20to%203%2f29%20%2c%202013 )" to the NuGetGallery.
The minclientVersion of the package will shown in the package home page right next to the package description.

*Contacting support*:

The "Report Abuse" page has been revamped to enable users to chose the specific issue with the package they are reporting. It also guides the user to differentiate between "Contact Owners" and "Report Abuse".

*Improvised Package statistics*:

The package statistics now shows the break down of downloads based on the NuGet client (like NuGet CommandLine 2.1, NuGet Package Manager console 2.2 and so on and it also shows the split of the type of download operation (like Install, Restore, Update)

*Other minor bug fixes*:

Complete list can be found here @ https://github.com/NuGet/NuGetGallery/issues?milestone=17


24 changes: 0 additions & 24 deletions Facts/Controllers/ApiControllerFacts.cs
Expand Up @@ -534,30 +534,6 @@ public async Task GetPackageReturnsLatestPackageIfNoVersionIsProvided()
packageFileService.Verify();
packageService.Verify();
}

[Fact]
public async Task GetPackageReturnsRedirectResultWhenExternalPackageUrlIsNotNull()
{
var package = new Package { ExternalPackageUrl = "http://theUrl" };
var packageService = new Mock<IPackageService>();
packageService.Setup(x => x.FindPackageByIdAndVersion("thePackage", "42.1066", false)).Returns(package);
var httpRequest = new Mock<HttpRequestBase>();
httpRequest.SetupGet(r => r.UserHostAddress).Returns("Foo");
httpRequest.SetupGet(r => r.UserAgent).Returns("Qux");
NameValueCollection headers = new NameValueCollection();
headers.Add("NuGet-Operation", "Install");
httpRequest.SetupGet(r => r.Headers).Returns(headers);
var httpContext = new Mock<HttpContextBase>();
httpContext.SetupGet(c => c.Request).Returns(httpRequest.Object);
var controller = CreateController(packageService);
var controllerContext = new ControllerContext(new RequestContext(httpContext.Object, new RouteData()), controller);
controller.ControllerContext = controllerContext;

var result = await controller.GetPackage("thePackage", "42.1066") as RedirectResult;

Assert.NotNull(result);
Assert.Equal("http://theUrl", result.Url);
}
}

public class ThePublishPackageAction
Expand Down
101 changes: 78 additions & 23 deletions Facts/Controllers/PackagesControllerFacts.cs
Expand Up @@ -109,7 +109,7 @@ private static Mock<ISearchService> CreateSearchService()
{
var searchService = new Mock<ISearchService>();
int total;
searchService.Setup(s => s.Search(It.IsAny<IQueryable<Package>>(), It.IsAny<SearchFilter>(), out total)).Returns(
searchService.Setup(s => s.Search(It.IsAny<SearchFilter>(), out total, null)).Returns(
(IQueryable<Package> p, string searchTerm) => p);

return searchService;
Expand Down Expand Up @@ -395,10 +395,7 @@ public void SendsMessageToGalleryOwnerWithEmailOnlyWhenUnauthenticated()
{
var messageService = new Mock<IMessageService>();
messageService.Setup(
s => s.ReportAbuse(
It.IsAny<MailAddress>(),
It.IsAny<Package>(),
"Mordor took my finger"));
s => s.ReportAbuse(It.Is<ReportPackageRequest>(r => r.Message == "Mordor took my finger")));
var package = new Package
{
PackageRegistration = new PackageRegistration { Id = "mordor" },
Expand All @@ -415,29 +412,31 @@ public void SendsMessageToGalleryOwnerWithEmailOnlyWhenUnauthenticated()
var model = new ReportAbuseViewModel
{
Email = "frodo@hobbiton.example.com",
Message = "Mordor took my finger."
Message = "Mordor took my finger.",
Reason = "GollumWasThere",
AlreadyContactedOwner = true,
};

TestUtility.SetupUrlHelper(controller, httpContext);
var result = controller.ReportAbuse("mordor", "2.0.1", model) as RedirectToRouteResult;

Assert.NotNull(result);
messageService.Verify(
s => s.ReportAbuse(
It.Is<MailAddress>(m => m.Address == "frodo@hobbiton.example.com"),
package,
"Mordor took my finger."
));
It.Is<ReportPackageRequest>(
r => r.FromAddress.Address == "frodo@hobbiton.example.com"
&& r.Package == package
&& r.Reason == "GollumWasThere"
&& r.Message == "Mordor took my finger."
&& r.AlreadyContactedOwners)));
}

[Fact]
public void SendsMessageToGalleryOwnerWithUserInfoWhenAuthenticated()
{
var messageService = new Mock<IMessageService>();
messageService.Setup(
s => s.ReportAbuse(
It.IsAny<MailAddress>(),
It.IsAny<Package>(),
"Mordor took my finger"));
s => s.ReportAbuse(It.Is<ReportPackageRequest>(r => r.Message == "Mordor took my finger")));
var package = new Package
{
PackageRegistration = new PackageRegistration { Id = "mordor" },
Expand All @@ -449,29 +448,85 @@ public void SendsMessageToGalleryOwnerWithUserInfoWhenAuthenticated()
httpContext.Setup(h => h.Request.IsAuthenticated).Returns(true);
httpContext.Setup(h => h.User.Identity.Name).Returns("Frodo");
var userService = new Mock<IUserService>();
userService.Setup(u => u.FindByUsername("Frodo")).Returns(new User { EmailAddress = "frodo@hobbiton.example.com", Username = "Frodo" });
userService.Setup(u => u.FindByUsername("Frodo")).Returns(new User { EmailAddress = "frodo@hobbiton.example.com", Username = "Frodo", Key = 1 });
var controller = CreateController(
packageService: packageService,
messageService: messageService,
userService: userService,
httpContext: httpContext);
var model = new ReportAbuseViewModel
{
Message = "Mordor took my finger."
Message = "Mordor took my finger",
Reason = "GollumWasThere",
};

var result = controller.ReportAbuse("mordor", "2.0.1", model) as RedirectToRouteResult;
TestUtility.SetupUrlHelper(controller, httpContext);
ActionResult result = controller.ReportAbuse("mordor", "2.0.1", model) as RedirectToRouteResult;

Assert.NotNull(result);
userService.VerifyAll();
messageService.Verify(
s => s.ReportAbuse(
It.Is<MailAddress>(
m => m.Address == "frodo@hobbiton.example.com"
&& m.DisplayName == "Frodo"),
package,
"Mordor took my finger."
));
It.Is<ReportPackageRequest>(
r => r.Message == "Mordor took my finger"
&& r.FromAddress.Address == "frodo@hobbiton.example.com"
&& r.FromAddress.DisplayName == "Frodo"
&& r.Reason == "GollumWasThere")));
}

[Fact]
public void FormRedirectsPackageOwnerToReportMyPackage()
{
var package = new Package
{
PackageRegistration = new PackageRegistration { Id = "Mordor", Owners = { new User { Username = "Sauron" }} },
Version = "2.0.1"
};
var packageService = new Mock<IPackageService>();
packageService.Setup(p => p.FindPackageByIdAndVersion("Mordor", It.IsAny<string>(), true)).Returns(package);
var httpContext = new Mock<HttpContextBase>();
httpContext.Setup(h => h.Request.IsAuthenticated).Returns(true);
httpContext.Setup(h => h.User.Identity.Name).Returns("Sauron");
var userService = new Mock<IUserService>();
userService.Setup(u => u.FindByUsername("Sauron")).Returns(new User { EmailAddress = "darklord@mordor.com", Username = "Sauron" });
var controller = CreateController(
packageService: packageService,
userService: userService,
httpContext: httpContext);

TestUtility.SetupUrlHelper(controller, httpContext);
ActionResult result = controller.ReportAbuse("Mordor", "2.0.1");
Assert.IsType<RedirectToRouteResult>(result);
Assert.Equal("ReportMyPackage", ((RedirectToRouteResult)result).RouteValues["Action"]);
}
}

public class TheReportMyPackageMethod
{
[Fact]
public void FormRedirectsNonOwnersToReportAbuse()
{
var package = new Package
{
PackageRegistration = new PackageRegistration { Id = "Mordor", Owners = { new User { Username = "Sauron", Key = 1 } } },
Version = "2.0.1"
};
var packageService = new Mock<IPackageService>();
packageService.Setup(p => p.FindPackageByIdAndVersion("Mordor", It.IsAny<string>(), true)).Returns(package);
var httpContext = new Mock<HttpContextBase>();
httpContext.Setup(h => h.Request.IsAuthenticated).Returns(true);
httpContext.Setup(h => h.User.Identity.Name).Returns("Frodo");
var userService = new Mock<IUserService>();
userService.Setup(u => u.FindByUsername("Frodo")).Returns(new User { EmailAddress = "frodo@hobbiton.example.com", Username = "Frodo", Key = 2 });
var controller = CreateController(
packageService: packageService,
userService: userService,
httpContext: httpContext);

TestUtility.SetupUrlHelper(controller, httpContext);
ActionResult result = controller.ReportMyPackage("Mordor", "2.0.1");
Assert.IsType<RedirectToRouteResult>(result);
Assert.Equal("ReportAbuse", ((RedirectToRouteResult)result).RouteValues["Action"]);
}
}

Expand Down
47 changes: 43 additions & 4 deletions Facts/Controllers/StatisticsControllerFacts.cs
Expand Up @@ -151,25 +151,64 @@ public async void StatisticsHomePage_Per_Package_ValidateReportStructureAndAvail
{
string PackageId = "A";

var fakeReport = "[{\"PackageVersion\":\"1.0\",\"Downloads\":101},{\"PackageVersion\":\"2.1\",\"Downloads\":202}]";
var fakeReport = "{\"Downloads\":303, Items:[{\"Version\":\"1.0\",\"Downloads\":101},{\"Version\":\"2.1\",\"Downloads\":202}]}";

var fakeReportService = new Mock<IReportService>();

fakeReportService.Setup(x => x.Load("RecentPopularity_" + PackageId + ".json")).Returns(Task.FromResult(fakeReport));
string reportName = "RecentPopularityDetail_" + PackageId + ".json";
reportName = reportName.ToLowerInvariant();

fakeReportService.Setup(x => x.Load(reportName)).Returns(Task.FromResult(fakeReport));

var controller = new StatisticsController(new JsonStatisticsService(fakeReportService.Object));

var model = (StatisticsPackagesViewModel)((ViewResult) await controller.PackageDownloadsByVersion(PackageId)).Model;

int sum = 0;

foreach (var item in model.PackageDownloadsByVersion)
foreach (var item in model.Report.Rows)
{
sum += item.Downloads;
}

Assert.Equal<int>(303, sum);
Assert.Equal<int>(303, model.TotalPackageDownloads);
Assert.Equal<int>(303, model.Report.Total);
}

[Fact]
public async void Statistics_By_Client_Operation_ValidateReportStructureAndAvailability()
{
string PackageId = "A";
string PackageVersion = "2.1";

var fakeReport = "{\"Downloads\":303, Items:[";
fakeReport += "{\"Version\":\"1.0\", \"Downloads\":101},";
fakeReport += "{\"Version\":\"2.1\", \"Downloads\":70, Items:[";
fakeReport += "{\"Client\":\"Package Manager\", \"Operation\":\"Install\", Downloads:45},";
fakeReport += "{\"Client\":\"Package Manager\", \"Operation\":\"Restore\", Downloads:25},";
fakeReport += "]}";
fakeReport += "]}";

var fakeReportService = new Mock<IReportService>();

string reportName = "RecentPopularityDetail_" + PackageId + ".json";
reportName = reportName.ToLowerInvariant();

fakeReportService.Setup(x => x.Load(reportName)).Returns(Task.FromResult(fakeReport));

var controller = new StatisticsController(new JsonStatisticsService(fakeReportService.Object));

var model = (StatisticsPackagesViewModel)((ViewResult)await controller.PackageDownloadsDetail(PackageId, PackageVersion)).Model;

int sum = 0;

foreach (var item in model.Report.Rows)
{
sum += item.Downloads;
}

Assert.Equal<int>(70, sum);
Assert.Equal<int>(70, model.Report.Total);
}

[Fact]
Expand Down
1 change: 1 addition & 0 deletions Facts/Controllers/UsersControllerFacts.cs
Expand Up @@ -17,6 +17,7 @@ public class UsersControllerFacts
Mock<IMessageService> messageService = null,
Mock<ICuratedFeedsByManagerQuery> feedsQuery = null,
Mock<IPrincipal> currentUser = null)

{
userService = userService ?? new Mock<IUserService>();
var packageService = new Mock<IPackageService>();
Expand Down
4 changes: 2 additions & 2 deletions Facts/Facts.csproj
Expand Up @@ -76,9 +76,9 @@
<Reference Include="MvcHaack.Ajax">
<HintPath>..\packages\MvcHaack.Ajax.MVC4.2.0.0.0\lib\net40\MvcHaack.Ajax.dll</HintPath>
</Reference>
<Reference Include="NuGet.Core, Version=2.3.40210.45, Culture=neutral, processorArchitecture=MSIL">
<Reference Include="NuGet.Core, Version=2.3.40314.95, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\Nuget.Core.2.3.0-alpha002\lib\net40-Client\NuGet.Core.dll</HintPath>
<HintPath>..\packages\NuGet.Core.2.3.0-alpha003\lib\net40-Client\NuGet.Core.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.ComponentModel.DataAnnotations" />
Expand Down
7 changes: 2 additions & 5 deletions Facts/Infrastructure/LuceneSearchServiceFacts.cs
Expand Up @@ -538,18 +538,15 @@ private IList<Package> IndexAndSearch(Mock<IPackageSource> packageSource, string
luceneIndexingService.UpdateIndex(forceRefresh: true);

var luceneSearchService = new LuceneSearchService(d);
int totalHits = 0;
var searchFilter = new SearchFilter
{
Skip = 0,
Take = 10,
SearchTerm = searchTerm,
};

var results = luceneSearchService.Search(
packageSource.Object.GetPackagesForIndexing(null),
searchFilter,
out totalHits).ToList();
int totalHits;
var results = luceneSearchService.Search(searchFilter, out totalHits).ToList();

return results;
}
Expand Down
2 changes: 1 addition & 1 deletion Facts/Services/FeedServiceFacts.cs
Expand Up @@ -74,7 +74,7 @@ public void V1FeedSearchDoesNotReturnPrereleasePackages()
configuration.Setup(c => c.GetSiteRoot(It.IsAny<bool>())).Returns("https://localhost:8081/");
var searchService = new Mock<ISearchService>(MockBehavior.Strict);
int total;
searchService.Setup(s => s.Search(It.IsAny<IQueryable<Package>>(), It.IsAny<SearchFilter>(), out total)).Returns
searchService.Setup(s => s.Search(It.IsAny<SearchFilter>(), out total, null)).Returns
<IQueryable<Package>, string>((_, __) => _);
var v1Service = new TestableV1Feed(repo.Object, configuration.Object, searchService.Object);

Expand Down

0 comments on commit 0c2b5da

Please sign in to comment.