aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorkballou <kballou@devnulllabs.io>2016-11-12 18:14:24 -0700
committerkballou <kballou@devnulllabs.io>2016-11-14 11:19:49 -0700
commit141547d8440b024a240654960b8f3f55a31d8ede (patch)
tree1b3bfa811c68c6f7fa1c557b31ffdc9e6804e30f /lib
parent011abb47be01bce1bce599e0c265c079fa55fe86 (diff)
downloadzendex-add_streaming.tar.gz
zendex-add_streaming.tar.xz
refactoring to use new Zendex HTTPoison Clientadd_streaming
This change also replaces the tests that were using the "in-memory" client with `exvcr` cassettes based tests. This does increase test time by about a second, but the overall improvement in not having to maintain a separate module for testing is nice. Mocking request/response pairs is, however, slightly tedious.
Diffstat (limited to 'lib')
-rw-r--r--lib/http_client/in_memory.ex138
-rw-r--r--lib/zendex.ex19
-rw-r--r--lib/zendex/common_helpers.ex15
-rw-r--r--lib/zendex/search.ex10
-rw-r--r--lib/zendex/ticket.ex21
-rw-r--r--lib/zendex/user.ex148
6 files changed, 36 insertions, 315 deletions
diff --git a/lib/http_client/in_memory.ex b/lib/http_client/in_memory.ex
deleted file mode 100644
index 4c43211..0000000
--- a/lib/http_client/in_memory.ex
+++ /dev/null
@@ -1,138 +0,0 @@
-defmodule Zendex.HttpClient.InMemory do
- @moduledoc """
- Allows testing of the Zendex project by mocking out calls to an actual Zendesk
- API.
- """
-
- @base_url "http://test.zendesk.com"
-
- def get!(@base_url <> "/api/v2/tickets.json",
- [{"Authorization", _authentication}]) do
- fake_response("ticket")
- end
-
- def get!(@base_url <> "/api/v2/search.json?query=requester%3AJimbob+type%3Aticket",
- [{"Authorization", _authentication}]) do
- fake_response(["Jimbob Ticket 1", "Jimbob Ticket 2"])
- end
-
- def get!(@base_url <> "/api/v2/search.json?query=requester%3AReginald+type%3Aticket&sort_by=created_at&sort_order=desc",
- [{"Authorization", _authentication}]) do
- fake_response(["Reginald Ticket 1", "Reginald Ticket 2"])
- end
-
- def get!(@base_url <> "/api/v2/users.json",
- [{"Authorization", _authentication}]) do
- fake_response("users")
- end
-
- def get!("#{@base_url}/api/v2/users/295204.json",
- [{"Authorization", _authentication}]) do
- fake_response(%{"user" => %{"ticket_restriction" => nil,
- "chat_only" => false,
- "shared_phone_number" => nil,
- "notes" => "",
- "phone" => nil,
- "organization_id" => 11129520411,
- "last_login_at" => "2016-10-28T21:08:23Z",
- "moderator" => true,
- "shared" => false,
- "id" => 295204,
- "role" => "admin",
- "external_id" => nil,
- "shared_agent" => false,
- "photo" => nil,
- "verified" => true,
- "active" => true,
- "locale_id" => 1,
- "suspended" => false,
- "created_at" => "2015-05-28T09:12:45Z",
- "name" => "Nikolao Aikema",
- "restricted_agent" => false,
- "locale" => "en-US",
- "details" => "",
- "alias" => nil,
- "url" => "https://test.zendesk.com/api/v2/users/295204.json",
- "custom_role_id" => nil,
- "email" => "nikolao.aikema@test.com",
- "signature" => nil,
- "two_factor_auth_enabled" => nil,
- "time_zone" => "London",
- "only_private_comments" => false,
- "user_fields" => %{"customer_complaint" => nil},
- "tags" => [],
- "updated_at" => "2016-10-28T21:08:23Z"}})
- end
-
- def get!("#{@base_url}/api/v2/users/show_many.json?ids=6,67",
- [{"Authorization", _authentication}]) do
- fake_response(%{users: [%{id: 6, name: "Kiki Segal"},
- %{id: 67, name: "Sarpedon Baumgartner"}]})
- end
-
- def get!("#{@base_url}/api/v2/users/649267/related.json",
- [{"Authorization", _authentication}]) do
- fake_response(%{"user_related" => %{"assigned_tickets" => 12,
- "ccd_tickets" => 5,
- "entry_subscriptions" => 1,
- "forum_subscriptions" => 3,
- "organization_subscriptions" => 1,
- "requested_tickets" => 7,
- "subscriptions" => 6,
- "topic_comments" => 116,
- "topics" => 5,
- "votes" => 2001}})
- end
-
- def post!(@base_url <> "/api/v2/tickets.json",
- "{\"ticket\":{}}",
- [{"Authorization", _authentication}, {"Content-Type", "application/json"}]) do
- fake_response("Ticket created successfully!")
- end
-
- def post!(@base_url <> "/api/v2/users.json",
- "{\"user\":{\"name\":\"Roger\",\"email\":\"roger@dodger.com\"}}",
- [{"Authorization", _authentication}, {"Content-Type", "application/json"}]) do
- fake_response(%{user: %{id: 1234, name: "Roger", email: "roger@dodger.com"}})
- end
-
- def delete!("#{@base_url}/api/v2/users/49043.json",
- [{"Authorization", _authentication}]) do
- fake_response(%{"user" => %{"ticket_restriction" => nil,
- "chat_only" => false,
- "shared_phone_number" => nil,
- "notes" => "",
- "phone" => nil,
- "organization_id" => 149043,
- "last_login_at" => "2016-10-28T21:08:23Z",
- "moderator" => true,
- "shared" => false,
- "id" => 49043,
- "role" => "admin",
- "external_id" => nil,
- "shared_agent" => false,
- "photo" => nil,
- "verified" => true,
- "active" => false,
- "locale_id" => 1,
- "suspended" => false,
- "created_at" => "2015-05-28T09:12:45Z",
- "name" => "Rian Hawkins",
- "restricted_agent" => false,
- "locale" => "en-US",
- "details" => "",
- "alias" => nil,
- "url" => "https://test.zendesk.com/api/v2/users/49043.json",
- "custom_role_id" => nil,
- "email" => "rian.hawkins@test.com",
- "signature" => nil,
- "two_factor_auth_enabled" => nil,
- "time_zone" => "London",
- "only_private_comments" => false,
- "user_fields" => %{"customer_complaint" => nil},
- "tags" => [],
- "updated_at" => "2016-10-28T21:08:23Z"}})
- end
-
- defp fake_response(body), do: %{body: Poison.encode!(body)}
-end
diff --git a/lib/zendex.ex b/lib/zendex.ex
index 2fbde39..e697d8b 100644
--- a/lib/zendex.ex
+++ b/lib/zendex.ex
@@ -38,15 +38,6 @@ defmodule Zendex do
resp
end
- def patch(path, connection, body \\ "") do
- _request(:patch, url(connection, path), connection.authentication, body)
- end
-
- def patch!(path, connection, body \\ "") do
- {_, resp} = patch(path, connection, body)
- resp
- end
-
@doc """
Underlying utility retrieval function
@@ -66,8 +57,14 @@ defmodule Zendex do
{auth, _} = Map.split(connection, [:authentication])
case pagination(options) do
- nil -> request_stream(:get, url, auth, "", :one_page)
- :none -> request_stream(:get, url, auth, "", :one_page)
+ nil ->
+ :get
+ |> request_stream(url, auth, "", :one_page)
+ |> realize_if_needed
+ :none ->
+ :get
+ |> request_stream(url, auth, "", :one_page)
+ |> realize_if_needed
:auto ->
:get
|> request_stream(url, auth)
diff --git a/lib/zendex/common_helpers.ex b/lib/zendex/common_helpers.ex
deleted file mode 100644
index dceb56d..0000000
--- a/lib/zendex/common_helpers.ex
+++ /dev/null
@@ -1,15 +0,0 @@
-defmodule Zendex.CommonHelpers do
- @moduledoc """
- Contains common helper functions used throughout Zendex.
- """
-
- def decode_response(%{body: body}), do: Poison.decode!(body)
-
- def get_headers(authentication) do
- [{"Authorization", "Basic #{authentication}"}]
- end
-
- def get_headers(authentication, %{content_type: :json}) do
- get_headers(authentication) ++ [{"Content-Type", "application/json"}]
- end
-end
diff --git a/lib/zendex/search.ex b/lib/zendex/search.ex
index ec9ea28..dc4909b 100644
--- a/lib/zendex/search.ex
+++ b/lib/zendex/search.ex
@@ -3,23 +3,19 @@ defmodule Zendex.Search do
Allows use of the Zendex search API functionality.
"""
- alias Zendex.CommonHelpers
-
@url "/api/v2/search.json?query="
- @http_client Application.get_env(:zendex, :http_client)
@doc """
Search Zendesk.
"""
- @spec query(Zendex.Connection.t, map, String.t, String.t) :: map
+ @spec query(Zendex.Connection.t, map, String.t, String.t) :: no_return
def query(connection, query, sort_by \\ "", sort_order \\ "desc") do
search_string = create_search_string(query)
sort_string = create_sort_string(sort_by, sort_order)
- "#{connection.base_url}#{@url}#{search_string}#{sort_string}"
- |> @http_client.get!(CommonHelpers.get_headers(connection.authentication))
- |> CommonHelpers.decode_response
+ "#{@url}#{search_string}#{sort_string}"
+ |> Zendex.get!(connection)
end
defp create_search_string(query) do
diff --git a/lib/zendex/ticket.ex b/lib/zendex/ticket.ex
index 9232d6e..9df77df 100644
--- a/lib/zendex/ticket.ex
+++ b/lib/zendex/ticket.ex
@@ -4,30 +4,23 @@ defmodule Zendex.Ticket do
and listing tickets.
"""
- alias Zendex.CommonHelpers
-
@url "/api/v2/tickets.json"
- @http_client Application.get_env(:zendex, :http_client)
@doc """
List all tickets.
"""
- @spec list(Zendex.Connection.t) :: map
- def list(connection) do
- "#{connection.base_url}#{@url}"
- |> @http_client.get!(CommonHelpers.get_headers(connection.authentication))
- |> CommonHelpers.decode_response
+ @spec list(Zendex.Connection.t, Keyword.t) :: [any] | {integer, any}
+ def list(connection, opts \\ []) do
+ "#{@url}"
+ |> Zendex.get!(connection, [], opts)
end
@doc """
Create a new ticket.
"""
- @spec create(Zendex.Connection.t, map) :: map
+ @spec create(Zendex.Connection.t, map) :: any
def create(connection, ticket) do
- "#{connection.base_url}#{@url}"
- |> @http_client.post!(Poison.encode!(ticket),
- CommonHelpers.get_headers(connection.authentication,
- %{content_type: :json}))
- |> CommonHelpers.decode_response
+ "#{@url}"
+ |> Zendex.post!(connection, Poison.encode!(ticket))
end
end
diff --git a/lib/zendex/user.ex b/lib/zendex/user.ex
index 9112b7f..a36f626 100644
--- a/lib/zendex/user.ex
+++ b/lib/zendex/user.ex
@@ -3,173 +3,61 @@ defmodule Zendex.User do
Interact with Zendesk user.
"""
- alias Zendex.CommonHelpers
-
@url "/api/v2/users"
- @http_client Application.get_env(:zendex, :http_client)
@doc """
List all users.
"""
- @spec list(Zendex.Connection.t) :: map
- def list(connection) do
- "#{connection.base_url}#{@url}.json"
- |> @http_client.get!(CommonHelpers.get_headers(connection.authentication))
- |> CommonHelpers.decode_response
+ @spec list(Zendex.Connection.t, Keyword.t) :: map | [map]
+ def list(connection, opts \\ []) do
+ "#{@url}.json"
+ |> Zendex.get!(connection, [], opts)
end
@doc """
Show a specific user, given their id.
-
- ## Examples
-
- iex> conn = Zendex.Connection.setup("http://test.zendesk.com", "ZendeskUser", "Password1")
- %{authentication: "WmVuZGVza1VzZXI6UGFzc3dvcmQx", base_url: "http://test.zendesk.com"}
- iex> Zendex.User.show(conn, 295204)
- %{"user" => %{"ticket_restriction" => nil,
- "chat_only" => false,
- "shared_phone_number" => nil,
- "notes" => "",
- "phone" => nil,
- "organization_id" => 11129520411,
- "last_login_at" => "2016-10-28T21:08:23Z",
- "moderator" => true,
- "shared" => false,
- "id" => 295204,
- "role" => "admin",
- "external_id" => nil,
- "shared_agent" => false,
- "photo" => nil,
- "verified" => true,
- "active" => true,
- "locale_id" => 1,
- "suspended" => false,
- "created_at" => "2015-05-28T09:12:45Z",
- "name" => "Nikolao Aikema",
- "restricted_agent" => false,
- "locale" => "en-US",
- "details" => "",
- "alias" => nil,
- "url" => "https://test.zendesk.com/api/v2/users/295204.json",
- "custom_role_id" => nil,
- "email" => "nikolao.aikema@test.com",
- "signature" => nil,
- "two_factor_auth_enabled" => nil,
- "time_zone" => "London",
- "only_private_comments" => false,
- "user_fields" => %{"customer_complaint" => nil},
- "tags" => [],
- "updated_at" => "2016-10-28T21:08:23Z"}}
-
"""
@spec show(Zendex.Connection.t, integer) :: map
def show(connection, id) do
- "#{connection.base_url}#{@url}/#{id}.json"
- |> @http_client.get!(CommonHelpers.get_headers(connection.authentication))
- |> CommonHelpers.decode_response
+ "#{@url}/#{id}.json"
+ |> Zendex.get!(connection)
end
@doc """
Show many user, given their ids.
"""
- @spec show_many(Zendex.Connection.t, [integer]) :: map
+ @spec show_many(Zendex.Connection.t, [integer]) :: no_return
def show_many(connection, ids) do
ids = Enum.join(ids, ",")
-
- "#{connection.base_url}#{@url}/show_many.json?ids=#{ids}"
- |> @http_client.get!(CommonHelpers.get_headers(connection.authentication))
- |> CommonHelpers.decode_response
+ "#{@url}/show_many.json?ids=#{ids}"
+ |> Zendex.get!(connection)
end
@doc """
Show information relating to the user, example: number of assigned tickets.
-
- ## Examples
-
- iex> conn = Zendex.Connection.setup("http://test.zendesk.com", "ZendeskUser", "Password1")
- %{authentication: "WmVuZGVza1VzZXI6UGFzc3dvcmQx", base_url: "http://test.zendesk.com"}
- iex> Zendex.User.related_information(conn, 649267)
- %{"user_related" => %{"assigned_tickets" => 12,
- "ccd_tickets" => 5,
- "entry_subscriptions" => 1,
- "forum_subscriptions" => 3,
- "organization_subscriptions" => 1,
- "requested_tickets" => 7,
- "subscriptions" => 6,
- "topic_comments" => 116,
- "topics" => 5,
- "votes" => 2001}}
-
"""
- @spec related_information(Zendex.Connection.t, integer) :: map
+ @spec related_information(Zendex.Connection.t, integer) :: no_return
def related_information(connection, id) do
- "#{connection.base_url}#{@url}/#{id}/related.json"
- |> @http_client.get!(CommonHelpers.get_headers(connection.authentication))
- |> CommonHelpers.decode_response
+ "#{@url}/#{id}/related.json"
+ |> Zendex.get!(connection)
end
@doc """
Create a new user.
"""
- @spec create(Zendex.Connection.t, map) :: map
+ @spec create(Zendex.Connection.t, map) :: any
def create(connection, user) do
- "#{connection.base_url}#{@url}.json"
- |> @http_client.post!(Poison.encode!(user),
- CommonHelpers.get_headers(connection.authentication,
- %{content_type: :json}))
- |> CommonHelpers.decode_response
+ "#{@url}.json"
+ |> Zendex.post!(connection, Poison.encode!(user))
end
@doc """
Delete a user.
-
- ## Examples
-
- iex> conn = Zendex.Connection.setup("http://test.zendesk.com", "ZendeskUser", "Password1")
- %{authentication: "WmVuZGVza1VzZXI6UGFzc3dvcmQx", base_url: "http://test.zendesk.com"}
- iex> Zendex.User.delete(conn, 49043)
- %{"user" => %{"ticket_restriction" => nil,
- "chat_only" => false,
- "shared_phone_number" => nil,
- "notes" => "",
- "phone" => nil,
- "organization_id" => 149043,
- "last_login_at" => "2016-10-28T21:08:23Z",
- "moderator" => true,
- "shared" => false,
- "id" => 49043,
- "role" => "admin",
- "external_id" => nil,
- "shared_agent" => false,
- "photo" => nil,
- "verified" => true,
- "active" => false,
- "locale_id" => 1,
- "suspended" => false,
- "created_at" => "2015-05-28T09:12:45Z",
- "name" => "Rian Hawkins",
- "restricted_agent" => false,
- "locale" => "en-US",
- "details" => "",
- "alias" => nil,
- "url" => "https://test.zendesk.com/api/v2/users/49043.json",
- "custom_role_id" => nil,
- "email" => "rian.hawkins@test.com",
- "signature" => nil,
- "two_factor_auth_enabled" => nil,
- "time_zone" => "London",
- "only_private_comments" => false,
- "user_fields" => %{"customer_complaint" => nil},
- "tags" => [],
- "updated_at" => "2016-10-28T21:08:23Z"}}
-
-
"""
- @spec show(Zendex.Connection.t, integer) :: map
+ @spec delete(Zendex.Connection.t, integer) :: {integer, map} | map
def delete(connection, id) do
- "#{connection.base_url}#{@url}/#{id}.json"
- |> @http_client.delete!(CommonHelpers.get_headers(connection.authentication))
- |> CommonHelpers.decode_response
+ "#{@url}/#{id}.json"
+ |> Zendex.delete!(connection)
end
end