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  }