8. Mocking DataΒΆ

Writing a contract enables you to create a mock server or a client by just writing the Arbitrary instances for datatypes used in the contract.

Lets create a mock server for the contract mentioned in Quick start by writing arbitrary instances for our datatypes.

instance Arbitrary UserData where
    arbitrary = UserData <$> arbitrary
                         <*> arbitrary
                         <*> arbitrary

instance Arbitrary UserToken where
    arbitrary = UserToken <$> arbitrary
                          <*> arbitrary
instance Arbitrary Text where
    arbitrary = elements ["Foo", "Bar", "Baz"]

Now we can create a Wai.Application for our mock server as

mockApp :: Wai.Application
mockApp = mockServer serverSettings (MockServer mockServerSettings :: MockServer MyApiService)

mockServer takes ServerSettings and MockServer as arguments. MockServer lets you decide what kind of mock data is to be returned (ApiOut, ApiError or OtherError). It returns ApiOut (SuccessData) by default.

Now you can run this Wai.Application on some port to bring up your mock server.

main :: IO ()
main = run 8000 mockApp

You can even mock the requests. To create a mock Request for route User declared in Quick start, we can write:

req <- mockClient (Res :: Resource GET User)

We can use this req while calling client function to make a Request.