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 }