Skip to content

Creating a dynamic mock that wraps an existing API call

Lazarus Lazaridis edited this page Nov 17, 2017 · 2 revisions

Use case

Suppose we are building an application that consumes the GitHub API to show information about repositories via the https://api.github.com/repos/:user/:repository endpoint.Suppose also that GitHub is working to enhance this endpoint with additional information about the last 10 commits of a requested repository.

We want to be able to support this enhancement once GitHub releases the feature. We will use DuckRails to wrap the original response with additional fake data.

Create a new mock and fill in the fields of the General tab as shown here: Duckrails mock form general tab

As you can see, the route path is pretty much the same with the one that we will consume.

Now, on the Response body tab, select Embedded Ruby as Body type and application/json as Content type.

In the Body content fill in:

<%
  # Fetch the response from GitHub
  original_response = RestClient.get "https://api.github.com/repos/#{@parameters[:username]}/#{@parameters[:repo_name]}" rescue '{}'
  result = JSON.parse(original_response)

  # Let's enhance with some random data
  result[:last_commits] = 10.times.map{|i| {
    changes: Random.rand(1000),
    date: (Date.today - Random.rand(10)),
    hash: Digest::SHA1.hexdigest("DuckRails-#{i}")
  }}
%>

<%= result.to_json %>

DuckRails is already configured to require RestClient so that it can be used in dynamic mocks.

Duckrails mock form response body tab

Keep in mind that if our application was using any additional parameters or headers when consuming the original GitHub endpoint, we can pass them as is to our RestClient call since we have the request's parameters and headers available at the @parameters and @headers variables respectively. Example:

<%
  accept_header = @headers['Accept']
  # Fetch the response from GitHub
  original_response = RestClient.get("https://api.github.com/repos/#{@parameters[:username]}/#{@parameters[:repo_name]}", headers: {'Accept': accept_header}) rescue '{}'
  result = JSON.parse(original_response)

  # Let's enhance with some random data
  result[:last_commits] = 10.times.map{|i| {
    changes: Random.rand(1000),
    date: (Date.today - Random.rand(10)),
    hash: Digest::SHA1.hexdigest("DuckRails-#{i}")
  }}
%>

<%= result.to_json %>

Let's see what we created. Given we have DuckRails running on port 8080, request: http://localhost:8080/repos/google/google-authenticator. Tadaaaa Duckrails wrap mock request