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 }