github.com/stripe/stripe-go/v76@v76.25.0/invoice_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 TestInvoiceParams_AppendTo(t *testing.T) {
    12  	{
    13  		params := &InvoiceUpcomingParams{SubscriptionBillingCycleAnchorNow: Bool(true)}
    14  		body := &form.Values{}
    15  		form.AppendTo(body, params)
    16  		t.Logf("body = %+v", body)
    17  		assert.Equal(t, []string{"now"}, body.Get("subscription_billing_cycle_anchor"))
    18  	}
    19  
    20  	{
    21  		params := &InvoiceUpcomingParams{SubscriptionBillingCycleAnchorUnchanged: Bool(true)}
    22  		body := &form.Values{}
    23  		form.AppendTo(body, params)
    24  		t.Logf("body = %+v", body)
    25  		assert.Equal(t, []string{"unchanged"}, body.Get("subscription_billing_cycle_anchor"))
    26  	}
    27  
    28  	{
    29  		params := &InvoiceUpcomingParams{SubscriptionTrialEndNow: Bool(true)}
    30  		body := &form.Values{}
    31  		form.AppendTo(body, params)
    32  		t.Logf("body = %+v", body)
    33  		assert.Equal(t, []string{"now"}, body.Get("subscription_trial_end"))
    34  	}
    35  }
    36  
    37  func TestInvoice_Unmarshal(t *testing.T) {
    38  	invoiceDataUnexpanded := map[string]interface{}{
    39  		"id":     "in_123",
    40  		"object": "invoice",
    41  		"discounts": []string{
    42  			"dis_123",
    43  			"dis_abc",
    44  		},
    45  		"total_discount_amounts": []map[string]interface{}{
    46  			{
    47  				"amount":   123,
    48  				"discount": "dis_123",
    49  			},
    50  			{
    51  				"amount":   345,
    52  				"discount": "dis_abc",
    53  			},
    54  		},
    55  	}
    56  
    57  	bytes, err := json.Marshal(&invoiceDataUnexpanded)
    58  	assert.NoError(t, err)
    59  
    60  	var invoiceUnexpanded Invoice
    61  	err = json.Unmarshal(bytes, &invoiceUnexpanded)
    62  	assert.NoError(t, err)
    63  
    64  	assert.Equal(t, "in_123", invoiceUnexpanded.ID)
    65  	assert.Equal(t, "invoice", invoiceUnexpanded.Object)
    66  
    67  	assert.Equal(t, 2, len(invoiceUnexpanded.Discounts))
    68  	assert.Equal(t, "dis_123", invoiceUnexpanded.Discounts[0].ID)
    69  	assert.Equal(t, "dis_abc", invoiceUnexpanded.Discounts[1].ID)
    70  
    71  	assert.Equal(t, 2, len(invoiceUnexpanded.TotalDiscountAmounts))
    72  	assert.Equal(t, int64(123), invoiceUnexpanded.TotalDiscountAmounts[0].Amount)
    73  	assert.Equal(t, "dis_123", invoiceUnexpanded.TotalDiscountAmounts[0].Discount.ID)
    74  	assert.Equal(t, int64(345), invoiceUnexpanded.TotalDiscountAmounts[1].Amount)
    75  	assert.Equal(t, "dis_abc", invoiceUnexpanded.TotalDiscountAmounts[1].Discount.ID)
    76  
    77  	invoiceDataExpanded := map[string]interface{}{
    78  		"id":     "in_123",
    79  		"object": "invoice",
    80  		"discounts": []map[string]interface{}{
    81  			{
    82  				"id":     "dis_123",
    83  				"object": "discount",
    84  				"coupon": map[string]interface{}{
    85  					"id":          "co_123",
    86  					"object":      "coupon",
    87  					"currency":    "usd",
    88  					"percent_off": 25.5,
    89  				},
    90  			},
    91  			{
    92  				"id":     "dis_abc",
    93  				"object": "discount",
    94  				"coupon": map[string]interface{}{
    95  					"id":          "co_abc",
    96  					"object":      "coupon",
    97  					"currency":    "eur",
    98  					"percent_off": 35.5,
    99  				},
   100  			},
   101  		},
   102  		"total_discount_amounts": []map[string]interface{}{
   103  			{
   104  				"amount": 123,
   105  				"discount": map[string]interface{}{
   106  					"id":     "dis_123",
   107  					"object": "discount",
   108  					"coupon": map[string]interface{}{
   109  						"id":          "co_123",
   110  						"object":      "coupon",
   111  						"currency":    "usd",
   112  						"percent_off": 25.5,
   113  					},
   114  				},
   115  			},
   116  			{
   117  				"amount": 345,
   118  				"discount": map[string]interface{}{
   119  					"id":     "dis_abc",
   120  					"object": "discount",
   121  					"coupon": map[string]interface{}{
   122  						"id":          "co_abc",
   123  						"object":      "coupon",
   124  						"currency":    "eur",
   125  						"percent_off": 35.5,
   126  					},
   127  				},
   128  			},
   129  		},
   130  	}
   131  
   132  	bytes2, err2 := json.Marshal(&invoiceDataExpanded)
   133  	assert.NoError(t, err2)
   134  
   135  	var invoiceExpanded Invoice
   136  	err = json.Unmarshal(bytes2, &invoiceExpanded)
   137  	assert.NoError(t, err)
   138  
   139  	assert.Equal(t, "in_123", invoiceExpanded.ID)
   140  	assert.Equal(t, "invoice", invoiceExpanded.Object)
   141  
   142  	assert.Equal(t, 2, len(invoiceExpanded.Discounts))
   143  	assert.Equal(t, "dis_123", invoiceExpanded.Discounts[0].ID)
   144  	assert.Equal(t, "discount", invoiceExpanded.Discounts[0].Object)
   145  	assert.Equal(t, "co_123", invoiceExpanded.Discounts[0].Coupon.ID)
   146  	assert.Equal(t, "coupon", invoiceExpanded.Discounts[0].Coupon.Object)
   147  	assert.Equal(t, float64(25.5), invoiceExpanded.Discounts[0].Coupon.PercentOff)
   148  	assert.Equal(t, "dis_abc", invoiceExpanded.Discounts[1].ID)
   149  	assert.Equal(t, "discount", invoiceExpanded.Discounts[1].Object)
   150  	assert.Equal(t, "co_abc", invoiceExpanded.Discounts[1].Coupon.ID)
   151  	assert.Equal(t, "coupon", invoiceExpanded.Discounts[1].Coupon.Object)
   152  	assert.Equal(t, float64(35.5), invoiceExpanded.Discounts[1].Coupon.PercentOff)
   153  
   154  	assert.Equal(t, 2, len(invoiceExpanded.TotalDiscountAmounts))
   155  	assert.Equal(t, int64(123), invoiceExpanded.TotalDiscountAmounts[0].Amount)
   156  	assert.Equal(t, "dis_123", invoiceExpanded.TotalDiscountAmounts[0].Discount.ID)
   157  	assert.Equal(t, "discount", invoiceExpanded.TotalDiscountAmounts[0].Discount.Object)
   158  	assert.Equal(t, "co_123", invoiceExpanded.TotalDiscountAmounts[0].Discount.Coupon.ID)
   159  	assert.Equal(t, "coupon", invoiceExpanded.TotalDiscountAmounts[0].Discount.Coupon.Object)
   160  	assert.Equal(t, float64(25.5), invoiceExpanded.TotalDiscountAmounts[0].Discount.Coupon.PercentOff)
   161  	assert.Equal(t, int64(345), invoiceExpanded.TotalDiscountAmounts[1].Amount)
   162  	assert.Equal(t, "dis_abc", invoiceExpanded.TotalDiscountAmounts[1].Discount.ID)
   163  	assert.Equal(t, "discount", invoiceExpanded.TotalDiscountAmounts[1].Discount.Object)
   164  	assert.Equal(t, "co_abc", invoiceExpanded.TotalDiscountAmounts[1].Discount.Coupon.ID)
   165  	assert.Equal(t, "coupon", invoiceExpanded.TotalDiscountAmounts[1].Discount.Coupon.Object)
   166  	assert.Equal(t, float64(35.5), invoiceExpanded.TotalDiscountAmounts[1].Discount.Coupon.PercentOff)
   167  }
   168  
   169  func TestInvoice_UnmarshalJSON(t *testing.T) {
   170  	// Unmarshals from a JSON string
   171  	{
   172  		var v Invoice
   173  		err := json.Unmarshal([]byte(`"in_123"`), &v)
   174  		assert.NoError(t, err)
   175  		assert.Equal(t, "in_123", v.ID)
   176  	}
   177  
   178  	// Unmarshals from a JSON object
   179  	{
   180  		v := Invoice{ID: "in_123"}
   181  		data, err := json.Marshal(&v)
   182  		assert.NoError(t, err)
   183  
   184  		err = json.Unmarshal(data, &v)
   185  		assert.NoError(t, err)
   186  		assert.Equal(t, "in_123", v.ID)
   187  	}
   188  }