Levin Keller
Levin Keller

Reputation: 31

Nock fixtures: Ignore request body when matching

In the Readme for nock it explains how one can ignore the request body.

I am using the fixtures feature of nock and I need to ignore the request body (at least partially). How can I do this? Can I write a regex in the body field of the json entries in the fixtures files?

Upvotes: 0

Views: 1445

Answers (1)

Levin Keller
Levin Keller

Reputation: 31

I solved it myself after some painful digging. Here is the solution:

I am trying to nock requests to the Kraken API. The request for the endpoint /0/private/TradesHistory is of method POST and sends a body containing a "query string like" string. For example the body will look like ofs=50&nonce=xxx. The nonce value changes with each request, so I want to ignore it to when looking for a matching nock. (The nonce can only be used once, it would make no sense for the client library to send the same value again).

So I have to add a "preprocessing" function as a config object to the call to nockBack like so:

import * as queryString from 'query-string'
import { back } from 'nock'
import * as path from 'path'

const before = (scope: any) => {
  scope.filteringRequestBody = (body: string, aRecordedBody: string) => {
    const { of: currentOffset, } = queryString.parse(`?${body}`) //Prepend a `?` so it is actually a query string.
    const { of: recordedOffset, } = queryString.parse(`?${body}`)
    if (!(currentOffset || recordedOffset)) {//This is the case where no offset is set. There is only possible recorded body in my case that matches this: The other body which has no offset. I replace the body with the recorded body to produce a match.
      return aRecordedBody
    }
    if (currentOffset === recordedOffset) {//This is the case where the sent body has the same offset as the recorded body. I replace the body with the recorded body in order to produce a match.
      return aRecordedBody
    }
    return body
  }
}

back.fixtures = `${__dirname}/nockFixtures/`

const { nockDone } = back('nocks.json',{before})
...//Run my queris
nockDone()

Now it works like a charm.

Upvotes: 1

Related Questions