Skip to content

Commit cfac33a

Browse files
authored
Merge pull request #140 from shore-gmbh/FEAT-add-customer-entitlement
feat: Add `CustomerEntitlement`
2 parents 6dff9ef + 7623d77 commit cfac33a

File tree

6 files changed

+201
-0
lines changed

6 files changed

+201
-0
lines changed

lib/chargebeex/builder.ex

+3
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ defmodule Chargebeex.Builder do
66
BillingAddress,
77
Card,
88
Customer,
9+
CustomerEntitlement,
910
Event,
1011
Invoice,
1112
HostedPage,
@@ -36,6 +37,7 @@ defmodule Chargebeex.Builder do
3637

3738
def build_resource(%{"subscription" => params}), do: Subscription.build(params)
3839
def build_resource(%{"customer" => params}), do: Customer.build(params)
40+
def build_resource(%{"customer_entitlement" => params}), do: CustomerEntitlement.build(params)
3941
def build_resource(%{"portal_session" => params}), do: PortalSession.build(params)
4042
def build_resource(%{"event" => params}), do: Event.build(params)
4143
def build_resource(%{"card" => params}), do: Card.build(params)
@@ -56,6 +58,7 @@ defmodule Chargebeex.Builder do
5658

5759
def build_resource("subscription", params), do: Subscription.build(params)
5860
def build_resource("customer", params), do: Customer.build(params)
61+
def build_resource("customer_entitlement", params), do: CustomerEntitlement.build(params)
5962
def build_resource("portal_session", params), do: PortalSession.build(params)
6063
def build_resource("event", params), do: Event.build(params)
6164
def build_resource("card", params), do: Card.build(params)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
defmodule Chargebeex.CustomerEntitlement do
2+
use TypedStruct
3+
4+
@resource "customer_entitlement"
5+
use Chargebeex.Resource, resource: @resource, only: []
6+
7+
@moduledoc """
8+
Struct that represent a Chargebee's API customer entitlement resource.
9+
"""
10+
11+
typedstruct do
12+
field :customer_id, String.t()
13+
field :subscription_id, String.t()
14+
field :feature_id, String.t()
15+
field :value, String.t()
16+
field :name, String.t()
17+
field :is_enabled, boolean()
18+
field :object, String.t()
19+
end
20+
21+
use ExConstructor, :build
22+
23+
@doc """
24+
Allows to list Customer Entitlements
25+
26+
Available filters can be found here: https://apidocs.chargebee.com/docs/api/customer_entitlements#list_customer_entitlements
27+
28+
## Examples
29+
30+
iex> filters = %{limit: 2}
31+
iex(2)> Chargebeex.CustomerEntitlement.list(filters)
32+
{:ok, [%Chargebeex.CustomerEntitlement{...}, %Chargebeex.CustomerEntitlement{...}], %{"next_offset" => nil}}
33+
"""
34+
def list(customer_id, params \\ %{}, opts \\ []) do
35+
nested_generic_action_without_id(
36+
:get,
37+
[customer: customer_id],
38+
@resource,
39+
"customer_entitlements",
40+
params,
41+
opts
42+
)
43+
end
44+
end

mix.exs

+1
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ defmodule Chargebeex.MixProject do
7474
Chargebeex.AttachedItem,
7575
Chargebeex.Card,
7676
Chargebeex.Customer,
77+
Chargebeex.CustomerEntitlement,
7778
Chargebeex.Event,
7879
Chargebeex.Invoice,
7980
Chargebeex.PortalSession,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
defmodule Chargebeex.Builder.CustomerEntitlementTest do
2+
use ExUnit.Case, async: true
3+
4+
alias Chargebeex.Builder
5+
alias Chargebeex.Fixtures.CustomerEntitlement, as: CustomerEntitlementFixture
6+
alias Chargebeex.CustomerEntitlement
7+
8+
describe "build/1" do
9+
test "should build an customer_entitlement" do
10+
builded =
11+
CustomerEntitlementFixture.retrieve()
12+
|> Jason.decode!()
13+
|> Builder.build()
14+
15+
assert %{"customer_entitlement" => %CustomerEntitlement{}} = builded
16+
end
17+
18+
test "should have the customer_entitlement params" do
19+
customer_entitlement =
20+
CustomerEntitlementFixture.retrieve()
21+
|> Jason.decode!()
22+
|> Builder.build()
23+
|> Map.get("customer_entitlement")
24+
25+
params = CustomerEntitlementFixture.customer_entitlement_params() |> Jason.decode!()
26+
27+
assert customer_entitlement.subscription_id == Map.get(params, "subscription_id")
28+
assert customer_entitlement.customer_id == Map.get(params, "customer_id")
29+
assert customer_entitlement.feature_id == Map.get(params, "feature_id")
30+
assert customer_entitlement.value == Map.get(params, "value")
31+
assert customer_entitlement.name == Map.get(params, "name")
32+
assert customer_entitlement.is_enabled == Map.get(params, "is_enabled")
33+
assert customer_entitlement.object == Map.get(params, "object")
34+
end
35+
end
36+
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
defmodule Chargebeex.CustomerEntitlementTest do
2+
use ExUnit.Case, async: true
3+
4+
import Hammox
5+
6+
alias Chargebeex.Fixtures.Common
7+
alias Chargebeex.CustomerEntitlement
8+
9+
setup :verify_on_exit!
10+
11+
describe "list" do
12+
test "with bad authentication should fail" do
13+
unauthorized = Common.unauthorized()
14+
15+
expect(
16+
Chargebeex.HTTPClientMock,
17+
:get,
18+
fn url, body, headers ->
19+
assert url ==
20+
"https://test-namespace.chargebee.com/api/v2/customers/customer_id/customer_entitlements"
21+
22+
assert headers == [{"Authorization", "Basic dGVzdF9jaGFyZ2VlYmVlX2FwaV9rZXk6"}]
23+
assert body == ""
24+
25+
{:ok, 401, [], Jason.encode!(unauthorized)}
26+
end
27+
)
28+
29+
assert {:error, 401, [], ^unauthorized} = CustomerEntitlement.list("customer_id")
30+
end
31+
32+
test "with no param, no offset should succeed" do
33+
expect(
34+
Chargebeex.HTTPClientMock,
35+
:get,
36+
fn url, body, headers ->
37+
assert url ==
38+
"https://test-namespace.chargebee.com/api/v2/customers/customer_id/customer_entitlements"
39+
40+
assert headers == [{"Authorization", "Basic dGVzdF9jaGFyZ2VlYmVlX2FwaV9rZXk6"}]
41+
assert body == ""
42+
43+
{:ok, 200, [],
44+
Jason.encode!(%{
45+
list: [%{customer_entitlement: %{}}, %{customer_entitlement: %{}}]
46+
})}
47+
end
48+
)
49+
50+
assert {:ok, [%CustomerEntitlement{}, %CustomerEntitlement{}], %{"next_offset" => nil}} =
51+
CustomerEntitlement.list("customer_id")
52+
end
53+
54+
test "with limit & offset params should succeed" do
55+
expect(
56+
Chargebeex.HTTPClientMock,
57+
:get,
58+
fn url, body, headers ->
59+
assert url ==
60+
"https://test-namespace.chargebee.com/api/v2/customers/customer_id/customer_entitlements?limit=1&feature_type%5Bis%5D=switch"
61+
62+
assert headers == [{"Authorization", "Basic dGVzdF9jaGFyZ2VlYmVlX2FwaV9rZXk6"}]
63+
assert body == ""
64+
65+
result = %{
66+
list: [%{customer_entitlement: %{customer_id: "customer_id"}}],
67+
next_offset: "bar"
68+
}
69+
70+
{:ok, 200, [], Jason.encode!(result)}
71+
end
72+
)
73+
74+
assert {:ok, [%CustomerEntitlement{}], %{"next_offset" => "bar"}} =
75+
CustomerEntitlement.list("customer_id", %{
76+
"feature_type[is]" => "switch",
77+
limit: 1
78+
})
79+
end
80+
end
81+
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
defmodule Chargebeex.Fixtures.CustomerEntitlement do
2+
def customer_entitlement_params() do
3+
"""
4+
{
5+
"customer_id": "cus01",
6+
"subscription_id": "sub123",
7+
"feature_id": "licenses",
8+
"feature_name": "Xero Integration",
9+
"value": "60",
10+
"name": "60 licenses",
11+
"is_enabled": true,
12+
"object": "customer_entitlement"
13+
}
14+
"""
15+
end
16+
17+
def retrieve() do
18+
"""
19+
{
20+
"customer_entitlement": #{customer_entitlement_params()}
21+
}
22+
"""
23+
end
24+
25+
def list() do
26+
"""
27+
{
28+
"list": [
29+
#{retrieve()},
30+
#{retrieve()}
31+
],
32+
"next_offset": "1612890918000"
33+
}
34+
"""
35+
end
36+
end

0 commit comments

Comments
 (0)