package sqlserverflexbeta import ( "context" "reflect" "testing" "time" "github.com/google/go-cmp/cmp" "github.com/stackitcloud/stackit-sdk-go/core/oapierror" "github.com/stackitcloud/stackit-sdk-go/core/utils" sqlserverflex "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/pkg_gen/sqlserverflexbeta" ) // Used for testing instance operations type apiClientInstanceMocked struct { instanceId string instanceState string instanceNetwork sqlserverflex.InstanceNetwork instanceIsDeleted bool instanceGetFails bool } type ListUsersRequestRequest struct{} func (l ListUsersRequestRequest) Page(_ int64) sqlserverflex.ApiListUsersRequestRequest { return l } func (l ListUsersRequestRequest) Size(_ int64) sqlserverflex.ApiListUsersRequestRequest { return l } func (l ListUsersRequestRequest) Sort(_ sqlserverflex.UserSort) sqlserverflex.ApiListUsersRequestRequest { return l } func (l ListUsersRequestRequest) Execute() (*sqlserverflex.ListUserResponse, error) { // TODO implement me panic("implement me") } func (a *apiClientInstanceMocked) ListUsersRequest( _ context.Context, _ string, _ string, _ string, ) sqlserverflex.ApiListUsersRequestRequest { return ListUsersRequestRequest{} } func (a *apiClientInstanceMocked) ListRolesRequestExecute( _ context.Context, _ string, _ string, _ string, ) (*sqlserverflex.ListRolesResponse, error) { return &sqlserverflex.ListRolesResponse{ Roles: &[]string{}, }, nil } func (a *apiClientInstanceMocked) ListUsersRequestExecute( _ context.Context, _ string, _ string, _ string, ) (*sqlserverflex.ListUserResponse, error) { return &sqlserverflex.ListUserResponse{ Pagination: nil, Users: nil, }, nil } func (a *apiClientInstanceMocked) GetDatabaseRequestExecute( _ context.Context, _ string, _ string, _ string, _ string, ) (*sqlserverflex.GetDatabaseResponse, error) { return nil, nil } func (a *apiClientInstanceMocked) GetUserRequestExecute( _ context.Context, _ string, _ string, _ string, _ int64, ) (*sqlserverflex.GetUserResponse, error) { return nil, nil } func (a *apiClientInstanceMocked) GetInstanceRequestExecute( _ context.Context, _, _, _ string, ) (*sqlserverflex.GetInstanceResponse, error) { if a.instanceGetFails { return nil, &oapierror.GenericOpenAPIError{ StatusCode: 500, } } if a.instanceIsDeleted { return nil, &oapierror.GenericOpenAPIError{ StatusCode: 404, } } return &sqlserverflex.GetInstanceResponse{ Id: &a.instanceId, Status: sqlserverflex.GetInstanceResponseGetStatusAttributeType(&a.instanceState), Network: &a.instanceNetwork, }, nil } func TestCreateInstanceWaitHandler(t *testing.T) { instanceId := utils.Ptr("foo") tests := []struct { desc string instanceId string instanceGetFails bool instanceState string instanceNetwork sqlserverflex.InstanceNetwork usersGetErrorStatus int wantErr bool wantRes *sqlserverflex.GetInstanceResponse }{ //{ // desc: "create_succeeded", // instanceId: *instanceId, // instanceGetFails: false, // instanceState: *stateSuccess, // instanceNetwork: sqlserverflex.InstanceNetwork{ // AccessScope: nil, // Acl: nil, // InstanceAddress: utils.Ptr("10.0.0.1"), // RouterAddress: utils.Ptr("10.0.0.2"), // }, // wantErr: false, // wantRes: &sqlserverflex.GetInstanceResponse{ // BackupSchedule: nil, // Edition: nil, // Encryption: nil, // FlavorId: nil, // Id: instanceId, // IsDeletable: nil, // Name: nil, // Network: &sqlserverflex.InstanceNetwork{ // AccessScope: nil, // Acl: nil, // InstanceAddress: utils.Ptr("10.0.0.1"), // RouterAddress: utils.Ptr("10.0.0.2"), // }, // Replicas: nil, // RetentionDays: nil, // Status: sqlserverflex.GetInstanceResponseGetStatusAttributeType(stateSuccess), // Storage: nil, // Version: nil, // }, // }, { desc: "create_failed", instanceId: *instanceId, instanceGetFails: false, instanceState: InstanceStateFailed, wantErr: true, wantRes: nil, }, { desc: "create_failed_2", instanceId: *instanceId, instanceGetFails: false, instanceState: InstanceStateEmpty, wantErr: true, wantRes: nil, }, { desc: "instance_get_fails", instanceId: *instanceId, instanceGetFails: true, wantErr: true, wantRes: nil, }, { desc: "timeout", instanceId: *instanceId, instanceGetFails: false, instanceState: InstanceStateProcessing, wantErr: true, wantRes: nil, }, } for _, tt := range tests { t.Run( tt.desc, func(t *testing.T) { apiClient := &apiClientInstanceMocked{ instanceId: tt.instanceId, instanceState: tt.instanceState, instanceGetFails: tt.instanceGetFails, } handler := CreateInstanceWaitHandler(context.Background(), apiClient, "", tt.instanceId, "") gotRes, err := handler.SetTimeout(10 * time.Millisecond).SetSleepBeforeWait(1 * time.Millisecond).WaitWithContext(context.Background()) if (err != nil) != tt.wantErr { t.Fatalf("handler error = %v, wantErr %v", err, tt.wantErr) } if !reflect.DeepEqual(gotRes, tt.wantRes) { t.Fatalf("handler gotRes = %v, want %v", gotRes, tt.wantRes) } }, ) } } func TestUpdateInstanceWaitHandler(t *testing.T) { t.Skip("skipping - needs refactoring") tests := []struct { desc string instanceGetFails bool instanceState string wantErr bool wantResp bool }{ { desc: "update_succeeded", instanceGetFails: false, instanceState: InstanceStateSuccess, wantErr: false, wantResp: true, }, { desc: "update_failed", instanceGetFails: false, instanceState: InstanceStateFailed, wantErr: true, wantResp: true, }, { desc: "update_failed_2", instanceGetFails: false, instanceState: InstanceStateEmpty, wantErr: true, wantResp: true, }, { desc: "get_fails", instanceGetFails: true, wantErr: true, wantResp: false, }, { desc: "timeout", instanceGetFails: false, instanceState: InstanceStateProcessing, wantErr: true, wantResp: true, }, } for _, tt := range tests { t.Run( tt.desc, func(t *testing.T) { instanceId := "foo-bar" apiClient := &apiClientInstanceMocked{ instanceId: instanceId, instanceState: tt.instanceState, instanceGetFails: tt.instanceGetFails, } var wantRes *sqlserverflex.GetInstanceResponse if tt.wantResp { wantRes = &sqlserverflex.GetInstanceResponse{ Id: &instanceId, Status: sqlserverflex.GetInstanceResponseGetStatusAttributeType(utils.Ptr(tt.instanceState)), } } handler := UpdateInstanceWaitHandler(context.Background(), apiClient, "", instanceId, "") gotRes, err := handler.SetTimeout(10 * time.Millisecond).SetSleepBeforeWait(1 * time.Millisecond).WaitWithContext(context.Background()) if (err != nil) != tt.wantErr { t.Fatalf("handler error = %v, wantErr %v", err, tt.wantErr) } if !cmp.Equal(gotRes, wantRes) { t.Fatalf("handler gotRes = %v, want %v", gotRes, wantRes) } }, ) } } func TestDeleteInstanceWaitHandler(t *testing.T) { tests := []struct { desc string instanceGetFails bool instanceState string wantErr bool }{ { desc: "delete_succeeded", instanceGetFails: false, instanceState: InstanceStateSuccess, wantErr: false, }, { desc: "delete_failed", instanceGetFails: false, instanceState: InstanceStateFailed, wantErr: true, }, { desc: "get_fails", instanceGetFails: true, wantErr: true, }, } for _, tt := range tests { t.Run( tt.desc, func(t *testing.T) { instanceId := "foo-bar" apiClient := &apiClientInstanceMocked{ instanceGetFails: tt.instanceGetFails, instanceIsDeleted: tt.instanceState == InstanceStateSuccess, instanceId: instanceId, instanceState: tt.instanceState, } handler := DeleteInstanceWaitHandler(context.Background(), apiClient, "", instanceId, "") _, err := handler.SetTimeout(10 * time.Millisecond).WaitWithContext(context.Background()) if (err != nil) != tt.wantErr { t.Fatalf("handler error = %v, wantErr %v", err, tt.wantErr) } }, ) } }