Search code examples
c#jsonunit-testinggetopenrasta

OpenRasta Unit Testing GET results in 404 error


I've completed my implementation of my first OpenRasta RESTful webservice and have successfully got the GET requests I wish for working.

Therefore I've taken some 'inspiration' from Daniel Irvine with his post http://danielirvine.com/blog/2011/06/08/testing-restful-services-with-openrasta/ to built a automated test project to test the implmentation.

I've created my own test class but I'm constantly getting a 404 error as the reponse status code.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using OpenRasta.Hosting.InMemory;
using PoppyService;
using OpenRasta.Web;
using System.IO;
using System.Runtime.Serialization.Json;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using NUnit.Framework;

namespace PoppyServiceTests
{
//http://danielirvine.com/blog/2011/06/08/testing-restful-services-with-openrasta/
[TestFixture]
class OpenRastaJSONTestMehods
{
    [TestCase("http://localhost/PoppyService/users")]
    public static void GET(string uri)
    {
        const string PoppyLocalHost = "http://localhost/PoppyService/";
        if (uri.Contains(PoppyLocalHost))
            GET(new Uri(uri));
        else
            throw new UriFormatException(string.Format("The uri doesn't contain {0}", PoppyLocalHost));
    }
    [Test]
    public static void GET(Uri serviceuri)
    {
        using (var host = new InMemoryHost(new Configuration()))
        {
            var request = new InMemoryRequest()
            {
                Uri = serviceuri,
                HttpMethod = "GET"
            };

            // set up your code formats - I'm using  
            // JSON because it's awesome  
            request.Entity.ContentType = MediaType.Json;
            request.Entity.Headers["Accept"] = "application/json";

            // send the request and save the resulting response  
            var response = host.ProcessRequest(request);
            int statusCode = response.StatusCode;

            NUnit.Framework.Assert.AreEqual(200, statusCode, string.Format("Http StatusCode Error: {0}", statusCode));

            // deserialize the content from the response  
            object returnedObject;
            if (response.Entity.ContentLength > 0)
            {
                // you must rewind the stream, as OpenRasta    
                // won't do this for you    
                response.Entity.Stream.Seek(0, SeekOrigin.Begin);
                var serializer = new DataContractJsonSerializer(typeof(object));
                returnedObject = serializer.ReadObject(response.Entity.Stream);
            }
        }
    }
}

}

If I navigate to the Uri manually in the browser I'm getting the correct responce and HTTP 200.

It's possibly something to do with my Configuration class, but if I test all the Uris manaully again I get the correct result.

public class Configuration : IConfigurationSource
{
    public void Configure()
    {
        using (OpenRastaConfiguration.Manual)
        {                
            ResourceSpace.Has.ResourcesOfType<TestPageResource>()
                .AtUri("/testpage").HandledBy<TestPageHandler>().RenderedByAspx("~/Views/DummyView.aspx");

            ResourceSpace.Has.ResourcesOfType<IList<AppUser>>()
                .AtUri("/users").And
                .AtUri("/user/{appuserid}").HandledBy<UserHandler>().AsJsonDataContract();

            ResourceSpace.Has.ResourcesOfType<AuthenticationResult>()
                .AtUri("/user").HandledBy<UserHandler>().AsJsonDataContract();

            ResourceSpace.Has.ResourcesOfType<IList<Client>>()
                .AtUri("/clients").And
                .AtUri("/client/{clientid}").HandledBy<ClientsHandler>().AsJsonDataContract();

            ResourceSpace.Has.ResourcesOfType<IList<Agency>>()
                .AtUri("/agencies").And
                .AtUri("/agency/{agencyid}").HandledBy<AgencyHandler>().AsJsonDataContract();

            ResourceSpace.Has.ResourcesOfType<IList<ClientApps>>()
                .AtUri("/clientapps/{appid}").HandledBy<ClientAppsHandler>().AsJsonDataContract();

            ResourceSpace.Has.ResourcesOfType<Client>()
                .AtUri("/agencyclients").And
                .AtUri("/agencyclients/{agencyid}").HandledBy<AgencyClientsHandler>().AsJsonDataContract();

            ResourceSpace.Has.ResourcesOfType<Client>()
                .AtUri("/agencyplususerclients/{appuserid}").HandledBy<AgencyPlusUserClientsHandler>().AsJsonDataContract();

            ResourceSpace.Has.ResourcesOfType<IList<Permission>>()
                .AtUri("/permissions/{appuserid}/{appid}").HandledBy<PermissionsHandler>().AsJsonDataContract();

            ResourceSpace.Has.ResourcesOfType<IList<Role>>()
                .AtUri("/roles").And
                .AtUri("/roles/{appuserid}").And.AtUri("/roles/{appuserid}/{appid}").HandledBy<RolesHandler>().AsJsonDataContract();

            ResourceSpace.Has.ResourcesOfType<IList<AppVersion>>()
                .AtUri("/userappversion").And
                .AtUri("/userappversion/{appuserid}").HandledBy<UserAppVersionHandler>().AsJsonDataContract();
        }
    }
}

Any suggestions would be greatfully received.


Solution

  • I've solved it with the help from Nate Taylor (http://taylonr.com/integration-testing-openrasta), who has implemented a similar test method for POST. I was including the solution name 'PoppyService' in the Uri which is the Uri for the project hosted on IIS. I mistakenly assumed the configuration would create this Uri for InMemoryHost as well but it routes straight to localhost. Removing this has made the Assert test be successful.

    [TestCase("http://localhost/users")]
        public static void GET(string uri)
        {
            const string LocalHost = "http://localhost/";
            if (uri.Contains(LocalHost))
                GET(new Uri(uri));
            else
                throw new UriFormatException(string.Format("The uri doesn't contain {0}", LocalHost));
        }
    

    The post is also a good find because I need to implement a test method for POST too. Hope this helps others too, as Daniel didn't specifically explain what he meant by MyResource. Is obvious to me now.