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  }