servirtium

package module
v1.1.6 Latest Latest
Warning

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

Go to latest
Published: Oct 2, 2022 License: MIT Imports: 17 Imported by: 0

README

servirtium-go

A Go implementation of Servirtium, a library that helps test interactions with APIs.

How it works

Servirtium is a server that serves as a man-in-the-middle: it processes incoming requests, forwards them to a destination API and writes the response into a Markdown file with a special format that is common across all of the implementations of the library. Later these Markdown files are used to replay the interactions that were recorded before, allowing to test interactions without making real API calls.

Prerequisites

The library is written in the Go programming language, so to use or compile the library you need Go Compiler. You can download it on the official site.

You can get the servirtium-go package by

# use Git tags
go get https://github.com/servirtium/servirtium-go@v4.0.1
# or Git branch name
go get https://github.com/servirtium/servirtium-go@master
# or Git commit hash
go get https://github.com/servirtium/servirtium-go@08c92af

Usage

You can use one of these attribute on test function to start the Servirtium server and config it to serve request in records and playback mode

For testify record mode example:

type ClimateTestSuiteRecord struct {
	recordClient ClientImpl
	suite.Suite
	servirtium *servirtium.Impl
}

func TestClimateTestSuiteRecord(t *testing.T) {
	suite.Run(t, new(ClimateTestSuiteRecord))
}

func (s *ClimateTestSuiteRecord) BeforeTest(suiteName, testName string) {
	validate := validator.New()
	s.servirtium = servirtium.NewServirtium()

	// For delete headers no need from request
	s.servirtium.DeleteRequestHeaders([]string{"No-need-header"})

	// For over write data in request header
	s.servirtium.ReplaceRequestHeaders(map[string]string{"User-Agent": "Servirtium-Testing"})

	// For mask sensitive data in request header
	s.servirtium.MaskResponseHeaders(map[string]string{"Set-Cookie": "REPLACED-IN-RECORDING", "Date": "Tue, 04 Aug 2020 16:53:25 GMT"})

	// For mask sensitive data in the request body
	passwordRegex := regexp.MustCompile(`(<password>.{0,}<\/password>)`)
	s.servirtium.MaskRequestBody(map[*regexp.Regexp]string{passwordRegex: "<password>MASKED</password>"})


	// For delete headers no need from response
	s.servirtium.DeleteResponseHeaders([]string{"No-need-header"})

	// For over write data in request header
	s.servirtium.ReplaceResponseHeaders(map[string]string{"User-Agent": "Servirtium-Testing"})

	// For mask sensitive data in request header
	s.servirtium.MaskResponseHeaders(map[string]string{"Set-Cookie": "REPLACED-IN-RECORDING", "Date": "Tue, 04 Aug 2020 16:53:25 GMT"})

	// For mask sensitive data in the response body
	tokenRegex := regexp.MustCompile(`(<token>.{0,}<\/token>)`)
	s.servirtium.MaskResponseBody(map[*regexp.Regexp]string{tokenRegex: "<password>MASKED</password>"})

	s.servirtium.StartRecord("http://climatedataapi.worldbank.org")
	recordClient := NewClient(http.DefaultClient, validate, s.servirtium.ServerRecord.URL)
	s.recordClient = *recordClient
}

func (s *ClimateTestSuiteRecord) AfterTest(suite, testName string) {
	isMatch := s.servirtium.CheckMarkdownIsDifferentToPreviousRecording(testName)
	s.True(isMatch)
	s.servirtium.WriteRecord(testName)
	s.servirtium.EndRecord()
}

func (s *ClimateTestSuiteRecord) TestAverageRainfallForGreatBritainFrom1980to1999Exists() {
	var (
		ctx      = context.Background()
		expected = float64(988.8454972331014)
	)
	recordResult, recordErr := s.recordClient.GetAveAnnualRainfall(ctx, 1980, 1999, "gbr")
	s.Equal(expected, recordResult)
	s.Nil(recordErr)
}

For testify Playback mode example:

type ClimateTestSuitePlayback struct {
	playbackClient ClientImpl
	suite.Suite
	servirtium *servirtium.Impl
}

func TestClimateTestSuitePlayback(t *testing.T) {
	suite.Run(t, new(ClimateTestSuitePlayback))
}

func (s *ClimateTestSuitePlayback) BeforeTest(suiteName, testName string) {
	validate := validator.New()
	servirtium := servirtium.NewServirtium()
	s.servirtium = servirtium
	s.servirtium.StartPlayback(testName)
	playbackClient := NewClient(http.DefaultClient, validate, s.servirtium.ServerPlayback.URL)
	s.playbackClient = *playbackClient
}

func (s *ClimateTestSuitePlayback) AfterTest(suite, testName string) {
	s.servirtium.EndPlayback()
}

func (s *ClimateTestSuitePlayback) TestAverageRainfallForGreatBritainFrom1980to1999Exists() {
	var (
		ctx      = context.Background()
		expected = float64(988.8454972331014)
	)
	playbackResult, playbackErr := s.playbackClient.GetAveAnnualRainfall(ctx, 1980, 1999, "gbr")
	s.Equal(expected, playbackResult)
	s.Nil(playbackErr)
}

For testify direct mode example:

type ClimateTestSuiteDirect struct {
	directClient ClientImpl
	suite.Suite
	servirtium *servirtium.Impl
}

func TestClimateTestSuiteDirect(t *testing.T) {
	suite.Run(t, new(ClimateTestSuiteDirect))
}

func (s *ClimateTestSuiteDirect) SetupTest() {
	validate := validator.New()
	directClient := NewClient(http.DefaultClient, validate, "http://climatedataapi.worldbank.org")
	s.directClient = *directClient
}

func (s *ClimateTestSuiteDirect) TestAverageRainfallForGreatBritainFrom1980to1999Exists() {
	var (
		ctx      = context.Background()
		expected = float64(988.8454972331014)
	)
	directResult, directErr := s.directClient.GetAveAnnualRainfall(ctx, 1980, 1999, "gbr")
	s.Equal(expected, directResult)
	s.Nil(directErr)
}

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type Impl

type Impl struct {
	ServerPlayback *http.Server
	ServerRecord   *http.Server
	// contains filtered or unexported fields
}

Impl ...

func NewServirtium

func NewServirtium() *Impl

NewServirtium ...

func (*Impl) EndPlayback

func (s *Impl) EndPlayback()

func (*Impl) EndRecord

func (s *Impl) EndRecord()

func (*Impl) GetPlaybackURL added in v1.1.3

func (s *Impl) GetPlaybackURL() string

func (*Impl) GetRecordURL added in v1.1.4

func (s *Impl) GetRecordURL() string

func (*Impl) SetCallerRequestBodyReplacement added in v1.1.0

func (s *Impl) SetCallerRequestBodyReplacement(replaceRegex map[*regexp.Regexp]string)

func (*Impl) SetCallerRequestHeaderReplacements added in v1.1.0

func (s *Impl) SetCallerRequestHeaderReplacements(replaceRegex map[*regexp.Regexp]string)

func (*Impl) SetCallerRequestHeadersRemoval added in v1.1.0

func (s *Impl) SetCallerRequestHeadersRemoval(headers []string)

func (*Impl) SetCallerResponseBodyReplacement added in v1.1.0

func (s *Impl) SetCallerResponseBodyReplacement(replaceRegex map[*regexp.Regexp]string)

func (*Impl) SetCallerResponseHeaderReplacements added in v1.1.0

func (s *Impl) SetCallerResponseHeaderReplacements(replaceRegex map[*regexp.Regexp]string)

func (*Impl) SetCallerResponseHeadersRemoval added in v1.1.0

func (s *Impl) SetCallerResponseHeadersRemoval(headers []string)

func (*Impl) SetRecordRequestBodyReplacement added in v1.1.0

func (s *Impl) SetRecordRequestBodyReplacement(replaceRegex map[*regexp.Regexp]string)

func (*Impl) SetRecordRequestHeaderReplacements added in v1.1.0

func (s *Impl) SetRecordRequestHeaderReplacements(replaceRegex map[*regexp.Regexp]string)

func (*Impl) SetRecordRequestHeadersRemoval added in v1.1.0

func (s *Impl) SetRecordRequestHeadersRemoval(headers []string)

func (*Impl) SetRecordResponseBodyReplacement added in v1.1.0

func (s *Impl) SetRecordResponseBodyReplacement(replaceRegex map[*regexp.Regexp]string)

func (*Impl) SetRecordResponseHeaderReplacements added in v1.1.0

func (s *Impl) SetRecordResponseHeaderReplacements(replaceRegex map[*regexp.Regexp]string)

func (*Impl) SetRecordResponseHeadersRemoval added in v1.1.0

func (s *Impl) SetRecordResponseHeadersRemoval(headers []string)

func (*Impl) StartPlayback

func (s *Impl) StartPlayback(recordFileName string, servirtiumPort int)

func (*Impl) StartRecord

func (s *Impl) StartRecord(apiURL string, servirtiumPort int)

func (*Impl) WriteRecord

func (s *Impl) WriteRecord(recordFileName string)

Directories

Path Synopsis

Jump to

Keyboard shortcuts

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