Skip to content
On this page

Mocking API

The Mocking API allows you to create mock responses for testing and development purposes. It uses the go-faker/faker: Go (Golang) Fake Data Generator for Struct, previously https://github.com/bxcodec/faker package to generate realistic and randomized data.

MockMiddlewareOptions

go
type MockMiddlewareOptions struct {
  Wrapper      MockMiddlewareWrapper
  Manual       MockMiddlewareManual
  IsPagination bool
  IsDisabled   bool
}

The MockMiddlewareOptions struct contains the following fields:

  • Wrapper: A MockMiddlewareWrapper function type that represents the wrapper function to be used for modifying the model.

  • Manual: A MockMiddlewareManual function type (not shown in the provided code) that represents the manual mocking function to be implemented.

  • IsPagination: A boolean indicating whether pagination is enabled for the mocking API.

  • IsDisabled: A boolean indicating whether the mocking middleware is disabled. Setting the ENV environment variable to mock will always return mock data.

Setting Up the Basic Mocking API

Step 1: Define the MockItem Struct

Define the MockItem struct with additional faker tags based on the examples provided in the faker repository:

go
type MockItem struct {
	ID                 string  `json:"id" faker:"uuid_hyphenated"`
	Name               string  `json:"name" faker:"name"`
	Email              string  `json:"email" faker:"email"`
	Latitude           float32 `json:"latitude" faker:"lat"`
	Longitude          float32 `json:"longitude" faker:"long"`
	CreditCardNumber   string  `json:"credit_card_number" faker:"cc_number"`
	CreditCardType     string  `json:"credit_card_type" faker:"cc_type"`
	DomainName         string  `json:"domain_name" faker:"domain_name"`
	IPV4               string  `json:"ipv4" faker:"ipv4"`
	IPV6               string  `json:"ipv6" faker:"ipv6"`
	Password           string  `json:"password" faker:"password"`
	Jwt                string  `json:"jwt" faker:"jwt"`
	PhoneNumber        string  `json:"phone_number" faker:"phone_number"`
	MacAddress         string  `json:"mac_address" faker:"mac_address"`
}

Step 2: Set Up the Mocking API Endpoint

Define the NewHomeHTTP function to set up the mocking API endpoint using Echo framework:

go
func NewHomeHTTP(e *echo.Echo) {
	e.GET("", core.WithHTTPContext(func(c core.IHTTPContext) error {
		return c.JSON(http.StatusOK, core.Map{
			"status": "i'm ok",
		})
	}), core.MockMiddleware(&MockItem{}, &core.MockMiddlewareOptions{}))
}

Example Response

json
{
  id: "1709a272-ab86-425f-b3ab-6a5c258b0451",
  name: "Prof. Oral Rogahn",
  email: "[email protected]",
  latitude: 63.298218,
  longitude: -148.2835,
  credit_card_number: "38989048719320",
  credit_card_type: "Diners Club",
  domain_name: "tkbhPNt.com",
  ipv4: "235.157.215.225",
  ipv6: "46d2:b413:3307:d7dd:6166:a4ce:a8e:e06f",
  password: "vMcZNdmHrujjblDIAWTtexgoQDoYSJULqCqJivuhWCcbFFbLCq",
  jwt: "PsfUcGrcAGvkkqaINXoXEZIBhgfnwKWLGVcyNHAk.PsfUcGrcAGvkkqaINXoXEZIBhgfnwKWLGVcyNHAk.PsfUcGrcAGvkkqaINXoXEZIBhgfnwKWLGVcyNHAk",
  phone_number: "610-527-4381",
  mac_address: "58:55:29:ad:ef:62"
}

Mocking Array API

Set Up the Mocking API Endpoint

Modify the NewHomeHTTP function to set up the mocking array API endpoint using the Echo framework:

go
func NewHomeHTTP(e *echo.Echo) {
	e.GET("", core.WithHTTPContext(func(c core.IHTTPContext) error {
		return c.JSON(http.StatusOK, core.Map{
			"status": "i'm ok",
		})
	}), core.MockMiddleware(&[]MockItem{}, &core.MockMiddlewareOptions{}))
}

Example response

json
[
  {
    id: "730fe83c-ba6f-42a5-b3a2-d1e19182399a",
    name: "King Brannon Turcotte",
    email: "[email protected]",
    latitude: 69.5202,
    longitude: 159.99734,
    credit_card_number: "38729394631322",
    credit_card_type: "Diners Club",
    domain_name: "Jhfirsj.ru",
    ipv4: "127.207.48.235",
    ipv6: "7d17:dda8:9f13:8fc0:b30d:7e28:7d4d:c881",
    password: "fqKaChiyyyHmEZpdJwutqqQLxLRBRqUoPpcgmsdYYPFjfwylXx",
    jwt: "hBlklUXTgdvCaeGVdsAenNGARlmHuSkcRPHFmluS.hBlklUXTgdvCaeGVdsAenNGARlmHuSkcRPHFmluS.hBlklUXTgdvCaeGVdsAenNGARlmHuSkcRPHFmluS",
    phone_number: "753-621-9810",
    mac_address: "ca:61:f1:25:2e:18"
  },
  {
    id: "b69fb0ad-63ac-4945-bbf4-c02018859c48",
    name: "King Stone Koepp",
    email: "[email protected]",
    latitude: -23.81511,
    longitude: 10.673737,
    credit_card_number: "38492306824560",
    credit_card_type: "Diners Club",
    domain_name: "qCEmQph.net",
    ipv4: "84.181.104.209",
    ipv6: "e413:190e:3fb9:c986:a6e5:4cb8:7822:c924",
    password: "cXfRmoeLWOMOCwSXfhFBXgCiGjQhnqPOZowmndKIouShpVIXkW",
    jwt: "RlHFIFabdRiCMkrdUBYnmmfnUNvnMxQHKfgIVMVY.RlHFIFabdRiCMkrdUBYnmmfnUNvnMxQHKfgIVMVY.RlHFIFabdRiCMkrdUBYnmmfnUNvnMxQHKfgIVMVY",
    phone_number: "218-341-0569",
    mac_address: "67:26:5a:f7:79:66"
  }
]

Mocking Paginated API

Set Up the Mocking API Endpoint

Modify the NewHomeHTTP function to set up the mocking paginated API endpoint using the Echo framework:

go
func NewHomeHTTP(e *echo.Echo) {
	e.GET("", core.WithHTTPContext(func(c core.IHTTPContext) error {
		return c.JSON(http.StatusOK, core.Map{
			"status": "i'm ok",
		})
	}), core.MockMiddleware(&[]MockItem{}, &core.MockMiddlewareOptions{IsPagination: true}))
}

Example response

json
{
  page: 1,
  total: 230,
  limit: 30,
  count: 0,
  items: [
    {
      id: "730fe83c-ba6f-42a5-b3a2-d1e19182399a",
      name: "King Brannon Turcotte",
      email: "[email protected]",
      latitude: 69.5202,
      longitude: 159.99734,
      credit_card_number: "38729394631322",
      credit_card_type: "Diners Club",
      domain_name: "Jhfirsj.ru",
      ipv4: "127.207.48.235",
      ipv6: "7d17:dda8:9f13:8fc0:b30d:7e28:7d4d:c881",
      password: "fqKaChiyyyHmEZpdJwutqqQLxLRBRqUoPpcgmsdYYPFjfwylXx",
      jwt: "hBlklUXTgdvCaeGVdsAenNGARlmHuSkcRPHFmluS.hBlklUXTgdvCaeGVdsAenNGARlmHuSkcRPHFmluS.hBlklUXTgdvCaeGVdsAenNGARlmHuSkcRPHFmluS",
      phone_number: "753-621-9810",
      mac_address: "ca:61:f1:25:2e:18"
    },
    {
      id: "b69fb0ad-63ac-4945-bbf4-c02018859c48",
      name: "King Stone Koepp",
      email: "[email protected]",
      latitude: -23.81511,
      longitude: 10.673737,
      credit_card_number: "38492306824560",
      credit_card_type: "Diners Club",
      domain_name: "qCEmQph.net",
      ipv4: "84.181.104.209",
      ipv6: "e413:190e:3fb9:c986:a6e5:4cb8:7822:c924",
      password: "cXfRmoeLWOMOCwSXfhFBXgCiGjQhnqPOZowmndKIouShpVIXkW",
      jwt: "RlHFIFabdRiCMkrdUBYnmmfnUNvnMxQHKfgIVMVY.RlHFIFabdRiCMkrdUBYnmmfnUNvnMxQHKfgIVMVY.RlHFIFabdRiCMkrdUBYnmmfnUNvnMxQHKfgIVMVY",
      phone_number: "218-341-0569",
      mac_address: "67:26:5a:f7:79:66"
    }
  ]
}

Manual Mocking API

go
e.GET("/manual", core.WithHTTPContext(func(c core.IHTTPContext) error {
	// Return a JSON response with a status message
	return c.JSON(http.StatusOK, core.Map{
		"status": "i'm ok",
	})
}), core.MockMiddleware(nil, &core.MockMiddlewareOptions{
	Manual: func(c core.IHTTPContext) error {
		// Implement your manual mocking logic here
		// You have access to the HTTP context (c) to handle the request and response

		// Example: Manually return a JSON response with a status message
		return c.JSON(http.StatusOK, core.Map{
			"status": "Manual mock response",
		})
	},
})) // Apply the mock middleware to the endpoint

Conclusion

You have successfully set up a mocking API using the provided code. This API allows you to mock responses for different scenarios, such as basic responses, array responses, paginated responses, and manual responses. Feel free to customize and extend the functionality according to your requirements.

Maintained by Passakon Puttasuwan & Dev Core Team.