Home > Mobile >  UUID field within Go Pact consumer test
UUID field within Go Pact consumer test

Time:09-25

I'm currently looking at adding Pact testing into my Go code, and i'm getting stuck on how to deal with field types of UUID. I have the following struct, which I use to deserialise a response from an API to

import (
    "github.com/google/uuid"
)

type Foo struct {
    ID          uuid.UUID `json:"id"`
    Name        string    `json:"name"`
    Description string    `json:"description"`
}

Now, when I try and write my consumer test, it looks something like this

    pact.
        AddInteraction().
        Given("A result exists").
        UponReceiving("A request to get all results").
        WithRequest(dsl.Request{
            Method:  "get",
            Path:    dsl.String("/v1"),
        }).
        WillRespondWith(dsl.Response{
            Status:  200,
            Headers: dsl.MapMatcher{"Content-Type": dsl.String("application/json")},
            Body:    dsl.Match(&Foo{}),
        })

The problem now, is the mocked response comes through as below, where it tries to put an array of bytes in the "id" field, I'm assuming since behind the scenes that is what the google/uuid library stores it as.

{
    "id": [
        1
    ],
    "name": "string",
    "description": "string"
}

Has anyone encountered this? And what would be the best way forward - the only solution I can see is changing my model to be a string, and then manually convert to a UUID within my code.

CodePudding user response:

The internal representation of uuid.UUID is type UUID [16]byte but json representation of UUID is string

var u uuid.UUID
u, _ = uuid.Parse("f47ac10b-58cc-0372-8567-0e02b2c3d479")

foo1 := Foo{u, "n", "d"}
res, _ := json.Marshal(foo1)

fmt.Println(string(res))
{
  "id": "f47ac10b-58cc-0372-8567-0e02b2c3d479",
  "name": "n",
  "description": "d"
}

and then load marshaled []byte

var foo Foo

json.Unmarshal(res, &foo)

CodePudding user response:

You currently can't use the Match function this way, as it rexurses non primative structures, albeit it should be possible to override this behaviour with struct tags. Could you please raise a feature request?

The simplest approach is to not use the Match method, and just manually express the contract details in the usual way.

  • Related