package main

import (
	"encoding/json"
	"testing"

	. "github.com/onsi/gomega"
)

func TestMarshalRequest(t *testing.T) {
	cases := map[string]struct {
		req             string
		bootstrap       bool
		checkStatus     bool
		expToken        string
		expEksArn       string
		expEndpoint     string
		expFrpcImage    string
		expFrpcEndpoint string
		expStatus       bool
	}{
		"bootstrap-req": {
			req: `{
  "token": "test-token",
  "eksArn": "arn:aws:eks:us-west-2:xxxxxxxxxxxx:cluster/eks-1228",
  "endpoint": "https://B6xxxxxxxxxxxxxxxxxxxxxxxxxxxx82.sk1.us-west-2.eks.amazonaws.com",
  "serviceDNS": null,
  "frpcImage": "xxxxxxxxxxxx.dkr.ecr.us-west-2.amazonaws.com/frpc:v0.38.0",
  "frpsEndpointSvc": "vpce-svc-0xxxxxxxxxxxxxxxd.us-west-2.vpce.amazonaws.com"
}`,
			bootstrap:       true,
			expToken:        "test-token",
			expEksArn:       "arn:aws:eks:us-west-2:xxxxxxxxxxxx:cluster/eks-1228",
			expEndpoint:     "https://B6xxxxxxxxxxxxxxxxxxxxxxxxxxxx82.sk1.us-west-2.eks.amazonaws.com",
			expFrpcImage:    "xxxxxxxxxxxx.dkr.ecr.us-west-2.amazonaws.com/frpc:v0.38.0",
			expFrpcEndpoint: "vpce-svc-0xxxxxxxxxxxxxxxd.us-west-2.vpce.amazonaws.com",
		},
		"check-status": {
			req: `{
  "status": true
}`,
			checkStatus: true,
			expStatus:   true,
		},
	}
	for name, tc := range cases {
		t.Run(name, func(t *testing.T) {
			g := NewGomegaWithT(t)
			var request Request
			g.Expect(json.Unmarshal([]byte(tc.req), &request)).To(Succeed())
			if tc.checkStatus {
				g.Expect(request.Status).To(Equal(tc.expStatus))
			}
			if tc.bootstrap {
				g.Expect(request.Token).To(Equal(tc.expToken))
				g.Expect(request.EksArn).To(Equal(tc.expEksArn))
				g.Expect(request.Endpoint).To(Equal(tc.expEndpoint))
				g.Expect(request.FrpcImage).To(Equal(tc.expFrpcImage))
				g.Expect(request.FrpsEndpointSvc).To(Equal(tc.expFrpcEndpoint))
			}
		})
	}
}
