JohanLarsson
JohanLarsson

Reputation: 485

Testing Web API controllers protected with [Authorize]

I have just added token-based security to my Web API using ASP.net identity OWIN and OAuth 2. As a result of this I am getting 405 unauthorized error on all my tests. How can I mock the securitycontext. I've seen some samples where other have overridden the Thread.CurrentPrincipal but unsure if this is the correct way.

sample test

    [TestMethod]
    public void Verify_GetReferenceData_Http_Get()
    {
        var configAE = new HttpSelfHostConfiguration("http://localhost:53224");
        Konstrukt.SL.AggregationEngine.WebApiConfig.Register(configAE, new AutoFacStandardModule());

        using (HttpSelfHostServer serverAE = new HttpSelfHostServer(configAE))
        {
            serverAE.OpenAsync().Wait();
            HttpResponseMessage responseMessage;
            using (var client = new HttpClient())
            {
                responseMessage =
                    client.GetAsync(
                        "http://localhost:53224/AggregationEngine/GetReferenceData/1/Dummy/..."
                        ).Result;
                serverAE.CloseAsync().Wait();
                configAE.Dispose();
                Assert.AreEqual(HttpStatusCode.OK, responseMessage.StatusCode, "Wrong http status returned");

            }
        }

    }

sample controller

public class GetReferenceDataController : ApiController
{
    private readonly IDeserializeHelper _deserializeHelper;
    private readonly IGetBudgetData _getBudgetData;
    private readonly IRevision _revision;

    public GetReferenceDataController(IDeserializeHelper deserializeHelper, IGetBudgetData getBudgetData, IRevision revision)
    {
        _deserializeHelper = deserializeHelper;
        _getBudgetData = getBudgetData;
        _revision = revision;
    }

    [Authorize]
    [Route("AggregationEngine/GetReferenceData/{budgetId}/{userId}/{filterJSON}")]
    [HttpGet]
    public HttpResponseMessage Get(int budgetId, string userId, [FromUri]string filterJSON)
    {
        FlatBudgetData data = new FlatBudgetData();
        IDataQueryFilter dataQueryFilter = _deserializeHelper.DeserializeToFilterObject(EntityType.UserReferenceLine, _revision.GetLatesRevision(budgetId), userId, filterJSON);
        data.Data = _getBudgetData.GetData(dataQueryFilter);

        string jsonFlatBudget = JsonConvert.SerializeObject(data);

        var jsonResponse = new HttpResponseMessage()
        {
            Content = new StringContent(jsonFlatBudget)
        };
        jsonResponse.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
        return jsonResponse;
    }
}

Upvotes: 3

Views: 2048

Answers (1)

JohanLarsson
JohanLarsson

Reputation: 485

I followed the first answer in the following stack thread and got it working. Integration Test Web Api With [Authorize]

Upvotes: 2

Related Questions