You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

139 lines
7.0 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using Microsoft.VisualStudio.TestTools.UnitTesting;
using Moq;
using Senparc.Weixin.HttpUtility;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
#if NET462
using System.Web;
#else
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Features;
#endif
namespace Senparc.Weixin.HttpUtility.Tests
{
[TestClass()]
public class UrlUtilityTests
{
[TestMethod()]
public void GenerateOAuthCallbackUrlTest()
{
#if NET462
Func<string, string, string, HttpContextBase> getHttpContextBase = (url, queryString, baseUrl) =>
{
var context = new Mock<HttpContextBase>();
var request = new Mock<HttpRequestBase>();
var response = new Mock<HttpResponseBase>();
request.Setup(r => r.Url).Returns(new Uri(url));
request.Setup(r => r.ApplicationPath).Returns(baseUrl);
context.Setup(c => c.Request).Returns(request.Object);
context.Setup(c => c.Response).Returns(response.Object);
context.Setup(c => c.Response).Returns(response.Object);
return context.Object;
var httpContext = new HttpContext(new HttpRequest("Senparc", url, queryString), new HttpResponse(null));
var httpContextBase = new HttpContextWrapper(httpContext);
return httpContextBase;
};
#else
Func<string, string, string, HttpContext> getHttpContextBase = (url, queryString, baseUrl) =>
{
var uri = new Uri(url);
var scheme = uri.Scheme;
var path = uri.LocalPath;
var httpContext = new DefaultHttpContext();
httpContext.Request.Path = path;
httpContext.Request.Host = new HostString(uri.Host, uri.Port);
httpContext.Request.Scheme = scheme;
httpContext.Request.QueryString = new QueryString(uri.Query);
httpContext.Request.PathBase = baseUrl;
return httpContext;
};
#endif
string virtualPath = null;//虚拟路径
{
var httpContext = getHttpContextBase("https://sdk.weixin.senparc.com/Home/Index", "", virtualPath);
var callbackUrl = Senparc.Weixin.AspNetHttpUtility.UrlUtility.GenerateOAuthCallbackUrl(httpContext, "/TenpayV3/OAuthCallback");
Console.WriteLine("\r\n普通 HTTP Url" + callbackUrl);
Assert.AreEqual(
"https://sdk.weixin.senparc.com/TenpayV3/OAuthCallback?returnUrl=http%3a%2f%2fsdk.weixin.senparc.com%2fHome%2fIndex",
callbackUrl, true);
}
{
var httpContext = getHttpContextBase("https://sdk.weixin.senparc.com/Home/Index?a=1&b=2&c=3-1", "a=1&b=2&c=3-1", virtualPath);
var callbackUrl = Senparc.Weixin.AspNetHttpUtility.UrlUtility.GenerateOAuthCallbackUrl(httpContext, "/TenpayV3/OAuthCallback");
Console.WriteLine("\r\n带参数 HTTP Url" + callbackUrl);
Assert.AreEqual(
"https://sdk.weixin.senparc.com/TenpayV3/OAuthCallback?returnUrl=http%3a%2f%2fsdk.weixin.senparc.com%2fHome%2fIndex%3fa%3d1%26b%3d2%26c%3d3-1",
callbackUrl, true);
}
{
var httpContext = getHttpContextBase("https://sdk.weixin.senparc.com:8080/Home/Index?a=1&b=2&c=3-1", "a=1&b=2&c=3-1", virtualPath);
var callbackUrl = Senparc.Weixin.AspNetHttpUtility.UrlUtility.GenerateOAuthCallbackUrl(httpContext, "/TenpayV3/OAuthCallback");
Console.WriteLine("\r\n带参数、带端口 HTTP Url" + callbackUrl);
Assert.AreEqual(
"https://sdk.weixin.senparc.com:8080/TenpayV3/OAuthCallback?returnUrl=http%3a%2f%2fsdk.weixin.senparc.com%3a8080%2fHome%2fIndex%3fa%3d1%26b%3d2%26c%3d3-1",
callbackUrl, true);
}
{
var httpContext = getHttpContextBase("https://sdk.weixin.senparc.com/Home/Index", "", virtualPath);
var callbackUrl = Senparc.Weixin.AspNetHttpUtility.UrlUtility.GenerateOAuthCallbackUrl(httpContext, "/TenpayV3/OAuthCallback");
Console.WriteLine("\r\n普通 HTTPS Url" + callbackUrl);
Assert.AreEqual(
"https://sdk.weixin.senparc.com/TenpayV3/OAuthCallback?returnUrl=https%3a%2f%2fsdk.weixin.senparc.com%2fHome%2fIndex",
callbackUrl, true);
}
{
var httpContext = getHttpContextBase("https://sdk.weixin.senparc.com/Home/Index?a=1&b=2&c=3-1", "a=1&b=2&c=3-1", virtualPath);
var callbackUrl = Senparc.Weixin.AspNetHttpUtility.UrlUtility.GenerateOAuthCallbackUrl(httpContext, "/TenpayV3/OAuthCallback");
Console.WriteLine("\r\n带参数 HTTPS Url" + callbackUrl);
Assert.AreEqual(
"https://sdk.weixin.senparc.com/TenpayV3/OAuthCallback?returnUrl=https%3a%2f%2fsdk.weixin.senparc.com%2fHome%2fIndex%3fa%3d1%26b%3d2%26c%3d3-1",
callbackUrl, true);
}
{
var httpContext = getHttpContextBase("https://sdk.weixin.senparc.com:1433/Home/Index?a=1&b=2&c=3-1", "a=1&b=2&c=3-1", virtualPath);
var callbackUrl = Senparc.Weixin.AspNetHttpUtility.UrlUtility.GenerateOAuthCallbackUrl(httpContext, "/TenpayV3/OAuthCallback");
Console.WriteLine("\r\n带参数、带端口 HTTPS Url" + callbackUrl);
Assert.AreEqual(
"https://sdk.weixin.senparc.com:1433/TenpayV3/OAuthCallback?returnUrl=https%3a%2f%2fsdk.weixin.senparc.com%3a1433%2fHome%2fIndex%3fa%3d1%26b%3d2%26c%3d3-1",
callbackUrl, true);
}
//虚拟路径
{
virtualPath = "/VirtualPath";
var httpContext = getHttpContextBase("https://sdk.weixin.senparc.com:1433/VirtualPath/Home/Index?a=1&b=2&c=3-1", "a=1&b=2&c=3-1", virtualPath);
//Console.WriteLine("\r\nhttpContext.Request.AbsoluteUri():"+httpContext.Request.AbsoluteUri());
var callbackUrl = Senparc.Weixin.AspNetHttpUtility.UrlUtility.GenerateOAuthCallbackUrl(httpContext, "/TenpayV3/OAuthCallback");
Console.WriteLine("\r\n带参数、带端口 HTTPS Url" + callbackUrl);
#if NET462
var expectedUrl = "https://sdk.weixin.senparc.com:1433/VirtualPath/TenpayV3/OAuthCallback?returnUrl=https%3a%2f%2fsdk.weixin.senparc.com%3a1433%2fVirtualPath%2fHome%2fIndex%3fa%3d1%26b%3d2%26c%3d3-1";
#else
//.NET Standard(.NET Core)下因为模拟会存在偏差无法自动识别Url中的VirtualPath为特殊的虚拟目录所以会出现重复因此以下结果是可以接受的
var expectedUrl = "https://sdk.weixin.senparc.com:1433/VirtualPath/TenpayV3/OAuthCallback?returnUrl=https%3a%2f%2fsdk.weixin.senparc.com%3a1433%2fVirtualPath%2fVirtualPath%2fHome%2fIndex%3fa%3d1%26b%3d2%26c%3d3-1";
#endif
Assert.AreEqual(expectedUrl, callbackUrl, true);
}
}
}
}