Skip to content

Commit 83f8059

Browse files
committed
Add ability to set mock values for authy provider
1 parent e862f32 commit 83f8059

File tree

5 files changed

+57
-8
lines changed

5 files changed

+57
-8
lines changed

README.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ The package can be installed by adding `phone_verification` to your list of depe
1010
def deps do
1111
[
1212
{:jason, "~> 1.1"}, # or any other JSON library
13-
{:phone_verification, "~> 0.1.0"}
13+
{:phone_verification, "~> 0.3.0"}
1414
]
1515
end
1616
```
@@ -24,7 +24,8 @@ config :phone_verification,
2424

2525
config :phone_verification, PhoneVerification.Provider.Authy,
2626
json_codec: Jason,
27-
api_key: System.get_env("AUTHY_API_KEY")
27+
api_key: System.get_env("AUTHY_API_KEY"),
28+
mocks: %{}
2829
```
2930

3031
## Usage

config/config.exs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,6 @@ config :phone_verification,
88

99
config :phone_verification, PhoneVerification.Provider.Authy,
1010
# json_codec: Jason,
11-
api_key: System.get_env("AUTHY_API_KEY")
11+
api_key: System.get_env("AUTHY_API_KEY"),
12+
# example: %{ "+380001234567" => "0000", "+380001234568" => "1234" }
13+
mocks: %{}

lib/phone_verification.ex

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,31 @@ defmodule PhoneVerification do
77
Application.get_env(:phone_verification, key)
88
end
99

10+
@spec start(%{
11+
required(:phone_number) => PhoneVerification.PhoneNumber.t(),
12+
required(:via) => :sms | :call,
13+
optional(:locale) => String.t(),
14+
optional(:code_length) => non_neg_integer(),
15+
optional(:custom_code) => PhoneVerification.verification_code()
16+
}) ::
17+
{:ok,
18+
%{
19+
message: String.t(),
20+
carrier: String.t(),
21+
seconds_to_expire: non_neg_integer()
22+
}}
23+
| {:error, %{message: String.t(), code: non_neg_integer()}}
1024
def start(params) do
1125
config(:default)
1226
|> Enum.into(%{})
1327
|> Map.merge(params)
1428
|> config(:provider).start()
1529
end
1630

31+
@spec check(%{
32+
required(:phone_number) => PhoneVerification.PhoneNumber.t(),
33+
required(:verification_code) => PhoneVerification.verification_code()
34+
}) :: {:ok, %{message: String.t()}} | {:error, %{message: String.t(), code: String.t()}}
1735
def check(params) do
1836
config(:provider).check(params)
1937
end

lib/phone_verification/provider/authy.ex

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,33 @@ defmodule PhoneVerification.Provider.Authy do
22
@behaviour PhoneVerification.Provider
33

44
@base_url "https://api.authy.com/protected/json/phones/verification/"
5+
# actually, it can be infinity, but we have to return a number
6+
@expiration_time_for_mock_phone_number_security_code 600
57

8+
@mock_carrier "life:) - Astelit"
69
@supported_keys [:phone_number, :country_code, :via, :locale, :code_length, :custom_code]
710
@impl true
8-
def start(params) do
9-
request(:post, "start", transform_params(params, @supported_keys))
11+
def start(%{phone_number: phone_number} = params) do
12+
if mock_number?(phone_number) do
13+
{:ok,
14+
%{
15+
seconds_to_expire: @expiration_time_for_mock_phone_number_security_code,
16+
message: "Requested verification using mock: #{phone_number}.",
17+
carrier: @mock_carrier
18+
}}
19+
else
20+
request(:post, "start", transform_params(params, @supported_keys))
21+
end
1022
end
1123

1224
@supported_keys [:phone_number, :country_code, :verification_code]
1325
@impl true
14-
def check(params) do
15-
request(:get, "check", transform_params(params, @supported_keys))
26+
def check(%{phone_number: phone_number} = params) do
27+
if mock_number?(phone_number) do
28+
check_mock_number(params)
29+
else
30+
request(:get, "check", transform_params(params, @supported_keys))
31+
end
1632
end
1733

1834
defp request(method, action, params) do
@@ -77,4 +93,16 @@ defmodule PhoneVerification.Provider.Authy do
7793
|> PhoneVerification.config()
7894
|> Keyword.fetch!(key)
7995
end
96+
97+
defp mock_number?(phone_number) do
98+
!is_nil(config(:mocks)[to_string(phone_number)])
99+
end
100+
101+
defp check_mock_number(%{phone_number: phone_number, verification_code: code}) do
102+
if config(:mocks)[to_string(phone_number)] == code do
103+
{:ok, %{message: "Verification code is correct."}}
104+
else
105+
{:error, %{message: "Verification code is incorrect", code: 60_022}}
106+
end
107+
end
80108
end

mix.exs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ defmodule PhoneVerification.MixProject do
44
def project do
55
[
66
app: :phone_verification,
7-
version: "0.2.0",
7+
version: "0.3.0",
88
elixir: "~> 1.3",
99
start_permanent: Mix.env() == :prod,
1010
description: description(),

0 commit comments

Comments
 (0)