2 changed files with 175 additions and 0 deletions
@ -0,0 +1,96 @@ |
|||||||
|
using System; |
||||||
|
using Microsoft.AspNetCore.Http; |
||||||
|
using Bit.Core.IdentityServer; |
||||||
|
using Xunit; |
||||||
|
using NSubstitute; |
||||||
|
using System.Collections.Generic; |
||||||
|
using Microsoft.Extensions.Primitives; |
||||||
|
|
||||||
|
namespace Bit.Core.Test.IdentityServer |
||||||
|
{ |
||||||
|
public class TokenRetrievalTests |
||||||
|
{ |
||||||
|
private Func<HttpRequest, string> Retrieve = TokenRetrieval.FromAuthorizationHeaderOrQueryString(); |
||||||
|
|
||||||
|
[Fact] |
||||||
|
public void RetrieveToken_FromHeader_ReturnsToken() |
||||||
|
{ |
||||||
|
// Arrange |
||||||
|
var headers = new HeaderDictionary |
||||||
|
{ |
||||||
|
{ "Authorization", "Bearer test_value" }, |
||||||
|
{ "X-Test-Header", "random_value" } |
||||||
|
}; |
||||||
|
|
||||||
|
var request = Substitute.For<HttpRequest>(); |
||||||
|
|
||||||
|
request.Headers.Returns(headers); |
||||||
|
|
||||||
|
// Act |
||||||
|
var token = Retrieve(request); |
||||||
|
|
||||||
|
// Assert |
||||||
|
Assert.Equal("test_value", token); |
||||||
|
} |
||||||
|
|
||||||
|
[Fact] |
||||||
|
public void RetrieveToken_FromQueryString_ReturnsToken() |
||||||
|
{ |
||||||
|
// Arrange |
||||||
|
var queryString = new Dictionary<string, StringValues> |
||||||
|
{ |
||||||
|
{ "access_token", "test_value" }, |
||||||
|
{ "test-query", "random_value" } |
||||||
|
}; |
||||||
|
|
||||||
|
var request = Substitute.For<HttpRequest>(); |
||||||
|
request.Query.Returns(new QueryCollection(queryString)); |
||||||
|
|
||||||
|
// Act |
||||||
|
var token = Retrieve(request); |
||||||
|
|
||||||
|
// Assert |
||||||
|
Assert.Equal("test_value", token); |
||||||
|
} |
||||||
|
|
||||||
|
[Fact] |
||||||
|
public void RetrieveToken_HasBoth_ReturnsHeaderToken() |
||||||
|
{ |
||||||
|
// Arrange |
||||||
|
var queryString = new Dictionary<string, StringValues> |
||||||
|
{ |
||||||
|
{ "access_token", "query_string_token" }, |
||||||
|
{ "test-query", "random_value" } |
||||||
|
}; |
||||||
|
|
||||||
|
var headers = new HeaderDictionary |
||||||
|
{ |
||||||
|
{ "Authorization", "Bearer header_token" }, |
||||||
|
{ "X-Test-Header", "random_value" } |
||||||
|
}; |
||||||
|
|
||||||
|
var request = Substitute.For<HttpRequest>(); |
||||||
|
request.Headers.Returns(headers); |
||||||
|
request.Query.Returns(new QueryCollection(queryString)); |
||||||
|
|
||||||
|
// Act |
||||||
|
var token = Retrieve(request); |
||||||
|
|
||||||
|
// Assert |
||||||
|
Assert.Equal("header_token", token); |
||||||
|
} |
||||||
|
|
||||||
|
[Fact] |
||||||
|
public void RetrieveToken_NoToken_ReturnsNull() |
||||||
|
{ |
||||||
|
// Arrange |
||||||
|
var request = Substitute.For<HttpRequest>(); |
||||||
|
|
||||||
|
// Act |
||||||
|
var token = Retrieve(request); |
||||||
|
|
||||||
|
// Assert |
||||||
|
Assert.Null(token); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,79 @@ |
|||||||
|
|
||||||
|
using Bit.Core.Utilities; |
||||||
|
using Bit.Core.Exceptions; |
||||||
|
using Microsoft.AspNetCore.Mvc.Filters; |
||||||
|
using Microsoft.Extensions.DependencyInjection; |
||||||
|
using NSubstitute; |
||||||
|
using Xunit; |
||||||
|
using System.Collections.Generic; |
||||||
|
using Microsoft.AspNetCore.Mvc; |
||||||
|
using Microsoft.AspNetCore.Http; |
||||||
|
using Microsoft.AspNetCore.Routing; |
||||||
|
using Microsoft.AspNetCore.Mvc.Abstractions; |
||||||
|
|
||||||
|
namespace Bit.Core.Test.Utilities |
||||||
|
{ |
||||||
|
public class SelfHostedAttributeTests |
||||||
|
{ |
||||||
|
[Fact] |
||||||
|
public void NotSelfHosted_Throws_When_SelfHosted() |
||||||
|
{ |
||||||
|
var sha = new SelfHostedAttribute { NotSelfHostedOnly = true }; |
||||||
|
|
||||||
|
Assert.Throws<BadRequestException>(() => sha.OnActionExecuting(GetContext(selfHosted: true))); |
||||||
|
} |
||||||
|
|
||||||
|
[Fact] |
||||||
|
public void NotSelfHosted_Success_When_NotSelfHosted() |
||||||
|
{ |
||||||
|
var sha = new SelfHostedAttribute { NotSelfHostedOnly = true }; |
||||||
|
|
||||||
|
sha.OnActionExecuting(GetContext(selfHosted: false)); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
[Fact] |
||||||
|
public void SelfHosted_Success_When_SelfHosted() |
||||||
|
{ |
||||||
|
var sha = new SelfHostedAttribute { SelfHostedOnly = true }; |
||||||
|
|
||||||
|
sha.OnActionExecuting(GetContext(selfHosted: true)); |
||||||
|
} |
||||||
|
|
||||||
|
[Fact] |
||||||
|
public void SelfHosted_Throws_When_NotSelfHosted() |
||||||
|
{ |
||||||
|
var sha = new SelfHostedAttribute { SelfHostedOnly = true }; |
||||||
|
|
||||||
|
Assert.Throws<BadRequestException>(() => sha.OnActionExecuting(GetContext(selfHosted: false))); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
// This generates a ActionExecutingContext with the needed injected |
||||||
|
// service with the given value. |
||||||
|
private ActionExecutingContext GetContext(bool selfHosted) |
||||||
|
{ |
||||||
|
IServiceCollection services = new ServiceCollection(); |
||||||
|
|
||||||
|
var globalSettings = new GlobalSettings |
||||||
|
{ |
||||||
|
SelfHosted = selfHosted |
||||||
|
}; |
||||||
|
|
||||||
|
services.AddSingleton(globalSettings); |
||||||
|
|
||||||
|
var httpContext = new DefaultHttpContext(); |
||||||
|
httpContext.RequestServices = services.BuildServiceProvider(); |
||||||
|
|
||||||
|
var context = Substitute.For<ActionExecutingContext>( |
||||||
|
Substitute.For<ActionContext>(httpContext, |
||||||
|
new RouteData(), |
||||||
|
Substitute.For<ActionDescriptor>()), |
||||||
|
new List<IFilterMetadata>(), |
||||||
|
new Dictionary<string, object>(), |
||||||
|
Substitute.For<Controller>()); |
||||||
|
|
||||||
|
return context; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
Loading…
Reference in new issue