defmodule Braintree.Testing.TestTransaction do
@moduledoc """
Create transactions for testing purposes only.
Transition to settled, settlement_confirmed, or settlement_declined states.
"""
alias Braintree.ErrorResponse, as: Error
alias Braintree.HTTP
alias Braintree.Transaction
@doc """
Use a `transaction_id` to transition to settled status. This
allows for testing of refunds.
## Example
{:ok, transaction} = TestTransaction.settle(transaction_id: "123")
transaction.status # "settled"
"""
@spec settle(String.t()) :: {:ok, any} | {:error, Error.t()}
def settle(transaction_id) do
path = "transactions/#{transaction_id}/settle"
with {:ok, payload} <- HTTP.put(path), do: response(payload)
end
@doc """
Use a `transaction_id` to transition to settled_confirmed status
## Example
{:ok, transaction} = TestTransaction.settlement_confirm(
transaction_id: "123")
transaction.status # "settlement_confirmed"
"""
@spec settlement_confirm(String.t()) :: {:ok, any} | {:error, Error.t()}
def settlement_confirm(transaction_id) do
path = "transactions/#{transaction_id}/settlement_confirm"
with {:ok, payload} <- HTTP.put(path), do: response(payload)
end
@doc """
Use a `transaction_id` to transition to settlement_declined status
## Example
{:ok, transaction} = TestTransaction.settlement_decline(
transaction_id: "123")
transaction.status # "settlement_declined"
"""
@spec settlement_decline(String.t()) :: {:ok, any} | {:error, Error.t()}
def settlement_decline(transaction_id) do
path = "transactions/#{transaction_id}/settlement_decline"
with {:ok, payload} <- HTTP.put(path), do: response(payload)
end
defp response(%{"transaction" => map}) do
{:ok, Transaction.new(map)}
end
end