package rest_api_test

// Docs:
// - Endpoint: https://developer.salesforce.com/docs/atlas.en-us.254.0.api_rest.meta/api_rest/resources_versions.htm
// - Request: https://developer.salesforce.com/docs/atlas.en-us.254.0.api_rest.meta/api_rest/resources_versions.htm
// - Response: https://developer.salesforce.com/docs/atlas.en-us.254.0.api_rest.meta/api_rest/resources_versions.htm
// - Sub-schema: https://developer.salesforce.com/docs/atlas.en-us.254.0.api_rest.meta/api_rest/resources_versions.htm
// - Errors: https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/intro_rest.htm

import (
	"net/http"
	"testing"

	"github.com/nexuscrm/tests/contract/internal/liveapi"
	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
)

func TestGetVersions(t *testing.T) {
	testCases := []struct {
		name    string
		arrange func(t *testing.T) string
		act     func(t *testing.T, path string) *http.Response
		assert  func(t *testing.T, resp *http.Response)
	}{
		{
			name: "versions list contains target version and resource root",
			// Doc: https://developer.salesforce.com/docs/atlas.en-us.254.0.api_rest.meta/api_rest/resources_versions.htm
			arrange: func(t *testing.T) string {
				return "/services/data"
			},
			act: func(t *testing.T, path string) *http.Response {
				client := liveapi.NewAuthenticatedClient(t)
				resp, err := client.DoJSON(http.MethodGet, path, nil)
				require.NoError(t, err)
				return resp
			},
			assert: func(t *testing.T, resp *http.Response) {
				require.Equal(t, http.StatusOK, resp.StatusCode)

				var versions []struct {
					Label   string `json:"label"`
					URL     string `json:"url"`
					Version string `json:"version"`
				}
				liveapi.DecodeJSON(t, resp, &versions)

				require.NotEmpty(t, versions)
				found := false
				for _, version := range versions {
					assert.NotEmpty(t, version.Label)
					assert.Contains(t, version.URL, "/services/data/")
					if version.Version == "63.0" {
						found = true
						assert.Equal(t, "/services/data/v63.0", version.URL)
					}
				}
				require.True(t, found, "expected version 63.0 in versions list")
			},
		},
	}

	for _, tc := range testCases {
		t.Run(tc.name, func(t *testing.T) {
			path := tc.arrange(t)
			resp := tc.act(t, path)
			tc.assert(t, resp)
		})
	}
}
