github.com/Axway/agent-sdk@v1.1.101/pkg/migrate/attributemigration_test.go (about) 1 package migrate 2 3 import ( 4 "context" 5 "encoding/json" 6 "testing" 7 8 apiv1 "github.com/Axway/agent-sdk/pkg/apic/apiserver/models/api/v1" 9 management "github.com/Axway/agent-sdk/pkg/apic/apiserver/models/management/v1alpha1" 10 defs "github.com/Axway/agent-sdk/pkg/apic/definitions" 11 "github.com/Axway/agent-sdk/pkg/config" 12 "github.com/Axway/agent-sdk/pkg/util" 13 "github.com/stretchr/testify/assert" 14 ) 15 16 func TestAttributeMigration(t *testing.T) { 17 tests := []struct { 18 name string 19 attrs map[string]string 20 updateCalled bool 21 createSubCalled bool 22 tags []string 23 expectedTags int 24 }{ 25 { 26 name: "should move api service attributes to the x-agent-details sub resource", 27 updateCalled: true, 28 createSubCalled: true, 29 tags: []string{"tag1", "tag2"}, 30 expectedTags: 1, 31 attrs: map[string]string{ 32 defs.AttrPreviousAPIServiceRevisionID: "1", 33 defs.AttrExternalAPIID: "2", 34 defs.AttrExternalAPIPrimaryKey: "3", 35 defs.AttrExternalAPIName: "api-name", 36 defs.AttrExternalAPIStage: "stage", 37 defs.AttrCreatedBy: "created-by", 38 "majorHash": "major", 39 "minorHash": "minor", 40 "az-api-hash": "azhash", 41 "az-resource-id": "resourceid", 42 "random": "abc", 43 }, 44 }, 45 { 46 name: "should not call update when there are no attributes to move", 47 updateCalled: false, 48 createSubCalled: false, 49 tags: []string{"abc", "123"}, 50 expectedTags: 2, 51 attrs: map[string]string{ 52 "random": "abc", 53 }, 54 }, 55 } 56 57 for _, tc := range tests { 58 t.Run(tc.name, func(t *testing.T) { 59 MatchAttr("majorHash", "minorHash") 60 MatchAttrPattern("az-") 61 RemoveTagPattern("tag1") 62 res := []*apiv1.ResourceInstance{ 63 { 64 ResourceMeta: apiv1.ResourceMeta{ 65 GroupVersionKind: management.APIServiceGVK(), 66 Name: "item-one", 67 Title: "item-one", 68 Metadata: apiv1.Metadata{}, 69 Attributes: tc.attrs, 70 Tags: tc.tags, 71 }, 72 }, 73 } 74 c := &mockAttrMigClient{ 75 res: res, 76 t: t, 77 expectedTags: tc.expectedTags, 78 } 79 cfg := &config.CentralConfiguration{} 80 am := NewAttributeMigration(c, cfg) 81 err := am.migrate("/apiservices", nil) 82 assert.Equal(t, tc.updateCalled, c.updateCalled) 83 assert.Equal(t, tc.createSubCalled, c.createSubCalled) 84 assert.Nil(t, err) 85 }) 86 } 87 } 88 89 func TestMigrate(t *testing.T) { 90 c := &mockAttrMigClient{ 91 t: t, 92 } 93 cfg := &config.CentralConfiguration{} 94 am := NewAttributeMigration(c, cfg) 95 ri := &apiv1.ResourceInstance{ 96 ResourceMeta: apiv1.ResourceMeta{ 97 GroupVersionKind: management.APIServiceGVK(), 98 Attributes: map[string]string{ 99 defs.AttrPreviousAPIServiceRevisionID: "1", 100 defs.AttrExternalAPIID: "2", 101 defs.AttrExternalAPIPrimaryKey: "3", 102 defs.AttrExternalAPIName: "api-name", 103 defs.AttrExternalAPIStage: "stage", 104 defs.AttrCreatedBy: "created-by", 105 "majorHash": "major", 106 "minorHash": "minor", 107 "az-api-hash": "azhash", 108 "az-resource-id": "resourceid", 109 "random": "abc", 110 }, 111 }, 112 } 113 114 c.execRes = ri 115 116 MatchAttr("majorHash", "minorHash") 117 MatchAttrPattern("az-") 118 119 svc, err := am.Migrate(context.Background(), ri) 120 assert.Nil(t, err) 121 assert.NotNil(t, util.GetAgentDetails(svc)) 122 } 123 124 type mockAttrMigClient struct { 125 res []*apiv1.ResourceInstance 126 t *testing.T 127 updateCalled bool 128 createSubCalled bool 129 execRes *apiv1.ResourceInstance 130 expectedTags int 131 } 132 133 func (m *mockAttrMigClient) GetAPIV1ResourceInstances(_ map[string]string, _ string) ([]*apiv1.ResourceInstance, error) { 134 return m.res, nil 135 } 136 137 func (m *mockAttrMigClient) UpdateResourceInstance(i apiv1.Interface) (*apiv1.ResourceInstance, error) { 138 m.updateCalled = true 139 ri, _ := i.AsInstance() 140 assert.NotContains(m.t, ri.Attributes, defs.AttrPreviousAPIServiceRevisionID) 141 assert.NotContains(m.t, ri.Attributes, defs.AttrExternalAPIID) 142 assert.NotContains(m.t, ri.Attributes, defs.AttrExternalAPIPrimaryKey) 143 assert.NotContains(m.t, ri.Attributes, defs.AttrExternalAPIName) 144 assert.NotContains(m.t, ri.Attributes, defs.AttrExternalAPIStage) 145 assert.NotContains(m.t, ri.Attributes, defs.AttrCreatedBy) 146 assert.NotContains(m.t, ri.Attributes, "majorHash") 147 assert.NotContains(m.t, ri.Attributes, "minorHash") 148 assert.NotContains(m.t, ri.Attributes, "az-api-hash") 149 assert.NotContains(m.t, ri.Attributes, "az-resource-id") 150 assert.Contains(m.t, ri.Attributes, "random") 151 152 sub := util.GetAgentDetails(ri) 153 assert.Contains(m.t, sub, defs.AttrPreviousAPIServiceRevisionID) 154 assert.Contains(m.t, sub, defs.AttrExternalAPIID) 155 assert.Contains(m.t, sub, defs.AttrExternalAPIPrimaryKey) 156 assert.Contains(m.t, sub, defs.AttrExternalAPIName) 157 assert.Contains(m.t, sub, defs.AttrExternalAPIStage) 158 assert.Contains(m.t, sub, defs.AttrCreatedBy) 159 assert.Contains(m.t, sub, "majorHash") 160 assert.Contains(m.t, sub, "minorHash") 161 assert.Contains(m.t, sub, "az-api-hash") 162 assert.Contains(m.t, sub, "az-resource-id") 163 assert.NotContains(m.t, sub, "random") 164 165 assert.Equal(m.t, m.expectedTags, len(ri.Tags)) 166 167 return nil, nil 168 } 169 170 func (m *mockAttrMigClient) CreateSubResource(_ apiv1.ResourceMeta, _ map[string]interface{}) error { 171 m.createSubCalled = true 172 return nil 173 } 174 175 func (m *mockAttrMigClient) CreateOrUpdateResource(data apiv1.Interface) (*apiv1.ResourceInstance, error) { 176 return m.execRes, nil 177 } 178 179 func (m *mockAttrMigClient) ExecuteAPI(_, _ string, _ map[string]string, _ []byte) ([]byte, error) { 180 return json.Marshal(m.execRes) 181 } 182 183 func (m mockAttrMigClient) DeleteResourceInstance(ri apiv1.Interface) error { 184 return nil 185 } 186 187 func (m mockAttrMigClient) GetResource(url string) (*apiv1.ResourceInstance, error) { 188 return nil, nil 189 }