github.com/koneal2013/storymetadatagenerator@v0.0.0-20230222212341-b170f254daa5/internal/server/http_test.go (about) 1 package server_test 2 3 import ( 4 "encoding/json" 5 "net/http" 6 "net/http/httptest" 7 "os" 8 "strings" 9 "testing" 10 11 "github.com/stretchr/testify/require" 12 "go.opentelemetry.io/otel" 13 14 storymetadata_v1 "github.com/koneal2013/storymetadatagenerator/api/v1" 15 "github.com/koneal2013/storymetadatagenerator/internal/middleware/adaptor" 16 "github.com/koneal2013/storymetadatagenerator/internal/server" 17 ) 18 19 const ( 20 succeed = "\u2714" 21 failed = "\u2718" 22 ) 23 24 func TestHttpServer(t *testing.T) { 25 for scenario, fn := range map[string]func(t *testing.T){ 26 "get status returns '200 ok'": testGetStatus, 27 "get story metadata for 'N' number of pages returns '200 ok'": testGetStoryMetadataSuccess, 28 } { 29 t.Run(scenario, func(t *testing.T) { 30 fn(t) 31 if t.Failed() { 32 t.Logf("%s %s", scenario, failed) 33 return 34 } 35 t.Logf("%s %s", scenario, succeed) 36 }) 37 } 38 } 39 40 func testGetStoryMetadataSuccess(t *testing.T) { 41 // change working dir to project root 42 err := os.Chdir("./../..") 43 require.NoError(t, err) 44 45 svrDeps := server.HttpSvrDeps{ 46 HttpTracer: otel.GetTracerProvider().Tracer("Test http trace"), 47 } 48 49 handler := adaptor.GenericHttpAdaptor(svrDeps.HandleGetStoryMetadata) 50 svr := testServer(handler) 51 defer svr.Close() 52 53 req, err := http.NewRequest("GET", svr.URL, strings.NewReader("1")) 54 require.NoError(t, err) 55 56 client := http.Client{} 57 resp, err := client.Do(req) 58 require.NoError(t, err) 59 60 metadata := &storymetadata_v1.StoryMetadataResult{} 61 err = json.NewDecoder(resp.Body).Decode(metadata) 62 require.NoError(t, err) 63 expectedStoryLength := 10 64 require.Equal(t, expectedStoryLength, len(metadata.Stories)) 65 require.Nil(t, metadata.Errs) 66 require.Equal(t, resp.StatusCode, http.StatusOK) 67 } 68 69 func testGetStatus(t *testing.T) { 70 svrDeps := server.HttpSvrDeps{ 71 HttpTracer: otel.GetTracerProvider().Tracer("Test http trace"), 72 } 73 handler := http.HandlerFunc(svrDeps.HandleStatus) 74 75 svr := testServer(handler) 76 defer svr.Close() 77 78 resp, err := http.Get(svr.URL) 79 require.NoError(t, err) 80 81 require.Equal(t, resp.StatusCode, http.StatusOK) 82 } 83 84 func testServer(f func(w http.ResponseWriter, r *http.Request)) *httptest.Server { 85 return httptest.NewServer(http.HandlerFunc(f)) 86 } 87 88 // mock server for instances where no internet connection is available 89 func mockServer() *httptest.Server { 90 f := func(w http.ResponseWriter, r *http.Request) { 91 json.NewEncoder(w).Encode(storymetadata_v1.StoryMetadataResult{ 92 Stories: map[string]storymetadata_v1.StoryMetadata{ 93 "testStory": { 94 WordCount: 10, 95 ReadabilityScore: "12", 96 ReadingTime: "<1", 97 Headline: "testHeadline", 98 Permalink: "testPermalink", 99 }, 100 }, 101 }) 102 w.Header().Add("Content-Type", "application/json") 103 } 104 return httptest.NewServer(http.HandlerFunc(f)) 105 }