// Copyright (c) STACKIT package postgresflexalpha import ( "context" "testing" "time" "github.com/google/go-cmp/cmp" "github.com/stackitcloud/stackit-sdk-go/core/oapierror" "github.com/stackitcloud/stackit-sdk-go/core/utils" "github.com/stackitcloud/stackit-sdk-go/services/postgresflex/v3alpha1api" ) func TestCreateInstanceWaitHandler(t *testing.T) { tests := []struct { desc string instanceGetFails bool instanceState string instanceNetwork v3alpha1api.InstanceNetwork usersGetErrorStatus int wantErr bool wantRes *v3alpha1api.GetInstanceResponse }{ { desc: "create_succeeded", instanceGetFails: false, instanceState: InstanceStateSuccess, instanceNetwork: v3alpha1api.InstanceNetwork{ AccessScope: nil, Acl: nil, InstanceAddress: utils.Ptr("10.0.0.1"), RouterAddress: utils.Ptr("10.0.0.1"), }, wantErr: false, wantRes: &v3alpha1api.GetInstanceResponse{ Id: "foo-bar", Status: InstanceStateSuccess, Network: v3alpha1api.InstanceNetwork{ AccessScope: nil, Acl: nil, InstanceAddress: utils.Ptr("10.0.0.1"), RouterAddress: utils.Ptr("10.0.0.1"), }, }, }, { desc: "create_failed", instanceGetFails: false, instanceState: InstanceStateFailed, instanceNetwork: v3alpha1api.InstanceNetwork{ AccessScope: nil, Acl: nil, InstanceAddress: utils.Ptr("10.0.0.1"), RouterAddress: utils.Ptr("10.0.0.1"), }, wantErr: true, wantRes: nil, }, { desc: "create_failed_2", instanceGetFails: false, instanceState: InstanceStateEmpty, instanceNetwork: v3alpha1api.InstanceNetwork{ AccessScope: nil, Acl: nil, InstanceAddress: utils.Ptr("10.0.0.1"), RouterAddress: utils.Ptr("10.0.0.1"), }, wantErr: true, wantRes: nil, }, { desc: "instance_get_fails", instanceGetFails: true, wantErr: true, wantRes: nil, }, { desc: "users_get_fails", instanceGetFails: false, instanceState: InstanceStateSuccess, instanceNetwork: v3alpha1api.InstanceNetwork{ AccessScope: nil, Acl: nil, InstanceAddress: utils.Ptr("10.0.0.1"), RouterAddress: utils.Ptr("10.0.0.1"), }, usersGetErrorStatus: 500, wantErr: true, wantRes: nil, }, { desc: "users_get_fails_2", instanceGetFails: false, instanceState: InstanceStateSuccess, instanceNetwork: v3alpha1api.InstanceNetwork{ AccessScope: nil, Acl: nil, InstanceAddress: utils.Ptr("10.0.0.1"), RouterAddress: utils.Ptr("10.0.0.1"), }, usersGetErrorStatus: 400, wantErr: true, wantRes: &v3alpha1api.GetInstanceResponse{ Id: "foo-bar", Status: InstanceStateSuccess, Network: v3alpha1api.InstanceNetwork{ AccessScope: nil, Acl: nil, InstanceAddress: utils.Ptr("10.0.0.1"), RouterAddress: utils.Ptr("10.0.0.1"), }, }, }, { desc: "fail when response has no instance address", instanceGetFails: false, instanceState: InstanceStateSuccess, instanceNetwork: v3alpha1api.InstanceNetwork{ AccessScope: (*v3alpha1api.InstanceNetworkAccessScope)(utils.Ptr("SNA")), Acl: nil, InstanceAddress: nil, RouterAddress: utils.Ptr("10.0.0.1"), }, wantErr: true, wantRes: nil, }, { desc: "timeout", instanceGetFails: false, instanceState: InstanceStateProgressing, instanceNetwork: v3alpha1api.InstanceNetwork{ AccessScope: (*v3alpha1api.InstanceNetworkAccessScope)(utils.Ptr("SNA")), Acl: nil, InstanceAddress: utils.Ptr("10.0.0.1"), RouterAddress: utils.Ptr("10.0.0.1"), }, wantErr: true, wantRes: nil, }, } for _, tt := range tests { t.Run( tt.desc, func(t *testing.T) { instanceID := "foo-bar" listUsersMock := func(_ v3alpha1api.ApiListUsersRequestRequest) (*v3alpha1api.ListUserResponse, error) { if tt.usersGetErrorStatus != 0 { return nil, &oapierror.GenericOpenAPIError{ StatusCode: tt.usersGetErrorStatus, } } aux := int32(0) return &v3alpha1api.ListUserResponse{ Pagination: v3alpha1api.Pagination{ TotalRows: aux, }, Users: []v3alpha1api.ListUser{}, }, nil } getInstanceMock := func(_ v3alpha1api.ApiGetInstanceRequestRequest) (*v3alpha1api.GetInstanceResponse, error) { if tt.instanceGetFails { return nil, &oapierror.GenericOpenAPIError{ StatusCode: 500, } } return &v3alpha1api.GetInstanceResponse{ Id: instanceID, Status: v3alpha1api.Status(tt.instanceState), Network: tt.instanceNetwork, }, nil } apiClientMock := v3alpha1api.DefaultAPIServiceMock{ GetInstanceRequestExecuteMock: &getInstanceMock, ListUsersRequestExecuteMock: &listUsersMock, } handler := CreateInstanceWaitHandler(context.Background(), apiClientMock, "", "", 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, tt.wantRes) { t.Fatalf("handler gotRes = %v, want %v", gotRes, tt.wantRes) } }, ) } } func TestUpdateInstanceWaitHandler(t *testing.T) { tests := []struct { desc string instanceGetFails bool instanceState string instanceNetwork v3alpha1api.InstanceNetwork wantErr bool wantRes *v3alpha1api.GetInstanceResponse }{ { desc: "update_succeeded", instanceGetFails: false, instanceState: InstanceStateSuccess, instanceNetwork: v3alpha1api.InstanceNetwork{ AccessScope: nil, Acl: nil, InstanceAddress: utils.Ptr("10.0.0.1"), RouterAddress: utils.Ptr("10.0.0.1"), }, wantErr: false, wantRes: &v3alpha1api.GetInstanceResponse{ Id: "foo-bar", Status: v3alpha1api.Status(InstanceStateSuccess), Network: v3alpha1api.InstanceNetwork{ AccessScope: nil, Acl: nil, InstanceAddress: utils.Ptr("10.0.0.1"), RouterAddress: utils.Ptr("10.0.0.1"), }, }, }, { desc: "update_failed", instanceGetFails: false, instanceState: InstanceStateFailed, instanceNetwork: v3alpha1api.InstanceNetwork{ AccessScope: nil, Acl: nil, InstanceAddress: utils.Ptr("10.0.0.1"), RouterAddress: utils.Ptr("10.0.0.1"), }, wantErr: true, wantRes: &v3alpha1api.GetInstanceResponse{ Id: "foo-bar", Status: v3alpha1api.Status(InstanceStateFailed), Network: v3alpha1api.InstanceNetwork{ AccessScope: nil, Acl: nil, InstanceAddress: utils.Ptr("10.0.0.1"), RouterAddress: utils.Ptr("10.0.0.1"), }, }, }, { desc: "update_failed_2", instanceGetFails: false, instanceState: InstanceStateEmpty, instanceNetwork: v3alpha1api.InstanceNetwork{ AccessScope: nil, Acl: nil, InstanceAddress: utils.Ptr("10.0.0.1"), RouterAddress: utils.Ptr("10.0.0.1"), }, wantErr: true, wantRes: nil, }, { desc: "get_fails", instanceGetFails: true, wantErr: true, wantRes: nil, }, { desc: "timeout", instanceGetFails: false, instanceState: InstanceStateProgressing, instanceNetwork: v3alpha1api.InstanceNetwork{ AccessScope: nil, Acl: nil, InstanceAddress: utils.Ptr("10.0.0.1"), RouterAddress: utils.Ptr("10.0.0.1"), }, wantErr: true, wantRes: nil, }, } for _, tt := range tests { t.Run( tt.desc, func(t *testing.T) { instanceID := "foo-bar" listUsersMock := func(_ v3alpha1api.ApiListUsersRequestRequest) (*v3alpha1api.ListUserResponse, error) { aux := int32(0) return &v3alpha1api.ListUserResponse{ Pagination: v3alpha1api.Pagination{ TotalRows: aux, }, Users: []v3alpha1api.ListUser{}, }, nil } getInstanceMock := func(_ v3alpha1api.ApiGetInstanceRequestRequest) (*v3alpha1api.GetInstanceResponse, error) { if tt.instanceGetFails { return nil, &oapierror.GenericOpenAPIError{ StatusCode: 500, } } return &v3alpha1api.GetInstanceResponse{ Id: instanceID, Status: v3alpha1api.Status(tt.instanceState), Network: tt.instanceNetwork, }, nil } apiClientMock := v3alpha1api.DefaultAPIServiceMock{ GetInstanceRequestExecuteMock: &getInstanceMock, ListUsersRequestExecuteMock: &listUsersMock, } handler := PartialUpdateInstanceWaitHandler(context.Background(), apiClientMock, "", "", instanceID) gotRes, err := handler.SetTimeout(10 * time.Millisecond).WaitWithContext(context.Background()) if (err != nil) != tt.wantErr { t.Fatalf("handler error = %v, wantErr %v", err, tt.wantErr) } if !cmp.Equal(gotRes, tt.wantRes) { t.Fatalf("handler gotRes = %v, want %v", gotRes, tt.wantRes) } }, ) } }