package values

import (
	"strings"
	"testing"
)

func TestGetComponentsFromReleaseManifest(t *testing.T) {
	type args struct {
		url string
	}
	tests := []struct {
		name           string
		args           args
		want           string
		wantErr        bool
		errMsgContains string
	}{
		{
			name:    "error_if_invalid_URL",
			args:    args{url: "Hello!_I'm_an_invalid_URL"},
			want:    "",
			wantErr: true,
		},
		{
			name:           "error_if_nonexistent_URL",
			args:           args{url: "https://distro.eks.amazonaws.com/kubernetes-1-23/kubernetes-1-23-eks-FOOOO.yaml"},
			want:           "",
			wantErr:        true,
			errMsgContains: "status code 403",
		},
		{
			name:    "return_expected_if_valid_URL",
			args:    args{url: validDataOne.url},
			want:    validDataOne.expectedOutput,
			wantErr: false,
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			got, err := GetComponentsFromReleaseManifest(tt.args.url)
			if err != nil {
				if !tt.wantErr {
					t.Errorf("GetComponentsFromReleaseManifest() error = %v, wantErr %v", err, tt.wantErr)
					return
				}
				if len(tt.errMsgContains) > 0 && !strings.Contains(err.Error(), tt.errMsgContains) {
					t.Errorf("GetComponentsFromReleaseManifest() got = %q, expected error message to contain %q",
						err, tt.errMsgContains)
					return
				}
			}
			if got != tt.want {
				t.Errorf("GetComponentsFromReleaseManifest() got = %v, want %v", got, tt.want)
			}
		})
	}
}

type validData struct {
	url            string
	expectedOutput string
}

var validDataOne = validData{
	url: "https://distro.eks.amazonaws.com/kubernetes-1-23/kubernetes-1-23-eks-1.yaml",
	expectedOutput: `| Name | Version | URI |
|------|---------|-----|
| aws-iam-authenticator | v0.5.8 | public.ecr.aws/eks-distro/kubernetes-sigs/aws-iam-authenticator:v0.5.8-eks-1-23-1 |
| coredns | v1.8.7 | public.ecr.aws/eks-distro/coredns/coredns:v1.8.7-eks-1-23-1 |
| csi-snapshotter | v5.0.1 | public.ecr.aws/eks-distro/kubernetes-csi/external-snapshotter/csi-snapshotter:v5.0.1-eks-1-23-1 |
| etcd | v3.5.3 | public.ecr.aws/eks-distro/etcd-io/etcd:v3.5.3-eks-1-23-1 |
| external-attacher | v3.4.0 | public.ecr.aws/eks-distro/kubernetes-csi/external-attacher:v3.4.0-eks-1-23-1 |
| external-provisioner | v3.1.0 | public.ecr.aws/eks-distro/kubernetes-csi/external-provisioner:v3.1.0-eks-1-23-1 |
| external-resizer | v1.4.0 | public.ecr.aws/eks-distro/kubernetes-csi/external-resizer:v1.4.0-eks-1-23-1 |
| go-runner | v0.13.0 | public.ecr.aws/eks-distro/kubernetes/go-runner:v0.13.0-eks-1-23-1 |
| kube-apiserver | v1.23.6 | public.ecr.aws/eks-distro/kubernetes/kube-apiserver:v1.23.6-eks-1-23-1 |
| kube-controller-manager | v1.23.6 | public.ecr.aws/eks-distro/kubernetes/kube-controller-manager:v1.23.6-eks-1-23-1 |
| kube-proxy | v1.23.6 | public.ecr.aws/eks-distro/kubernetes/kube-proxy:v1.23.6-eks-1-23-1 |
| kube-proxy-base | v0.13.0 | public.ecr.aws/eks-distro/kubernetes/kube-proxy-base:v0.13.0-eks-1-23-1 |
| kube-scheduler | v1.23.6 | public.ecr.aws/eks-distro/kubernetes/kube-scheduler:v1.23.6-eks-1-23-1 |
| livenessprobe | v2.7.0 | public.ecr.aws/eks-distro/kubernetes-csi/livenessprobe:v2.7.0-eks-1-23-1 |
| metrics-server | v0.6.1 | public.ecr.aws/eks-distro/kubernetes-sigs/metrics-server:v0.6.1-eks-1-23-1 |
| node-driver-registrar | v2.5.0 | public.ecr.aws/eks-distro/kubernetes-csi/node-driver-registrar:v2.5.0-eks-1-23-1 |
| pause | v1.23.6 | public.ecr.aws/eks-distro/kubernetes/pause:v1.23.6-eks-1-23-1 |
| snapshot-controller | v5.0.1 | public.ecr.aws/eks-distro/kubernetes-csi/external-snapshotter/snapshot-controller:v5.0.1-eks-1-23-1 |
| snapshot-validation-webhook | v5.0.1 | public.ecr.aws/eks-distro/kubernetes-csi/external-snapshotter/snapshot-validation-webhook:v5.0.1-eks-1-23-1 |`,
}