github.com/kumasuke120/mockuma@v1.1.9/internal/server/executor_test.go (about)

     1  package server
     2  
     3  import (
     4  	"bytes"
     5  	"errors"
     6  	"fmt"
     7  	"net/http"
     8  	"net/http/httptest"
     9  	"testing"
    10  	"time"
    11  
    12  	"github.com/kumasuke120/mockuma/internal/mckmaps"
    13  	"github.com/kumasuke120/mockuma/internal/myhttp"
    14  	"github.com/stretchr/testify/assert"
    15  )
    16  
    17  func TestForwardError_Error(t *testing.T) {
    18  	e := &forwardError{err: errors.New("test_error")}
    19  	assert.NotNil(t, e)
    20  	assert.Contains(t, e.Error(), "test_error")
    21  }
    22  
    23  func TestWaitBeforeReturns(t *testing.T) {
    24  	//noinspection GoImportUsedAsName
    25  	assert := assert.New(t)
    26  
    27  	i1 := &mckmaps.Interval{Min: 100, Max: 100}
    28  	i1Start := time.Now()
    29  	waitBeforeReturns(i1)
    30  	i1Elapsed := time.Since(i1Start)
    31  	assert.True(i1Elapsed.Milliseconds() >= 100)
    32  
    33  	i2 := &mckmaps.Interval{Min: 10, Max: 30}
    34  	i2Start := time.Now()
    35  	for i := 0; i < 10; i++ {
    36  		waitBeforeReturns(i2)
    37  	}
    38  	i2Elapsed := time.Since(i2Start)
    39  	assert.True(i2Elapsed.Milliseconds() >= 100 && i2Elapsed.Milliseconds() <= 350)
    40  }
    41  
    42  func TestPolicyExecutor_executor(t *testing.T) {
    43  	//noinspection GoImportUsedAsName
    44  	assert := assert.New(t)
    45  
    46  	rr1 := httptest.NewRecorder()
    47  	var rw1 http.ResponseWriter = rr1
    48  	exe1 := &policyExecutor{
    49  		r:      httptest.NewRequest("GET", "/TestPolicyExecutor_executor", nil),
    50  		w:      &rw1,
    51  		policy: newJSONPolicy(myhttp.StatusOK, "OK"),
    52  	}
    53  	e1 := exe1.execute()
    54  	if assert.Nil(e1) {
    55  		assert.Equal(http.StatusOK, rr1.Code)
    56  		assert.Equal(fmt.Sprintf(`{"statusCode": %d, "message": "%s"}`, http.StatusOK, "OK"), rr1.Body.String())
    57  	}
    58  
    59  	rr2 := httptest.NewRecorder()
    60  	var rw2 http.ResponseWriter = rr2
    61  	exe2 := &policyExecutor{
    62  		r:      httptest.NewRequest("GET", "/TestPolicyExecutor_executor", nil),
    63  		w:      &rw2,
    64  		policy: pNoPolicyMatched,
    65  	}
    66  	e2 := exe2.execute()
    67  	if assert.Nil(e2) {
    68  		assert.Equal(http.StatusBadRequest, rr2.Code)
    69  		assert.Equal(string(pNoPolicyMatched.Returns.Body), rr2.Body.String())
    70  	}
    71  
    72  	rr3Start := time.Now()
    73  	rr3 := httptest.NewRecorder()
    74  	var rw3 http.ResponseWriter = rr3
    75  	exe3 := &policyExecutor{
    76  		r: httptest.NewRequest("GET", "/TestPolicyExecutor_executor", nil),
    77  		w: &rw3,
    78  		policy: &mckmaps.Policy{
    79  			CmdType: mckmaps.CmdTypeReturns,
    80  			Returns: &mckmaps.Returns{
    81  				StatusCode: myhttp.StatusOK,
    82  				Latency: &mckmaps.Interval{
    83  					Min: 100,
    84  					Max: 100,
    85  				},
    86  				Headers: []*mckmaps.NameValuesPair{
    87  					{Name: myhttp.HeaderContentType, Values: []string{myhttp.ContentTypeJSON}},
    88  				},
    89  				Body: []byte(fmt.Sprintf(`{"statusCode": %d, "message": "%s"}`, myhttp.StatusOK, "test")),
    90  			},
    91  		},
    92  	}
    93  	e3 := exe3.execute()
    94  	assert.Nil(e3)
    95  	rr3Elapsed := time.Since(rr3Start)
    96  	assert.True(rr3Elapsed.Milliseconds() >= 100)
    97  
    98  	rr4 := httptest.NewRecorder()
    99  	var rw4 http.ResponseWriter = rr4
   100  	exe4 := &policyExecutor{
   101  		r: httptest.NewRequest("GET", "/TestPolicyExecutor_executor", nil),
   102  		w: &rw4,
   103  		policy: &mckmaps.Policy{
   104  			CmdType: mckmaps.CmdTypeForwards,
   105  			Forwards: &mckmaps.Forwards{
   106  				Latency: &mckmaps.Interval{
   107  					Min: 0,
   108  					Max: 0,
   109  				},
   110  				Path: "https://www.example.com",
   111  			},
   112  		},
   113  	}
   114  	e4 := exe4.execute()
   115  	assert.Nil(e4)
   116  	assert.Equal(http.StatusOK, rr4.Code)
   117  
   118  	handler := newMockHandler(mappings).(*mockHandler)
   119  	rr5 := httptest.NewRecorder()
   120  	var rw5 http.ResponseWriter = rr5
   121  	exe5 := &policyExecutor{
   122  		h: handler,
   123  		r: httptest.NewRequest("POST", "/TestPolicyExecutor_executor", bytes.NewReader([]byte("120"))),
   124  		w: &rw5,
   125  		policy: &mckmaps.Policy{
   126  			CmdType: mckmaps.CmdTypeForwards,
   127  			Forwards: &mckmaps.Forwards{
   128  				Path: "/m",
   129  			},
   130  		},
   131  	}
   132  	e5 := exe5.execute()
   133  	assert.Nil(e5)
   134  	assert.Equal(http.StatusOK, rr5.Code)
   135  	assert.Equal("TEST/v1", rr5.Header().Get("Server"))
   136  
   137  	rr6 := httptest.NewRecorder()
   138  	var rw6 http.ResponseWriter = rr6
   139  	exe6 := &policyExecutor{
   140  		h: handler,
   141  		r: httptest.NewRequest("GET", "/c?r1=120", nil),
   142  		w: &rw6,
   143  		policy: &mckmaps.Policy{
   144  			CmdType: mckmaps.CmdTypeForwards,
   145  			Forwards: &mckmaps.Forwards{
   146  				Path: "m",
   147  			},
   148  		},
   149  	}
   150  	e6 := exe6.execute()
   151  	assert.Nil(e6)
   152  	assert.Equal(http.StatusOK, rr6.Code)
   153  
   154  	rr7 := httptest.NewRecorder()
   155  	var rw7 http.ResponseWriter = rr7
   156  	exe7 := &policyExecutor{
   157  		r: httptest.NewRequest("GET", "/TestPolicyExecutor_executor", nil),
   158  		w: &rw7,
   159  		policy: &mckmaps.Policy{
   160  			CmdType: "wow",
   161  		},
   162  	}
   163  	e7 := exe7.execute()
   164  	assert.NotNil(e7)
   165  	assert.Contains(e7.Error(), "wow")
   166  
   167  	rr8 := httptest.NewRecorder()
   168  	var rw8 http.ResponseWriter = rr8
   169  	exe8 := &policyExecutor{
   170  		r: httptest.NewRequest("GET", "/TestPolicyExecutor_executor", nil),
   171  		w: &rw8,
   172  		policy: &mckmaps.Policy{
   173  			CmdType: mckmaps.CmdTypeForwards,
   174  			Forwards: &mckmaps.Forwards{
   175  				Path: "http://localhost:8080",
   176  			},
   177  		},
   178  	}
   179  	e8 := exe8.execute()
   180  	assert.NotNil(e8)
   181  
   182  	rr9 := httptest.NewRecorder()
   183  	var rw9 http.ResponseWriter = rr9
   184  	exe9 := &policyExecutor{
   185  		r:          httptest.NewRequest("GET", "/TestPolicyExecutor_executor", nil),
   186  		w:          &rw9,
   187  		policy:     newJSONPolicy(myhttp.StatusOK, "OK"),
   188  		returnHead: true,
   189  	}
   190  	e9 := exe9.execute()
   191  	if assert.Nil(e9) {
   192  		assert.Empty(rr9.Body.String())
   193  	}
   194  }