Skip to content

Commit

Permalink
moved aggregate stats from pages to stats
Browse files Browse the repository at this point in the history
  • Loading branch information
johnataylor committed Jan 22, 2013
1 parent 2e1b477 commit 4183672
Show file tree
Hide file tree
Showing 10 changed files with 180 additions and 193 deletions.
103 changes: 0 additions & 103 deletions Facts/Controllers/PagesControllerFacts.cs

This file was deleted.

100 changes: 94 additions & 6 deletions Facts/Controllers/StatisticsControllerFacts.cs
Expand Up @@ -3,6 +3,10 @@
using System.Threading.Tasks;
using System.Web.Mvc;
using Xunit;
using System.Globalization;

This comment has been minimized.

Copy link
@jeffhandley

jeffhandley Jan 22, 2013

Member

sort usings

using System.Web;
using System.Threading;
using System.Web.Routing;

namespace NuGetGallery
{
Expand All @@ -19,7 +23,7 @@ public async void StatisticsHomePage_ValidateReportStructureAndAvailability()
fakeReportService.Setup(x => x.Load("RecentPopularity.json")).Returns(Task.FromResult(fakePackageReport));
fakeReportService.Setup(x => x.Load("RecentPopularityDetail.json")).Returns(Task.FromResult(fakePackageVersionReport));

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

This comment has been minimized.

Copy link
@jeffhandley

jeffhandley Jan 22, 2013

Member

you can add a ctor overload that only takes the IStatisticsService


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

Expand Down Expand Up @@ -55,7 +59,7 @@ public async void StatisticsHomePage_ValidateFullReportStructureAndAvailability(
fakeReportService.Setup(x => x.Load("RecentPopularity.json")).Returns(Task.FromResult(fakePackageReport));
fakeReportService.Setup(x => x.Load("RecentPopularityDetail.json")).Returns(Task.FromResult(fakePackageVersionReport));

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

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

Expand Down Expand Up @@ -105,7 +109,7 @@ public async void StatisticsHomePage_Packages_ValidateReportStructureAndAvailabi

fakeReportService.Setup(x => x.Load("RecentPopularity.json")).Returns(Task.FromResult(fakePackageReport));

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

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

Expand All @@ -128,7 +132,7 @@ public async void StatisticsHomePage_PackageVersions_ValidateReportStructureAndA

fakeReportService.Setup(x => x.Load("RecentPopularityDetail.json")).Returns(Task.FromResult(fakePackageVersionReport));

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

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

Expand All @@ -153,7 +157,7 @@ public async void StatisticsHomePage_Per_Package_ValidateReportStructureAndAvail

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

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

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

Expand All @@ -177,7 +181,7 @@ public async void StatisticsHomePage_Packages_Negative_ValidateThrowOnInvalidStr

fakeReportService.Setup(x => x.Load("RecentPopularity.json")).Returns(Task.FromResult(fakePackageReport));

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

bool hasException = false;

Expand All @@ -197,6 +201,90 @@ public async void StatisticsHomePage_Packages_Negative_ValidateThrowOnInvalidStr
throw new Exception("this exception thrown because expected exception was not thrown");
}
}

public class TheStatsAction

This comment has been minimized.

Copy link
@jeffhandley

jeffhandley Jan 22, 2013

Member

This should be renamed to TheTotalsAction

{
[Fact]
public void UseServerCultureIfLanguageHeadersIsMissing()
{
// Arrange
var currentCulture = CultureInfo.CurrentCulture;

try
{
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-us");

var statsService = new Mock<IAggregateStatsService>(MockBehavior.Strict);
var stats = new AggregateStats
{
Downloads = 2013,
TotalPackages = 1000,
UniquePackages = 500
};
statsService.Setup(s => s.GetAggregateStats()).Returns(stats);

var controller = CreateController(statsService);

// Act
var result = controller.Totals() as JsonResult;

// Asssert
Assert.NotNull(result);
dynamic data = result.Data;

Assert.Equal("2,013", (string)data.Downloads);
Assert.Equal("500", (string)data.UniquePackages);
Assert.Equal("1,000", (string)data.TotalPackages);
}
finally
{
Thread.CurrentThread.CurrentCulture = currentCulture;
}
}

[Fact]
public void UseClientCultureIfLanguageHeadersIsPresent()
{
// Arrange
var statsService = new Mock<IAggregateStatsService>(MockBehavior.Strict);
var stats = new AggregateStats
{
Downloads = 2013,
TotalPackages = 1000,
UniquePackages = 500
};
statsService.Setup(s => s.GetAggregateStats()).Returns(stats);

var request = new Mock<HttpRequestBase>();
request.Setup(r => r.UserLanguages).Returns(new string[] { "vi-VN" });

var controller = CreateController(statsService, request);

// Act
var result = controller.Totals() as JsonResult;

// Asssert
Assert.NotNull(result);
dynamic data = result.Data;

Assert.Equal("2.013", (string)data.Downloads);
Assert.Equal("500", (string)data.UniquePackages);
Assert.Equal("1.000", (string)data.TotalPackages);
}
}

public static StatisticsController CreateController(Mock<IAggregateStatsService> statsService, Mock<HttpRequestBase> request = null)
{
request = request ?? new Mock<HttpRequestBase>();

var context = new Mock<HttpContextBase>();
context.SetupGet(s => s.Request).Returns(request.Object);

var controller = new StatisticsController(null, statsService.Object);

This comment has been minimized.

Copy link
@jeffhandley

jeffhandley Jan 22, 2013

Member

Use the overloaded ctor

controller.ControllerContext = new ControllerContext(context.Object, new RouteData(), controller);

return controller;
}
}
}

1 change: 0 additions & 1 deletion Facts/Facts.csproj
Expand Up @@ -153,7 +153,6 @@
<Compile Include="Controllers\JsonApiControllerFacts.cs" />
<Compile Include="Controllers\PackageFilesControllerFacts.cs" />
<Compile Include="Controllers\PackagesControllerFacts.cs" />
<Compile Include="Controllers\PagesControllerFacts.cs" />
<Compile Include="Controllers\StatisticsControllerFacts.cs" />
<Compile Include="Controllers\UsersControllerFacts.cs" />
<Compile Include="Entities\PackageFacts.cs" />
Expand Down
12 changes: 6 additions & 6 deletions Website/App_Start/Routes.cs
Expand Up @@ -14,16 +14,16 @@ public static void RegisterRoutes(RouteCollection routes)
"",
MVC.Pages.Home());

routes.MapRoute(
RouteName.Stats,
"stats/totals",
MVC.Pages.Stats());

routes.MapRoute(
RouteName.StatisticsHome,
"stats/home",
"stats",
new { controller = MVC.Statistics.Name, action = "Index" });

routes.MapRoute(
RouteName.Stats,
"stats/totals",
MVC.Statistics.Totals());

routes.MapRoute(
RouteName.StatisticsPackages,
"stats/packages",
Expand Down
42 changes: 1 addition & 41 deletions Website/Controllers/PagesController.cs
Expand Up @@ -6,11 +6,8 @@ namespace NuGetGallery
{
public partial class PagesController : Controller
{
private readonly IAggregateStatsService _statsService;

public PagesController(IAggregateStatsService statsService)
public PagesController()
{
_statsService = statsService;
}

public virtual ActionResult Home()
Expand All @@ -27,42 +24,5 @@ public virtual ActionResult Privacy()
{
return View();
}

[HttpGet]
[OutputCache(VaryByParam = "None", Duration = 120, Location = OutputCacheLocation.Server)]
public virtual JsonResult Stats()
{
var stats = _statsService.GetAggregateStats();

// if we fail to detect client locale from the Languages header, fall back to server locale
CultureInfo clientCulture = DetermineClientLocale() ?? CultureInfo.CurrentCulture;
return Json(
new
{
Downloads = stats.Downloads.ToString("n0", clientCulture),
UniquePackages = stats.UniquePackages.ToString("n0", clientCulture),
TotalPackages = stats.TotalPackages.ToString("n0", clientCulture)
},
JsonRequestBehavior.AllowGet);
}

private CultureInfo DetermineClientLocale()
{
CultureInfo clientCulture = null;

string[] languages = Request.UserLanguages;
if (languages != null && languages.Length > 0)
{
try
{
clientCulture = CultureInfo.GetCultureInfo(languages[0].ToLowerInvariant().Trim());
}
catch (CultureNotFoundException)
{
}
}

return clientCulture;
}
}
}

2 comments on commit 4183672

@jeffhandley
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looking good

@johnataylor
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done

Please sign in to comment.