The simple package to stub HTTP resource using WireMock admin
docker run -it --rm -p 8080:8080 wiremock/wiremock
package main
import (
"net/http"
"testing"
"github.com/wiremock/go-wiremock"
)
func TestSome(t *testing.T) {
wiremockClient := wiremock.NewClient("https://0.0.0.0:8080")
defer wiremockClient.Reset()
// stubbing POST https://0.0.0.0:8080/example
wiremockClient.StubFor(wiremock.Post(wiremock.URLPathEqualTo("/example")).
WithQueryParam("firstName", wiremock.EqualTo("John")).
WithQueryParam("lastName", wiremock.NotMatching("Black")).
WithBodyPattern(wiremock.EqualToJson(`{"meta": "information"}`)).
WithHeader("x-session", wiremock.Matching("^\\S+fingerprint\\S+$")).
WillReturnResponse(
wiremock.NewResponse().
WithJSONBody(map[string]interface{}{
"code": 400,
"detail": "detail",
}).
WithHeader("Content-Type", "application/json").
WithStatus(http.StatusBadRequest),
).
AtPriority(1))
// scenario
defer wiremockClient.ResetAllScenarios()
wiremockClient.StubFor(wiremock.Get(wiremock.URLPathEqualTo("/status")).
WillReturnResponse(
wiremock.NewResponse().
WithJSONBody(map[string]interface{}{
"status": nil,
}).
WithHeader("Content-Type", "application/json").
WithStatus(http.StatusOK),
).
InScenario("Set status").
WhenScenarioStateIs(wiremock.ScenarioStateStarted))
wiremockClient.StubFor(wiremock.Post(wiremock.URLPathEqualTo("/state")).
WithBodyPattern(wiremock.EqualToJson(`{"status": "started"}`)).
InScenario("Set status").
WillSetStateTo("Status started"))
statusStub := wiremock.Get(wiremock.URLPathEqualTo("/status")).
WillReturnResponse(
wiremock.NewResponse().
WithJSONBody(map[string]interface{}{
"status": "started",
}).
WithHeader("Content-Type", "application/json").
WithStatus(http.StatusOK),
).
InScenario("Set status").
WhenScenarioStateIs("Status started")
wiremockClient.StubFor(statusStub)
//testing code...
verifyResult, _ := wiremockClient.Verify(statusStub.Request(), 1)
if !verifyResult {
//...
}
wiremockClient.DeleteStub(statusStub)
}