package httpapi

import (
	"testing"

	"github.com/google/go-cmp/cmp"
	"github.com/ooni/probe-cli/v3/internal/model"
	"github.com/ooni/probe-cli/v3/internal/model/mocks"
)

func TestNewEndpointList(t *testing.T) {
	type args struct {
		httpClient model.HTTPClient
		userAgent  string
		services   []model.OOAPIService
	}
	defaultHTTPClient := &mocks.HTTPClient{}
	tests := []struct {
		name    string
		args    args
		wantOut []*Endpoint
	}{{
		name: "with no services",
		args: args{
			httpClient: defaultHTTPClient,
			userAgent:  model.HTTPHeaderUserAgent,
			services:   nil,
		},
		wantOut: nil,
	}, {
		name: "common cases",
		args: args{
			httpClient: defaultHTTPClient,
			userAgent:  model.HTTPHeaderUserAgent,
			services: []model.OOAPIService{{
				Address: "https://www.example.com/",
				Type:    "https",
				Front:   "",
			}, {
				Address: "https://www.example.org/",
				Type:    "cloudfront",
				Front:   "example.org.it",
			}, {
				Address: "https://nonexistent.onion/",
				Type:    "onion",
				Front:   "",
			}},
		},
		wantOut: []*Endpoint{{
			BaseURL:    "https://www.example.com/",
			HTTPClient: defaultHTTPClient,
			Host:       "",
			UserAgent:  model.HTTPHeaderUserAgent,
		}, {
			BaseURL:    "https://www.example.org/",
			HTTPClient: defaultHTTPClient,
			Host:       "example.org.it",
			UserAgent:  model.HTTPHeaderUserAgent,
		}},
	}}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			gotOut := NewEndpointList(tt.args.httpClient, tt.args.userAgent, tt.args.services...)
			if diff := cmp.Diff(tt.wantOut, gotOut); diff != "" {
				t.Fatal(diff)
			}
		})
	}
}