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

     1  package v1
     2  
     3  import (
     4  	"encoding/json"
     5  	"io"
     6  	"os"
     7  	"testing"
     8  
     9  	"github.com/stretchr/testify/assert"
    10  )
    11  
    12  // should marshal bytes of a ResourceInstance into a new empty ResourceInstance
    13  func TestResourceInstanceMarshalJSON(t *testing.T) {
    14  	r1 := &ResourceInstance{
    15  		ResourceMeta: ResourceMeta{
    16  			GroupVersionKind: GroupVersionKind{
    17  				APIVersion: "v1",
    18  				GroupKind: GroupKind{
    19  					Group: "group",
    20  					Kind:  "kind",
    21  				},
    22  			},
    23  			Name:     "name",
    24  			Title:    "title",
    25  			Metadata: Metadata{},
    26  			Attributes: map[string]string{
    27  				"key": "value",
    28  			},
    29  			Tags: []string{"tag1", "tag2"},
    30  			SubResources: map[string]interface{}{
    31  				"x-agent-details": map[string]interface{}{
    32  					"sub1": "value",
    33  				},
    34  			},
    35  		},
    36  		Owner: &Owner{
    37  			Type: TeamOwner,
    38  			ID:   "123",
    39  		},
    40  		Spec: map[string]interface{}{
    41  			"description": "test",
    42  		},
    43  		rawResource: nil,
    44  	}
    45  
    46  	bts, err := json.Marshal(r1)
    47  	assert.Nil(t, err)
    48  	assert.NotNil(t, bts)
    49  
    50  	r2 := &ResourceInstance{}
    51  
    52  	err = json.Unmarshal(bts, r2)
    53  	assert.Nil(t, err)
    54  	assert.Equal(t, json.RawMessage(bts), r2.GetRawResource())
    55  	assert.Equal(t, r1.Spec, r2.Spec)
    56  	assert.Equal(t, r1.Owner, r2.Owner)
    57  
    58  	r1.Metadata.Audit = AuditMetadata{}
    59  	r2.Metadata.Audit = AuditMetadata{}
    60  	assert.Equal(t, r1.ResourceMeta, r2.ResourceMeta)
    61  }
    62  
    63  func TestResourceInstanceUnMarshalError(t *testing.T) {
    64  	ri := &ResourceInstance{}
    65  	err := json.Unmarshal([]byte(`{"spec": "fake"}`), ri)
    66  	assert.Error(t, err)
    67  
    68  	ri = &ResourceInstance{}
    69  	err = json.Unmarshal([]byte(`{"owner": "fake", "spec": {}}`), ri)
    70  	assert.Error(t, err)
    71  }
    72  
    73  func TestResourceInstance_FromInstance(t *testing.T) {
    74  	ri1 := &ResourceInstance{
    75  		ResourceMeta: ResourceMeta{
    76  			GroupVersionKind: GroupVersionKind{
    77  				APIVersion: "v1",
    78  				GroupKind: GroupKind{
    79  					Group: "group",
    80  					Kind:  "kind",
    81  				},
    82  			},
    83  			Name:     "name",
    84  			Title:    "title",
    85  			Metadata: Metadata{},
    86  			Attributes: map[string]string{
    87  				"key": "value",
    88  			},
    89  			Tags: []string{"tag1", "tag2"},
    90  			SubResources: map[string]interface{}{
    91  				"subresource": map[string]interface{}{
    92  					"sub1": "value",
    93  				},
    94  			},
    95  		},
    96  		Owner: &Owner{
    97  			Type: TeamOwner,
    98  			ID:   "123",
    99  		},
   100  		Spec: map[string]interface{}{
   101  			"description": "test",
   102  		},
   103  	}
   104  
   105  	ri2 := &ResourceInstance{}
   106  
   107  	inst, err := ri1.AsInstance()
   108  	assert.Nil(t, err)
   109  	err = ri2.FromInstance(inst)
   110  	assert.Nil(t, err)
   111  	assert.Equal(t, ri1, ri2)
   112  }
   113  
   114  func TestResourceInstance_UnmarshalMarshallJSON(t *testing.T) {
   115  	tests := []struct {
   116  		name         string
   117  		testFile     string
   118  		outFile      string
   119  		update       map[string]interface{}
   120  		validateKeys []string
   121  	}{
   122  		{
   123  			name:     "Discovery Agent",
   124  			testFile: "testdata/discoveryagent_in.json",
   125  			outFile:  "testdata/discoveryagent_out.json",
   126  			update: map[string]interface{}{
   127  				"dataplaneType": "Changed",
   128  				"config": map[string]string{
   129  					"test": "set",
   130  				},
   131  			},
   132  			validateKeys: []string{"spec", "status", "name", "title"},
   133  		},
   134  	}
   135  	for _, tt := range tests {
   136  		t.Run(tt.name, func(t *testing.T) {
   137  			inputFile, _ := os.Open(tt.testFile)
   138  			inputData, _ := io.ReadAll(inputFile)
   139  
   140  			// unmarshal the json to an object
   141  			ri := &ResourceInstance{}
   142  			if err := ri.UnmarshalJSON(inputData); err != nil {
   143  				t.Errorf("ResourceInstance.UnmarshalJSON() error = %v", err)
   144  			}
   145  
   146  			// update the selected spec values
   147  			for k, v := range tt.update {
   148  				ri.Spec[k] = v
   149  			}
   150  
   151  			out, err := ri.MarshalJSON()
   152  			if err != nil {
   153  				t.Errorf("ResourceInstance.MarshalJSON() error = %v", err)
   154  			}
   155  
   156  			// unmarshal out to map[string]interface{} to complete compares
   157  			outData := map[string]interface{}{}
   158  			json.Unmarshal(out, &outData)
   159  
   160  			// unmarshal expected to map[string]interface{}
   161  			expectedFile, _ := os.Open(tt.outFile)
   162  			expectedBytes, _ := io.ReadAll(expectedFile)
   163  			expectedData := map[string]interface{}{}
   164  			json.Unmarshal(expectedBytes, &expectedData)
   165  
   166  			// compare out and expected
   167  			for _, k := range tt.validateKeys {
   168  				assert.Equal(t, expectedData[k], outData[k])
   169  			}
   170  		})
   171  	}
   172  }