package client import ( "context" "testing" connectorv1 "github.com/tech/sendico/pkg/proto/connector/v1" mntxv1 "github.com/tech/sendico/pkg/proto/gateway/mntx/v1" "google.golang.org/grpc" ) type stubConnectorClient struct { submitReq *connectorv1.SubmitOperationRequest getReq *connectorv1.GetOperationRequest submitResp *connectorv1.SubmitOperationResponse getResp *connectorv1.GetOperationResponse } func (s *stubConnectorClient) SubmitOperation(_ context.Context, in *connectorv1.SubmitOperationRequest, _ ...grpc.CallOption) (*connectorv1.SubmitOperationResponse, error) { s.submitReq = in if s.submitResp != nil { return s.submitResp, nil } return &connectorv1.SubmitOperationResponse{}, nil } func (s *stubConnectorClient) GetOperation(_ context.Context, in *connectorv1.GetOperationRequest, _ ...grpc.CallOption) (*connectorv1.GetOperationResponse, error) { s.getReq = in if s.getResp != nil { return s.getResp, nil } return &connectorv1.GetOperationResponse{}, nil } func TestCreateCardPayout_UsesOperationRefIdentity(t *testing.T) { stub := &stubConnectorClient{ submitResp: &connectorv1.SubmitOperationResponse{ Receipt: &connectorv1.OperationReceipt{ OperationId: "payment-1:hop_4_card_payout_send", Status: connectorv1.OperationStatus_OPERATION_WAITING, ProviderRef: "provider-1", }, }, } client := &gatewayClient{client: stub, cfg: Config{}} resp, err := client.CreateCardPayout(context.Background(), &mntxv1.CardPayoutRequest{ PayoutId: "payout-legacy-id", OperationRef: "payment-1:hop_4_card_payout_send", IdempotencyKey: "", AmountMinor: 12345, Currency: "RUB", }) if err != nil { t.Fatalf("CreateCardPayout returned error: %v", err) } if resp.GetPayout() == nil { t.Fatal("expected payout") } if got, want := resp.GetPayout().GetPayoutId(), "payment-1:hop_4_card_payout_send"; got != want { t.Fatalf("payout_id mismatch: got=%q want=%q", got, want) } if stub.submitReq == nil || stub.submitReq.GetOperation() == nil { t.Fatal("expected submitted operation") } if got, want := stub.submitReq.GetOperation().GetOperationRef(), "payment-1:hop_4_card_payout_send"; got != want { t.Fatalf("operation_ref mismatch: got=%q want=%q", got, want) } if got, want := stub.submitReq.GetOperation().GetIdempotencyKey(), "payment-1:hop_4_card_payout_send"; got != want { t.Fatalf("idempotency_key mismatch: got=%q want=%q", got, want) } } func TestGetCardPayoutStatus_UsesPayoutIDAsOperationID(t *testing.T) { stub := &stubConnectorClient{ getResp: &connectorv1.GetOperationResponse{ Operation: &connectorv1.Operation{ OperationId: "payment-2:hop_4_card_payout_send", Status: connectorv1.OperationStatus_OPERATION_PROCESSING, }, }, } client := &gatewayClient{client: stub, cfg: Config{}} resp, err := client.GetCardPayoutStatus(context.Background(), &mntxv1.GetCardPayoutStatusRequest{ PayoutId: "payment-2:hop_4_card_payout_send", }) if err != nil { t.Fatalf("GetCardPayoutStatus returned error: %v", err) } if stub.getReq == nil { t.Fatal("expected get operation request") } if got, want := stub.getReq.GetOperationId(), "payment-2:hop_4_card_payout_send"; got != want { t.Fatalf("operation_id mismatch: got=%q want=%q", got, want) } if resp.GetPayout() == nil { t.Fatal("expected payout") } if got, want := resp.GetPayout().GetPayoutId(), "payment-2:hop_4_card_payout_send"; got != want { t.Fatalf("payout_id mismatch: got=%q want=%q", got, want) } } func TestCreateCardTokenPayout_UsesOperationRefWhenReceiptOperationIDMissing(t *testing.T) { stub := &stubConnectorClient{ submitResp: &connectorv1.SubmitOperationResponse{ Receipt: &connectorv1.OperationReceipt{ OperationId: "", Status: connectorv1.OperationStatus_OPERATION_PROCESSING, ProviderRef: "provider-2", }, }, } client := &gatewayClient{client: stub, cfg: Config{}} resp, err := client.CreateCardTokenPayout(context.Background(), &mntxv1.CardTokenPayoutRequest{ PayoutId: "legacy-payout-id", OperationRef: "payment-3:hop_4_card_payout_send_2", IdempotencyKey: "", AmountMinor: 777, Currency: "RUB", CardToken: "tok_123", }) if err != nil { t.Fatalf("CreateCardTokenPayout returned error: %v", err) } if stub.submitReq == nil || stub.submitReq.GetOperation() == nil { t.Fatal("expected submitted operation") } if got, want := stub.submitReq.GetOperation().GetOperationRef(), "payment-3:hop_4_card_payout_send_2"; got != want { t.Fatalf("operation_ref mismatch: got=%q want=%q", got, want) } if got, want := stub.submitReq.GetOperation().GetIdempotencyKey(), "payment-3:hop_4_card_payout_send_2"; got != want { t.Fatalf("idempotency_key mismatch: got=%q want=%q", got, want) } if resp.GetPayout() == nil { t.Fatal("expected payout") } if got, want := resp.GetPayout().GetPayoutId(), "payment-3:hop_4_card_payout_send_2"; got != want { t.Fatalf("payout_id mismatch: got=%q want=%q", got, want) } }