zendesk2 0.4.4 → 0.4.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (66) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +14 -0
  3. data/lib/zendesk2/client/models/categories.rb +1 -1
  4. data/lib/zendesk2/client/models/forums.rb +1 -1
  5. data/lib/zendesk2/client/models/groups.rb +1 -1
  6. data/lib/zendesk2/client/models/membership.rb +1 -1
  7. data/lib/zendesk2/client/models/organization.rb +2 -0
  8. data/lib/zendesk2/client/models/organizations.rb +1 -1
  9. data/lib/zendesk2/client/models/ticket_audits.rb +1 -1
  10. data/lib/zendesk2/client/models/ticket_comments.rb +1 -1
  11. data/lib/zendesk2/client/models/ticket_metrics.rb +1 -1
  12. data/lib/zendesk2/client/models/tickets.rb +1 -1
  13. data/lib/zendesk2/client/models/topic_comments.rb +1 -1
  14. data/lib/zendesk2/client/models/topics.rb +1 -1
  15. data/lib/zendesk2/client/models/user_field.rb +59 -0
  16. data/lib/zendesk2/client/models/user_fields.rb +11 -0
  17. data/lib/zendesk2/client/models/user_identity.rb +1 -1
  18. data/lib/zendesk2/client/models/users.rb +1 -1
  19. data/lib/zendesk2/client/requests/create_membership.rb +10 -0
  20. data/lib/zendesk2/client/requests/create_user.rb +2 -12
  21. data/lib/zendesk2/client/requests/create_user_field.rb +44 -0
  22. data/lib/zendesk2/client/requests/destroy_user.rb +1 -0
  23. data/lib/zendesk2/client/requests/destroy_user_field.rb +27 -0
  24. data/lib/zendesk2/client/requests/get_category.rb +7 -14
  25. data/lib/zendesk2/client/requests/get_group.rb +6 -14
  26. data/lib/zendesk2/client/requests/get_membership.rb +6 -14
  27. data/lib/zendesk2/client/requests/get_organization.rb +7 -14
  28. data/lib/zendesk2/client/requests/get_organization_memberships.rb +1 -1
  29. data/lib/zendesk2/client/requests/get_ticket.rb +6 -14
  30. data/lib/zendesk2/client/requests/get_ticket_audit.rb +7 -18
  31. data/lib/zendesk2/client/requests/get_ticket_field.rb +6 -15
  32. data/lib/zendesk2/client/requests/get_ticket_fields.rb +1 -1
  33. data/lib/zendesk2/client/requests/get_ticket_metric.rb +6 -17
  34. data/lib/zendesk2/client/requests/get_topic_comment.rb +3 -6
  35. data/lib/zendesk2/client/requests/get_topic_comments.rb +1 -1
  36. data/lib/zendesk2/client/requests/get_user.rb +9 -13
  37. data/lib/zendesk2/client/requests/get_user_field.rb +25 -0
  38. data/lib/zendesk2/client/requests/get_user_fields.rb +18 -0
  39. data/lib/zendesk2/client/requests/get_user_identity.rb +6 -15
  40. data/lib/zendesk2/client/requests/get_user_memberships.rb +1 -1
  41. data/lib/zendesk2/client/requests/mark_membership_default.rb +2 -6
  42. data/lib/zendesk2/client/requests/mark_user_identity_primary.rb +3 -6
  43. data/lib/zendesk2/client/requests/update_group.rb +8 -14
  44. data/lib/zendesk2/client/requests/update_topic_comment.rb +2 -2
  45. data/lib/zendesk2/client/requests/update_user_field.rb +28 -0
  46. data/lib/zendesk2/client.rb +79 -15
  47. data/lib/zendesk2/collection.rb +1 -18
  48. data/lib/zendesk2/paged_collection.rb +100 -0
  49. data/lib/zendesk2/version.rb +1 -1
  50. data/lib/zendesk2.rb +9 -7
  51. data/spec/categories_spec.rb +6 -4
  52. data/spec/forums_spec.rb +7 -4
  53. data/spec/groups_spec.rb +6 -3
  54. data/spec/memberships_spec.rb +31 -5
  55. data/spec/organizations_spec.rb +6 -3
  56. data/spec/shared/zendesk_resource.rb +66 -48
  57. data/spec/ticket_fields_spec.rb +6 -3
  58. data/spec/tickets_spec.rb +6 -3
  59. data/spec/topic_comments_spec.rb +6 -5
  60. data/spec/topics_spec.rb +7 -5
  61. data/spec/user_fields_spec.rb +12 -0
  62. data/spec/user_identities_spec.rb +7 -7
  63. data/spec/users_spec.rb +7 -4
  64. metadata +12 -6
  65. data/spec/config_spec.rb +0 -17
  66. data/spec/shared/resource.rb +0 -66
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 36f8f737437bc490b562bba51cd72fec6ffad957
4
- data.tar.gz: 2497c5274d2462c7d601ced33979ee752d344d51
3
+ metadata.gz: 79d128511e7f57cbba27856d2f6802def8372e72
4
+ data.tar.gz: 6f8a606ef092869b312359ea713464a5cbdf930e
5
5
  SHA512:
6
- metadata.gz: 963a99eddbf1d5533c549360051df1589b619e581b027887dc0abe8551bc71e518a8c70323135160c9ad57cfcdb01f61adeb26fd4ac09a6c9c20993e524f551f
7
- data.tar.gz: b316d150a0ce25ba55e744f5e66dd3ebc5a1d957418d76bc2e817a214e26ecc78dc4de2352530ea1310e354f5458a0c74afad051d1ead7be59d9f672803dfece
6
+ metadata.gz: 30155530e6086ef765851f134129bcf22baaa95e4b8561a685df15c828e4f852f9482ffd24083158682f16b512831e661feefdd07e5c16a61b857b94335c2d19
7
+ data.tar.gz: a94bccf5ecce5fbc6230fc8c158c2a43c8fb96d545c93108c0207e7e7195c3f08ec7fe44f9dc949d9a9786a0b0e7111ec695e9c545d1b76004f1e05d40757d28
data/README.md CHANGED
@@ -19,6 +19,18 @@ Or install it yourself as:
19
19
 
20
20
  ## Usage
21
21
 
22
+ ### Mock it!
23
+
24
+ All support resources have basic mocks. Error conditions and messaging are constantly changing. Please contribute updates or fixes to the mock if you encounter inconsistencies.
25
+
26
+ ```ruby
27
+ Zendesk2::Client.mock!
28
+
29
+ client = Zendesk2::Client.new(...) # Zendesk2::Client::Mock
30
+ client.organizations.create!(name: "foo") # Zendesk2::Client::Organization
31
+ client.organizations.create!(name: "foo") # Zendesk2::Error => Name has already been taken
32
+ ```
33
+
22
34
  ### Defaults
23
35
 
24
36
  Default credentials will be read in from `~/.zendesk2` file in YAML format.
@@ -57,6 +69,7 @@ Currently support resources
57
69
  * Categories
58
70
  * Forums
59
71
  * Groups
72
+ * Memberships
60
73
  * Organization
61
74
  * Ticket Audits
62
75
  * Ticket Fields
@@ -64,6 +77,7 @@ Currently support resources
64
77
  * Topic Comments
65
78
  * Topics
66
79
  * User Identities
80
+ * User Fields
67
81
  * Users
68
82
 
69
83
  All collection are accessed like so:
@@ -1,4 +1,4 @@
1
- class Zendesk2::Client::Categories < Zendesk2::Collection
1
+ class Zendesk2::Client::Categories < Zendesk2::PagedCollection
2
2
  include Zendesk2::Searchable
3
3
 
4
4
  model Zendesk2::Client::Category
@@ -1,4 +1,4 @@
1
- class Zendesk2::Client::Forums < Zendesk2::Collection
1
+ class Zendesk2::Client::Forums < Zendesk2::PagedCollection
2
2
  include Zendesk2::Searchable
3
3
 
4
4
  model Zendesk2::Client::Forum
@@ -1,4 +1,4 @@
1
- class Zendesk2::Client::Groups < Zendesk2::Collection
1
+ class Zendesk2::Client::Groups < Zendesk2::PagedCollection
2
2
  include Zendesk2::Searchable
3
3
 
4
4
  model Zendesk2::Client::Group
@@ -35,7 +35,7 @@ class Zendesk2::Client::Membership < Zendesk2::Model
35
35
  merge_attributes(data)
36
36
  end
37
37
 
38
- def destroy
38
+ def destroy!
39
39
  requires :identity
40
40
 
41
41
  connection.destroy_membership("id" => self.identity)
@@ -40,9 +40,11 @@ class Zendesk2::Client::Organization < Zendesk2::Model
40
40
  def save!
41
41
  data = if new_record?
42
42
  requires :name
43
+
43
44
  connection.create_organization(params).body["organization"]
44
45
  else
45
46
  requires :identity
47
+
46
48
  connection.update_organization(params).body["organization"]
47
49
  end
48
50
  merge_attributes(data)
@@ -1,4 +1,4 @@
1
- class Zendesk2::Client::Organizations < Zendesk2::Collection
1
+ class Zendesk2::Client::Organizations < Zendesk2::PagedCollection
2
2
  include Zendesk2::Searchable
3
3
 
4
4
  model Zendesk2::Client::Organization
@@ -1,4 +1,4 @@
1
- class Zendesk2::Client::TicketAudits < Zendesk2::Collection
1
+ class Zendesk2::Client::TicketAudits < Zendesk2::PagedCollection
2
2
 
3
3
  model Zendesk2::Client::TicketAudit
4
4
 
@@ -1,4 +1,4 @@
1
- class Zendesk2::Client::TicketComments < Zendesk2::Collection
1
+ class Zendesk2::Client::TicketComments < Zendesk2::PagedCollection
2
2
 
3
3
  model Zendesk2::Client::TicketComment
4
4
 
@@ -1,4 +1,4 @@
1
- class Zendesk2::Client::TicketMetrics < Zendesk2::Collection
1
+ class Zendesk2::Client::TicketMetrics < Zendesk2::PagedCollection
2
2
  model Zendesk2::Client::TicketMetric
3
3
 
4
4
  attribute :ticket_id, type: :integer
@@ -1,4 +1,4 @@
1
- class Zendesk2::Client::Tickets < Zendesk2::Collection
1
+ class Zendesk2::Client::Tickets < Zendesk2::PagedCollection
2
2
  include Zendesk2::Searchable
3
3
 
4
4
  model Zendesk2::Client::Ticket
@@ -1,4 +1,4 @@
1
- class Zendesk2::Client::TopicComments < Zendesk2::Collection
1
+ class Zendesk2::Client::TopicComments < Zendesk2::PagedCollection
2
2
  include Zendesk2::Searchable
3
3
 
4
4
  model Zendesk2::Client::TopicComment
@@ -1,4 +1,4 @@
1
- class Zendesk2::Client::Topics < Zendesk2::Collection
1
+ class Zendesk2::Client::Topics < Zendesk2::PagedCollection
2
2
  include Zendesk2::Searchable
3
3
 
4
4
  model Zendesk2::Client::Topic
@@ -0,0 +1,59 @@
1
+ class Zendesk2::Client::UserField < Zendesk2::Model
2
+ extend Zendesk2::Attributes
3
+
4
+ PARAMS = %w[key type title description position active, regexp_for_validation tag custom_field_options]
5
+
6
+ # @return [Integer] Automatically assigned upon creation
7
+ identity :id, type: :integer
8
+
9
+ # @return [Boolean] If true, this field is available for use
10
+ attribute :active, type: :boolean
11
+ # @return [Time] The time the ticket field was created
12
+ attribute :created_at, type: :time
13
+ # @return [Array] Required and presented for a custom field of type "tagger"
14
+ attribute :custom_field_options, type: :array
15
+ # @return [String] User-defined description of this field's purpose
16
+ attribute :description, type: :string
17
+ # @return [String] create A unique key that identifies this custom field. This is used for updating the field and referencing in placeholders.
18
+ attribute :key, type: :string
19
+ # @return [Integer] Ordering of the field relative to other fields
20
+ attribute :position, type: :integer
21
+ # @return [String] Regular expression field only. The validation pattern for a field value to be deemed valid.
22
+ attribute :regexp_for_validation, type: :string
23
+ # @return [String] Optional for custom field of type "checkbox"; not presented otherwise.
24
+ attribute :tag, type: :string
25
+ # @return [String] The title of the custom field
26
+ attribute :title, type: :string
27
+ # @return [String] Supported types: "text", "textarea", "checkbox", "date", "integer", "decimal", "regexp", "tagger" (custom dropdown)
28
+ attribute :type, type: :string
29
+ # @return [Time] The time of the last update of the ticket field
30
+ attribute :updated_at, type: :time
31
+ # @return [String] The URL for this resource
32
+ attribute :url, type: :string
33
+
34
+ def save!
35
+ data = if new_record?
36
+ requires :type, :title, :key
37
+
38
+ connection.create_user_field(params).body["user_field"]
39
+ else
40
+ requires :identity
41
+
42
+ connection.update_user_field(params.merge("id" => self.identity)).body["user_field"]
43
+ end
44
+
45
+ merge_attributes(data)
46
+ end
47
+
48
+ def destroy!
49
+ requires :identity
50
+
51
+ connection.destroy_user_field("id" => self.identity)
52
+ end
53
+
54
+ private
55
+
56
+ def params
57
+ Cistern::Hash.slice(Zendesk2.stringify_keys(attributes), *PARAMS)
58
+ end
59
+ end
@@ -0,0 +1,11 @@
1
+ class Zendesk2::Client::UserFields < Zendesk2::Collection
2
+ include Zendesk2::Searchable
3
+
4
+ model Zendesk2::Client::UserField
5
+
6
+ self.collection_method = :get_user_fields
7
+ self.collection_root = "user_fields"
8
+ self.model_method = :get_user_field
9
+ self.model_root = "user_field"
10
+ self.search_type = "user_field"
11
+ end
@@ -37,7 +37,7 @@ class Zendesk2::Client::UserIdentity < Zendesk2::Model
37
37
  merge_attributes(data)
38
38
  end
39
39
 
40
- def destroy
40
+ def destroy!
41
41
  requires :identity
42
42
 
43
43
  connection.destroy_user_identity("user_id" => self.user_id, "id" => self.identity)
@@ -1,4 +1,4 @@
1
- class Zendesk2::Client::Users < Zendesk2::Collection
1
+ class Zendesk2::Client::Users < Zendesk2::PagedCollection
2
2
  include Zendesk2::Searchable
3
3
 
4
4
  model Zendesk2::Client::User
@@ -1,6 +1,8 @@
1
1
  class Zendesk2::Client
2
2
  class Real
3
3
  def create_membership(params={})
4
+ require_parameters(params, "user_id", "organization_id")
5
+
4
6
  user_id = params["user_id"]
5
7
 
6
8
  request(
@@ -13,9 +15,17 @@ class Zendesk2::Client
13
15
 
14
16
  class Mock
15
17
  def create_membership(params={})
18
+ require_parameters(params, "user_id", "organization_id")
19
+
16
20
  user_id = params["user_id"]
17
21
  organization_id = params["organization_id"]
18
22
 
23
+ find!(:users, user_id)
24
+ find!(:organizations, organization_id, error: :invalid, details: { "organization" => [ { "description" => "Organization cannot be blank" } ] })
25
+ if self.data[:memberships].values.find { |m| m["user_id"] == user_id && m["organization_id"] == organization_id }
26
+ error!(:invalid, description: { "user_id" => [ { "description" => "User has already been taken" } ] })
27
+ end
28
+
19
29
  resource_id = self.class.new_id
20
30
 
21
31
  default_membership = false # !self.data[:memberships].values.find { |m| m["user_id"] == user_id && m["default"] }
@@ -23,20 +23,10 @@ class Zendesk2::Client
23
23
  }.merge(params)
24
24
 
25
25
  if (email = record["email"]) && self.data[:identities].find{|k,i| i["type"] == "email" && i["value"] == email}
26
- response(
27
- :method => :put,
28
- :path => path,
29
- :status => 422,
30
- :body => {
31
- "error" => "RecordInvalid",
32
- "description" => "Record validation errors",
33
- "details" => {
26
+ error!(:invalid, :details => {
34
27
  "email" => [ {
35
28
  "description" => "Email #{email} is already being used by another user"
36
- } ]
37
- }
38
- }
39
- )
29
+ }]})
40
30
  else
41
31
  user_identity_id = self.class.new_id # ugh
42
32
 
@@ -0,0 +1,44 @@
1
+ class Zendesk2::Client
2
+ class Real
3
+ def create_user_field(params={})
4
+ request(
5
+ :body => {"user_field" => params},
6
+ :method => :post,
7
+ :path => "/user_fields.json",
8
+ )
9
+ end
10
+ end # Real
11
+
12
+ class Mock
13
+ def create_user_field(params={})
14
+ identity = self.class.new_id
15
+
16
+ record = {
17
+ "active" => true,
18
+ "collapsed_for_agents" => false,
19
+ "created_at" => Time.now.iso8601,
20
+ "description" => params["title"],
21
+ "editable_in_portal" => false,
22
+ "id" => identity,
23
+ "position" => 9999,
24
+ "regexp_for_validation" => "",
25
+ "removable" => true,
26
+ "required" => false,
27
+ "required_in_portal" => false,
28
+ "tag" => "",
29
+ "title_in_portal" => params["title"],
30
+ "updated_at" => Time.now.iso8601,
31
+ "url" => url_for("/user_fields/#{identity}.json"),
32
+ "visible_in_portal" => false,
33
+ }.merge(params)
34
+
35
+ self.data[:user_fields][identity] = record
36
+
37
+ response(
38
+ :method => :post,
39
+ :body => {"user_field" => record},
40
+ :path => "/user_fields.json"
41
+ )
42
+ end
43
+ end # Mock
44
+ end # Zendesk2::Client
@@ -16,6 +16,7 @@ class Zendesk2::Client
16
16
  path = "/users/#{id}.json"
17
17
 
18
18
  tickets = self.data[:tickets].values.select{|t| t["requester_id"] == id}.size
19
+ find!(:users, id)
19
20
  if tickets < 1
20
21
  body = self.data[:users].delete(id)
21
22
  response(
@@ -0,0 +1,27 @@
1
+ class Zendesk2::Client
2
+ class Real
3
+ def destroy_user_field(params={})
4
+ id = params["id"]
5
+
6
+ request(
7
+ :method => :delete,
8
+ :path => "/user_fields/#{id}.json"
9
+ )
10
+ end
11
+ end
12
+
13
+ class Mock
14
+ def destroy_user_field(params={})
15
+ id = params["id"]
16
+ body = self.data[:user_fields].delete(id)
17
+
18
+ response(
19
+ :method => :delete,
20
+ :path => "/user_fields/#{id}.json",
21
+ :body => {
22
+ "user_field" => body,
23
+ },
24
+ )
25
+ end
26
+ end
27
+ end
@@ -12,21 +12,14 @@ class Zendesk2::Client
12
12
 
13
13
  class Mock
14
14
  def get_category(params={})
15
- id = params["id"]
16
- if body = self.data[:categories][id]
15
+ id = params["id"]
17
16
 
18
- response(
19
- :path => "/categories/#{id}.json",
20
- :body => {
21
- "category" => body
22
- },
23
- )
24
- else
25
- response(
26
- :path => "/categories/#{id}.json",
27
- :status => 404
28
- )
29
- end
17
+ response(
18
+ :path => "/categories/#{id}.json",
19
+ :body => {
20
+ "category" => find!(:categories, id)
21
+ },
22
+ )
30
23
  end
31
24
  end # Mock
32
25
  end
@@ -15,20 +15,12 @@ class Zendesk2::Client
15
15
  id = params["id"]
16
16
  path = "/groups/#{id}.json"
17
17
 
18
- if body = self.data[:groups][id]
19
- response(
20
- :path => path,
21
- :body => {
22
- "group" => body
23
- },
24
- )
25
- else
26
- response(
27
- :path => path,
28
- :status => 404,
29
- :body => {"error" => "RecordNotFound", "description" => "Not found"},
30
- )
31
- end
18
+ response(
19
+ :path => path,
20
+ :body => {
21
+ "group" => find!(:groups, id),
22
+ },
23
+ )
32
24
  end
33
25
  end # Mock
34
26
  end
@@ -16,20 +16,12 @@ class Zendesk2::Client
16
16
 
17
17
  path = "/organization_memberships/#{membership_id}.json"
18
18
 
19
- if body = self.data[:memberships][membership_id]
20
- response(
21
- :path => path,
22
- :body => {
23
- "organization_membership" => body
24
- },
25
- )
26
- else
27
- response(
28
- :path => path,
29
- :status => 404,
30
- :body => {"error" => "RecordNotFound", "description" => "Not found"},
31
- )
32
- end
19
+ response(
20
+ :path => path,
21
+ :body => {
22
+ "organization_membership" => find!(:memberships, membership_id)
23
+ },
24
+ )
33
25
  end
34
26
  end # Mock
35
27
  end