github.com/vmware/go-vcloud-director/v2@v2.24.0/govcd/openapi_endpoints_unit_test.go (about)

     1  //go:build unit || ALL
     2  
     3  package govcd
     4  
     5  import (
     6  	"fmt"
     7  	"testing"
     8  
     9  	"github.com/vmware/go-vcloud-director/v2/types/v56"
    10  )
    11  
    12  // TestClient_getOpenApiHighestElevatedVersion aims to test out capabilities of getOpenApiHighestElevatedVersion
    13  // It consists of:
    14  // * A few manually defined tests for known endpoints
    15  // * Automatically generated tests for each entry in endpointMinApiVersions to ensure it returns correct version
    16  // * Automatically generated tests where available VCD version does not satisfy it
    17  // * Automatically generated tests to check if each elevated API version is returned for endpoints that have it defined
    18  func TestClient_getOpenApiHighestElevatedVersion(t *testing.T) {
    19  	type testCase struct {
    20  		name              string
    21  		supportedVersions SupportedVersions
    22  		endpoint          string
    23  		wantVersion       string
    24  		wantErr           bool
    25  	}
    26  
    27  	// Start with some statically defined tests for known endpoints
    28  	tests := []testCase{
    29  		{
    30  			name:              "VCD_does_not_support_minimum_required_version",
    31  			supportedVersions: renderSupportedVersions([]string{"27.0", "28.0", "29.0", "30.0", "31.0", "32.0", "33.0"}),
    32  			endpoint:          types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointNsxtNatRules,
    33  			wantVersion:       "",
    34  			wantErr:           true, // NAT requires at least version 34.0
    35  		},
    36  		{
    37  			name:              "VCD_minimum_required_version_only",
    38  			supportedVersions: renderSupportedVersions([]string{"28.0", "29.0", "30.0", "31.0", "32.0", "33.0", "34.0"}),
    39  			endpoint:          types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointNsxtNatRules,
    40  			wantVersion:       "34.0",
    41  			wantErr:           false, // NAT minimum requirement is version 34.0
    42  		},
    43  		{
    44  			name: "VCD_minimum_required_version_only_unordered",
    45  			// Explicitly pass in unordered VCD API supported versions to ensure that ordering and matching works well
    46  			supportedVersions: renderSupportedVersions([]string{"33.0", "34.0", "30.0", "31.0", "32.0", "28.0", "29.0"}),
    47  			endpoint:          types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointNsxtNatRules,
    48  			wantVersion:       "34.0",
    49  			wantErr:           false, // NAT minimum requirement is version 34.0
    50  		},
    51  	}
    52  
    53  	// Generate unit tests for each defined endpoint in endpointMinApiVersions which does not have an elevated
    54  	// version entry in endpointElevatedApiVersions.
    55  	// Always expect to get minimal version returned without error
    56  	for endpointName, minimumRequiredVersion := range endpointMinApiVersions {
    57  		// Do not create a test case for those endpoints which explicitly have elevated versions defined in
    58  		// endpointElevatedApiVersions
    59  		if _, hasEntry := endpointElevatedApiVersions[endpointName]; hasEntry {
    60  			continue
    61  		}
    62  
    63  		tCase := testCase{
    64  			name: fmt.Sprintf("%s_minimum_version_%s", minimumRequiredVersion, endpointName),
    65  			// Put a list of versions which always satisfied minimum requirement
    66  			supportedVersions: renderSupportedVersions([]string{
    67  				"27.0", "28.0", "29.0", "30.0", "31.0", "32.0", "33.0", "34.0", "35.0", "35.1", "35.2", "36.0", "37.0", "38.0",
    68  			}),
    69  			endpoint:    endpointName,
    70  			wantVersion: minimumRequiredVersion,
    71  			wantErr:     false,
    72  		}
    73  		tests = append(tests, tCase)
    74  	}
    75  
    76  	// Generate unit tests for each defined endpoint in endpointMinApiVersions which does not have supported version at all
    77  	// Always expect an error and empty version
    78  	for endpointName, minimumRequiredVersion := range endpointMinApiVersions {
    79  		tCase := testCase{
    80  			name: fmt.Sprintf("%s_unsatisfied_minimum_version_%s", minimumRequiredVersion, endpointName),
    81  			supportedVersions: renderSupportedVersions([]string{
    82  				"25.0",
    83  			}),
    84  			endpoint:    endpointName,
    85  			wantVersion: "",
    86  			wantErr:     true,
    87  		}
    88  		tests = append(tests, tCase)
    89  	}
    90  
    91  	// Generate tests for each elevated API version in endpoints which do have elevated rights defined
    92  	for endpointName := range endpointMinApiVersions {
    93  		// Do not create a test case for those endpoints which do not have endpointElevatedApiVersions specified
    94  		if _, hasEntry := endpointElevatedApiVersions[endpointName]; !hasEntry {
    95  			continue
    96  		}
    97  
    98  		// generate tests for all elevated rights and expect to get
    99  		for _, singleElevatedApiVerion := range endpointElevatedApiVersions[endpointName] {
   100  
   101  			tCase := testCase{
   102  				name: fmt.Sprintf("elevated_up_to_%s_for_%s", singleElevatedApiVerion, endpointName),
   103  				// Insert some older versions and make it so that the highest elevated API version matches
   104  				supportedVersions: renderSupportedVersions([]string{
   105  					"27.0", singleElevatedApiVerion, "23.0", "30.0",
   106  				}),
   107  				endpoint:    endpointName,
   108  				wantVersion: singleElevatedApiVerion,
   109  				wantErr:     false,
   110  			}
   111  			tests = append(tests, tCase)
   112  		}
   113  	}
   114  
   115  	// Run all defined tests
   116  	for _, tt := range tests {
   117  		t.Run(tt.name, func(t *testing.T) {
   118  			client := &Client{
   119  				supportedVersions: tt.supportedVersions,
   120  			}
   121  			got, err := client.getOpenApiHighestElevatedVersion(tt.endpoint)
   122  			if (err != nil) != tt.wantErr {
   123  				t.Errorf("getOpenApiHighestElevatedVersion() error = %v, wantErr %v", err, tt.wantErr)
   124  				return
   125  			}
   126  			if got != tt.wantVersion {
   127  				t.Errorf("getOpenApiHighestElevatedVersion() got = %v, wantVersion %v", got, tt.wantVersion)
   128  			}
   129  		})
   130  	}
   131  }
   132  
   133  // renderSupportedVersions is a helper to create fake `SupportedVersions` type out of given VCD API version list
   134  func renderSupportedVersions(versions []string) SupportedVersions {
   135  	supportedVersions := SupportedVersions{}
   136  
   137  	for _, version := range versions {
   138  		supportedVersions.VersionInfos = append(supportedVersions.VersionInfos,
   139  			VersionInfo{
   140  				Version:    version,
   141  				LoginUrl:   "https://fake-host/api/sessions",
   142  				Deprecated: false,
   143  			})
   144  	}
   145  	return supportedVersions
   146  }