I am writing a Pact consumer test in Go. When I define the interaction I need to add the expected response object. The provider service is written in PHP and this is the response I am expecting:
return [
'status' => 'success',
'data' => [
'configuration' => Associative Array,
'undeploy_configuration' => Associative Array,
'meta_data' => Associative Array,
'undeploy_lora_app_key' => String,
],
];
This is the object I created in Go to represent the response I should get:
deviceConfigurationResponse := dsl.Like(map[string]interface{}{
"status": "success",
"data": dsl.Like(map[string]interface{}{
"configuration": dsl.MapMatcher{
"config1": dsl.String("value1"),
"config2": dsl.String("value2"),
},
"undeploy_configuration": dsl.MapMatcher{
"undeploy1": dsl.String("value3"),
"undeploy2": dsl.String("value4"),
},
"meta_data": dsl.MapMatcher{
"meta1": dsl.String("info1"),
"meta2": dsl.String("info2"),
},
"undeploy_lora_app_key": dsl.String("example_undeploy_lora_app_key"),
}),
})
However when I run the test I get this error:
--- FAIL: TestGetDeviceConfiguration (1.79s)
panic: match: unhandled type: interface {} [recovered]
panic: match: unhandled type: interface {}
This is the full code:
func TestGetDeviceConfiguration(t *testing.T) {
// Create Pact client
pact := &dsl.Pact{
Consumer: "consumer",
Provider: "provider",
PactDir: "./pacts",
}
defer pact.Teardown()
deviceConfigurationResponse := dsl.Like(map[string]interface{}{
"status": "success",
"data": dsl.Like(map[string]interface{}{
"configuration": dsl.MapMatcher{
"config1": dsl.String("value1"),
"config2": dsl.String("value2"),
},
"undeploy_configuration": dsl.MapMatcher{
"undeploy1": dsl.String("value3"),
"undeploy2": dsl.String("value4"),
},
"meta_data": dsl.MapMatcher{
"meta1": dsl.String("info1"),
"meta2": dsl.String("info2"),
},
"undeploy_lora_app_key": dsl.String("example_undeploy_lora_app_key"),
}),
})
// Define the expected interaction with the provisioning-service
value := "123456789"
pact.
AddInteraction().
Given("Device configuration exists for the given device ID").
UponReceiving("A request to get device configuration").
WithRequest(dsl.Request{
Method: "GET",
Path: dsl.String(fmt.Sprintf("/api/prov/state/%s/configuration", value)),
Headers: dsl.MapMatcher{"Accept": dsl.String("application/json")},
}).
WillRespondWith(dsl.Response{
Status: 200,
Headers: dsl.MapMatcher{"Content-Type": dsl.String("application/json")},
Body: dsl.Match(deviceConfigurationResponse),
})
// Test the OnSessionEstablished function
var test = func() error {
cache := new(CacheMock)
deviceConfigGetter := new(DeviceConfigGetterMock)
_, err := GetDeviceConfiguration(value)
cache.AssertExpectations(t)
deviceConfigGetter.AssertExpectations(t)
return err
}
// Verify the interaction with the provider
var err = pact.Verify(test)
assert.NoError(t, err)
}
The method you are using (
Match
) takes a struct annotated with struct tags (see https://github.com/pact-foundation/pact-go#auto-generate-matchers-from-struct-tags) that specify how the various items within the struct should be matched. You are manually providing a structure with the right matchers already, so there is no need to wrap it inMatch
at all.Something like this should work: