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

     1  package http
     2  
     3  import (
     4  	"context"
     5  	"encoding/json"
     6  	"fmt"
     7  	"net/http"
     8  	"net/http/httptest"
     9  	"reflect"
    10  	"testing"
    11  
    12  	"github.com/saucelabs/saucectl/internal/job"
    13  )
    14  
    15  func TestWebdriver_StartJob(t *testing.T) {
    16  	type args struct {
    17  		ctx               context.Context
    18  		jobStarterPayload job.StartOptions
    19  	}
    20  	type fields struct {
    21  		HTTPClient *http.Client
    22  		URL        string
    23  	}
    24  	tests := []struct {
    25  		name       string
    26  		fields     fields
    27  		args       args
    28  		want       string
    29  		wantErr    error
    30  		serverFunc func(w http.ResponseWriter, r *http.Request) // what shall the mock server respond with
    31  	}{
    32  		{
    33  			name: "Happy path",
    34  			args: args{
    35  				ctx: context.TODO(),
    36  				jobStarterPayload: job.StartOptions{
    37  					User:        "fake-user",
    38  					AccessKey:   "fake-access-key",
    39  					BrowserName: "fake-browser-name",
    40  					Name:        "fake-test-name",
    41  					Framework:   "fake-framework",
    42  					Build:       "fake-buildname",
    43  					Tags:        nil,
    44  				},
    45  			},
    46  			want:    "fake-job-id",
    47  			wantErr: nil,
    48  			serverFunc: func(w http.ResponseWriter, r *http.Request) {
    49  				w.WriteHeader(201)
    50  				_ = json.NewEncoder(w).Encode(sessionStartResponse{
    51  					SessionID: "fake-job-id",
    52  				})
    53  			},
    54  		},
    55  		{
    56  			name: "Non 2xx status code",
    57  			args: args{
    58  				ctx:               context.TODO(),
    59  				jobStarterPayload: job.StartOptions{},
    60  			},
    61  			want:    "",
    62  			wantErr: fmt.Errorf("job start failed (401): go away"),
    63  			serverFunc: func(w http.ResponseWriter, r *http.Request) {
    64  				w.WriteHeader(401)
    65  				_, _ = w.Write([]byte("go away"))
    66  			},
    67  		},
    68  		{
    69  			name: "Unknown error",
    70  			args: args{
    71  				ctx:               context.TODO(),
    72  				jobStarterPayload: job.StartOptions{},
    73  			},
    74  			want:    "",
    75  			wantErr: fmt.Errorf("job start failed (500): internal server error"),
    76  			serverFunc: func(w http.ResponseWriter, r *http.Request) {
    77  				w.WriteHeader(500)
    78  				_, err := w.Write([]byte("internal server error"))
    79  				if err != nil {
    80  					t.Errorf("failed to write response: %v", err)
    81  				}
    82  			},
    83  		},
    84  	}
    85  	for _, tt := range tests {
    86  		t.Run(tt.name, func(t *testing.T) {
    87  			server := httptest.NewServer(http.HandlerFunc(tt.serverFunc))
    88  			defer server.Close()
    89  
    90  			c := &Webdriver{
    91  				HTTPClient: server.Client(),
    92  				URL:        server.URL,
    93  			}
    94  
    95  			got, _, err := c.StartJob(tt.args.ctx, tt.args.jobStarterPayload)
    96  			if (err != nil) && !reflect.DeepEqual(err, tt.wantErr) {
    97  				t.Errorf("StartJob() error = %v, wantErr %v", err, tt.wantErr)
    98  				return
    99  			}
   100  			if !reflect.DeepEqual(got, tt.want) {
   101  				t.Errorf("StartJob() got = %v, want %v", got, tt.want)
   102  			}
   103  		})
   104  	}
   105  }