From 626170ad4ee4aa0be91ceabdd746e65fdd9ea496 Mon Sep 17 00:00:00 2001 From: Morgan Sadr-Hashemi Date: Thu, 6 Aug 2020 16:39:58 +0100 Subject: [PATCH] Handle 404 not found errors (#116) * Bump Elixir version * Handle 404 not found errors This can happen when you try and run an action against a lead that doesn't exist. * Bump major version Dropping support for Elixir 1.9 in this PR * Bump elixir version on CI --- .circleci/config.yml | 2 +- .tool-versions | 5 +-- lib/closex/http_client.ex | 4 ++ mix.exs | 4 +- mix.lock | 6 +-- .../vcr_cassettes/merge_leads_not_found.json | 42 +++++++++++++++++++ test/http_client_test.exs | 38 +++++++++++++++++ 7 files changed, 92 insertions(+), 9 deletions(-) create mode 100644 test/fixtures/vcr_cassettes/merge_leads_not_found.json diff --git a/.circleci/config.yml b/.circleci/config.yml index 24a0fe9..44b3fb2 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -3,7 +3,7 @@ jobs: build: working_directory: ~/closex docker: - - image: elixir:1.6 + - image: elixir:1.10 environment: COVERALLS_REPO_TOKEN: 3T8c9tUBXMAmGPmnBO1SUv7xGFr32gbLs MIX_ENV: test diff --git a/.tool-versions b/.tool-versions index 9093daa..f99b5d1 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1,3 +1,2 @@ -elixir 1.9.0 -erlang 22.0.5 - +elixir 1.10.3 +erlang 22.3.4 diff --git a/lib/closex/http_client.ex b/lib/closex/http_client.ex index 80a1eec..9d289af 100644 --- a/lib/closex/http_client.ex +++ b/lib/closex/http_client.ex @@ -288,6 +288,10 @@ defmodule Closex.HTTPClient do {:error, response} end + defp handle_response({:ok, response = %{status_code: 404}}) do + {:error, response} + end + defp handle_response({:ok, response = %{status_code: 429}}) do {:error, response} end diff --git a/mix.exs b/mix.exs index 3b64b8f..c112c81 100644 --- a/mix.exs +++ b/mix.exs @@ -4,13 +4,13 @@ defmodule Closex.Mixfile do def project do [ app: :closex, - version: "1.4.7", + version: "2.0.0", build_path: "_build", config_path: "config/config.exs", deps_path: "deps", lockfile: "mix.lock", elixirc_paths: elixirc_paths(Mix.env()), - elixir: "~> 1.6", + elixir: "~> 1.10", description: description(), package: package(), deps: deps(), diff --git a/mix.lock b/mix.lock index a79836f..7e74336 100644 --- a/mix.lock +++ b/mix.lock @@ -7,8 +7,8 @@ "exjsx": {:hex, :exjsx, "4.0.0", "60548841e0212df401e38e63c0078ec57b33e7ea49b032c796ccad8cde794b5c", [:mix], [{:jsx, "~> 2.8.0", [hex: :jsx, repo: "hexpm", optional: false]}], "hexpm", "32e95820a97cffea67830e91514a2ad53b888850442d6d395f53a1ac60c82e07"}, "exvcr": {:hex, :exvcr, "0.10.3", "1ae3b97560430acfa88ebc737c85b2b7a9dbacd8a2b26789a19718b51ae3522c", [:mix], [{:exactor, "~> 2.2", [hex: :exactor, repo: "hexpm", optional: false]}, {:exjsx, "~> 4.0", [hex: :exjsx, repo: "hexpm", optional: false]}, {:httpoison, "~> 1.0", [hex: :httpoison, repo: "hexpm", optional: true]}, {:httpotion, "~> 3.1", [hex: :httpotion, repo: "hexpm", optional: true]}, {:ibrowse, "~> 4.4", [hex: :ibrowse, repo: "hexpm", optional: true]}, {:meck, "~> 0.8", [hex: :meck, repo: "hexpm", optional: false]}], "hexpm", "484d856d5f4f6a1ba3a691b82fcd29c0a46cb56eb6ddfd2b1d7aca1061a46ec0"}, "file_system": {:hex, :file_system, "0.2.6", "fd4dc3af89b9ab1dc8ccbcc214a0e60c41f34be251d9307920748a14bf41f1d3", [:mix], [], "hexpm", "0d50da6b04c58e101a3793b1600f9a03b86e3a8057b192ac1766013d35706fa6"}, - "hackney": {:hex, :hackney, "1.15.2", "07e33c794f8f8964ee86cebec1a8ed88db5070e52e904b8f12209773c1036085", [:rebar3], [{:certifi, "2.5.1", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "6.0.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "1.0.1", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~>1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "1.1.5", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}], "hexpm"}, - "httpoison": {:hex, :httpoison, "1.6.2", "ace7c8d3a361cebccbed19c283c349b3d26991eff73a1eaaa8abae2e3c8089b6", [:mix], [{:hackney, "~> 1.15 and >= 1.15.2", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm"}, + "hackney": {:hex, :hackney, "1.15.2", "07e33c794f8f8964ee86cebec1a8ed88db5070e52e904b8f12209773c1036085", [:rebar3], [{:certifi, "2.5.1", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "6.0.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "1.0.1", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~>1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "1.1.5", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}], "hexpm", "e0100f8ef7d1124222c11ad362c857d3df7cb5f4204054f9f0f4a728666591fc"}, + "httpoison": {:hex, :httpoison, "1.6.2", "ace7c8d3a361cebccbed19c283c349b3d26991eff73a1eaaa8abae2e3c8089b6", [:mix], [{:hackney, "~> 1.15 and >= 1.15.2", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "aa2c74bd271af34239a3948779612f87df2422c2fdcfdbcec28d9c105f0773fe"}, "idna": {:hex, :idna, "6.0.0", "689c46cbcdf3524c44d5f3dde8001f364cd7608a99556d8fbd8239a5798d4c10", [:rebar3], [{:unicode_util_compat, "0.4.1", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "4bdd305eb64e18b0273864920695cb18d7a2021f31a11b9c5fbcd9a253f936e2"}, "jason": {:hex, :jason, "1.1.2", "b03dedea67a99223a2eaf9f1264ce37154564de899fd3d8b9a21b1a6fd64afe7", [:mix], [{:decimal, "~> 1.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "fdf843bca858203ae1de16da2ee206f53416bbda5dc8c9e78f43243de4bc3afe"}, "jsx": {:hex, :jsx, "2.8.3", "a05252d381885240744d955fbe3cf810504eb2567164824e19303ea59eef62cf", [:mix, :rebar3], [], "hexpm", "fc3499fed7a726995aa659143a248534adc754ebd16ccd437cd93b649a95091f"}, @@ -20,6 +20,6 @@ "mix_test_watch": {:hex, :mix_test_watch, "0.9.0", "c72132a6071261893518fa08e121e911c9358713f62794a90c95db59042af375", [:mix], [{:file_system, "~> 0.2.1 or ~> 0.3", [hex: :file_system, repo: "hexpm", optional: false]}], "hexpm", "817dec4a7f6edf260258002f99ac8ffaf7a8f395b27bf2d13ec24018beecec8a"}, "nimble_parsec": {:hex, :nimble_parsec, "0.5.0", "90e2eca3d0266e5c53f8fbe0079694740b9c91b6747f2b7e3c5d21966bba8300", [:mix], [], "hexpm", "5c040b8469c1ff1b10093d3186e2e10dbe483cd73d79ec017993fb3985b8a9b3"}, "parse_trans": {:hex, :parse_trans, "3.3.0", "09765507a3c7590a784615cfd421d101aec25098d50b89d7aa1d66646bc571c1", [:rebar3], [], "hexpm", "17ef63abde837ad30680ea7f857dd9e7ced9476cdd7b0394432af4bfc241b960"}, - "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.5", "6eaf7ad16cb568bb01753dbbd7a95ff8b91c7979482b95f38443fe2c8852a79b", [:make, :mix, :rebar3], [], "hexpm"}, + "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.5", "6eaf7ad16cb568bb01753dbbd7a95ff8b91c7979482b95f38443fe2c8852a79b", [:make, :mix, :rebar3], [], "hexpm", "13104d7897e38ed7f044c4de953a6c28597d1c952075eb2e328bc6d6f2bfc496"}, "unicode_util_compat": {:hex, :unicode_util_compat, "0.4.1", "d869e4c68901dd9531385bb0c8c40444ebf624e60b6962d95952775cac5e90cd", [:rebar3], [], "hexpm", "1d1848c40487cdb0b30e8ed975e34e025860c02e419cb615d255849f3427439d"}, } diff --git a/test/fixtures/vcr_cassettes/merge_leads_not_found.json b/test/fixtures/vcr_cassettes/merge_leads_not_found.json new file mode 100644 index 0000000..33caa93 --- /dev/null +++ b/test/fixtures/vcr_cassettes/merge_leads_not_found.json @@ -0,0 +1,42 @@ +[ + { + "request": { + "body": "{\"destination\":\"dont_find_me\",\"source\":\"lead_8xlzqZBSz6iKJJLoZ82Fh2vqcUzretDDBClxTmWgLJ1\"}", + "headers": { + "Content-Type": "application/json", + "Accept": "application/json" + }, + "method": "post", + "options": { + "basic_auth": [ + "FAKE_CLOSEIO_TOKEN:", + "" + ] + }, + "request_body": "", + "url": "https://api.close.com/api/v1/lead/merge/" + }, + "response": { + "binary": false, + "body": "{\"errors\":[\"Source lead does not exist.\"]}\n", + "headers": { + "date": "Thu, 06 Aug 2020 15:17:36 GMT", + "content-type": "application/json", + "content-length": "43", + "x-frame-options": "SAMEORIGIN", + "x-rate-limit-limit": "320", + "x-rate-limit-remaining": "319", + "x-rate-limit-reset": "7.699090", + "x-xss-protection": "1; mode=block", + "x-content-type-options": "nosniff", + "strict-transport-security": "max-age=31556926; includeSubDomains", + "referrer-policy": "no-referrer-when-downgrade", + "set-cookie": "session=; Expires=Thu, 01-Jan-1970 00:00:00 GMT; Max-Age=0; Path=/", + "x-envoy-upstream-service-time": "51", + "server": "envoy" + }, + "status_code": 404, + "type": "ok" + } + } +] diff --git a/test/http_client_test.exs b/test/http_client_test.exs index 2eeb5f6..a06f8bd 100644 --- a/test/http_client_test.exs +++ b/test/http_client_test.exs @@ -897,6 +897,44 @@ defmodule Closex.HTTPClientTest do assert response == %{"status" => "ok"} end end + + test "returns an error if it can't find one of the leads" do + use_cassette "merge_leads_not_found" do + {:error, response} = merge_leads(@source_lead_id, "dont_find_me") + + assert response == %HTTPoison.Response{ + body: %{"errors" => ["Source lead does not exist."]}, + headers: [ + {"content-length", "43"}, + {"content-type", "application/json"}, + {"date", "Thu, 06 Aug 2020 15:17:36 GMT"}, + {"referrer-policy", "no-referrer-when-downgrade"}, + {"server", "envoy"}, + {"set-cookie", + "session=; Expires=Thu, 01-Jan-1970 00:00:00 GMT; Max-Age=0; Path=/"}, + {"strict-transport-security", "max-age=31556926; includeSubDomains"}, + {"x-content-type-options", "nosniff"}, + {"x-envoy-upstream-service-time", "51"}, + {"x-frame-options", "SAMEORIGIN"}, + {"x-rate-limit-limit", "320"}, + {"x-rate-limit-remaining", "319"}, + {"x-rate-limit-reset", "7.699090"}, + {"x-xss-protection", "1; mode=block"} + ], + request: %HTTPoison.Request{ + body: + "{\"destination\":\"dont_find_me\",\"source\":\"lead_8xlzqZBSz6iKJJLoZ82Fh2vqcUzretDDBClxTmWgLJ1\"}", + headers: [{"Content-Type", "application/json"}, {"Accept", "application/json"}], + method: :post, + options: [hackney: [basic_auth: {"FAKE_CLOSEIO_TOKEN", ""}]], + params: %{}, + url: "https://api.close.com/api/v1/lead/merge/" + }, + request_url: "https://api.close.com/api/v1/lead/merge/", + status_code: 404 + } + end + end end describe "log_call/1" do