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 }