Преглед на файлове

Add tests for HTTP file abstraction

tags/v2.1.3^2
9seconds преди 4 години
родител
ревизия
e6fa69d288
променени са 4 файла, в които са добавени 104 реда и са изтрити 3 реда
  1. 8
    0
      ipblocklist/files/http.go
  2. 90
    0
      ipblocklist/files/http_test.go
  3. 3
    0
      ipblocklist/files/init.go
  4. 3
    3
      ipblocklist/files/local_test.go

+ 8
- 0
ipblocklist/files/http.go Целия файл

29
 		return nil, fmt.Errorf("cannot get url %s: %w", h.url, err)
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
 	return response.Body, nil
36
 	return response.Body, nil
33
 }
37
 }
34
 
38
 
35
 func NewHTTP(client *http.Client, endpoint string) (File, error) {
39
 func NewHTTP(client *http.Client, endpoint string) (File, error) {
40
+	if client == nil {
41
+		return nil, ErrBadHTTPClient
42
+	}
43
+
36
 	parsed, err := url.Parse(endpoint)
44
 	parsed, err := url.Parse(endpoint)
37
 	if err != nil {
45
 	if err != nil {
38
 		return nil, fmt.Errorf("incorrect url %s: %w", endpoint, err)
46
 		return nil, fmt.Errorf("incorrect url %s: %w", endpoint, err)

+ 90
- 0
ipblocklist/files/http_test.go Целия файл

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 Целия файл

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

+ 3
- 3
ipblocklist/files/local_test.go Целия файл

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

Loading…
Отказ
Запис