package endpoint

import (
	"net/url"
	"reflect"
	"testing"
)

func TestNewEndpoint(t *testing.T) {
	type args struct {
		scheme string
		host   string
	}
	tests := []struct {
		name string
		args args
		want *url.URL
	}{
		{
			name: "https://github.com/go-kratos/kratos/",
			args: args{"https", "github.com/go-kratos/kratos/"},
			want: &url.URL{Scheme: "https", Host: "github.com/go-kratos/kratos/"},
		},
		{
			name: "https://go-kratos.dev/",
			args: args{"https", "go-kratos.dev/"},
			want: &url.URL{Scheme: "https", Host: "go-kratos.dev/"},
		},
		{
			name: "https://www.google.com/",
			args: args{"https", "www.google.com/"},
			want: &url.URL{Scheme: "https", Host: "www.google.com/"},
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			if got := NewEndpoint(tt.args.scheme, tt.args.host); !reflect.DeepEqual(got, tt.want) {
				t.Errorf("NewEndpoint() = %v, want %v", got, tt.want)
			}
		})
	}
}

func TestParseEndpoint(t *testing.T) {
	type args struct {
		endpoints []string
		scheme    string
	}
	tests := []struct {
		name    string
		args    args
		want    string
		wantErr bool
	}{
		{
			name:    "kratos",
			args:    args{endpoints: []string{"https://github.com/go-kratos/kratos"}, scheme: "https"},
			want:    "github.com",
			wantErr: false,
		},
		{
			name:    "test",
			args:    args{endpoints: []string{"http://go-kratos.dev/"}, scheme: "https"},
			want:    "",
			wantErr: false,
		},
		{
			name:    "localhost:8080",
			args:    args{endpoints: []string{"grpcs://localhost:8080/"}, scheme: "grpcs"},
			want:    "localhost:8080",
			wantErr: false,
		},
		{
			name:    "localhost:8081",
			args:    args{endpoints: []string{"grpcs://localhost:8080/"}, scheme: "grpc"},
			want:    "",
			wantErr: false,
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			got, err := ParseEndpoint(tt.args.endpoints, tt.args.scheme)
			if (err != nil) != tt.wantErr {
				t.Errorf("ParseEndpoint() error = %v, wantErr %v", err, tt.wantErr)
				return
			}
			if got != tt.want {
				t.Errorf("ParseEndpoint() got = %v, want %v", got, tt.want)
			}
		})
	}
}

func TestSchema(t *testing.T) {
	tests := []struct {
		schema string
		secure bool
		want   string
	}{
		{
			schema: "http",
			secure: true,
			want:   "https",
		},
		{
			schema: "http",
			secure: false,
			want:   "http",
		},
		{
			schema: "grpc",
			secure: true,
			want:   "grpcs",
		},
		{
			schema: "grpc",
			secure: false,
			want:   "grpc",
		},
	}
	for _, tt := range tests {
		if got := Scheme(tt.schema, tt.secure); got != tt.want {
			t.Errorf("Schema() = %v, want %v", got, tt.want)
		}
	}
}