Adding Tests and Refactoring

Functional Tests for RazorPages added
This commit is contained in:
Steve Smith
2018-05-31 12:28:55 -04:00
parent 5fb9e741dd
commit 814d3e249c
22 changed files with 275 additions and 142 deletions

View File

@@ -1,17 +1,27 @@
using Microsoft.eShopWeb.ViewModels;
using Microsoft.AspNetCore.Mvc.Testing;
using Microsoft.eShopWeb;
using Microsoft.eShopWeb.ViewModels;
using Newtonsoft.Json;
using System.Linq;
using System.Net.Http;
using System.Threading.Tasks;
using Xunit;
namespace FunctionalTests.Web.Controllers
{
public class ApiCatalogControllerList : BaseWebTest
public class ApiCatalogControllerList : IClassFixture<CustomWebApplicationFactory<Startup>>
{
public ApiCatalogControllerList(CustomWebApplicationFactory<Startup> factory)
{
Client = factory.CreateClient();
}
public HttpClient Client { get; }
[Fact]
public async Task ReturnsFirst10CatalogItems()
{
var response = await _client.GetAsync("/api/catalog/list");
var response = await Client.GetAsync("/api/catalog/list");
response.EnsureSuccessStatusCode();
var stringResponse = await response.Content.ReadAsStringAsync();
var model = JsonConvert.DeserializeObject<CatalogIndexViewModel>(stringResponse);
@@ -22,7 +32,7 @@ namespace FunctionalTests.Web.Controllers
[Fact]
public async Task ReturnsLast2CatalogItemsGivenPageIndex1()
{
var response = await _client.GetAsync("/api/catalog/list?page=1");
var response = await Client.GetAsync("/api/catalog/list?page=1");
response.EnsureSuccessStatusCode();
var stringResponse = await response.Content.ReadAsStringAsync();
var model = JsonConvert.DeserializeObject<CatalogIndexViewModel>(stringResponse);

View File

@@ -1,89 +0,0 @@
using System;
using System.IO;
using System.Net.Http;
using System.Reflection;
using Microsoft.eShopWeb;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.TestHost;
using Microsoft.Extensions.Logging;
using Infrastructure.Data;
using Infrastructure.Identity;
using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.DependencyInjection;
namespace FunctionalTests.Web.Controllers
{
public abstract class BaseWebTest
{
protected readonly HttpClient _client;
protected string _contentRoot;
public BaseWebTest()
{
_client = GetClient();
}
protected HttpClient GetClient()
{
var startupAssembly = typeof(Startup).GetTypeInfo().Assembly;
_contentRoot = GetProjectPath("src", startupAssembly);
var builder = new WebHostBuilder()
.UseContentRoot(_contentRoot)
.UseEnvironment("Testing")
.UseStartup<Startup>();
var server = new TestServer(builder);
// seed data
using (var scope = server.Host.Services.CreateScope())
{
var services = scope.ServiceProvider;
var loggerFactory = services.GetRequiredService<ILoggerFactory>();
var catalogContext = services.GetRequiredService<CatalogContext>();
CatalogContextSeed.SeedAsync(catalogContext, loggerFactory)
.Wait();
var userManager = services.GetRequiredService<UserManager<ApplicationUser>>();
AppIdentityDbContextSeed.SeedAsync(userManager).Wait();
}
return server.CreateClient();
}
/// <summary>
/// Gets the full path to the target project path that we wish to test
/// </summary>
/// <param name="solutionRelativePath">
/// The parent directory of the target project.
/// e.g. src, samples, test, or test/Websites
/// </param>
/// <param name="startupAssembly">The target project's assembly.</param>
/// <returns>The full path to the target project.</returns>
protected static string GetProjectPath(string solutionRelativePath, Assembly startupAssembly)
{
// Get name of the target project which we want to test
var projectName = startupAssembly.GetName().Name;
// Get currently executing test project path
var applicationBasePath = AppContext.BaseDirectory;
// Find the folder which contains the solution file. We then use this information to find the target
// project which we want to test.
var directoryInfo = new DirectoryInfo(applicationBasePath);
do
{
var solutionFileInfo = new FileInfo(Path.Combine(directoryInfo.FullName, "eShopOnWeb.sln"));
if (solutionFileInfo.Exists)
{
return Path.GetFullPath(Path.Combine(directoryInfo.FullName, solutionRelativePath, projectName));
}
directoryInfo = directoryInfo.Parent;
}
while (directoryInfo.Parent != null);
throw new Exception($"Solution root could not be located using application root {applicationBasePath}.");
}
}
}

View File

@@ -10,10 +10,7 @@ namespace FunctionalTests.Web.Controllers
{
public CatalogControllerIndex(CustomWebApplicationFactory<Startup> factory)
{
Client = factory.CreateClient(new WebApplicationFactoryClientOptions
{
AllowAutoRedirect = false
});
Client = factory.CreateClient();
}
public HttpClient Client { get; }

View File

@@ -6,6 +6,7 @@ using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using System;
using Microsoft.EntityFrameworkCore;
using Infrastructure.Identity;
namespace FunctionalTests.Web.Controllers
{
@@ -14,7 +15,6 @@ namespace FunctionalTests.Web.Controllers
{
protected override void ConfigureWebHost(IWebHostBuilder builder)
{
builder.UseEnvironment("Testing");
builder.ConfigureServices(services =>
{
// Create a new service provider.
@@ -30,6 +30,12 @@ namespace FunctionalTests.Web.Controllers
options.UseInternalServiceProvider(serviceProvider);
});
services.AddDbContext<AppIdentityDbContext>(options =>
{
options.UseInMemoryDatabase("Identity");
options.UseInternalServiceProvider(serviceProvider);
});
// Build the service provider.
var sp = services.BuildServiceProvider();

View File

@@ -0,0 +1,32 @@
using Microsoft.AspNetCore.Mvc.Testing;
using Microsoft.eShopWeb;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using Xunit;
namespace FunctionalTests.Web.Controllers
{
public class OrderIndexOnGet : IClassFixture<CustomWebApplicationFactory<Startup>>
{
public OrderIndexOnGet(CustomWebApplicationFactory<Startup> factory)
{
Client = factory.CreateClient(new WebApplicationFactoryClientOptions
{
AllowAutoRedirect = false
});
}
public HttpClient Client { get; }
[Fact]
public async Task ReturnsRedirectGivenAnonymousUser()
{
var response = await Client.GetAsync("/Order/Index");
var redirectLocation = response.Headers.Location.OriginalString;
Assert.Equal(HttpStatusCode.Redirect, response.StatusCode);
Assert.Contains("Account/Signin", redirectLocation);
}
}
}