Skip to content

Commit

Permalink
feat(bank-accounts): adds bank accounts resource, refactors tests ENG…
Browse files Browse the repository at this point in the history
…-5294 (#5)
  • Loading branch information
itsachen committed Jan 22, 2018
1 parent 768e88d commit 03c11d2
Show file tree
Hide file tree
Showing 3 changed files with 153 additions and 17 deletions.
15 changes: 15 additions & 0 deletions lib/lob/bank_account.ex
@@ -0,0 +1,15 @@
defmodule Lob.BankAccount do
@moduledoc """
Module implementing the Lob bank accounts API.
"""

use Lob.ResourceBase, endpoint: "bank_accounts", methods: [:create, :retrieve, :list, :delete]

@spec verify(String.t, map, map) :: Client.response
def verify(id, data, headers \\ %{}) do
Client.post_request(verify_url(id), Util.build_body(data), Util.build_headers(headers))
end

defp verify_url(resource_id), do: "#{resource_url(resource_id)}/verify"

end
97 changes: 97 additions & 0 deletions test/lob/bank_account_test.exs
@@ -0,0 +1,97 @@
defmodule Lob.BankAccountTest do
use ExUnit.Case

alias Lob.BankAccount

setup do
%{
sample_bank_account: %{
routing_number: "122100024",
account_number: "123456789",
account_type: "company",
signatory: "John Doe"
}
}
end

describe "list/2" do

test "lists bank accounts" do
{:ok, bank_accounts, _headers} = BankAccount.list()
assert bank_accounts.object == "list"
end

test "includes total count" do
{:ok, bank_accounts, _headers} = BankAccount.list(%{include: ["total_count"]})
assert Map.get(bank_accounts, :total_count) != nil
end

test "lists by limit" do
{:ok, bank_accounts, _headers} = BankAccount.list(%{limit: 2})
assert bank_accounts.count == 2
end

test "filters by metadata" do
{:ok, bank_accounts, _headers} = BankAccount.list(%{metadata: %{foo: "bar"}})
assert bank_accounts.count == 1
end

end

describe "retrieve/2" do

test "retrieves a bank account", %{sample_bank_account: sample_bank_account} do
{:ok, created_bank_account, _headers} = BankAccount.create(sample_bank_account)

{:ok, retrieved_bank_account, _headers} = BankAccount.retrieve(created_bank_account.id)
assert retrieved_bank_account.account_number == created_bank_account.account_number
end

end

describe "create/2" do

test "creates a bank account", %{sample_bank_account: sample_bank_account} do
{:ok, created_bank_account, headers} = BankAccount.create(sample_bank_account)

assert created_bank_account.account_number == sample_bank_account.account_number
assert Enum.member?(headers, {"X-Rate-Limit-Limit", "150"})
end

test "creates a bank account with metadata", %{sample_bank_account: sample_bank_account} do
{:ok, created_bank_account, headers} =
sample_bank_account
|> Map.merge(%{metadata: %{key: "value"}})
|> BankAccount.create

assert created_bank_account.account_number == sample_bank_account.account_number
assert Enum.member?(headers, {"X-Rate-Limit-Limit", "150"})
end

end

describe "delete/2" do

test "deletes a bank account", %{sample_bank_account: sample_bank_account} do
{:ok, created_bank_account, _headers} = BankAccount.create(sample_bank_account)

{:ok, deleted_bank_account, _headers} = BankAccount.delete(created_bank_account.id)
assert deleted_bank_account.id == created_bank_account.id
assert deleted_bank_account.deleted == true
end

end

describe "verify/3" do

test "verifies a bank account", %{sample_bank_account: sample_bank_account} do
{:ok, created_bank_account, _headers} = BankAccount.create(sample_bank_account)

{:ok, verified_bank_account, _headers} = BankAccount.verify(created_bank_account.id, %{amounts: [12, 34]})
assert created_bank_account.id == verified_bank_account.id
assert verified_bank_account.verified == true
end

end

end
58 changes: 41 additions & 17 deletions test/lob/check_test.exs
Expand Up @@ -2,6 +2,7 @@ defmodule Lob.CheckTest do
use ExUnit.Case

alias Lob.Address
alias Lob.BankAccount
alias Lob.Check

setup do
Expand All @@ -16,15 +17,21 @@ defmodule Lob.CheckTest do
address_zip: "94107"
}

sample_bank_account = %{
routing_number: "122100024",
account_number: "123456789",
account_type: "company",
signatory: "John Doe"
}

sample_check = %{
description: "Library Test Check #{DateTime.utc_now |> DateTime.to_string}",
amount: 100
}

# TODO(anthony): Once bank account API is added to wrapper, replace this ID with a created bank account
%{
test_bank_account_id: "bank_ffbb58dbc5a51d8",
sample_address: sample_address,
sample_bank_account: sample_bank_account,
sample_check: sample_check
}
end
Expand Down Expand Up @@ -55,15 +62,16 @@ defmodule Lob.CheckTest do

describe "retrieve/2" do

test "retrieves a check", %{sample_address: sample_address, test_bank_account_id: test_bank_account_id, sample_check: sample_check} do
test "retrieves a check", %{sample_address: sample_address, sample_bank_account: sample_bank_account, sample_check: sample_check} do
{:ok, created_address, _headers} = Address.create(sample_address)
{:ok, verified_bank_account, _headers} = create_and_verify_bank_account(sample_bank_account)

{:ok, created_check, _headers} =
Check.create(%{
description: sample_check.description,
to: created_address.id,
from: created_address.id,
bank_account: test_bank_account_id,
bank_account: verified_bank_account.id,
amount: 42
})

Expand All @@ -75,45 +83,49 @@ defmodule Lob.CheckTest do

describe "create/2" do

test "creates a check with address_id", %{sample_address: sample_address, test_bank_account_id: test_bank_account_id, sample_check: sample_check} do
test "creates a check with address_id", %{sample_address: sample_address, sample_bank_account: sample_bank_account, sample_check: sample_check} do
{:ok, created_address, _headers} = Address.create(sample_address)
{:ok, verified_bank_account, _headers} = create_and_verify_bank_account(sample_bank_account)

{:ok, created_check, headers} =
Check.create(%{
description: sample_check.description,
to: created_address.id,
from: created_address.id,
bank_account: test_bank_account_id,
bank_account: verified_bank_account.id,
amount: 42
})

assert created_check.description == sample_check.description
assert Enum.member?(headers, {"X-Rate-Limit-Limit", "150"})
end

test "creates a check with address params", %{sample_check: sample_check, test_bank_account_id: test_bank_account_id, sample_address: sample_address} do
test "creates a check with address params", %{sample_check: sample_check, sample_bank_account: sample_bank_account, sample_address: sample_address} do
{:ok, verified_bank_account, _headers} = create_and_verify_bank_account(sample_bank_account)

{:ok, created_check, headers} =
Check.create(%{
description: sample_check.description,
to: sample_address,
from: sample_address,
bank_account: test_bank_account_id,
bank_account: verified_bank_account.id,
amount: 42
})

assert created_check.description == sample_check.description
assert Enum.member?(headers, {"X-Rate-Limit-Limit", "150"})
end

test "creates a check with logo, attachment and check bottom as URL", %{sample_address: sample_address, test_bank_account_id: test_bank_account_id, sample_check: sample_check} do
test "creates a check with logo, attachment and check bottom as URL", %{sample_address: sample_address, sample_bank_account: sample_bank_account, sample_check: sample_check} do
{:ok, created_address, _headers} = Address.create(sample_address)
{:ok, verified_bank_account, _headers} = create_and_verify_bank_account(sample_bank_account)

{:ok, created_check, headers} =
Check.create(%{
description: sample_check.description,
to: created_address.id,
from: created_address.id,
bank_account: test_bank_account_id,
bank_account: verified_bank_account.id,
amount: 42,
logo: "http://via.placeholder.com/100x100",
check_bottom: "https://s3-us-west-2.amazonaws.com/lob-assets/letter-goblue.pdf",
Expand All @@ -124,15 +136,16 @@ defmodule Lob.CheckTest do
assert Enum.member?(headers, {"X-Rate-Limit-Limit", "150"})
end

test "creates a check with logo as PNG and attachment and check bottom as PDF", %{sample_address: sample_address, test_bank_account_id: test_bank_account_id, sample_check: sample_check} do
test "creates a check with logo as PNG and attachment and check bottom as PDF", %{sample_address: sample_address, sample_bank_account: sample_bank_account, sample_check: sample_check} do
{:ok, created_address, _headers} = Address.create(sample_address)
{:ok, verified_bank_account, _headers} = create_and_verify_bank_account(sample_bank_account)

{:ok, created_check, headers} =
Check.create(%{
description: sample_check.description,
to: created_address.id,
from: created_address.id,
bank_account: test_bank_account_id,
bank_account: verified_bank_account.id,
amount: 42,
logo: %{local_path: "test/assets/logo.png"},
check_bottom: %{local_path: "test/assets/8.5x11.pdf"},
Expand All @@ -143,16 +156,18 @@ defmodule Lob.CheckTest do
assert Enum.member?(headers, {"X-Rate-Limit-Limit", "150"})
end

test "creates a check with an idempotency key", %{sample_address: sample_address, test_bank_account_id: test_bank_account_id, sample_check: sample_check} do
test "creates a check with an idempotency key", %{sample_address: sample_address, sample_bank_account: sample_bank_account, sample_check: sample_check} do
{:ok, created_address, _headers} = Address.create(sample_address)
{:ok, verified_bank_account, _headers} = create_and_verify_bank_account(sample_bank_account)

idempotency_key = UUID.uuid4()

{:ok, created_check, _headers} =
Check.create(%{
description: sample_check.description,
to: created_address.id,
from: created_address.id,
bank_account: test_bank_account_id,
bank_account: verified_bank_account.id,
amount: 42
}, %{
"Idempotency-Key" => idempotency_key
Expand All @@ -163,7 +178,7 @@ defmodule Lob.CheckTest do
description: "Duplicated Check",
to: created_address.id,
from: created_address.id,
bank_account: test_bank_account_id,
bank_account: verified_bank_account.id,
amount: 42
}, %{
"Idempotency-Key" => idempotency_key
Expand All @@ -176,15 +191,16 @@ defmodule Lob.CheckTest do

describe "delete/2" do

test "deletes a check", %{sample_address: sample_address, test_bank_account_id: test_bank_account_id, sample_check: sample_check} do
test "deletes a check", %{sample_address: sample_address, sample_bank_account: sample_bank_account, sample_check: sample_check} do
{:ok, created_address, _headers} = Address.create(sample_address)
{:ok, verified_bank_account, _headers} = create_and_verify_bank_account(sample_bank_account)

{:ok, created_check, _headers} =
Check.create(%{
description: sample_check.description,
to: created_address.id,
from: created_address.id,
bank_account: test_bank_account_id,
bank_account: verified_bank_account.id,
amount: 42
})

Expand All @@ -195,4 +211,12 @@ defmodule Lob.CheckTest do

end

defp create_and_verify_bank_account(payload) do
payload
|> BankAccount.create()
|> elem(1)
|> Map.get(:id)
|> BankAccount.verify(%{amounts: [12, 34]})
end

end

0 comments on commit 03c11d2

Please sign in to comment.