github.com/Axway/agent-sdk@v1.1.101/pkg/apic/apiserver/models/api/v1/resourcemeta_test.go (about)

     1  package v1
     2  
     3  import (
     4  	"encoding/json"
     5  	"testing"
     6  
     7  	"github.com/stretchr/testify/assert"
     8  )
     9  
    10  func TestResourceMetaMarshal(t *testing.T) {
    11  	apiID := "99"
    12  	primaryKey := "4321"
    13  
    14  	meta1 := &ResourceMeta{
    15  		GroupVersionKind: GroupVersionKind{
    16  			GroupKind: GroupKind{
    17  				Group: "group",
    18  				Kind:  "kind",
    19  			},
    20  			APIVersion: "v1",
    21  		},
    22  		Name:  "meta1",
    23  		Title: "meta1",
    24  		Metadata: Metadata{
    25  			ID: "123",
    26  		},
    27  		Tags: []string{"tag1", "tag2"},
    28  		Attributes: map[string]string{
    29  			"abc": "123",
    30  		},
    31  	}
    32  
    33  	empty := meta1.GetSubResource("abc123")
    34  	assert.Nil(t, empty)
    35  
    36  	meta1.SetSubResource("x-agent-details", map[string]interface{}{
    37  		"apiID": apiID,
    38  	})
    39  
    40  	// Get the sub resource by name, and update the value returned
    41  	resource := meta1.GetSubResource("x-agent-details")
    42  	m := resource.(map[string]interface{})
    43  	m["primaryKey"] = primaryKey
    44  
    45  	// save the resource with the new value
    46  	meta1.SetSubResource("x-agent-details", m)
    47  
    48  	bts, err := json.Marshal(meta1)
    49  	assert.Nil(t, err)
    50  	assert.NotNil(t, bts)
    51  
    52  	// Unmarshal the ResourceMeta bytes to a map to confirm that MarshalJSON saved the SubResource correctly
    53  	values := map[string]interface{}{}
    54  	err = json.Unmarshal(bts, &values)
    55  	assert.Nil(t, err)
    56  
    57  	// Get the x-agent-details sub resource, and convert it to a map
    58  	subResource := values["x-agent-details"]
    59  	xAgentDetailsSub, ok := subResource.(map[string]interface{})
    60  	assert.True(t, ok)
    61  
    62  	assert.Equal(t, apiID, xAgentDetailsSub["apiID"])
    63  	assert.Equal(t, primaryKey, xAgentDetailsSub["primaryKey"])
    64  
    65  	// Unmarshal the data from meta1, to meta2, which is empty, and assert meta2 contains the same data from meta1
    66  	meta2 := &ResourceMeta{}
    67  	err = json.Unmarshal(bts, meta2)
    68  	assert.Nil(t, err)
    69  
    70  	meta1.Metadata.Audit = AuditMetadata{}
    71  	meta2.Metadata.Audit = AuditMetadata{}
    72  	assert.Equal(t, meta1, meta2)
    73  
    74  	// expect to the sub resources to be equal
    75  	assert.True(t, len(meta2.SubResources) == 1)
    76  	assert.Equal(t, xAgentDetailsSub, meta2.SubResources["x-agent-details"])
    77  
    78  	// unset the name
    79  	meta1.Name = ""
    80  
    81  	bts, err = json.Marshal(meta1)
    82  	assert.Nil(t, err)
    83  	assert.NotNil(t, bts)
    84  
    85  	// Unmarshal the ResourceMeta bytes to a map to confirm that MarshalJSON did not save name
    86  	values = map[string]interface{}{}
    87  	json.Unmarshal(bts, &values)
    88  	assert.NotContains(t, values, "name")
    89  
    90  	// Unmarshal the ResourceMeta bytes to a map to confirm that MarshalJSON
    91  	meta3 := ResourceMeta{}
    92  	err = json.Unmarshal(bts, &meta3)
    93  	assert.Nil(t, err)
    94  
    95  	assert.Equal(t, "", meta3.Name)
    96  }
    97  
    98  func TestResourceMeta(t *testing.T) {
    99  	meta := &ResourceMeta{
   100  		GroupVersionKind: GroupVersionKind{
   101  			GroupKind: GroupKind{
   102  				Group: "group",
   103  				Kind:  "kind",
   104  			},
   105  			APIVersion: "v1",
   106  		},
   107  		Title: "title",
   108  		Metadata: Metadata{
   109  			ID: "333",
   110  			References: []Reference{
   111  				{
   112  					Group:     "ref1group",
   113  					Kind:      "ref1kind",
   114  					ID:        "ref1id",
   115  					Name:      "ref1name",
   116  					ScopeName: "ref1scope",
   117  					Type:      "ref1type",
   118  				},
   119  				{
   120  					Group:     "ref2group",
   121  					Kind:      "ref2kind",
   122  					ID:        "ref2id",
   123  					Name:      "ref2name",
   124  					ScopeName: "ref2scope",
   125  					Type:      "ref2type",
   126  				},
   127  				{
   128  					Group:     "ref3group",
   129  					Kind:      "ref3kind",
   130  					ID:        "ref3id",
   131  					Name:      "ref3name",
   132  					ScopeName: "ref3scope",
   133  					Type:      "ref3type",
   134  				},
   135  			},
   136  		},
   137  	}
   138  
   139  	assert.Equal(t, meta.Metadata, meta.GetMetadata())
   140  	assert.Equal(t, meta.GroupVersionKind, meta.GetGroupVersionKind())
   141  
   142  	meta.SetName("name")
   143  	assert.Equal(t, meta.Name, meta.GetName())
   144  
   145  	assert.Equal(t, 0, len(meta.GetAttributes()))
   146  	meta.SetAttributes(map[string]string{
   147  		"abc": "123",
   148  	})
   149  	assert.Equal(t, meta.Attributes, meta.GetAttributes())
   150  
   151  	assert.Equal(t, 0, len(meta.GetTags()))
   152  	meta.SetTags([]string{"tag1", "tag2"})
   153  	assert.Equal(t, meta.Tags, meta.GetTags())
   154  
   155  	// test GetReferenceByGVK
   156  	ref1GVK := GroupVersionKind{
   157  		GroupKind: GroupKind{
   158  			Group: "ref1group",
   159  			Kind:  "ref1kind",
   160  		},
   161  		APIVersion: "v1",
   162  	}
   163  	ref2GVK := GroupVersionKind{
   164  		GroupKind: GroupKind{
   165  			Group: "ref2group",
   166  			Kind:  "ref2kind",
   167  		},
   168  		APIVersion: "v1",
   169  	}
   170  	ref3GVK := GroupVersionKind{
   171  		GroupKind: GroupKind{
   172  			Group: "ref3group",
   173  			Kind:  "ref3kind",
   174  		},
   175  		APIVersion: "v1",
   176  	}
   177  	ref1test := meta.GetReferenceByGVK(ref1GVK)
   178  	assert.Equal(t, ref1test, meta.Metadata.References[0])
   179  	ref2test := meta.GetReferenceByGVK(ref2GVK)
   180  	assert.Equal(t, ref2test, meta.Metadata.References[1])
   181  	ref3test := meta.GetReferenceByGVK(ref3GVK)
   182  	assert.Equal(t, ref3test, meta.Metadata.References[2])
   183  }
   184  
   185  // should be able to call get methods if meta is nil
   186  func TestResourceMetaNilReference(t *testing.T) {
   187  	var meta *ResourceMeta
   188  
   189  	assert.Equal(t, "", meta.GetName())
   190  	assert.Equal(t, Metadata{}, meta.GetMetadata())
   191  	assert.Equal(t, GroupVersionKind{}, meta.GetGroupVersionKind())
   192  	assert.Equal(t, map[string]string{}, meta.GetAttributes())
   193  	assert.Equal(t, []string{}, meta.GetTags())
   194  	assert.Nil(t, meta.GetSubResource("abc"))
   195  }
   196  
   197  func TestResourceMetaGetSelfLink(t *testing.T) {
   198  	plurals["kind"] = "kinds"
   199  	plurals["scopeKind"] = "scopeKinds"
   200  
   201  	meta := &ResourceMeta{
   202  		GroupVersionKind: GroupVersionKind{
   203  			GroupKind: GroupKind{
   204  				Group: "group",
   205  				Kind:  "kind",
   206  			},
   207  		},
   208  		Title: "title",
   209  		Metadata: Metadata{
   210  			ID: "333",
   211  		},
   212  		Name: "name",
   213  	}
   214  
   215  	// no version
   216  	link := meta.GetSelfLink()
   217  	assert.Equal(t, "", link)
   218  
   219  	meta.APIVersion = "v1"
   220  
   221  	// no scope
   222  	link = meta.GetSelfLink()
   223  	assert.Equal(t, "/group/v1/kinds/name", link)
   224  
   225  	meta.Metadata.Scope = MetadataScope{
   226  		Name: "scope",
   227  		Kind: "scopeKind",
   228  	}
   229  
   230  	scopeKindMap[meta.GroupKind] = "scopeKind"
   231  
   232  	// no scope kind
   233  	link = meta.GetSelfLink()
   234  	assert.Equal(t, "/group/v1/scopeKinds/scope/kinds/name", link)
   235  
   236  	// selflink
   237  	meta.Metadata.SelfLink = "/selflink"
   238  	link = meta.GetSelfLink()
   239  	assert.Equal(t, "/selflink", link)
   240  }