zendesk2 1.11.0 → 1.12.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +1 -1
  3. data/CHANGELOG.md +2 -3
  4. data/Gemfile +1 -3
  5. data/README.md +2 -0
  6. data/lib/zendesk2.rb +1 -1
  7. data/lib/zendesk2/client.rb +11 -11
  8. data/lib/zendesk2/create_category.rb +2 -2
  9. data/lib/zendesk2/create_forum.rb +2 -2
  10. data/lib/zendesk2/create_group.rb +2 -2
  11. data/lib/zendesk2/create_organization.rb +2 -2
  12. data/lib/zendesk2/create_ticket.rb +36 -9
  13. data/lib/zendesk2/create_ticket_field.rb +2 -2
  14. data/lib/zendesk2/create_topic.rb +2 -2
  15. data/lib/zendesk2/create_topic_comment.rb +2 -2
  16. data/lib/zendesk2/create_user.rb +4 -4
  17. data/lib/zendesk2/create_user_field.rb +2 -2
  18. data/lib/zendesk2/create_user_identity.rb +2 -2
  19. data/lib/zendesk2/create_view.rb +2 -2
  20. data/lib/zendesk2/get_view_tickets.rb +2 -2
  21. data/lib/zendesk2/help_center/create_help_center_article.rb +2 -2
  22. data/lib/zendesk2/help_center/create_help_center_category.rb +2 -2
  23. data/lib/zendesk2/help_center/create_help_center_post.rb +2 -2
  24. data/lib/zendesk2/help_center/create_help_center_section.rb +2 -2
  25. data/lib/zendesk2/help_center/create_help_center_subscription.rb +2 -3
  26. data/lib/zendesk2/help_center/create_help_center_topic.rb +2 -2
  27. data/lib/zendesk2/help_center/create_help_center_translation.rb +2 -2
  28. data/lib/zendesk2/help_center/destroy_help_center_article.rb +3 -1
  29. data/lib/zendesk2/help_center/search_help_center_articles.rb +2 -9
  30. data/lib/zendesk2/help_center/subscription_request.rb +0 -1
  31. data/lib/zendesk2/help_center/update_help_center_subscription.rb +1 -1
  32. data/lib/zendesk2/mock.rb +1 -0
  33. data/lib/zendesk2/organizations.rb +6 -5
  34. data/lib/zendesk2/paged_collection.rb +10 -10
  35. data/lib/zendesk2/request.rb +7 -10
  36. data/lib/zendesk2/search.rb +2 -9
  37. data/lib/zendesk2/search_organization.rb +2 -9
  38. data/lib/zendesk2/search_user.rb +2 -9
  39. data/lib/zendesk2/searchable.rb +6 -6
  40. data/lib/zendesk2/ticket.rb +20 -11
  41. data/lib/zendesk2/update_user.rb +2 -2
  42. data/lib/zendesk2/update_view.rb +1 -1
  43. data/lib/zendesk2/version.rb +1 -1
  44. data/spec/tickets_spec.rb +41 -0
  45. data/zendesk2.gemspec +1 -0
  46. metadata +22 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9e80f873dd170c7aa2f3a62268d1e2580228f5c5
4
- data.tar.gz: 4eca8baf6dd0b2f4be9d2b2a4879dd77c78cec69
3
+ metadata.gz: a61d3d90ed074ac942698a76c6032da01d98dc49
4
+ data.tar.gz: c7c9d087bc7d353345a15e02455b679c745d3a91
5
5
  SHA512:
6
- metadata.gz: 717c640ad7636fefe296d93c3c75f317fb83e758bc08c2fda527abbf2c917adb364d484cbdf75753d92a966442d6eabf58c5deb6224f0bc34474d064bfb35e21
7
- data.tar.gz: 5a635a1179e896ab3cfcc00aa1b6751310afb29f803d8775ab3cd65c0e3ab004c6d69257db0e617eedfdfc95e682890fe8c1461c54e8f567b6164966199007c7
6
+ metadata.gz: 68410198ef99c316d62bb865a3f2d29e9975848972ee8b706d37bd0acb84ba547209efecbff793afdee1d85edccda4fdfc93f0a069675f0a5968472c922b6cd1
7
+ data.tar.gz: bf5cc95b1b2e4dc8e616112aabc0ade9419a1b68ef1223ff136209f470b3f1b0e986dc2c154fa69f898a73347eee04f17728a3d89a43f63999ab6a0c7f357b1c
@@ -1,5 +1,5 @@
1
1
  AllCops:
2
- TargetRubyVersion: 2.3
2
+ TargetRubyVersion: 2.2
3
3
  DisplayCopNames: true
4
4
  Metrics/LineLength:
5
5
  Max: 120
@@ -1,8 +1,7 @@
1
1
  # Change Log
2
2
 
3
- ## [Unreleased](https://github.com/lanej/zendesk2/tree/HEAD)
4
-
5
- [Full Changelog](https://github.com/lanej/zendesk2/compare/v1.10.0...HEAD)
3
+ ## [v1.11.0](https://github.com/lanej/zendesk2/tree/v1.11.0) (2016-07-05)
4
+ [Full Changelog](https://github.com/lanej/zendesk2/compare/v1.10.0...v1.11.0)
6
5
 
7
6
  **Implemented enhancements:**
8
7
 
data/Gemfile CHANGED
@@ -5,9 +5,7 @@ source 'https://rubygems.org'
5
5
  gemspec
6
6
 
7
7
  gem 'rake'
8
- # To avoid warnings from JWT
9
- gem 'json', '~> 1.8'
10
- gem 'rubocop', '~> 0.41', require: false
8
+ gem 'rubocop', '~> 0.44.1', require: false
11
9
 
12
10
  group :test do
13
11
  gem 'pry-nav'
data/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # Zendesk2
2
2
 
3
+ [![Join the chat at https://gitter.im/lanej/zendesk2](https://badges.gitter.im/lanej/zendesk2.svg)](https://gitter.im/lanej/zendesk2?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
4
+
3
5
  [![Build Status](https://travis-ci.org/lanej/zendesk2.svg?branch=master)](http://travis-ci.org/lanej/zendesk2)
4
6
  [![Gem Version](https://fury-badge.herokuapp.com/rb/zendesk2.png)](http://badge.fury.io/rb/zendesk2)
5
7
  [![Code Climate](https://codeclimate.com/badge.png)](https://codeclimate.com/github/lanej/zendesk2)
@@ -19,7 +19,7 @@ require 'securerandom'
19
19
  module Zendesk2
20
20
  include Cistern::Client.with(interface: :module)
21
21
 
22
- USER_AGENT = <<-UA
22
+ USER_AGENT = <<-UA.freeze
23
23
  Ruby/#{RUBY_VERSION} (#{RUBY_PLATFORM}; #{RUBY_ENGINE}) Zendesk2/#{Zendesk2::VERSION} Faraday/#{Faraday::VERSION}
24
24
  UA
25
25
 
@@ -1,19 +1,19 @@
1
1
  # frozen_string_literal: true
2
2
  # @deprecated use {#Zendesk2}
3
3
  module Zendesk2::Client
4
- def self.method_missing(message, *args, &block)
5
- Cistern.deprecation('Zendesk2::Client is deprecated, use Zendesk2', caller[1])
6
-
7
- if Zendesk2.respond_to?(message)
8
- Zendesk2.public_send(message, *args, &block)
9
- else
10
- super
4
+ class << self
5
+ def respond_to_missing?(method, *)
6
+ Zendesk2.respond_to?(method) || super
11
7
  end
12
- end
13
8
 
14
- def self.respond_to?(message)
15
- Cistern.deprecation('Zendesk2::Client is deprecated, use Zendesk2', caller[1])
9
+ def method_missing(message, *args, &block)
10
+ Cistern.deprecation('Zendesk2::Client is deprecated, use Zendesk2', caller[1])
16
11
 
17
- Zendesk2.respond_to?(message) || super
12
+ if Zendesk2.respond_to?(message)
13
+ Zendesk2.public_send(message, *args, &block)
14
+ else
15
+ super
16
+ end
17
+ end
18
18
  end
19
19
  end
@@ -16,8 +16,8 @@ class Zendesk2::CreateCategory
16
16
  record = {
17
17
  'id' => identity,
18
18
  'url' => url_for("/categories/#{identity}.json"),
19
- 'created_at' => Time.now.iso8601,
20
- 'updated_at' => Time.now.iso8601,
19
+ 'created_at' => timestamp,
20
+ 'updated_at' => timestamp,
21
21
  }.merge(Cistern::Hash.slice(params.fetch('category'), *self.class.accepted_attributes))
22
22
 
23
23
  cistern.data[:categories][identity] = record
@@ -20,8 +20,8 @@ class Zendesk2::CreateForum
20
20
  record = {
21
21
  'id' => identity,
22
22
  'url' => url_for("/forums/#{identity}.json"),
23
- 'created_at' => Time.now.iso8601,
24
- 'updated_at' => Time.now.iso8601,
23
+ 'created_at' => timestamp,
24
+ 'updated_at' => timestamp,
25
25
  }.merge(Cistern::Hash.slice(params.fetch('forum'), *self.class.accepted_attributes))
26
26
 
27
27
  cistern.data[:forums][identity] = record
@@ -20,8 +20,8 @@ class Zendesk2::CreateGroup
20
20
  record = {
21
21
  'id' => identity,
22
22
  'url' => url_for("/groups/#{identity}.json"),
23
- 'created_at' => Time.now.iso8601,
24
- 'updated_at' => Time.now.iso8601,
23
+ 'created_at' => timestamp,
24
+ 'updated_at' => timestamp,
25
25
  'deleted' => false,
26
26
  }.merge(group_params)
27
27
 
@@ -20,8 +20,8 @@ class Zendesk2::CreateOrganization
20
20
  record = {
21
21
  'id' => identity,
22
22
  'url' => url_for("/organizations/#{identity}.json"),
23
- 'created_at' => Time.now.iso8601,
24
- 'updated_at' => Time.now.iso8601,
23
+ 'created_at' => timestamp,
24
+ 'updated_at' => timestamp,
25
25
  }.merge(organization_params)
26
26
 
27
27
  unless record['name']
@@ -8,7 +8,7 @@ class Zendesk2::CreateTicket
8
8
 
9
9
  def self.accepted_attributes
10
10
  %w(external_id via priority requester requester_id submitter_id assignee_id organization_id subject description
11
- custom_fields recipient status collaborator_ids tags)
11
+ custom_fields recipient status collaborator_ids collaborators tags)
12
12
  end
13
13
 
14
14
  def ticket_params
@@ -24,6 +24,7 @@ class Zendesk2::CreateTicket
24
24
  requester_id = create_params.delete('requester_id')
25
25
 
26
26
  set_requester(create_params.delete('requester'), create_params)
27
+ set_collaborators(create_params)
27
28
  custom_fields = get_custom_fields(create_params.delete('custom_fields') || [])
28
29
 
29
30
  identity = cistern.serial_id
@@ -31,10 +32,9 @@ class Zendesk2::CreateTicket
31
32
  record = {
32
33
  'id' => identity,
33
34
  'url' => url_for("/tickets/#{identity}.json"),
34
- 'created_at' => Time.now.iso8601,
35
- 'updated_at' => Time.now.iso8601,
35
+ 'created_at' => timestamp,
36
+ 'updated_at' => timestamp,
36
37
  'priority' => nil,
37
- 'collaborator_ids' => [],
38
38
  'custom_fields' => custom_fields,
39
39
  }.merge(create_params)
40
40
 
@@ -64,11 +64,7 @@ class Zendesk2::CreateTicket
64
64
  ],
65
65
  })
66
66
 
67
- known_user = cistern.users.search(email: requester['email']).first
68
-
69
- user_id = (known_user && known_user.identity) || cistern.create_user('user' => requester).body['user']['id']
70
-
71
- create_params['requester_id'] = user_id.to_i
67
+ create_params['requester_id'] = find_or_create_user(requester)
72
68
  end
73
69
 
74
70
  def get_custom_fields(requested_custom_fields)
@@ -87,4 +83,35 @@ class Zendesk2::CreateTicket
87
83
 
88
84
  custom_fields
89
85
  end
86
+
87
+ # rubocop:disable Style/AccessorMethodName
88
+ def set_collaborators(create_params)
89
+ ids = create_params.delete('collaborator_ids') || []
90
+ collaborator_specs = create_params.delete('collaborators') || []
91
+
92
+ ids += collaborator_specs.map do |spec|
93
+ case spec
94
+ when Hash
95
+ find_or_create_user(spec)
96
+ when Integer, String
97
+ cistern.users.get!(spec).identity
98
+ else
99
+ raise ArgumentError, "Unprocessable collaborator: #{spec}"
100
+ end
101
+ end.compact
102
+
103
+ create_params.merge!('collaborator_ids' => ids)
104
+ end
105
+
106
+ def find_or_create_user(user)
107
+ return nil unless user['email']
108
+ user['name'] ||= user['email'].split('@').first.capitalize
109
+
110
+ known_user = cistern.users.search(email: user['email']).first
111
+
112
+ user_id = (known_user && known_user.identity) ||
113
+ cistern.create_user('user' => user).body['user']['id']
114
+
115
+ user_id.to_i
116
+ end
90
117
  end
@@ -21,7 +21,7 @@ class Zendesk2::CreateTicketField
21
21
  record = {
22
22
  'active' => true,
23
23
  'collapsed_for_agents' => false,
24
- 'created_at' => Time.now.iso8601,
24
+ 'created_at' => timestamp,
25
25
  'description' => params['title'],
26
26
  'editable_in_portal' => false,
27
27
  'id' => identity,
@@ -32,7 +32,7 @@ class Zendesk2::CreateTicketField
32
32
  'required_in_portal' => false,
33
33
  'tag' => '',
34
34
  'title_in_portal' => params['title'],
35
- 'updated_at' => Time.now.iso8601,
35
+ 'updated_at' => timestamp,
36
36
  'url' => url_for("/ticket_fields/#{identity}.json"),
37
37
  'visible_in_portal' => false,
38
38
  }.merge(ticket_field_params)
@@ -20,8 +20,8 @@ class Zendesk2::CreateTopic
20
20
  record = {
21
21
  'id' => identity,
22
22
  'url' => url_for("/topics/#{identity}.json"),
23
- 'created_at' => Time.now.iso8601,
24
- 'updated_at' => Time.now.iso8601,
23
+ 'created_at' => timestamp,
24
+ 'updated_at' => timestamp,
25
25
  }.merge(topic_params)
26
26
 
27
27
  data[:topics][identity] = record
@@ -24,8 +24,8 @@ class Zendesk2::CreateTopicComment
24
24
  record = {
25
25
  'id' => identity,
26
26
  'url' => url_for("/topics/#{topic_id}/comments/#{identity}.json"),
27
- 'created_at' => Time.now.iso8601,
28
- 'updated_at' => Time.now.iso8601,
27
+ 'created_at' => timestamp,
28
+ 'updated_at' => timestamp,
29
29
  'topic_id' => topic_id,
30
30
  }.merge(topic_comment_params)
31
31
 
@@ -25,8 +25,8 @@ class Zendesk2::CreateUser
25
25
  record = {
26
26
  'id' => user_id,
27
27
  'url' => url_for("/users/#{user_id}.json"),
28
- 'created_at' => Time.now.iso8601,
29
- 'updated_at' => Time.now.iso8601,
28
+ 'created_at' => timestamp,
29
+ 'updated_at' => timestamp,
30
30
  'role' => 'end-user',
31
31
  'active' => true,
32
32
  }.merge(user_params)
@@ -58,8 +58,8 @@ class Zendesk2::CreateUser
58
58
  user_identity = {
59
59
  'id' => user_identity_id,
60
60
  'url' => url_for("/users/#{user_id}/identities/#{user_identity_id}.json"),
61
- 'created_at' => Time.now.iso8601,
62
- 'updated_at' => Time.now.iso8601,
61
+ 'created_at' => timestamp,
62
+ 'updated_at' => timestamp,
63
63
  'type' => 'email',
64
64
  'value' => record['email'],
65
65
  'verified' => false,
@@ -20,7 +20,7 @@ class Zendesk2::CreateUserField
20
20
  record = {
21
21
  'active' => true,
22
22
  'collapsed_for_agents' => false,
23
- 'created_at' => Time.now.iso8601,
23
+ 'created_at' => timestamp,
24
24
  'description' => params['title'],
25
25
  'editable_in_portal' => false,
26
26
  'id' => identity,
@@ -31,7 +31,7 @@ class Zendesk2::CreateUserField
31
31
  'required_in_portal' => false,
32
32
  'tag' => '',
33
33
  'title_in_portal' => params['title'],
34
- 'updated_at' => Time.now.iso8601,
34
+ 'updated_at' => timestamp,
35
35
  'url' => url_for("/user_fields/#{identity}.json"),
36
36
  'visible_in_portal' => false,
37
37
  }.merge(user_field_params)
@@ -24,8 +24,8 @@ class Zendesk2::CreateUserIdentity
24
24
  record = {
25
25
  'id' => identity,
26
26
  'url' => url_for("/user/#{user_id}/identities/#{identity}.json"),
27
- 'created_at' => Time.now.iso8601,
28
- 'updated_at' => Time.now.iso8601,
27
+ 'created_at' => timestamp,
28
+ 'updated_at' => timestamp,
29
29
  'verified' => false,
30
30
  'primary' => false,
31
31
  'user_id' => user_id,
@@ -63,8 +63,8 @@ class Zendesk2::CreateView
63
63
  record = {
64
64
  'id' => identity,
65
65
  'url' => url_for("/views/#{identity}.json"),
66
- 'created_at' => Time.now.iso8601,
67
- 'updated_at' => Time.now.iso8601,
66
+ 'created_at' => timestamp,
67
+ 'updated_at' => timestamp,
68
68
  'active' => true,
69
69
  'execution' => {
70
70
  'columns' => columns,
@@ -15,7 +15,7 @@ class Zendesk2::GetViewTickets
15
15
  view = find!(:views, view_id)
16
16
 
17
17
  operators = Array(view['conditions']['all']).map do |c|
18
- operator = ('is' == c.fetch('operator')) ? :eql? : :!=
18
+ operator = 'is' == c.fetch('operator') ? :eql? : :!=
19
19
  key = c.fetch('field')
20
20
  value = c.fetch('value').to_s
21
21
 
@@ -27,7 +27,7 @@ class Zendesk2::GetViewTickets
27
27
  end
28
28
 
29
29
  any_operators = Array(view['conditions']['any']).map do |c|
30
- operator = ('is' == c.fetch('operator')) ? :eql? : :!=
30
+ operator = 'is' == c.fetch('operator') ? :eql? : :!=
31
31
  key = c.fetch('field')
32
32
  value = c.fetch('value').to_s
33
33
 
@@ -44,8 +44,8 @@ class Zendesk2::CreateHelpCenterArticle
44
44
  'vote_sum' => 0,
45
45
  'vote_count' => 0,
46
46
  'section_id' => section_id,
47
- 'created_at' => Time.now.iso8601,
48
- 'updated_at' => Time.now.iso8601,
47
+ 'created_at' => timestamp,
48
+ 'updated_at' => timestamp,
49
49
  'title' => '',
50
50
  'body' => '',
51
51
  'source_locale' => locale,
@@ -26,8 +26,8 @@ class Zendesk2::CreateHelpCenterCategory
26
26
  'html_url' => html_url_for("/hc/#{locale}/categories/#{identity}.json"),
27
27
  'author_id' => cistern.current_user['id'],
28
28
  'position' => position,
29
- 'created_at' => Time.now.iso8601,
30
- 'updated_at' => Time.now.iso8601,
29
+ 'created_at' => timestamp,
30
+ 'updated_at' => timestamp,
31
31
  'description' => '',
32
32
  }.merge(category_params)
33
33
 
@@ -21,8 +21,8 @@ class Zendesk2::CreateHelpCenterPost
21
21
  'id' => identity,
22
22
  'url' => url_for("/community/posts/#{identity}.json"),
23
23
  'html_url' => html_url_for("/hc/posts/#{identity}.json"),
24
- 'created_at' => Time.now.iso8601,
25
- 'updated_at' => Time.now.iso8601,
24
+ 'created_at' => timestamp,
25
+ 'updated_at' => timestamp,
26
26
  'vote_count' => 0,
27
27
  'vote_sum' => 0,
28
28
  'comment_count' => 0,
@@ -37,8 +37,8 @@ class Zendesk2::CreateHelpCenterSection
37
37
  'vote_sum' => 0,
38
38
  'vote_count' => 0,
39
39
  'category_id' => category_id,
40
- 'created_at' => Time.now.iso8601,
41
- 'updated_at' => Time.now.iso8601,
40
+ 'created_at' => timestamp,
41
+ 'updated_at' => timestamp,
42
42
  'name' => '',
43
43
  'body' => '',
44
44
  'source_locale' => locale,
@@ -28,12 +28,11 @@ class Zendesk2::CreateHelpCenterSubscription
28
28
  mock_response('Required parameter missing: subscription', status: 400)
29
29
  end
30
30
 
31
-
32
31
  record = subscription_params.merge(
33
32
  'id' => identity,
34
33
  'url' => url,
35
- 'created_at' => Time.now.iso8601, # @todo create #timestamp helper
36
- 'updated_at' => Time.now.iso8601,
34
+ 'created_at' => timestamp, # @todo create #timestamp helper
35
+ 'updated_at' => timestamp,
37
36
  'content_id' => content_id,
38
37
  'content_type' => content_type,
39
38
  )
@@ -24,8 +24,8 @@ class Zendesk2::CreateHelpCenterTopic
24
24
  'url' => url_for("/communit/topics/#{identity}.json"),
25
25
  'html_url' => html_url_for("/hc/topics/#{identity}.json"),
26
26
  'position' => position,
27
- 'created_at' => Time.now.iso8601,
28
- 'updated_at' => Time.now.iso8601,
27
+ 'created_at' => timestamp,
28
+ 'updated_at' => timestamp,
29
29
  'description' => '',
30
30
  }.merge(topic_params)
31
31
 
@@ -22,8 +22,8 @@ class Zendesk2::CreateHelpCenterTranslation
22
22
  'id' => identity,
23
23
  'url' => url_for("/help_center/#{source_type_url}/#{source_id}/translation/#{locale}.json"),
24
24
  'html_url' => html_url_for("/hc/#{locale}/#{source_type_url}/#{source_id}"),
25
- 'created_at' => Time.now.iso8601,
26
- 'updated_at' => Time.now.iso8601,
25
+ 'created_at' => timestamp,
26
+ 'updated_at' => timestamp,
27
27
  'title' => params.fetch('translation').fetch('title'),
28
28
  'body' => (params.fetch('translation')['body'] || ''),
29
29
  'outdated' => false,
@@ -10,6 +10,8 @@ class Zendesk2::DestroyHelpCenterArticle
10
10
  end
11
11
 
12
12
  def mock
13
- mock_response('article' => find!(:help_center_articles, article_id))
13
+ delete!(:help_center_articles, article_id)
14
+
15
+ mock_response(nil)
14
16
  end
15
17
  end
@@ -6,16 +6,9 @@ class Zendesk2::SearchHelpCenterArticles
6
6
 
7
7
  attr_reader :query
8
8
 
9
- def _mock(query, params = {})
9
+ def call(query, params)
10
10
  @query = query
11
- setup(params)
12
- mock
13
- end
14
-
15
- def _real(query, params = {})
16
- @query = query
17
- setup(params)
18
- real
11
+ super(params)
19
12
  end
20
13
 
21
14
  def mock
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
  module Zendesk2::HelpCenter::SubscriptionRequest
3
-
4
3
  def self.included(klass)
5
4
  super
6
5
  klass.extend(ClassMethods)
@@ -25,7 +25,7 @@ class Zendesk2::UpdateHelpCenterSubscription
25
25
 
26
26
  updated = subscription_params
27
27
  updated['locale'] = updated.delete('source_locale') if updated['source_locale']
28
- updated['updated_at'] = Time.now.iso8601
28
+ updated['updated_at'] = timestamp
29
29
 
30
30
  subscription.merge!(updated)
31
31
 
@@ -3,6 +3,7 @@ class Zendesk2::Mock
3
3
  attr_reader :username, :url, :token, :jwt_token
4
4
  attr_accessor :last_request
5
5
 
6
+ # rubocop:disable Metrics/BlockLength
6
7
  def self.data
7
8
  @data ||= Hash.new do |h, k|
8
9
  h[k] = {
@@ -15,11 +15,12 @@ class Zendesk2::Organizations
15
15
  def find_by_external_id(external_id)
16
16
  body = cistern.get_organization_by_external_id('external_id' => external_id).body
17
17
  data = body.delete('organizations')
18
- if data
19
- collection = clone.load(data)
20
- collection.merge_attributes(Cistern::Hash.slice(body, 'count', 'next_page', 'previous_page'))
21
- collection
22
- end
18
+
19
+ return unless data
20
+
21
+ collection = clone.load(data)
22
+ collection.merge_attributes(Cistern::Hash.slice(body, 'count', 'next_page', 'previous_page'))
23
+ collection
23
24
  end
24
25
 
25
26
  self.collection_method = :get_organizations
@@ -58,19 +58,19 @@ module Zendesk2::PagedCollection
58
58
  end
59
59
 
60
60
  def next_page
61
- if next_page_link
62
- options = { 'url' => next_page_link }
63
- options['filtered'] = filtered if respond_to?(:filtered) # searchable
64
- new_page.all(options)
65
- end
61
+ return nil unless next_page_link
62
+
63
+ options = { 'url' => next_page_link }
64
+ options['filtered'] = filtered if respond_to?(:filtered) # searchable
65
+ new_page.all(options)
66
66
  end
67
67
 
68
68
  def previous_page
69
- if previous_page_link
70
- options = { 'url' => previous_page_link }
71
- options['filtered'] = filtered if respond_to?(:filtered) # searchable
72
- new_page.all(options)
73
- end
69
+ return nil unless previous_page_link
70
+
71
+ options = { 'url' => previous_page_link }
72
+ options['filtered'] = filtered if respond_to?(:filtered) # searchable
73
+ new_page.all(options)
74
74
  end
75
75
 
76
76
  # Attempt creation of resource and explode if unsuccessful
@@ -52,18 +52,11 @@ module Zendesk2::Request
52
52
 
53
53
  attr_reader :params
54
54
 
55
- def setup(params)
55
+ def call(*args)
56
+ params = args.last.is_a?(Hash) ? args.pop : {}
56
57
  @params = Cistern::Hash.stringify_keys(params)
57
- end
58
-
59
- def _mock(params = {})
60
- setup(params)
61
- mock
62
- end
63
58
 
64
- def _real(params = {})
65
- setup(params)
66
- real
59
+ dispatch
67
60
  end
68
61
 
69
62
  def page_params!(options)
@@ -147,6 +140,10 @@ module Zendesk2::Request
147
140
  }.merge(cistern.hash.slice(params, :method, :path, :body, :headers),),)
148
141
  end
149
142
 
143
+ def timestamp
144
+ Time.now.iso8601
145
+ end
146
+
150
147
  def mock_response(body, options = {})
151
148
  response(
152
149
  method: self.class.request_method,
@@ -10,16 +10,9 @@ class Zendesk2::Search
10
10
 
11
11
  attr_reader :query
12
12
 
13
- def _mock(query, params = {})
13
+ def call(query, params)
14
14
  @query = query
15
- setup(params)
16
- mock
17
- end
18
-
19
- def _real(query, params = {})
20
- @query = query
21
- setup(params)
22
- real
15
+ super(params)
23
16
  end
24
17
 
25
18
  def mock
@@ -10,16 +10,9 @@ class Zendesk2::SearchOrganization
10
10
 
11
11
  page_params!
12
12
 
13
- def _mock(query, params = {})
13
+ def call(query, params = {})
14
14
  @query = query
15
- setup(params)
16
- mock
17
- end
18
-
19
- def _real(query, params = {})
20
- @query = query
21
- setup(params)
22
- real
15
+ super(params)
23
16
  end
24
17
 
25
18
  def mock
@@ -10,16 +10,9 @@ class Zendesk2::SearchUser
10
10
 
11
11
  page_params!
12
12
 
13
- def _mock(query, params = {})
13
+ def call(query, params)
14
14
  @query = query
15
- setup(params)
16
- mock
17
- end
18
-
19
- def _real(query, params = {})
20
- @query = query
21
- setup(params)
22
- real
15
+ super(params)
23
16
  end
24
17
 
25
18
  def mock
@@ -21,15 +21,15 @@ module Zendesk2::Searchable
21
21
  # @see http://developer.zendesk.com/documentation/rest_api/search.html
22
22
  def search(terms, params = {})
23
23
  query = (terms.is_a?(Hash) ? search_by_hash(terms) : search_by_string(terms))
24
-
25
24
  body = cistern.send(self.class.search_request, query, params).body
26
25
  data = body.delete('results')
27
26
 
28
- if data
29
- load(data)
30
- merge_attributes(Cistern::Hash.slice(body, 'count', 'next_page', 'previous_page').merge('filtered' => true))
31
- self
32
- end
27
+ return nil unless data
28
+
29
+ load(data)
30
+
31
+ merge_attributes(Cistern::Hash.slice(body, 'count', 'next_page', 'previous_page').merge('filtered' => true))
32
+ self
33
33
  end
34
34
 
35
35
  private
@@ -115,17 +115,6 @@ class Zendesk2::Ticket
115
115
  )
116
116
  end
117
117
 
118
- # @return [Array<Zendesk2::User>] All users CCD on this ticket
119
- def collaborators
120
- collaborator_ids.map { |cid| cistern.users.get(cid) }
121
- end
122
-
123
- # Update list of users to be CCD on this ticket
124
- # @param [Array<Zendesk2::User>] collaborators list of users
125
- def collaborators=(collaborators)
126
- self.collaborator_ids = collaborators.map(&:identity)
127
- end
128
-
129
118
  # @return [Zendesk2::TicketAudits] all audits for this ticket
130
119
  def audits
131
120
  cistern.ticket_audits(ticket_id: identity).all
@@ -140,4 +129,24 @@ class Zendesk2::Ticket
140
129
  def comments
141
130
  cistern.ticket_comments(ticket_id: identity).all
142
131
  end
132
+
133
+ # @return [Array<Zendesk2::User>] All users CCD on this ticket
134
+ def collaborators
135
+ (collaborator_ids || []).map { |id| cistern.users.get(id) }
136
+ end
137
+
138
+ def collaborators=(collaborators)
139
+ collaborators = [collaborators] unless collaborators.is_a?(Array)
140
+
141
+ value = collaborators.map do |collaborator|
142
+ case collaborator
143
+ when Zendesk2::User
144
+ collaborator.identity
145
+ else
146
+ collaborator
147
+ end
148
+ end
149
+
150
+ attributes[:collaborators] = value
151
+ end
143
152
  end
@@ -54,8 +54,8 @@ class Zendesk2::UpdateUser
54
54
  user_identity = {
55
55
  'id' => user_identity_id,
56
56
  'url' => url_for("/users/#{user_id}/identities/#{user_identity_id}.json"),
57
- 'created_at' => Time.now.iso8601,
58
- 'updated_at' => Time.now.iso8601,
57
+ 'created_at' => timestamp,
58
+ 'updated_at' => timestamp,
59
59
  'type' => 'email',
60
60
  'value' => email,
61
61
  'verified' => false,
@@ -28,7 +28,7 @@ class Zendesk2::UpdateView
28
28
  a + [{ 'id' => e, 'name' => Zendesk2::CreateView.view_columns.fetch(c) }]
29
29
  end
30
30
 
31
- body['updated_at'] = Time.now.iso8601
31
+ body['updated_at'] = timestamp
32
32
 
33
33
  if columns.any?
34
34
  body['execution'] = {
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module Zendesk2
3
- VERSION = '1.11.0'
3
+ VERSION = '1.12.0'.freeze
4
4
  end
@@ -39,6 +39,47 @@ describe 'Zendesk2' do
39
39
  end
40
40
  end
41
41
 
42
+ it 'should create collaborators' do
43
+ name = 'Josh Lane'
44
+ email = mock_email
45
+ collaborating_user = client.users.create!(email: mock_email, name: mock_uuid)
46
+ collaborating_user_id = client.users.create!(email: mock_email, name: mock_uuid).identity
47
+
48
+ ticket = client.tickets.create!(
49
+ subject: mock_uuid,
50
+ description: mock_uuid,
51
+ collaborators: [{ name: name, email: email }, collaborating_user_id, collaborating_user],
52
+ )
53
+
54
+ collaborators = [collaborating_user]
55
+ collaborators << client.users.get(collaborating_user_id)
56
+ collaborators << client.users.search(email: email).first if Zendesk2.mocking?
57
+
58
+ expect(ticket.collaborators).to include(*collaborators)
59
+ end
60
+
61
+ it 'fails to create collaborators with missing collaborators[email]' do
62
+ ticket = client.tickets.create!(
63
+ subject: mock_uuid,
64
+ description: mock_uuid,
65
+ collaborators: { name: 'josh', email: nil },
66
+ )
67
+
68
+ expect(ticket.collaborators).to be_empty
69
+ end
70
+
71
+ it 'fails to create collaborators with missing collaborators[name]' do
72
+ email = mock_email
73
+
74
+ ticket = client.tickets.create!(
75
+ subject: mock_uuid,
76
+ description: mock_uuid,
77
+ collaborators: { name: nil, email: email },
78
+ )
79
+
80
+ expect(ticket.collaborators.map(&:email)).to contain_exactly(email)
81
+ end
82
+
42
83
  context 'valid requester exists' do
43
84
  it 'sets organization id' do
44
85
  ticket = client.tickets.create!(subject: mock_uuid, description: mock_uuid, requester_id: 11_111_111_111_199)
@@ -23,4 +23,5 @@ Gem::Specification.new do |gem|
23
23
  gem.add_dependency 'faraday', '~> 0.9'
24
24
  gem.add_dependency 'faraday_middleware', '~> 0.9'
25
25
  gem.add_dependency 'jwt', '~> 1.0'
26
+ gem.add_dependency 'json', '> 1.7', '< 3.0'
26
27
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zendesk2
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.11.0
4
+ version: 1.12.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Josh Lane
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-07-05 00:00:00.000000000 Z
11
+ date: 2016-10-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: cistern
@@ -66,6 +66,26 @@ dependencies:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: '1.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: json
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">"
74
+ - !ruby/object:Gem::Version
75
+ version: '1.7'
76
+ - - "<"
77
+ - !ruby/object:Gem::Version
78
+ version: '3.0'
79
+ type: :runtime
80
+ prerelease: false
81
+ version_requirements: !ruby/object:Gem::Requirement
82
+ requirements:
83
+ - - ">"
84
+ - !ruby/object:Gem::Version
85
+ version: '1.7'
86
+ - - "<"
87
+ - !ruby/object:Gem::Version
88
+ version: '3.0'
69
89
  description: Zendesk V2 API client
70
90
  email:
71
91
  - me@joshualane.com