Kaynağa Gözat

Add tests for HTTP file abstraction

tags/v2.1.3^2
9seconds 4 yıl önce
ebeveyn
işleme
e6fa69d288

+ 8
- 0
ipblocklist/files/http.go Dosyayı Görüntüle

@@ -29,10 +29,18 @@ func (h httpFile) Open(ctx context.Context) (io.ReadCloser, error) {
29 29
 		return nil, fmt.Errorf("cannot get url %s: %w", h.url, err)
30 30
 	}
31 31
 
32
+	if response.StatusCode >= http.StatusBadRequest {
33
+		return nil, fmt.Errorf("unexpected status code %d", response.StatusCode)
34
+	}
35
+
32 36
 	return response.Body, nil
33 37
 }
34 38
 
35 39
 func NewHTTP(client *http.Client, endpoint string) (File, error) {
40
+	if client == nil {
41
+		return nil, ErrBadHTTPClient
42
+	}
43
+
36 44
 	parsed, err := url.Parse(endpoint)
37 45
 	if err != nil {
38 46
 		return nil, fmt.Errorf("incorrect url %s: %w", endpoint, err)

+ 90
- 0
ipblocklist/files/http_test.go Dosyayı Görüntüle

@@ -0,0 +1,90 @@
1
+package files_test
2
+
3
+import (
4
+	"context"
5
+	"io"
6
+	"net/http"
7
+	"net/http/httptest"
8
+	"strings"
9
+	"testing"
10
+
11
+	"github.com/9seconds/mtg/v2/ipblocklist/files"
12
+	"github.com/stretchr/testify/suite"
13
+)
14
+
15
+type HTTPTestSuite struct {
16
+	suite.Suite
17
+
18
+	httpClient *http.Client
19
+	httpServer *httptest.Server
20
+	ctx        context.Context
21
+	ctxCancel  context.CancelFunc
22
+}
23
+
24
+func (suite *HTTPTestSuite) makeFile(path string) (files.File, error) {
25
+	return files.NewHTTP(suite.httpClient, suite.httpServer.URL+"/"+path)
26
+}
27
+
28
+func (suite *HTTPTestSuite) SetupSuite() {
29
+	mux := http.NewServeMux()
30
+
31
+	mux.Handle("/", http.FileServer(http.Dir("testdata")))
32
+
33
+	suite.httpServer = httptest.NewServer(mux)
34
+	suite.httpClient = suite.httpServer.Client()
35
+}
36
+
37
+func (suite *HTTPTestSuite) SetupTest() {
38
+	suite.ctx, suite.ctxCancel = context.WithCancel(context.Background())
39
+}
40
+
41
+func (suite *HTTPTestSuite) TearDownTest() {
42
+	suite.ctxCancel()
43
+	suite.httpServer.CloseClientConnections()
44
+}
45
+
46
+func (suite *HTTPTestSuite) TearDownSuite() {
47
+	suite.httpServer.Close()
48
+}
49
+
50
+func (suite *HTTPTestSuite) TestBadURL() {
51
+	_, err := files.NewHTTP(suite.httpClient, "sdfsdf")
52
+	suite.Error(err)
53
+}
54
+
55
+func (suite *HTTPTestSuite) TestBadSchema() {
56
+	_, err := files.NewHTTP(suite.httpClient, "gopher://lala")
57
+	suite.Error(err)
58
+}
59
+
60
+func (suite *HTTPTestSuite) TestNilHTTPClient() {
61
+	_, err := files.NewHTTP(nil, "")
62
+	suite.Error(err)
63
+}
64
+
65
+func (suite *HTTPTestSuite) TestAbsentFile() {
66
+	file, err := suite.makeFile("absent")
67
+	suite.NoError(err)
68
+
69
+	_, err = file.Open(suite.ctx)
70
+	suite.Error(err)
71
+}
72
+
73
+func (suite *HTTPTestSuite) TestOk() {
74
+	file, err := suite.makeFile("readable")
75
+	suite.NoError(err)
76
+
77
+	readCloser, err := file.Open(suite.ctx)
78
+	suite.NoError(err)
79
+
80
+	defer readCloser.Close()
81
+
82
+	data, err := io.ReadAll(readCloser)
83
+	suite.NoError(err)
84
+	suite.Equal("Hooray!", strings.TrimSpace(string(data)))
85
+}
86
+
87
+func TestHTTP(t *testing.T) {
88
+	t.Parallel()
89
+	suite.Run(t, &HTTPTestSuite{})
90
+}

+ 3
- 0
ipblocklist/files/init.go Dosyayı Görüntüle

@@ -2,9 +2,12 @@ package files
2 2
 
3 3
 import (
4 4
 	"context"
5
+	"errors"
5 6
 	"io"
6 7
 )
7 8
 
9
+var ErrBadHTTPClient = errors.New("incorrect http client")
10
+
8 11
 type File interface {
9 12
 	Open(context.Context) (io.ReadCloser, error)
10 13
 }

+ 3
- 3
ipblocklist/files/local_test.go Dosyayı Görüntüle

@@ -16,7 +16,7 @@ type LocalTestSuite struct {
16 16
 	suite.Suite
17 17
 }
18 18
 
19
-func (suite *LocalTestSuite) GetLocalFile(name string) string {
19
+func (suite *LocalTestSuite) getLocalFile(name string) string {
20 20
 	return filepath.Join("testdata", name)
21 21
 }
22 22
 
@@ -30,14 +30,14 @@ func (suite *LocalTestSuite) TestIncorrect() {
30 30
 		value := v
31 31
 
32 32
 		suite.T().Run(v, func(t *testing.T) {
33
-			_, err := files.NewLocal(suite.GetLocalFile(value))
33
+			_, err := files.NewLocal(suite.getLocalFile(value))
34 34
 			assert.Error(t, err)
35 35
 		})
36 36
 	}
37 37
 }
38 38
 
39 39
 func (suite *LocalTestSuite) TestOk() {
40
-	file, err := files.NewLocal(suite.GetLocalFile("readable"))
40
+	file, err := files.NewLocal(suite.getLocalFile("readable"))
41 41
 	suite.NoError(err)
42 42
 
43 43
 	reader, err := file.Open(context.Background())

Loading…
İptal
Kaydet