testify

package
v0.1.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 10, 2023 License: MIT Imports: 4 Imported by: 0

Documentation

Index

Examples

Constants

This section is empty.

Variables

View Source
var (
	ErrNilResponse = errors.New("response cannot be nil")
)

Functions

This section is empty.

Types

type Caller

type Caller struct {
	ExpectedRequest *http.Request
	Response        *http.Response
	Err             error
}

Caller type for call(s) http testing with a http.Client without execute on the network call You need set the ExpectedRequest field. This fields should be asserted to have equal values: - Body - ContentLength - Form - Header - Method - URL - context.Context

type HTTPClient

type HTTPClient interface {
	// Client returns a http.Client
	Client() *http.Client
	// AddCall adds a Caller to the list of callers
	// The callers list is ordered, so the first caller added will be the first to be executed
	// By default, if the caller does not have a response or error set,
	// a default response will be returned.
	// The default response return a 200 OK with a empty body
	// and a Content-Type header set to application/json.
	AddCall(call Caller)
	// SetDefaultResponse sets a default response to be returned by the http.Client
	// If no response or error are set.
	SetDefaultResponse(response *http.Response) error
	// RoundTrip method to implement http.RoundTripper interface
	RoundTrip(req *http.Request) (*http.Response, error)
	// ExpectedCalls asserts that all calls were executed
	// You need to call this method at the end of your test to ensure that all calls were executed
	ExpectedCalls()
}

HTTPClient type for call(s) http testing with a http.Client without execute on the network call It is useful to test a code that makes http calls

func NewHTTPClient

func NewHTTPClient(t *testing.T) HTTPClient
Example
package main

import (
	"context"
	"errors"
	"fmt"
	"net/http"
	"testing"

	"github.com/gofast-pkg/http/testify"
	"github.com/stretchr/testify/assert"
)

const (
	urlTestRequest1 = "http://example.com/request_1"
	urlTestRequest2 = "http://example.com/request_2"
)

// testedCode simulates a code that makes two http requests
func testedCode(ctx context.Context, c *http.Client) error {
	var err error
	var r1 *http.Request
	var r2 *http.Request
	var resp1 *http.Response
	var resp2 *http.Response

	if r1, err = http.NewRequestWithContext(ctx, http.MethodGet, urlTestRequest1, nil); err != nil {
		return err
	}
	if r2, err = http.NewRequestWithContext(ctx, http.MethodGet, urlTestRequest2, nil); err != nil {
		return err
	}

	if resp1, err = c.Do(r1); err != nil {
		return err
	}
	defer resp1.Body.Close()

	if resp1.StatusCode != http.StatusOK {
		return errors.New("unexpected status code")
	}

	if resp2, err = c.Do(r2); err != nil {
		return err
	}
	defer resp2.Body.Close()

	if resp2.StatusCode != http.StatusCreated {
		return errors.New("unexpected status code")
	}

	return nil
}

func main() {
	var err error
	var expectedR1 *http.Request
	var expectedR2 *http.Request
	t := new(testing.T)
	client := testify.NewHTTPClient(t)
	ctx := context.Background()

	if expectedR1, err = http.NewRequestWithContext(
		ctx,
		http.MethodGet,
		urlTestRequest1,
		nil); err != nil {
		t.Fatal(err)
	}
	if expectedR2, err = http.NewRequestWithContext(
		ctx,
		http.MethodGet,
		urlTestRequest2,
		nil); err != nil {
		t.Fatal(err)
	}

	client.AddCall(testify.Caller{
		ExpectedRequest: expectedR1,
	})
	client.AddCall(testify.Caller{
		ExpectedRequest: expectedR2,
		Response: &http.Response{
			StatusCode: http.StatusCreated,
		},
	})

	err = testedCode(ctx, client.Client())
	if assert.NoError(t, err) {
		fmt.Println("no error")
		client.ExpectedCalls()
	}
}
Output:

no error

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL