Adding Tests and Refactoring
Functional Tests for RazorPages added
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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}.");
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -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; }
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user