github.com/sdqri/sequined@v0.0.0-20240421190656-fc6bf956f4d8/internal/graphmultiplexer/graph_multiplexer_test.go (about)

     1  package graphmultiplexer_test
     2  
     3  import (
     4  	"net/http"
     5  	"net/http/httptest"
     6  	"os"
     7  	"strings"
     8  	"testing"
     9  
    10  	gmx "github.com/sdqri/sequined/internal/graphmultiplexer"
    11  	hyr "github.com/sdqri/sequined/internal/hyperrenderer"
    12  	"github.com/sdqri/sequined/internal/observer"
    13  	"github.com/stretchr/testify/assert"
    14  )
    15  
    16  func init() {
    17  	if err := os.Chdir("../.."); err != nil {
    18  		panic(err)
    19  	}
    20  }
    21  
    22  type RequestTestCase struct {
    23  	req                *http.Request
    24  	ExpectedStatusCode int
    25  	ExpectedBody       []byte
    26  }
    27  
    28  func TestHandleGraphHttpRequest(t *testing.T) {
    29  	testCases := []struct {
    30  		name             string
    31  		rootGenerator    func() *hyr.Webpage
    32  		requestTestCases []RequestTestCase
    33  	}{
    34  		{
    35  			name: "single node",
    36  			rootGenerator: func() *hyr.Webpage {
    37  				return hyr.NewWebpage(hyr.WebpageTypeHub)
    38  			},
    39  			requestTestCases: []RequestTestCase{
    40  				{
    41  					req:                httptest.NewRequest(http.MethodGet, "/", strings.NewReader("")),
    42  					ExpectedStatusCode: http.StatusOK,
    43  				},
    44  			},
    45  		},
    46  		{
    47  			name: "single node with prefix",
    48  			rootGenerator: func() *hyr.Webpage {
    49  				return hyr.NewWebpage(hyr.WebpageTypeHub, hyr.WithPathPrefix("/testprefix"))
    50  			},
    51  			requestTestCases: []RequestTestCase{
    52  				{
    53  					req:                httptest.NewRequest(http.MethodGet, "/testprefix", strings.NewReader("")),
    54  					ExpectedStatusCode: http.StatusOK,
    55  				},
    56  				{
    57  					req:                httptest.NewRequest(http.MethodGet, "/", strings.NewReader("")),
    58  					ExpectedStatusCode: http.StatusNotFound,
    59  				},
    60  			},
    61  		},
    62  	}
    63  
    64  	for _, tc := range testCases {
    65  		t.Run(tc.name, func(t *testing.T) {
    66  			root := tc.rootGenerator()
    67  			mx, err := gmx.New(root)
    68  			assert.NoErrorf(t, err, "Error while creating root")
    69  			for _, rtc := range tc.requestTestCases {
    70  				r := httptest.NewRecorder()
    71  				mx.GraphHandlerFunc(r, rtc.req)
    72  				assert.Equal(t, rtc.ExpectedStatusCode, r.Result().StatusCode)
    73  			}
    74  		})
    75  	}
    76  }
    77  
    78  func TestObserverOnMux(t *testing.T) {
    79  	testCases := []struct {
    80  		name string
    81  
    82  		rootGenerator              func() *hyr.Webpage
    83  		reqs                       []*http.Request
    84  		ExpectedNodeLogLength      int
    85  		ExpectedVisitHistoryLength int
    86  	}{
    87  		{
    88  			name: "root & single visit",
    89  			rootGenerator: func() *hyr.Webpage {
    90  				return hyr.NewWebpage(hyr.WebpageTypeHub)
    91  			},
    92  			reqs: []*http.Request{
    93  				httptest.NewRequest(http.MethodGet, "/", strings.NewReader("")),
    94  			},
    95  			ExpectedNodeLogLength:      1,
    96  			ExpectedVisitHistoryLength: 1,
    97  		},
    98  	}
    99  
   100  	for _, tc := range testCases {
   101  		t.Run(tc.name, func(t *testing.T) {
   102  			root := tc.rootGenerator()
   103  			o := observer.New()
   104  			mx, err := gmx.New(root, gmx.WithObserver(o))
   105  			assert.NoErrorf(t, err, "Error while creating root")
   106  			for _, req := range tc.reqs {
   107  				r := httptest.NewRecorder()
   108  				mx.GraphHandlerFunc(r, req)
   109  			}
   110  
   111  			assert.Len(t, mx.Observer.NodeLogMap, tc.ExpectedNodeLogLength)
   112  			assert.Len(t, mx.Observer.VisitHistory, tc.ExpectedVisitHistoryLength)
   113  		})
   114  	}
   115  
   116  }