github.com/saucelabs/saucectl@v0.175.1/internal/http/imagerunner_test.go (about)

     1  package http
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"io"
     7  	"net/http"
     8  	"net/http/httptest"
     9  	"testing"
    10  
    11  	"github.com/hashicorp/go-retryablehttp"
    12  	"github.com/saucelabs/saucectl/internal/iam"
    13  	"github.com/stretchr/testify/assert"
    14  )
    15  
    16  func TestImageRunner_GetArtifacts(t *testing.T) {
    17  	type fields struct {
    18  		Client *retryablehttp.Client
    19  		URL    string
    20  		Creds  iam.Credentials
    21  	}
    22  	type args struct {
    23  		ctx context.Context
    24  		id  string
    25  	}
    26  	tests := []struct {
    27  		name    string
    28  		fields  fields
    29  		args    args
    30  		want    assert.ValueAssertionFunc
    31  		wantErr assert.ErrorAssertionFunc
    32  	}{
    33  		{
    34  			name:   "Empty Payload",
    35  			fields: fields{},
    36  			args: args{
    37  				ctx: context.Background(),
    38  				id:  "run-id-1",
    39  			},
    40  			want: func(t assert.TestingT, i interface{}, input ...interface{}) bool {
    41  				rd := i.(io.ReadCloser)
    42  				buf, err := io.ReadAll(rd)
    43  				if err != nil {
    44  					return false
    45  				}
    46  				return string(buf) == "expected-run-1"
    47  			},
    48  			wantErr: func(t assert.TestingT, err error, i ...interface{}) bool {
    49  				return err == nil
    50  			},
    51  		},
    52  	}
    53  	ta := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    54  		var err error
    55  		switch r.URL.Path {
    56  		case "/artifacts/run-id-1":
    57  			w.WriteHeader(200)
    58  			_, err = w.Write([]byte("expected-run-1"))
    59  		default:
    60  			w.WriteHeader(http.StatusInternalServerError)
    61  		}
    62  
    63  		if err != nil {
    64  			t.Errorf("failed to respond: %v", err)
    65  		}
    66  	}))
    67  	defer ta.Close()
    68  
    69  	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    70  		var err error
    71  		switch r.URL.Path {
    72  		case "/v1alpha1/hosted/image/runners/run-id-1/artifacts/url":
    73  			w.WriteHeader(200)
    74  			_, err = w.Write([]byte(fmt.Sprintf(`{"url":"%s/artifacts/run-id-1"}`, ta.URL)))
    75  		default:
    76  			w.WriteHeader(http.StatusInternalServerError)
    77  		}
    78  
    79  		if err != nil {
    80  			t.Errorf("failed to respond: %v", err)
    81  		}
    82  	}))
    83  	defer ts.Close()
    84  	for _, tt := range tests {
    85  		t.Run(tt.name, func(t *testing.T) {
    86  			c := &ImageRunner{
    87  				Client: retryablehttp.NewClient(),
    88  				URL:    ts.URL,
    89  				Creds:  tt.fields.Creds,
    90  			}
    91  			got, err := c.DownloadArtifacts(tt.args.ctx, tt.args.id)
    92  			if !tt.wantErr(t, err, fmt.Sprintf("GetArtifacts(%v, %v)", tt.args.ctx, tt.args.id)) {
    93  				return
    94  			}
    95  			tt.want(t, got, fmt.Sprintf("GetArtifacts(%v, %v)", tt.args.ctx, tt.args.id))
    96  		})
    97  	}
    98  }