lib/mock_stripe/product.ex

defmodule MockStripe.Product do
  defstruct [
    :created,
    :id,
    :name,
    :object,
    :updated,
    :active
  ]

  alias MockStripe.List
  alias MockStripe.Product

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

  def retrieve("prod_" <> _ = stripe_id) do
    %Product{
      created: 1_600_353_622,
      id: stripe_id,
      name: "Premium Plan",
      object: "product",
      updated: 1_600_798_919,
      active: true
    }
  end

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

  def create(attrs \\ %{}) do
    {:ok,
     %Product{
       created: 1_622_123_382,
       id: "prod_#{MockStripe.token()}",
       name: Map.get(attrs, :name, "Product Name"),
       object: "product",
       updated: 1_622_123_382,
       active: true
     }}
  end

  def update(stripe_id, attrs \\ %{}) do
    {:ok,
     %Product{
       created: 1_622_123_382,
       id: stripe_id,
       name: Map.get(attrs, :name, "Product Name"),
       object: "product",
       updated: 1_622_123_382,
       active: true
     }}
  end
end