package model

import (
	"encoding/json"
	"testing"

	apiresource "github.com/pingcap/test-infra/common/model/resource"
)

func TestMarshalUnmarshalTestPlan(t *testing.T) {
	runMarshalUnmarshalTests(t, marshalTest{
		TestPlan{
			ID:      3,
			Name:    "Release Testing",
			Type:    TestPlanKindGeneral,
			Creator: 3,
			Variables: []PlanVarDecl{
				{Name: "version", Default: "nightly"},
			},
			TestBed: TestBed{Items: []TestBedItem{
				{
					ResourceHandle: apiresource.ResourceHandle{
						Name: "tidb-1",
						Type: "TIDB_CLUSTER",
					},
					Spec: json.RawMessage(`{
          "tidb": {
            "replicas": 1,
            "image": "hub.pingcap.net/qa/tidb:master"
          },
          "tikv": {
            "repliacs": 2,
            "image": "hub.pingcap.net/qa/tikv:master",
            "config": "[storage]\nreserve-space = 0\n"
          },
          "pd": {
            "repliacs": 3,
            "image": "hub.pingcap.net/qa/tipd:master"
          }
        }`),
				},
				{
					ResourceHandle: apiresource.ResourceHandle{
						Name: "tidb-2",
						Type: "TIDB_CLUSTER",
					},
					Spec: json.RawMessage(`{
          "tidb": {
            "replicas": 3,
            "image": "hub.pingcap.net/qa/tidb:master"
          },
          "tikv": {
            "repliacs": 2,
            "image": "hub.pingcap.net/qa/tikv:master",
            "config": "[storage]\nreserve-space = 0\n"
          }
        }`),
				},
			}},
			Pipeline: []PipelineStep{
				{
					Name:  "bank-pessimistic",
					After: []string{},
					CaseRef: CaseRef{
						CaseID: 1,
						Arguments: []CaseParamBind{
							{Name: "tidb", Value: "{{testbed.tidb}}"},
							{Name: "txn-mode", Value: "pessimistic"},
						},
					},
				},
				{
					Name:  "bank-optimistic",
					After: []string{"bank-pessimistic"},
					CaseRef: CaseRef{
						CaseID: 1,
						Arguments: []CaseParamBind{
							{Name: "tidb", Value: "{{testbed.tidb}}"},
							{Name: "txn-mode", Value: "optimistic"},
						},
					},
				},
				{
					Name:  "bank-optimistic",
					After: []string{"bank-pessimistic"},
					CaseRef: CaseRef{
						CaseID: 1,
						Arguments: []CaseParamBind{
							{Name: "tidb", Value: "{{testbed.tidb}}"},
							{Name: "txn-mode", Value: "optimistic"},
						},
					},
				},
			},
		},
		`{
  "id": 3,
  "type": "GENERAL",
  "name": "Release Testing",
  "creator": 3,
  "testbed": {
    "physicalResourceRequest": {
      "cpu": {},
      "memory": {}
    },
    "items": [
      {
        "name": "tidb-1",
        "type": "TIDB_CLUSTER",
        "spec": {
          "tidb": {
            "replicas": 1,
            "image": "hub.pingcap.net/qa/tidb:master"
          },
          "tikv": {
            "repliacs": 2,
            "image": "hub.pingcap.net/qa/tikv:master",
            "config": "[storage]\nreserve-space = 0\n"
          },
          "pd": {
            "repliacs": 3,
            "image": "hub.pingcap.net/qa/tipd:master"
          }
        }
      },
      {
        "name": "tidb-2",
        "type": "TIDB_CLUSTER",
        "spec": {
          "tidb": {
            "replicas": 3,
            "image": "hub.pingcap.net/qa/tidb:master"
          },
          "tikv": {
            "repliacs": 2,
            "image": "hub.pingcap.net/qa/tikv:master",
            "config": "[storage]\nreserve-space = 0\n"
          }
        }
      }
    ],
    "reclaimPolicy": {
      "lease": "",
      "gcStrategy": {}
    }
  },
  "failFast": false,
  "createdAt": "0001-01-01T00:00:00Z",
  "updatedAt": "0001-01-01T00:00:00Z",
  "pipeline": [
    {
      "name": "bank-pessimistic",
      "after": [],
      "timeout": 0,
      "caseID": 1,
      "arguments": [
        {
          "name": "tidb",
          "value": "{{testbed.tidb}}"
        },
        {
          "name": "txn-mode",
          "value": "pessimistic"
        }
      ]
    },
    {
      "name": "bank-optimistic",
      "after": [
        "bank-pessimistic"
      ],
      "timeout": 0,
      "caseID": 1,
      "arguments": [
        {
          "name": "tidb",
          "value": "{{testbed.tidb}}"
        },
        {
          "name": "txn-mode",
          "value": "optimistic"
        }
      ]
    },
    {
      "name": "bank-optimistic",
      "after": [
        "bank-pessimistic"
      ],
      "timeout": 0,
      "caseID": 1,
      "arguments": [
        {
          "name": "tidb",
          "value": "{{testbed.tidb}}"
        },
        {
          "name": "txn-mode",
          "value": "optimistic"
        }
      ]
    }
  ],
  "variables": [
    {
      "name": "version",
      "default": "nightly"
    }
  ]
}`,
	})
}
