mirror of
https://github.com/ScuroNeko/mtg.git
synced 2026-09-01 16:01:55 +03:00
Add tests for HTTP file abstraction
This commit is contained in:
@@ -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)
|
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
|
return response.Body, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewHTTP(client *http.Client, endpoint string) (File, error) {
|
func NewHTTP(client *http.Client, endpoint string) (File, error) {
|
||||||
|
if client == nil {
|
||||||
|
return nil, ErrBadHTTPClient
|
||||||
|
}
|
||||||
|
|
||||||
parsed, err := url.Parse(endpoint)
|
parsed, err := url.Parse(endpoint)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("incorrect url %s: %w", endpoint, err)
|
return nil, fmt.Errorf("incorrect url %s: %w", endpoint, err)
|
||||||
|
|||||||
@@ -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{})
|
||||||
|
}
|
||||||
@@ -2,9 +2,12 @@ package files
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"errors"
|
||||||
"io"
|
"io"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var ErrBadHTTPClient = errors.New("incorrect http client")
|
||||||
|
|
||||||
type File interface {
|
type File interface {
|
||||||
Open(context.Context) (io.ReadCloser, error)
|
Open(context.Context) (io.ReadCloser, error)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ type LocalTestSuite struct {
|
|||||||
suite.Suite
|
suite.Suite
|
||||||
}
|
}
|
||||||
|
|
||||||
func (suite *LocalTestSuite) GetLocalFile(name string) string {
|
func (suite *LocalTestSuite) getLocalFile(name string) string {
|
||||||
return filepath.Join("testdata", name)
|
return filepath.Join("testdata", name)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -30,14 +30,14 @@ func (suite *LocalTestSuite) TestIncorrect() {
|
|||||||
value := v
|
value := v
|
||||||
|
|
||||||
suite.T().Run(v, func(t *testing.T) {
|
suite.T().Run(v, func(t *testing.T) {
|
||||||
_, err := files.NewLocal(suite.GetLocalFile(value))
|
_, err := files.NewLocal(suite.getLocalFile(value))
|
||||||
assert.Error(t, err)
|
assert.Error(t, err)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (suite *LocalTestSuite) TestOk() {
|
func (suite *LocalTestSuite) TestOk() {
|
||||||
file, err := files.NewLocal(suite.GetLocalFile("readable"))
|
file, err := files.NewLocal(suite.getLocalFile("readable"))
|
||||||
suite.NoError(err)
|
suite.NoError(err)
|
||||||
|
|
||||||
reader, err := file.Open(context.Background())
|
reader, err := file.Open(context.Background())
|
||||||
|
|||||||
Reference in New Issue
Block a user