Files
gocryptotrader/exchanges/mock/server_test.go
Ryan O'Hara-Reid 6d8ba0a96a Initial implementation of HTTP mock testing framework (#310)
* Initial implementation of HTTP mock testing framework

Convert to VCR testing server. Segregate live testing via build tags.

Converted Binance to VCR server

Convert Bitstamp to VCR mocking tests

Added VCR mock testing for localbitcoins

* Add server generation for concurrent testing

* Fix linter issues

* Fix linter issue

* fix race - potentially

* revert auto assigning of host vals

* Fix requested changes

* Adds mock testing for ANX
Switch to using TestMain functionality
Added cron job usage for travis-ci to live testing
Added appveyor scheduled build check for live testing

* WOOPS

* silly correction

* Fixes fantastic linter issues

* fixed another whoopsie

* WOOO!

* Adds gemini mock testing with additional fixes

* Add docs and sharedvalue

* Added tls using httptest package

* Fixed issues

* added explicit mock recording reference to error

* Fix requested changes

* strip port from mock files as they are not needed on tls server

* Change incorrect names

* fix requested changes

* lbank update

* Fix another issue

* Updated readme
2019-08-23 15:20:02 +10:00

118 lines
2.7 KiB
Go

package mock
import (
"bytes"
"encoding/json"
"io/ioutil"
"net/http"
"os"
"strings"
"testing"
"github.com/thrasher-corp/gocryptotrader/common"
)
type responsePayload struct {
Price float64 `json:"price"`
Amount float64 `json:"amount"`
Currency string `json:"currency"`
}
const queryString = "currency=btc&command=getprice"
const testFile = "test.json"
func TestNewVCRServer(t *testing.T) {
_, _, err := NewVCRServer("")
if err == nil {
t.Error("Test Failed - NewVCRServer error cannot be nil")
}
// Set up mock data
test1 := VCRMock{}
test1.Routes = make(map[string]map[string][]HTTPResponse)
test1.Routes["/test"] = make(map[string][]HTTPResponse)
rp, err := json.Marshal(responsePayload{Price: 8000.0,
Amount: 1,
Currency: "bitcoin"})
if err != nil {
t.Fatal("Test Failed - marshal error", err)
}
testValue := HTTPResponse{Data: rp, QueryString: queryString, BodyParams: queryString}
test1.Routes["/test"][http.MethodGet] = []HTTPResponse{testValue}
payload, err := json.Marshal(test1)
if err != nil {
t.Fatal("Test Failed - marshal error", err)
}
err = ioutil.WriteFile(testFile, payload, os.ModePerm)
if err != nil {
t.Fatal("Test Failed - marshal error", err)
}
deets, client, err := NewVCRServer(testFile)
if err != nil {
t.Error("Test Failed - NewVCRServer error", err)
}
common.HTTPClient = client // Set common package global HTTP Client
_, err = common.SendHTTPRequest(http.MethodGet,
"http://localhost:300/somethingElse?"+queryString,
nil,
bytes.NewBufferString(""))
if err == nil {
t.Error("Test Failed - Sending http request expected an error")
}
// Expected good outcome
r, err := common.SendHTTPRequest(http.MethodGet,
deets,
nil,
bytes.NewBufferString(""))
if err != nil {
t.Error("Test Failed - Sending http request error", err)
}
if !strings.Contains(r, "404 page not found") {
t.Error("Test Failed - Was not expecting any value returned:", r)
}
r, err = common.SendHTTPRequest(http.MethodGet,
deets+"/test?"+queryString,
nil,
bytes.NewBufferString(""))
if err != nil {
t.Error("Test Failed - Sending http request error", err)
}
var res responsePayload
err = json.Unmarshal([]byte(r), &res)
if err != nil {
t.Error("Test Failed - unmarshal error", err)
}
if res.Price != 8000 {
t.Error("Test Failed - response error expected 8000 but received:",
res.Price)
}
if res.Amount != 1 {
t.Error("Test Failed - response error expected 1 but received:",
res.Amount)
}
if res.Currency != "bitcoin" {
t.Error("Test Failed - response error expected \"bitcoin\" but received:",
res.Currency)
}
// clean up test.json file
err = os.Remove(testFile)
if err != nil {
t.Fatal("Test Failed - Remove error", err)
}
}