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  }