Skip to content

Commit

Permalink
Improve tests for http package (#187)
Browse files Browse the repository at this point in the history
  • Loading branch information
majd authored May 27, 2023
1 parent 95c3aa6 commit bf33e0d
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 85 deletions.
1 change: 0 additions & 1 deletion pkg/appstore/appstore_replicate_sinf.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,6 @@ func (t *appstore) ReplicateSinf(input ReplicateSinfInput) error {
return fmt.Errorf("failed to read info plist: %w", err)
}

fmt.Println(manifest != nil)
if manifest != nil {
err = t.replicateSinfFromManifest(*manifest, zipWriter, input.Sinfs, bundleName)
} else {
Expand Down
133 changes: 50 additions & 83 deletions pkg/http/client_test.go
Original file line number Diff line number Diff line change
@@ -1,72 +1,37 @@
package http

import (
"context"
"encoding/json"
"errors"
"fmt"
"github.com/golang/mock/gomock"
. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
"math/rand"
"net/http"
"net/http/httptest"
)

type JSONResult struct {
Foo string `json:"foo"`
}
var _ = Describe("Client", Ordered, func() {
type jsonResult struct {
Foo string `json:"foo"`
}

type XMLResult struct {
Foo string `plist:"foo"`
}
type xmlResult struct {
Foo string `plist:"foo"`
}

var _ = Describe("Client", Ordered, func() {
var (
port int
ctx context.Context
cancel context.CancelFunc
ctrl *gomock.Controller
srv *httptest.Server
mockHandler func(w http.ResponseWriter, r *http.Request)
mockCookieJar *MockCookieJar
)

BeforeAll(func() {
ctrl = gomock.NewController(GinkgoT())
port = rand.Intn(59_999-50_000) + 50_000
ctx, cancel = context.WithCancel(context.Background())
mockCookieJar = NewMockCookieJar(ctrl)

http.HandleFunc("/json", func(w http.ResponseWriter, r *http.Request) {
res := []byte("{\"foo\":\"bar\"}")
w.Header().Add("Content-Type", "application/json")
_, err := w.Write(res)
Expect(err).ToNot(HaveOccurred())
})

http.HandleFunc("/xml", func(w http.ResponseWriter, r *http.Request) {
res := []byte("<dict><key>foo</key><string>bar</string></dict>")
w.Header().Add("Content-Type", "application/xml")
_, err := w.Write(res)
Expect(err).ToNot(HaveOccurred())
})

http.HandleFunc("/error", func(w http.ResponseWriter, r *http.Request) {
w.Header().Add("Content-Type", "application/random-type")
})

http.HandleFunc("/headers", func(w http.ResponseWriter, r *http.Request) {
err := json.NewEncoder(w).Encode(r.Header)
Expect(err).ToNot(HaveOccurred())
})

go func() {
err := http.ListenAndServe(fmt.Sprintf(":%d", port), nil)
Expect(err).ToNot(HaveOccurred())
<-ctx.Done()
}()
})

AfterAll(func() {
cancel()
mockHandler = func(w http.ResponseWriter, r *http.Request) {}
srv = httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
mockHandler(w, r)
}))
})

BeforeEach(func() {
Expand All @@ -77,17 +42,22 @@ var _ = Describe("Client", Ordered, func() {
})

It("returns request", func() {
sut := NewClient[XMLResult](Args{})
sut := NewClient[xmlResult](Args{})

req, err := sut.NewRequest("GET", fmt.Sprintf("http://localhost:%d/json", port), nil)
req, err := sut.NewRequest("GET", srv.URL, nil)
Expect(err).ToNot(HaveOccurred())
Expect(req).ToNot(BeNil())
})

It("returns response", func() {
sut := NewClient[XMLResult](Args{})
mockHandler = func(w http.ResponseWriter, r *http.Request) {
defer GinkgoRecover()
Expect(r.Header.Get("User-Agent")).To(Equal(DefaultUserAgent))
}

sut := NewClient[xmlResult](Args{})

req, err := sut.NewRequest("GET", fmt.Sprintf("http://localhost:%d/json", port), nil)
req, err := sut.NewRequest("GET", srv.URL, nil)
Expect(err).ToNot(HaveOccurred())
Expect(req).ToNot(BeNil())

Expand All @@ -98,20 +68,18 @@ var _ = Describe("Client", Ordered, func() {

When("payload decodes successfully", func() {
When("cookie jar fails to save", func() {
var testErr = errors.New("test")

BeforeEach(func() {
mockCookieJar.EXPECT().
Save().
Return(testErr)
Return(errors.New(""))
})

It("returns error", func() {
sut := NewClient[JSONResult](Args{
sut := NewClient[jsonResult](Args{
CookieJar: mockCookieJar,
})
_, err := sut.Send(Request{
URL: fmt.Sprintf("http://localhost:%d/json", port),
URL: srv.URL,
Method: MethodGET,
})

Expand All @@ -127,11 +95,17 @@ var _ = Describe("Client", Ordered, func() {
})

It("decodes JSON response", func() {
sut := NewClient[JSONResult](Args{
mockHandler = func(w http.ResponseWriter, r *http.Request) {
w.Header().Add("Content-Type", "application/json")
_, err := w.Write([]byte("{\"foo\":\"bar\"}"))
Expect(err).ToNot(HaveOccurred())
}

sut := NewClient[jsonResult](Args{
CookieJar: mockCookieJar,
})
res, err := sut.Send(Request{
URL: fmt.Sprintf("http://localhost:%d/json", port),
URL: srv.URL,
Method: MethodGET,
ResponseFormat: ResponseFormatJSON,
Headers: map[string]string{
Expand All @@ -149,11 +123,17 @@ var _ = Describe("Client", Ordered, func() {
})

It("decodes XML response", func() {
sut := NewClient[XMLResult](Args{
mockHandler = func(w http.ResponseWriter, r *http.Request) {
w.Header().Add("Content-Type", "application/xml")
_, err := w.Write([]byte("<dict><key>foo</key><string>bar</string></dict>"))
Expect(err).ToNot(HaveOccurred())
}

sut := NewClient[xmlResult](Args{
CookieJar: mockCookieJar,
})
res, err := sut.Send(Request{
URL: fmt.Sprintf("http://localhost:%d/xml", port),
URL: srv.URL,
Method: MethodPOST,
ResponseFormat: ResponseFormatXML,
})
Expand All @@ -163,11 +143,15 @@ var _ = Describe("Client", Ordered, func() {
})

It("returns error when content type is not supported", func() {
sut := NewClient[XMLResult](Args{
mockHandler = func(w http.ResponseWriter, r *http.Request) {
w.Header().Add("Content-Type", "application/xyz")
}

sut := NewClient[xmlResult](Args{
CookieJar: mockCookieJar,
})
_, err := sut.Send(Request{
URL: fmt.Sprintf("http://localhost:%d/error", port),
URL: srv.URL,
Method: MethodPOST,
ResponseFormat: "random",
})
Expand All @@ -179,11 +163,11 @@ var _ = Describe("Client", Ordered, func() {

When("payload fails to decode", func() {
It("returns error", func() {
sut := NewClient[XMLResult](Args{
sut := NewClient[xmlResult](Args{
CookieJar: mockCookieJar,
})
_, err := sut.Send(Request{
URL: fmt.Sprintf("http://localhost:%d/error", port),
URL: srv.URL,
Method: MethodPOST,
ResponseFormat: ResponseFormatXML,
Payload: &URLPayload{
Expand All @@ -196,21 +180,4 @@ var _ = Describe("Client", Ordered, func() {
Expect(err).To(HaveOccurred())
})
})

It("uses default headers", func() {
sut := NewClient[XMLResult](Args{})

req, err := sut.NewRequest("GET", fmt.Sprintf("http://localhost:%d/headers", port), nil)
Expect(err).ToNot(HaveOccurred())
Expect(req).ToNot(BeNil())

res, err := sut.Do(req)
Expect(err).ToNot(HaveOccurred())
Expect(res).ToNot(BeNil())

headers := http.Header{}
err = json.NewDecoder(res.Body).Decode(&headers)
Expect(err).ToNot(HaveOccurred())
Expect(headers.Get("User-Agent")).To(Equal(DefaultUserAgent))
})
})
5 changes: 4 additions & 1 deletion pkg/http/constants.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,8 @@ type ResponseFormat string
const (
ResponseFormatJSON ResponseFormat = "json"
ResponseFormatXML ResponseFormat = "xml"
DefaultUserAgent = "Configurator/2.15 (Macintosh; OS X 11.0.0; 16G29) AppleWebKit/2603.3.8"
)

const (
DefaultUserAgent = "Configurator/2.15 (Macintosh; OS X 11.0.0; 16G29) AppleWebKit/2603.3.8"
)

0 comments on commit bf33e0d

Please sign in to comment.