Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-pages.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'internal/httprange/resource_test.go')
-rw-r--r--internal/httprange/resource_test.go96
1 files changed, 96 insertions, 0 deletions
diff --git a/internal/httprange/resource_test.go b/internal/httprange/resource_test.go
new file mode 100644
index 00000000..89d15a21
--- /dev/null
+++ b/internal/httprange/resource_test.go
@@ -0,0 +1,96 @@
+package httprange
+
+import (
+ "context"
+ "fmt"
+ "net/http"
+ "net/http/httptest"
+ "testing"
+
+ "github.com/stretchr/testify/require"
+)
+
+func TestNewResource(t *testing.T) {
+ resource := Resource{
+ URL: "/some/resource",
+ ETag: "etag",
+ LastModified: "Wed, 21 Oct 2015 07:28:00 GMT",
+ Size: 1,
+ }
+
+ tests := map[string]struct {
+ url string
+ status int
+ contentRange string
+ want Resource
+ expectedErrMsg string
+ }{
+ "status_ok": {
+ url: "/some/resource",
+ status: http.StatusOK,
+ want: resource,
+ },
+ "status_partial_content_success": {
+ url: "/some/resource",
+ status: http.StatusPartialContent,
+ contentRange: "bytes 200-1000/67589",
+ want: func() Resource {
+ r := resource
+ r.Size = 67589
+ return r
+ }(),
+ },
+ "status_partial_content_invalid_content_range": {
+ url: "/some/resource",
+ status: http.StatusPartialContent,
+ contentRange: "invalid",
+ expectedErrMsg: "invalid `Content-Range`:",
+ },
+ "status_partial_content_content_range_not_a_number": {
+ url: "/some/resource",
+ status: http.StatusPartialContent,
+ contentRange: "bytes 200-1000/notanumber",
+ expectedErrMsg: "invalid `Content-Range`:",
+ },
+ "StatusRequestedRangeNotSatisfiable": {
+ url: "/some/resource",
+ status: http.StatusRequestedRangeNotSatisfiable,
+ expectedErrMsg: ErrRangeRequestsNotSupported.Error(),
+ },
+ "not_found": {
+ url: "/some/resource",
+ status: http.StatusNotFound,
+ expectedErrMsg: fmt.Sprintf("httprange: new resource %d: %q", http.StatusNotFound, "404 Not Found"),
+ },
+ "invalid_url": {
+ url: "/%",
+ expectedErrMsg: "invalid URL escape",
+ },
+ }
+
+ for name, tt := range tests {
+ t.Run(name, func(t *testing.T) {
+ testServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ w.Header().Set("ETag", tt.want.ETag)
+ w.Header().Set("Last-Modified", tt.want.LastModified)
+ w.Header().Set("Content-Range", tt.contentRange)
+ w.WriteHeader(tt.status)
+ w.Write([]byte("1"))
+ }))
+ defer testServer.Close()
+
+ got, err := NewResource(context.Background(), testServer.URL+tt.url)
+ if tt.expectedErrMsg != "" {
+ require.Error(t, err)
+ require.Contains(t, err.Error(), tt.expectedErrMsg)
+ return
+ }
+
+ require.NoError(t, err)
+ require.Contains(t, got.URL, tt.want.URL)
+ require.Equal(t, tt.want.LastModified, got.LastModified)
+ require.Equal(t, tt.want.ETag, got.ETag)
+ require.Equal(t, tt.want.Size, got.Size)
+ })
+ }
+}