From e6fa69d28890ebe1ee287f8338b19de54fe9862e Mon Sep 17 00:00:00 2001 From: 9seconds Date: Mon, 29 Nov 2021 15:56:53 +0300 Subject: [PATCH] Add tests for HTTP file abstraction --- ipblocklist/files/http.go | 8 +++ ipblocklist/files/http_test.go | 90 +++++++++++++++++++++++++++++++++ ipblocklist/files/init.go | 3 ++ ipblocklist/files/local_test.go | 6 +-- 4 files changed, 104 insertions(+), 3 deletions(-) create mode 100644 ipblocklist/files/http_test.go diff --git a/ipblocklist/files/http.go b/ipblocklist/files/http.go index c024399..69b4cfc 100644 --- a/ipblocklist/files/http.go +++ b/ipblocklist/files/http.go @@ -29,10 +29,18 @@ func (h httpFile) Open(ctx context.Context) (io.ReadCloser, error) { return nil, fmt.Errorf("cannot get url %s: %w", h.url, err) } + if response.StatusCode >= http.StatusBadRequest { + return nil, fmt.Errorf("unexpected status code %d", response.StatusCode) + } + return response.Body, nil } func NewHTTP(client *http.Client, endpoint string) (File, error) { + if client == nil { + return nil, ErrBadHTTPClient + } + parsed, err := url.Parse(endpoint) if err != nil { return nil, fmt.Errorf("incorrect url %s: %w", endpoint, err) diff --git a/ipblocklist/files/http_test.go b/ipblocklist/files/http_test.go new file mode 100644 index 0000000..294739e --- /dev/null +++ b/ipblocklist/files/http_test.go @@ -0,0 +1,90 @@ +package files_test + +import ( + "context" + "io" + "net/http" + "net/http/httptest" + "strings" + "testing" + + "github.com/9seconds/mtg/v2/ipblocklist/files" + "github.com/stretchr/testify/suite" +) + +type HTTPTestSuite struct { + suite.Suite + + httpClient *http.Client + httpServer *httptest.Server + ctx context.Context + ctxCancel context.CancelFunc +} + +func (suite *HTTPTestSuite) makeFile(path string) (files.File, error) { + return files.NewHTTP(suite.httpClient, suite.httpServer.URL+"/"+path) +} + +func (suite *HTTPTestSuite) SetupSuite() { + mux := http.NewServeMux() + + mux.Handle("/", http.FileServer(http.Dir("testdata"))) + + suite.httpServer = httptest.NewServer(mux) + suite.httpClient = suite.httpServer.Client() +} + +func (suite *HTTPTestSuite) SetupTest() { + suite.ctx, suite.ctxCancel = context.WithCancel(context.Background()) +} + +func (suite *HTTPTestSuite) TearDownTest() { + suite.ctxCancel() + suite.httpServer.CloseClientConnections() +} + +func (suite *HTTPTestSuite) TearDownSuite() { + suite.httpServer.Close() +} + +func (suite *HTTPTestSuite) TestBadURL() { + _, err := files.NewHTTP(suite.httpClient, "sdfsdf") + suite.Error(err) +} + +func (suite *HTTPTestSuite) TestBadSchema() { + _, err := files.NewHTTP(suite.httpClient, "gopher://lala") + suite.Error(err) +} + +func (suite *HTTPTestSuite) TestNilHTTPClient() { + _, err := files.NewHTTP(nil, "") + suite.Error(err) +} + +func (suite *HTTPTestSuite) TestAbsentFile() { + file, err := suite.makeFile("absent") + suite.NoError(err) + + _, err = file.Open(suite.ctx) + suite.Error(err) +} + +func (suite *HTTPTestSuite) TestOk() { + file, err := suite.makeFile("readable") + suite.NoError(err) + + readCloser, err := file.Open(suite.ctx) + suite.NoError(err) + + defer readCloser.Close() + + data, err := io.ReadAll(readCloser) + suite.NoError(err) + suite.Equal("Hooray!", strings.TrimSpace(string(data))) +} + +func TestHTTP(t *testing.T) { + t.Parallel() + suite.Run(t, &HTTPTestSuite{}) +} diff --git a/ipblocklist/files/init.go b/ipblocklist/files/init.go index 922b211..520b2c5 100644 --- a/ipblocklist/files/init.go +++ b/ipblocklist/files/init.go @@ -2,9 +2,12 @@ package files import ( "context" + "errors" "io" ) +var ErrBadHTTPClient = errors.New("incorrect http client") + type File interface { Open(context.Context) (io.ReadCloser, error) } diff --git a/ipblocklist/files/local_test.go b/ipblocklist/files/local_test.go index 3108dab..f3dba38 100644 --- a/ipblocklist/files/local_test.go +++ b/ipblocklist/files/local_test.go @@ -16,7 +16,7 @@ type LocalTestSuite struct { suite.Suite } -func (suite *LocalTestSuite) GetLocalFile(name string) string { +func (suite *LocalTestSuite) getLocalFile(name string) string { return filepath.Join("testdata", name) } @@ -30,14 +30,14 @@ func (suite *LocalTestSuite) TestIncorrect() { value := v suite.T().Run(v, func(t *testing.T) { - _, err := files.NewLocal(suite.GetLocalFile(value)) + _, err := files.NewLocal(suite.getLocalFile(value)) assert.Error(t, err) }) } } func (suite *LocalTestSuite) TestOk() { - file, err := files.NewLocal(suite.GetLocalFile("readable")) + file, err := files.NewLocal(suite.getLocalFile("readable")) suite.NoError(err) reader, err := file.Open(context.Background())