92 lines
3.3 KiB
C#
92 lines
3.3 KiB
C#
using System;
|
|
using System.Net;
|
|
using System.Net.Http;
|
|
using System.Net.Http.Headers;
|
|
using System.Threading.Tasks;
|
|
using System.Web.Http;
|
|
using Microsoft.Owin.Testing;
|
|
using Newtonsoft.Json;
|
|
using NUnit.Framework;
|
|
using Umbraco.Core;
|
|
using Umbraco.Web;
|
|
using Umbraco.Web.WebApi;
|
|
|
|
namespace Umbraco.Tests.TestHelpers.ControllerTesting
|
|
{
|
|
public class TestRunner
|
|
{
|
|
private readonly Func<HttpRequestMessage, UmbracoHelper, ApiController> _controllerFactory;
|
|
|
|
public TestRunner(Func<HttpRequestMessage, UmbracoHelper, ApiController> controllerFactory)
|
|
{
|
|
_controllerFactory = controllerFactory;
|
|
}
|
|
|
|
public async Task<Tuple<HttpResponseMessage, string>> Execute(string controllerName, string actionName, HttpMethod method,
|
|
HttpContent content = null,
|
|
MediaTypeWithQualityHeaderValue mediaTypeHeader = null,
|
|
bool assertOkResponse = true)
|
|
{
|
|
if (mediaTypeHeader == null)
|
|
{
|
|
mediaTypeHeader = new MediaTypeWithQualityHeaderValue("application/json");
|
|
}
|
|
|
|
var startup = new TestStartup(
|
|
configuration =>
|
|
{
|
|
configuration.Routes.MapHttpRoute("Default",
|
|
routeTemplate: "{controller}/{action}/{id}",
|
|
defaults: new { controller = controllerName, action = actionName, id = RouteParameter.Optional });
|
|
},
|
|
_controllerFactory);
|
|
|
|
using (var server = TestServer.Create(builder => startup.Configuration(builder)))
|
|
{
|
|
var request = new HttpRequestMessage
|
|
{
|
|
RequestUri = new Uri("https://testserver/"),
|
|
Method = method
|
|
};
|
|
|
|
if (content != null)
|
|
request.Content = content;
|
|
|
|
request.Headers.Accept.Add(mediaTypeHeader);
|
|
|
|
Console.WriteLine(request);
|
|
var response = await server.HttpClient.SendAsync(request);
|
|
Console.WriteLine(response);
|
|
|
|
if (response.IsSuccessStatusCode == false)
|
|
{
|
|
WriteResponseError(response);
|
|
}
|
|
|
|
var json = (await ((StreamContent)response.Content).ReadAsStringAsync()).TrimStart(AngularJsonMediaTypeFormatter.XsrfPrefix);
|
|
if (!json.IsNullOrWhiteSpace())
|
|
{
|
|
var deserialized = JsonConvert.DeserializeObject(json);
|
|
Console.Write(JsonConvert.SerializeObject(deserialized, Formatting.Indented));
|
|
}
|
|
|
|
if (assertOkResponse)
|
|
{
|
|
Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
|
|
}
|
|
|
|
return Tuple.Create(response, json);
|
|
}
|
|
}
|
|
|
|
private static void WriteResponseError(HttpResponseMessage response)
|
|
{
|
|
var result = response.Content.ReadAsStringAsync().Result;
|
|
Console.Out.WriteLine("Http operation unsuccessfull");
|
|
Console.Out.WriteLine($"Status: '{response.StatusCode}'");
|
|
Console.Out.WriteLine($"Reason: '{response.ReasonPhrase}'");
|
|
Console.Out.WriteLine(result);
|
|
}
|
|
}
|
|
}
|