github.com/vmware/go-vcloud-director/v2@v2.24.0/govcd/ui_plugin_unit_test.go (about) 1 //go:build unit || ALL 2 3 package govcd 4 5 import ( 6 "net/http" 7 "net/textproto" 8 "reflect" 9 "testing" 10 11 "github.com/vmware/go-vcloud-director/v2/types/v56" 12 ) 13 14 // Test_getPluginMetadata tests that getPluginMetadata can retrieve correctly the UI plugin metadata information 15 // stored inside the ZIP file. 16 func Test_getPluginMetadata(t *testing.T) { 17 18 // This object is equivalent to the manifest.json that is inside the ../test-resources/ui_plugin.zip file 19 var testUIPluginMetadata = &types.UIPluginMetadata{ 20 Vendor: "VMware", 21 License: "BSD-2-Clause", 22 Link: "http://www.vmware.com", 23 PluginName: "Test Plugin", 24 Version: "1.2.3", 25 Description: "Test Plugin description", 26 ProviderScoped: true, 27 TenantScoped: true, 28 } 29 30 tests := []struct { 31 name string 32 pluginPath string 33 want *types.UIPluginMetadata 34 wantErr bool 35 }{ 36 { 37 name: "get ui plugin metadata", 38 pluginPath: "../test-resources/ui_plugin.zip", 39 want: testUIPluginMetadata, 40 }, 41 { 42 name: "invalid plugin", 43 pluginPath: "../test-resources/udf_test.iso", 44 wantErr: true, 45 }, 46 } 47 for _, tt := range tests { 48 t.Run(tt.name, func(t *testing.T) { 49 got, err := getPluginMetadata(tt.pluginPath) 50 if (err != nil) != tt.wantErr { 51 t.Errorf("getPluginMetadata() error = %v, wantErr %v", err, tt.wantErr) 52 return 53 } 54 if !reflect.DeepEqual(got, tt.want) { 55 t.Errorf("getPluginMetadata() got = %v, want %v", got, tt.want) 56 } 57 }) 58 } 59 } 60 61 // Test_getTransferIdFromHeader tests that getTransferIdFromHeader can retrieve correctly a transfer ID from the headers 62 // of any HTTP response. 63 func Test_getTransferIdFromHeader(t *testing.T) { 64 tests := []struct { 65 name string 66 headers http.Header 67 want string 68 wantErr bool 69 }{ 70 { 71 name: "valid link in header", 72 headers: http.Header{ 73 textproto.CanonicalMIMEHeaderKey("link"): { 74 "<https://www.my-vcd.com/transfer/cb63b0f6-ba56-43a8-8fe3-a64f0b25e7e5/my-amazing-plugin1.0.zip>;rel=\"upload:default\";type=\"application/octet-stream\"", 75 }, 76 }, 77 want: "cb63b0f6-ba56-43a8-8fe3-a64f0b25e7e5/my-amazing-plugin1.0.zip", 78 wantErr: false, 79 }, 80 { 81 name: "valid link in header with special URI", 82 headers: http.Header{ 83 textproto.CanonicalMIMEHeaderKey("link"): { 84 "<my-vcd:8080/transfer/cb63b0f6-ba56-43a8-8fe3-a64f0b25e7e5/my-amazing-plugin1.1.zip>;rel=\"upload:default\";type=\"application/octet-stream\"", 85 }, 86 }, 87 want: "cb63b0f6-ba56-43a8-8fe3-a64f0b25e7e5/my-amazing-plugin1.1.zip", 88 wantErr: false, 89 }, 90 { 91 name: "empty header", 92 headers: http.Header{ 93 textproto.CanonicalMIMEHeaderKey("link"): { 94 "", 95 }, 96 }, 97 wantErr: true, 98 }, 99 { 100 name: "empty link in header", 101 headers: http.Header{ 102 textproto.CanonicalMIMEHeaderKey("link"): { 103 "<>;rel=\"upload:default\";type=\"application/octet-stream\"", 104 }, 105 }, 106 wantErr: true, 107 }, 108 { 109 name: "no link part in header", 110 headers: http.Header{ 111 textproto.CanonicalMIMEHeaderKey("link"): { 112 "rel=\"upload:default\";type=\"application/octet-stream\"", 113 }, 114 }, 115 wantErr: true, 116 }, 117 { 118 name: "invalid header", 119 headers: http.Header{ 120 textproto.CanonicalMIMEHeaderKey("link"): { 121 "Error", 122 }, 123 }, 124 wantErr: true, 125 }, 126 } 127 for _, tt := range tests { 128 t.Run(tt.name, func(t *testing.T) { 129 got, err := getTransferIdFromHeader(tt.headers) 130 if (err != nil) != tt.wantErr { 131 t.Errorf("getTransferIdFromHeader() error = %v, wantErr %v", err, tt.wantErr) 132 return 133 } 134 if got != tt.want { 135 t.Errorf("getTransferIdFromHeader() got = %v, want %v", got, tt.want) 136 } 137 }) 138 } 139 }