lib/mock_stripe/customer.ex

defmodule MockStripe.Customer do
  defstruct [
    :created,
    :default_source,
    :email,
    :id,
    :name,
    :object
  ]

  alias MockStripe.List
  alias MockStripe.Customer

  def create(attrs \\ %{}) do
    {:ok,
     retrieve()
     |> Map.merge(attrs)}
  end

  def retrieve() do
    stripe_id = "cus_#{MockStripe.token()}"
    retrieve(stripe_id)
  end

  def retrieve("cus_" <> _ = stripe_id) do
    %Customer{
      created: 1_600_892_385,
      email: "andreas@codered.se",
      id: stripe_id,
      name: "Andreas Eriksson",
      object: "customer"
    }
  end

  def list(_attrs \\ %{}) do
    {:ok,
     %List{
       data: [
         retrieve()
       ],
       has_more: false,
       object: "list",
       total_count: nil,
       url: "/v1/customers"
     }}
  end

  def update(customer_stripe_id, attrs) do
    {:ok,
     retrieve()
     |> Map.merge(%{id: customer_stripe_id})
     |> Map.merge(attrs)}
  end
end