github.com/stripe/stripe-go/v76@v76.25.0/account_test.go (about)

     1  package stripe
     2  
     3  import (
     4  	"encoding/json"
     5  	"testing"
     6  
     7  	assert "github.com/stretchr/testify/require"
     8  	"github.com/stripe/stripe-go/v76/form"
     9  )
    10  
    11  func TestAccountExternalAccountParams_AppendTo(t *testing.T) {
    12  	{
    13  		params := &AccountExternalAccountParams{}
    14  		body := &form.Values{}
    15  		form.AppendTo(body, params)
    16  		t.Logf("body = %+v", body)
    17  		assert.Equal(t, []string{"bank_account"}, body.Get("object"))
    18  	}
    19  
    20  	{
    21  		params := &AccountExternalAccountParams{Token: String("tok_123")}
    22  		body := &form.Values{}
    23  
    24  		// 0-length keyParts are not allowed, so call AppendTo directly (as
    25  		// opposed to through the form package) and inject a realistic set
    26  		params.AppendTo(body, []string{"external_account"})
    27  
    28  		t.Logf("body = %+v", body)
    29  		assert.Equal(t, []string{"tok_123"}, body.Get("external_account"))
    30  	}
    31  }
    32  
    33  func TestAccount_Unmarshal(t *testing.T) {
    34  	accountData := map[string]interface{}{
    35  		"id": "acct_123",
    36  		"business_profile": map[string]interface{}{
    37  			"mcc": "123",
    38  		},
    39  		"business_type": "company",
    40  		"capabilities": map[string]interface{}{
    41  			"card_payments": "active",
    42  			"transfers":     "inactive",
    43  		},
    44  		"external_accounts": map[string]interface{}{
    45  			"object":   "list",
    46  			"has_more": true,
    47  			"data": []map[string]interface{}{
    48  				{
    49  					"object": "bank_account",
    50  					"id":     "ba_123",
    51  				},
    52  				{
    53  					"object": "card",
    54  					"id":     "card_123",
    55  				},
    56  			},
    57  		},
    58  		"metadata": map[string]interface{}{
    59  			"key1": "value1",
    60  			"key2": "value2",
    61  		},
    62  		"object": "account",
    63  		"requirements": map[string]interface{}{
    64  			"current_deadline": 1234567890,
    65  			"currently_due": []interface{}{
    66  				"tos_acceptance.date",
    67  				"tos_acceptance.ip",
    68  			},
    69  			"disabled_reason": "fields_needed",
    70  			"errors": []map[string]interface{}{
    71  				{
    72  					"code":        "invalid_value_other",
    73  					"reason":      "This value is invalid",
    74  					"requirement": "tos_acceptance.date",
    75  				},
    76  			},
    77  			"eventually_due": []interface{}{
    78  				"relationship.representative",
    79  			},
    80  			"past_due": []interface{}{},
    81  		},
    82  		"settings": map[string]interface{}{
    83  			"branding": map[string]interface{}{
    84  				"icon": "file_123",
    85  				"logo": "file_234",
    86  			},
    87  			"card_payments": map[string]interface{}{
    88  				"decline_on": map[string]interface{}{
    89  					"avs_failure": true,
    90  					"cvc_failure": false,
    91  				},
    92  				"statement_descriptor_prefix": "prefix",
    93  			},
    94  			"payments": map[string]interface{}{
    95  				"statement_descriptor": "descriptor",
    96  			},
    97  			"payouts": map[string]interface{}{
    98  				"debit_negative_balances": true,
    99  				"schedule": map[string]interface{}{
   100  					"delay_days": 2,
   101  					"interval":   "weekly",
   102  				},
   103  				"statement_descriptor_prefix": "prefix",
   104  			},
   105  		},
   106  		"tos_acceptance": map[string]interface{}{
   107  			"date":              1528573382,
   108  			"ip":                "127.0.0.1",
   109  			"user_agent":        "user agent",
   110  			"service_agreement": "recipient",
   111  		},
   112  		"type": "custom",
   113  	}
   114  
   115  	bytes, err := json.Marshal(&accountData)
   116  	assert.NoError(t, err)
   117  
   118  	var account Account
   119  	err = json.Unmarshal(bytes, &account)
   120  	assert.NoError(t, err)
   121  
   122  	assert.Equal(t, "acct_123", account.ID)
   123  
   124  	assert.Equal(t, "123", account.BusinessProfile.MCC)
   125  
   126  	assert.Equal(t, AccountCapabilityStatusActive, account.Capabilities.CardPayments)
   127  	assert.Equal(t, AccountCapabilityStatus(""), account.Capabilities.LegacyPayments)
   128  	assert.Equal(t, AccountCapabilityStatusInactive, account.Capabilities.Transfers)
   129  
   130  	assert.Equal(t, AccountBusinessTypeCompany, account.BusinessType)
   131  
   132  	// Assert ExternalAccounts are fully deserialized
   133  	assert.Equal(t, true, account.ExternalAccounts.HasMore)
   134  	assert.Equal(t, 2, len(account.ExternalAccounts.Data))
   135  	assert.Equal(t, "ba_123", account.ExternalAccounts.Data[0].ID)
   136  	assert.Equal(t, "card_123", account.ExternalAccounts.Data[1].ID)
   137  
   138  	assert.Equal(t, "value1", account.Metadata["key1"])
   139  	assert.Equal(t, "value2", account.Metadata["key2"])
   140  
   141  	assert.Equal(t, int64(1234567890), account.Requirements.CurrentDeadline)
   142  	assert.Equal(t, 2, len(account.Requirements.CurrentlyDue))
   143  	assert.Equal(t, AccountRequirementsDisabledReasonFieldsNeeded, account.Requirements.DisabledReason)
   144  	assert.Equal(t, 1, len(account.Requirements.Errors))
   145  	assert.Equal(t, "invalid_value_other", account.Requirements.Errors[0].Code)
   146  	assert.Equal(t, 1, len(account.Requirements.EventuallyDue))
   147  	assert.Equal(t, 0, len(account.Requirements.PastDue))
   148  
   149  	assert.Equal(t, "file_123", account.Settings.Branding.Icon.ID)
   150  	assert.Equal(t, "file_234", account.Settings.Branding.Logo.ID)
   151  	assert.Equal(t, true, account.Settings.CardPayments.DeclineOn.AVSFailure)
   152  	assert.Equal(t, false, account.Settings.CardPayments.DeclineOn.CVCFailure)
   153  	assert.Equal(t, "prefix", account.Settings.CardPayments.StatementDescriptorPrefix)
   154  	assert.Equal(t, "descriptor", account.Settings.Payments.StatementDescriptor)
   155  	assert.Equal(t, true, account.Settings.Payouts.DebitNegativeBalances)
   156  	assert.Equal(t, int64(2), account.Settings.Payouts.Schedule.DelayDays)
   157  	assert.Equal(t, AccountSettingsPayoutsScheduleIntervalWeekly, account.Settings.Payouts.Schedule.Interval)
   158  
   159  	assert.Equal(t, int64(1528573382), account.TOSAcceptance.Date)
   160  	assert.Equal(t, "127.0.0.1", account.TOSAcceptance.IP)
   161  	assert.Equal(t, "user agent", account.TOSAcceptance.UserAgent)
   162  	assert.Equal(t, AccountTOSAcceptanceServiceAgreementRecipient, account.TOSAcceptance.ServiceAgreement)
   163  
   164  	assert.Equal(t, AccountTypeCustom, account.Type)
   165  }
   166  
   167  func TestAccount_UnmarshalJSON(t *testing.T) {
   168  	// Unmarshals from a JSON string
   169  	{
   170  		var v Account
   171  		err := json.Unmarshal([]byte(`"acct_123"`), &v)
   172  		assert.NoError(t, err)
   173  		assert.Equal(t, "acct_123", v.ID)
   174  	}
   175  
   176  	// Unmarshals from a JSON object
   177  	{
   178  		v := Account{ID: "acct_123"}
   179  		data, err := json.Marshal(&v)
   180  		assert.NoError(t, err)
   181  
   182  		err = json.Unmarshal(data, &v)
   183  		assert.NoError(t, err)
   184  		assert.Equal(t, "acct_123", v.ID)
   185  	}
   186  }
   187  
   188  func TestExternalAccount_UnmarshalJSON(t *testing.T) {
   189  	// Unmarshals from a JSON object
   190  	{
   191  		// We build the JSON object manually here because it's key that the
   192  		// `object` field is included so that the source knows what type to
   193  		// decode
   194  		data := []byte(`{"id":"ba_123", "object":"bank_account"}`)
   195  
   196  		var v AccountExternalAccount
   197  		err := json.Unmarshal(data, &v)
   198  		assert.NoError(t, err)
   199  		assert.Equal(t, AccountExternalAccountTypeBankAccount, v.Type)
   200  
   201  		// The external account has a field for each possible type, so the
   202  		// bank account is located one level down
   203  		assert.Equal(t, "ba_123", v.BankAccount.ID)
   204  	}
   205  }
   206  
   207  func TestPayoutScheduleParams_AppendTo(t *testing.T) {
   208  	{
   209  		params := &AccountSettingsPayoutsScheduleParams{DelayDaysMinimum: Bool(true)}
   210  		body := &form.Values{}
   211  		form.AppendTo(body, params)
   212  		t.Logf("body = %+v", body)
   213  		assert.Equal(t, []string{"minimum"}, body.Get("delay_days"))
   214  	}
   215  }