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 }