Skip to content

Commit

Permalink
Update invoice types and params (#346)
Browse files Browse the repository at this point in the history
* update invoice types and params

* remove card params check

* update invoiceitem with types, params and endpoints

* invoice item test

* restart test

* add product test
  • Loading branch information
snewcomer authored and begedin committed Apr 11, 2018
1 parent fc7fb73 commit 464687e
Show file tree
Hide file tree
Showing 7 changed files with 200 additions and 30 deletions.
1 change: 1 addition & 0 deletions lib/stripe/converter.ex
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ defmodule Stripe.Converter do
external_account
file_upload
invoice
invoiceitem
line_item
list
oauth
Expand Down
5 changes: 1 addition & 4 deletions lib/stripe/payment_methods/card.ex
Original file line number Diff line number Diff line change
Expand Up @@ -114,10 +114,7 @@ defmodule Stripe.Card do
@doc """
Retrieve a card.
"""
@spec retrieve(Stripe.id() | t, params, Stripe.options()) :: {:ok, t} | {:error, Stripe.Error.t()}
when params: %{
:id => String.t(),
}
@spec retrieve(Stripe.id() | t, map, Stripe.options()) :: {:ok, t} | {:error, Stripe.Error.t()}
def retrieve(id, %{customer: _} = params, opts \\ []) do
endpoint = params |> plural_endpoint()

Expand Down
59 changes: 35 additions & 24 deletions lib/stripe/subscriptions/invoice.ex
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,15 @@ defmodule Stripe.Invoice do
application_fee: integer | nil,
attempt_count: non_neg_integer,
attempted: boolean,
billing: String.t() | nil,
charge: Stripe.id() | Stripe.Charge.t() | nil,
closed: boolean,
currency: String.t(),
customer: Stripe.id() | Stripe.Customer.t(),
date: Stripe.timestamp(),
description: String.t() | nil,
discount: Stripe.Discount.t() | nil,
due_date: Stripe.timestamp() | nil,
ending_balance: integer | nil,
forgiven: boolean,
lines: Stripe.List.t(Stripe.LineItem.t()),
Expand Down Expand Up @@ -58,13 +60,15 @@ defmodule Stripe.Invoice do
:application_fee,
:attempt_count,
:attempted,
:billing,
:charge,
:closed,
:currency,
:customer,
:date,
:description,
:discount,
:due_date,
:ending_balance,
:forgiven,
:lines,
Expand Down Expand Up @@ -93,14 +97,16 @@ defmodule Stripe.Invoice do
"""
@spec create(params, Stripe.options()) :: {:ok, t} | {:error, Stripe.Error.t()}
when params: %{
application_fee: integer,
description: String.t(),
metadata: %{
optional(String.t()) => String.t()
},
statement_descriptor: String.t(),
subscription: Stripe.id() | Stripe.Subscription.t(),
tax_percent: integer | nil
optional(:application_fee) => integer,
optional(:billing) => String.t(),
:customer => Stripe.id() | Stripe.Customer.t(),
optional(:days_until_due) => integer,
optional(:description) => String.t(),
optional(:due_date) => String.timestamp(),
optional(:metadata) => Stripe.Types.metadata(),
optional(:statement_descriptor) => String.t(),
optional(:subscription) => Stripe.id() | Stripe.Subscription.t(),
optional(:tax_percent) => integer
} | %{}
def create(params, opts \\ []) do
new_request(opts)
Expand Down Expand Up @@ -129,15 +135,16 @@ defmodule Stripe.Invoice do
"""
@spec update(Stripe.id() | t, params, Stripe.options()) :: {:ok, t} | {:error, Stripe.Error.t()}
when params: %{
application_fee: integer,
closed: boolean,
description: String.t(),
forgiven: true,
metadata: %{
optional(String.t()) => String.t()
},
statement_descriptor: String.t(),
tax_percent: integer | nil
optional(:application_fee) => integer,
optional(:closed) => boolean,
optional(:days_until_due) => integer,
optional(:description) => String.t(),
optional(:due_date) => String.timestamp(),
optional(:forgiven) => boolean,
optional(:metadata) => Stripe.Types.metadata(),
optional(:paid) => boolean,
optional(:statement_descriptor) => String.t(),
optional(:tax_percent) => integer
} | %{}
def update(id, params, opts \\ []) do
new_request(opts)
Expand All @@ -164,12 +171,14 @@ defmodule Stripe.Invoice do
"""
@spec list(params, Stripe.options()) :: {:ok, Stripe.List.t(t)} | {:error, Stripe.Error.t()}
when params: %{
customer: Stripe.Customer.t() | Stripe.id(),
date: Stripe.date_query(),
ending_before: t | Stripe.id(),
limit: 1..100,
starting_after: t | Stripe.id(),
subscription: Stripe.Subscription.t() | Stripe.id()
optional(:billing) => String.t(),
optional(:customer) => Stripe.id() | Stripe.Customer.t(),
optional(:date) => Stripe.date_query(),
optional(:due_date) => String.timestamp(),
optional(:ending_before) => t | Stripe.id(),
optional(:limit) => 1..100,
optional(:starting_after) => t | Stripe.id(),
optional(:subscription) => Stripe.id() | Stripe.Subscription.t()
} | %{}
def list(params \\ %{}, opts \\ []) do
new_request(opts)
Expand All @@ -185,7 +194,9 @@ defmodule Stripe.Invoice do
"""
@spec pay(Stripe.id() | t, params, Stripe.options()) :: {:ok, t} | {:error, Stripe.Error.t()}
when params: %{
source: Stripe.id() | Stripe.Source.t() | nil
:id => String.t(),
optional(:forgive) => boolean,
optional(:source) => Stripe.id() | Stripe.Source.t() | nil
} | %{}
def pay(id, params, opts \\ []) do
new_request(opts)
Expand Down
88 changes: 86 additions & 2 deletions lib/stripe/subscriptions/invoiceitem.ex
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ defmodule Stripe.Invoiceitem do
"""

use Stripe.Entity
import Stripe.Request

@type t :: %__MODULE__{
id: Stripe.id(),
Expand All @@ -30,7 +31,8 @@ defmodule Stripe.Invoiceitem do
proration: boolean,
quantity: integer,
subscription: Stripe.id() | Stripe.Subscription.t() | nil,
subscription_item: Stripe.id() | Stripe.SubscriptionItem.t() | nil
subscription_item: Stripe.id() | Stripe.SubscriptionItem.t() | nil,
unit_amount: integer
}

defstruct [
Expand All @@ -50,6 +52,88 @@ defmodule Stripe.Invoiceitem do
:proration,
:quantity,
:subscription,
:subscription_item
:subscription_item,
:unit_amount
]

@plural_endpoint "invoiceitems"

@doc """
Create an invoiceitem.
"""
@spec create(params, Stripe.options()) :: {:ok, t} | {:error, Stripe.Error.t()}
when params: %{
optional(:amount) => integer,
:currency => String.t(),
:customer => Stripe.id() | Stripe.Customer.t(),
optional(:description) => String.t(),
optional(:discountable) => boolean,
optional(:invoice) => Stripe.id() | Stripe.Invoice.t(),
optional(:metadata) => Stripe.Types.metadata(),
optional(:quantity) => integer,
optional(:subscription) => Stripe.id() | Stripe.Subscription.t(),
optional(:unit_amount) => integer
} | %{}
def create(params, opts \\ []) do
new_request(opts)
|> put_endpoint(@plural_endpoint)
|> put_params(params)
|> put_method(:post)
|> cast_to_id([:subscription])
|> make_request()
end

@doc """
Retrieve an invoiceitem.
"""
@spec retrieve(Stripe.id() | t, Stripe.options()) :: {:ok, t} | {:error, Stripe.Error.t()}
def retrieve(id, opts \\ []) do
new_request(opts)
|> put_endpoint(@plural_endpoint <> "/#{get_id!(id)}")
|> put_method(:get)
|> make_request()
end

@doc """
Update an invoiceitem.
Takes the `id` and a map of changes.
"""
@spec update(Stripe.id() | t, params, Stripe.options()) :: {:ok, t} | {:error, Stripe.Error.t()}
when params: %{
optional(:amount) => integer,
optional(:description) => String.t(),
optional(:discountable) => boolean,
optional(:metadata) => Stripe.Types.metadata(),
optional(:quantity) => integer,
optional(:unit_amount) => integer
} | %{}
def update(id, params, opts \\ []) do
new_request(opts)
|> put_endpoint(@plural_endpoint <> "/#{get_id!(id)}")
|> put_method(:post)
|> put_params(params)
|> make_request()
end

@doc """
List all invoiceitems.
"""
@spec list(params, Stripe.options()) :: {:ok, Stripe.List.t(t)} | {:error, Stripe.Error.t()}
when params: %{
optional(:created) => String.timestamp(),
optional(:customer) => Stripe.id() | Stripe.Customer.t(),
optional(:ending_before) => t | Stripe.id(),
optional(:invoice) => Stripe.id() | Stripe.Invoice.t(),
optional(:limit) => 1..100,
optional(:starting_after) => t | Stripe.id()
} | %{}
def list(params \\ %{}, opts \\ []) do
new_request(opts)
|> put_endpoint(@plural_endpoint)
|> put_method(:get)
|> put_params(params)
|> cast_to_id([:customer, :ending_before, :starting_after])
|> make_request()
end
end
34 changes: 34 additions & 0 deletions test/stripe/subscriptions/invoiceitem_test.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
defmodule Stripe.InvoiceitemTest do
use Stripe.StripeCase, async: true

describe "create/2" do
test "creates an invoice" do
assert {:ok, %Stripe.Invoiceitem{}} = Stripe.Invoiceitem.create(%{customer: "cus_123", currency: "usd"})
assert_stripe_requested(:post, "/v1/invoiceitems")
end
end

describe "retrieve/2" do
test "retrieves an invoice" do
assert {:ok, %Stripe.Invoiceitem{}} = Stripe.Invoiceitem.retrieve("in_1234")
assert_stripe_requested(:get, "/v1/invoiceitems/in_1234")
end
end

describe "update/2" do
test "updates an invoice" do
params = %{metadata: %{key: "value"}}
assert {:ok, %Stripe.Invoiceitem{}} = Stripe.Invoiceitem.update("in_1234", params)
assert_stripe_requested(:post, "/v1/invoiceitems/in_1234")
end
end

describe "list/2" do
test "lists all invoiceitems" do
assert {:ok, %Stripe.List{data: invoiceitems}} = Stripe.Invoiceitem.list()
assert_stripe_requested(:get, "/v1/invoiceitems")
assert is_list(invoiceitems)
assert %Stripe.Invoiceitem{} = hd(invoiceitems)
end
end
end
42 changes: 42 additions & 0 deletions test/stripe/subscriptions/product_test.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
defmodule Stripe.ProductTest do
use Stripe.StripeCase, async: true

describe "create/2" do
test "creates an invoice" do
assert {:ok, %Stripe.Product{}} = Stripe.Product.create(%{name: "Plus", type: "service"})
assert_stripe_requested(:post, "/v1/products")
end
end

describe "retrieve/2" do
test "retrieves an invoice" do
assert {:ok, %Stripe.Product{}} = Stripe.Product.retrieve("Plus")
assert_stripe_requested(:get, "/v1/products/Plus")
end
end

describe "update/2" do
test "updates an invoice" do
params = %{metadata: %{key: "value"}}
assert {:ok, %Stripe.Product{}} = Stripe.Product.update("Plus", params)
assert_stripe_requested(:post, "/v1/products/Plus")
end
end

describe "list/2" do
test "lists all products" do
assert {:ok, %Stripe.List{data: products}} = Stripe.Product.list()
assert_stripe_requested(:get, "/v1/products")
assert is_list(products)
assert %Stripe.Product{} = hd(products)
end
end

describe "delete/1" do
test "deletes a product" do
{:ok, product} = Stripe.Product.retrieve("Plus")
assert {:ok, _} = Stripe.Product.delete("Plus")
assert_stripe_requested(:delete, "/v1/products/#{product.id}")
end
end
end
1 change: 1 addition & 0 deletions test/stripe/util_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ defmodule Stripe.UtilTest do
assert object_name_to_module("external_account") == Stripe.ExternalAccount
assert object_name_to_module("file_upload") == Stripe.FileUpload
assert object_name_to_module("invoice") == Stripe.Invoice
assert object_name_to_module("invoiceitem") == Stripe.Invoiceitem
assert object_name_to_module("line_item") == Stripe.LineItem
assert object_name_to_module("list") == Stripe.List
assert object_name_to_module("plan") == Stripe.Plan
Expand Down

0 comments on commit 464687e

Please sign in to comment.