zendesk2 1.4.2 → 1.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (153) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +7 -1
  3. data/lib/zendesk2/attributes.rb +1 -1
  4. data/lib/zendesk2/{collection.rb → client/collection.rb} +22 -17
  5. data/lib/zendesk2/client/collections/categories.rb +2 -1
  6. data/lib/zendesk2/client/collections/forums.rb +2 -1
  7. data/lib/zendesk2/client/collections/groups.rb +4 -3
  8. data/lib/zendesk2/client/collections/help_center/articles.rb +2 -1
  9. data/lib/zendesk2/client/collections/help_center/categories.rb +2 -1
  10. data/lib/zendesk2/client/collections/help_center/sections.rb +2 -1
  11. data/lib/zendesk2/client/collections/memberships.rb +9 -7
  12. data/lib/zendesk2/client/collections/organizations.rb +3 -2
  13. data/lib/zendesk2/client/collections/ticket_audits.rb +5 -4
  14. data/lib/zendesk2/client/collections/ticket_comments.rb +4 -3
  15. data/lib/zendesk2/client/collections/ticket_fields.rb +3 -1
  16. data/lib/zendesk2/client/collections/tickets.rb +2 -1
  17. data/lib/zendesk2/client/collections/topic_comments.rb +2 -1
  18. data/lib/zendesk2/client/collections/topics.rb +2 -1
  19. data/lib/zendesk2/client/collections/user_fields.rb +3 -1
  20. data/lib/zendesk2/client/collections/user_identities.rb +3 -1
  21. data/lib/zendesk2/client/collections/users.rb +3 -2
  22. data/lib/zendesk2/client/help_center.rb +3 -0
  23. data/lib/zendesk2/client/mock.rb +7 -130
  24. data/lib/zendesk2/{model.rb → client/model.rb} +7 -3
  25. data/lib/zendesk2/client/models/audit_event.rb +2 -2
  26. data/lib/zendesk2/client/models/category.rb +8 -8
  27. data/lib/zendesk2/client/models/forum.rb +11 -16
  28. data/lib/zendesk2/client/models/group.rb +8 -13
  29. data/lib/zendesk2/client/models/help_center/article.rb +12 -16
  30. data/lib/zendesk2/client/models/help_center/category.rb +12 -16
  31. data/lib/zendesk2/client/models/help_center/section.rb +12 -16
  32. data/lib/zendesk2/client/models/membership.rb +10 -12
  33. data/lib/zendesk2/client/models/organization.rb +13 -20
  34. data/lib/zendesk2/client/models/ticket.rb +21 -19
  35. data/lib/zendesk2/client/models/ticket_audit.rb +3 -3
  36. data/lib/zendesk2/client/models/ticket_comment.rb +1 -1
  37. data/lib/zendesk2/client/models/ticket_comment_privacy_change.rb +1 -1
  38. data/lib/zendesk2/client/models/ticket_field.rb +5 -13
  39. data/lib/zendesk2/client/models/ticket_metric.rb +1 -1
  40. data/lib/zendesk2/client/models/ticket_voice_comment.rb +1 -1
  41. data/lib/zendesk2/client/models/topic.rb +9 -14
  42. data/lib/zendesk2/client/models/topic_comment.rb +14 -19
  43. data/lib/zendesk2/client/models/user.rb +25 -32
  44. data/lib/zendesk2/client/models/user_field.rb +10 -18
  45. data/lib/zendesk2/client/models/user_identity.rb +9 -18
  46. data/lib/zendesk2/client/real.rb +7 -8
  47. data/lib/zendesk2/client/request.rb +271 -0
  48. data/lib/zendesk2/client/requests/create_category.rb +19 -27
  49. data/lib/zendesk2/client/requests/create_forum.rb +23 -28
  50. data/lib/zendesk2/client/requests/create_group.rb +25 -29
  51. data/lib/zendesk2/client/requests/create_help_center_article.rb +54 -60
  52. data/lib/zendesk2/client/requests/create_help_center_category.rb +35 -47
  53. data/lib/zendesk2/client/requests/create_help_center_section.rb +49 -55
  54. data/lib/zendesk2/client/requests/create_membership.rb +42 -42
  55. data/lib/zendesk2/client/requests/create_organization.rb +30 -40
  56. data/lib/zendesk2/client/requests/create_ticket.rb +76 -85
  57. data/lib/zendesk2/client/requests/create_ticket_field.rb +36 -40
  58. data/lib/zendesk2/client/requests/create_topic.rb +23 -28
  59. data/lib/zendesk2/client/requests/create_topic_comment.rb +27 -31
  60. data/lib/zendesk2/client/requests/create_user.rb +51 -56
  61. data/lib/zendesk2/client/requests/create_user_field.rb +36 -40
  62. data/lib/zendesk2/client/requests/create_user_identity.rb +39 -44
  63. data/lib/zendesk2/client/requests/destroy_category.rb +8 -21
  64. data/lib/zendesk2/client/requests/destroy_forum.rb +8 -23
  65. data/lib/zendesk2/client/requests/destroy_group.rb +8 -21
  66. data/lib/zendesk2/client/requests/destroy_help_center_article.rb +8 -18
  67. data/lib/zendesk2/client/requests/destroy_help_center_category.rb +8 -18
  68. data/lib/zendesk2/client/requests/destroy_help_center_section.rb +10 -18
  69. data/lib/zendesk2/client/requests/destroy_membership.rb +8 -22
  70. data/lib/zendesk2/client/requests/destroy_organization.rb +8 -21
  71. data/lib/zendesk2/client/requests/destroy_ticket.rb +8 -21
  72. data/lib/zendesk2/client/requests/destroy_ticket_field.rb +8 -21
  73. data/lib/zendesk2/client/requests/destroy_topic.rb +8 -23
  74. data/lib/zendesk2/client/requests/destroy_topic_comment.rb +11 -24
  75. data/lib/zendesk2/client/requests/destroy_user.rb +17 -43
  76. data/lib/zendesk2/client/requests/destroy_user_field.rb +7 -22
  77. data/lib/zendesk2/client/requests/destroy_user_identity.rb +10 -25
  78. data/lib/zendesk2/client/requests/get_assignable_groups.rb +8 -16
  79. data/lib/zendesk2/client/requests/get_categories.rb +7 -15
  80. data/lib/zendesk2/client/requests/get_category.rb +11 -22
  81. data/lib/zendesk2/client/requests/get_ccd_tickets.rb +11 -18
  82. data/lib/zendesk2/client/requests/get_current_user.rb +6 -16
  83. data/lib/zendesk2/client/requests/get_forum.rb +11 -23
  84. data/lib/zendesk2/client/requests/get_forums.rb +7 -15
  85. data/lib/zendesk2/client/requests/get_group.rb +9 -23
  86. data/lib/zendesk2/client/requests/get_groups.rb +7 -15
  87. data/lib/zendesk2/client/requests/get_help_center_article.rb +13 -37
  88. data/lib/zendesk2/client/requests/get_help_center_articles.rb +6 -15
  89. data/lib/zendesk2/client/requests/get_help_center_categories.rb +6 -15
  90. data/lib/zendesk2/client/requests/get_help_center_category.rb +13 -37
  91. data/lib/zendesk2/client/requests/get_help_center_section.rb +14 -37
  92. data/lib/zendesk2/client/requests/get_help_center_sections.rb +6 -15
  93. data/lib/zendesk2/client/requests/get_membership.rb +9 -24
  94. data/lib/zendesk2/client/requests/get_organization.rb +9 -22
  95. data/lib/zendesk2/client/requests/get_organization_by_external_id.rb +11 -20
  96. data/lib/zendesk2/client/requests/get_organization_memberships.rb +10 -16
  97. data/lib/zendesk2/client/requests/get_organization_tickets.rb +14 -21
  98. data/lib/zendesk2/client/requests/get_organization_users.rb +12 -20
  99. data/lib/zendesk2/client/requests/get_organizations.rb +7 -16
  100. data/lib/zendesk2/client/requests/get_requested_tickets.rb +12 -18
  101. data/lib/zendesk2/client/requests/get_ticket.rb +9 -23
  102. data/lib/zendesk2/client/requests/get_ticket_audits.rb +12 -18
  103. data/lib/zendesk2/client/requests/get_ticket_comments.rb +10 -19
  104. data/lib/zendesk2/client/requests/get_ticket_field.rb +9 -22
  105. data/lib/zendesk2/client/requests/get_ticket_fields.rb +7 -15
  106. data/lib/zendesk2/client/requests/get_tickets.rb +7 -15
  107. data/lib/zendesk2/client/requests/get_topic.rb +8 -23
  108. data/lib/zendesk2/client/requests/get_topic_comment.rb +12 -28
  109. data/lib/zendesk2/client/requests/get_topic_comments.rb +13 -18
  110. data/lib/zendesk2/client/requests/get_topics.rb +6 -15
  111. data/lib/zendesk2/client/requests/get_user.rb +15 -28
  112. data/lib/zendesk2/client/requests/get_user_field.rb +9 -22
  113. data/lib/zendesk2/client/requests/get_user_identities.rb +11 -18
  114. data/lib/zendesk2/client/requests/get_user_identity.rb +11 -21
  115. data/lib/zendesk2/client/requests/get_user_memberships.rb +12 -18
  116. data/lib/zendesk2/client/requests/get_users.rb +7 -15
  117. data/lib/zendesk2/client/requests/mark_membership_default.rb +17 -28
  118. data/lib/zendesk2/client/requests/mark_user_identity_primary.rb +17 -30
  119. data/lib/zendesk2/client/requests/search.rb +30 -19
  120. data/lib/zendesk2/client/requests/search_help_center_articles.rb +22 -18
  121. data/lib/zendesk2/client/requests/search_organization.rb +40 -28
  122. data/lib/zendesk2/client/requests/search_user.rb +56 -44
  123. data/lib/zendesk2/client/requests/update_category.rb +14 -24
  124. data/lib/zendesk2/client/requests/update_forum.rb +13 -25
  125. data/lib/zendesk2/client/requests/update_group.rb +12 -24
  126. data/lib/zendesk2/client/requests/update_help_center_article.rb +17 -42
  127. data/lib/zendesk2/client/requests/update_help_center_category.rb +17 -42
  128. data/lib/zendesk2/client/requests/update_help_center_section.rb +17 -42
  129. data/lib/zendesk2/client/requests/update_organization.rb +23 -35
  130. data/lib/zendesk2/client/requests/update_ticket.rb +63 -63
  131. data/lib/zendesk2/client/requests/update_ticket_field.rb +12 -24
  132. data/lib/zendesk2/client/requests/update_topic.rb +11 -25
  133. data/lib/zendesk2/client/requests/update_user.rb +47 -62
  134. data/lib/zendesk2/client/requests/update_user_field.rb +11 -23
  135. data/lib/zendesk2/client/requests/update_user_identity.rb +20 -28
  136. data/lib/zendesk2/client.rb +52 -28
  137. data/lib/zendesk2/paged_collection.rb +9 -9
  138. data/lib/zendesk2/searchable.rb +1 -1
  139. data/lib/zendesk2/version.rb +1 -1
  140. data/lib/zendesk2.rb +1 -13
  141. data/spec/categories_spec.rb +132 -0
  142. data/spec/forums_spec.rb +132 -0
  143. data/spec/lib/paged_collection_spec.rb +2 -2
  144. data/spec/memberships_spec.rb +5 -9
  145. data/spec/organizations_spec.rb +176 -25
  146. data/spec/spec_helper.rb +2 -0
  147. data/spec/tickets_spec.rb +2 -2
  148. data/spec/topic_comments_spec.rb +2 -2
  149. data/spec/user_identities_spec.rb +9 -6
  150. data/spec/users_spec.rb +22 -21
  151. data/zendesk2.gemspec +1 -2
  152. metadata +7 -21
  153. data/lib/zendesk2/client/requests/update_topic_comment.rb +0 -37
@@ -0,0 +1,271 @@
1
+ class Zendesk2::Client::Request
2
+ def self.request_method(request_method=nil)
3
+ @request_method ||= request_method
4
+ end
5
+
6
+ def self.request_params(&block)
7
+ @request_params ||= block
8
+ end
9
+
10
+ def self.request_body(&block)
11
+ @request_body ||= block
12
+ end
13
+
14
+ def self.request_path(&block)
15
+ @request_path ||= block
16
+ end
17
+
18
+ def self.page_params!
19
+ @page_params = true
20
+ end
21
+
22
+ def self.page_params?
23
+ @page_params
24
+ end
25
+
26
+ def self.error_map
27
+ @@error_map ||= {
28
+ :invalid => [422, {
29
+ "error" => "RecordInvalid",
30
+ "description" => "Record validation errors",
31
+ }],
32
+ :not_found => [404, {
33
+ "error" => "RecordNotFound",
34
+ "description" => "Not found",
35
+ }],
36
+ }
37
+ end
38
+
39
+ attr_reader :params
40
+
41
+ def setup(params)
42
+ @params = Cistern::Hash.stringify_keys(params)
43
+ end
44
+
45
+ def _mock(params={})
46
+ setup(params)
47
+ mock
48
+ end
49
+
50
+ def _real(params={})
51
+ setup(params)
52
+ real
53
+ end
54
+
55
+ def page_params!(options)
56
+ if url = options.delete("url")
57
+ Faraday::NestedParamsEncoder.decode(URI.parse(url).query)
58
+ else
59
+ Cistern::Hash.stringify_keys(options)
60
+ end
61
+ end
62
+
63
+ def page_params?
64
+ self.class.page_params?
65
+ end
66
+
67
+ def request_params
68
+ if page_params?
69
+ page_params = page_params!(self.params)
70
+ end
71
+
72
+ if self.class.request_params
73
+ self.class.request_params.call(self)
74
+ else
75
+ page_params
76
+ end
77
+ end
78
+
79
+ def request_path
80
+ case (generator = self.class.request_path)
81
+ when Proc then
82
+ generator.call(self)
83
+ else raise ArgumentError.new("Couldn't generate request_path from #{generator.inspect}")
84
+ end
85
+ end
86
+
87
+ def request_body
88
+ case (generator = self.class.request_body)
89
+ when Proc then
90
+ generator.call(self)
91
+ when NilClass then nil
92
+ else raise("Invalid request body generator: #{generator.inspect}")
93
+ end
94
+ end
95
+
96
+ def pluralize(word)
97
+ pluralized = word.dup
98
+ [[/y$/, 'ies'], [/$/, 's']].find{|regex, replace| pluralized.gsub!(regex, replace) if pluralized.match(regex)}
99
+ pluralized
100
+ end
101
+
102
+ def data
103
+ self.service.data
104
+ end
105
+
106
+ def html_url_for(path)
107
+ File.join(service.url, path.to_s)
108
+ end
109
+
110
+ def url_for(path, options={})
111
+ URI.parse(
112
+ File.join(service.url, "/api/v2", path.to_s)
113
+ ).tap do |uri|
114
+ if query = options[:query]
115
+ uri.query = Faraday::NestedParamsEncoder.encode(query)
116
+ end
117
+ end.to_s
118
+ end
119
+
120
+ def real(params={})
121
+ service.request(:method => self.class.request_method,
122
+ :path => self.request_path,
123
+ :body => self.request_body,
124
+ :url => params["url"],
125
+ :params => self.request_params,
126
+ )
127
+ end
128
+
129
+ def real_request(params={})
130
+ request({
131
+ :method => self.class.request_method,
132
+ :path => self.request_path(params),
133
+ :body => self.request_body(params),
134
+ }.merge(cistern::hash.slice(params, :method, :path, :body, :headers)))
135
+ end
136
+
137
+ def mock_response(body, options={})
138
+ response(
139
+ :method => self.class.request_method,
140
+ :path => options[:path] || self.request_path,
141
+ :request_body => self.request_body,
142
+ :response_body => body,
143
+ :headers => options[:headers] || {},
144
+ :status => options[:status] || 200,
145
+ :params => options[:params] || self.request_params,
146
+ )
147
+ end
148
+
149
+ def find!(collection, identity, options={})
150
+ if resource = self.service.data[collection][identity.to_i]
151
+ resource
152
+ else
153
+ error!(options[:error] || :not_found, options)
154
+ end
155
+ end
156
+
157
+ def delete!(collection, identity, options={})
158
+ self.service.data[collection].delete(identity.to_i) ||
159
+ error!(options[:error] || :not_found, options)
160
+ end
161
+
162
+ def error!(type, options={})
163
+ status, body = self.class.error_map[type]
164
+ body.merge!("details" => options[:details]) if options[:details]
165
+
166
+ response(
167
+ :path => self.request_path,
168
+ :status => status,
169
+ :body => body,
170
+ )
171
+ end
172
+
173
+ def resources(collection, options={})
174
+ page = collection.is_a?(Array) ? collection : service.data[collection.to_sym].values
175
+ root = options.fetch(:root) { !collection.is_a?(Array) && collection.to_s }
176
+
177
+ mock_response(
178
+ root => page,
179
+ "count" => page.size,
180
+ )
181
+ end
182
+
183
+ def page(collection, options={})
184
+ url_params = options[:params] || params
185
+ page_params = page_params!(params)
186
+
187
+ page_size = (page_params.delete("per_page") || 50).to_i
188
+ page_index = (page_params.delete("page") || 1).to_i
189
+ root = options.fetch(:root) { !collection.is_a?(Array) && collection.to_s }
190
+ path = options[:path] || request_path
191
+
192
+ offset = (page_index - 1) * page_size
193
+
194
+ resources = collection.is_a?(Array) ? collection : service.data[collection.to_sym].values
195
+ count = resources.size
196
+ total_pages = (count / page_size) + 1
197
+
198
+ next_page = if page_index < total_pages
199
+ url_for(path, query: {"page" => page_index + 1, "per_page" => page_size}.merge(url_params))
200
+ end
201
+ previous_page = if page_index > 1
202
+ url_for(path, query: {"page" => page_index - 1, "per_page" => page_size}.merge(url_params))
203
+ end
204
+
205
+ resource_page = resources.slice(offset, page_size)
206
+
207
+ body = {
208
+ root => resource_page,
209
+ "count" => count,
210
+ "next_page" => next_page,
211
+ "previous_page" => previous_page,
212
+ }
213
+
214
+ response(
215
+ :body => body,
216
+ :path => path
217
+ )
218
+ end
219
+
220
+ # @fixme
221
+ # id values are validate for format / type
222
+ #
223
+ # {
224
+ # "error": {
225
+ # "title": "Invalid attribute",
226
+ # "message": "You passed an invalid value for the id attribute. must be an integer"
227
+ # }
228
+ # }
229
+ # @note
230
+ #
231
+ # \@request_body is special because it's need for spec assertions but
232
+ # {Faraday::Env} replaces the request body with the response body after
233
+ # the request and the reference is lost
234
+ def response(options={})
235
+ body = options[:response_body] || options[:body]
236
+ method = options[:method] || :get
237
+ params = options[:params]
238
+ service.last_request = options[:request_body]
239
+ status = options[:status] || 200
240
+
241
+ path = options[:path]
242
+ url = options[:url] || url_for(path, query: params)
243
+
244
+ request_headers = {"Accept" => "application/json"}
245
+ response_headers = {"Content-Type" => "application/json; charset=utf-8"}
246
+
247
+ # request phase
248
+ # * :method - :get, :post, ...
249
+ # * :url - URI for the current request; also contains GET parameters
250
+ # * :body - POST parameters for :post/:put requests
251
+ # * :request_headers
252
+
253
+ # response phase
254
+ # * :status - HTTP response status code, such as 200
255
+ # * :body - the response body
256
+ # * :response_headers
257
+ env = Faraday::Env.from(
258
+ :method => method,
259
+ :url => URI.parse(url),
260
+ :body => body,
261
+ :request_headers => request_headers,
262
+ :response_headers => response_headers,
263
+ :status => status,
264
+ )
265
+
266
+ Faraday::Response::RaiseError.new.on_complete(env) ||
267
+ Faraday::Response.new(env)
268
+ rescue Faraday::Error::ClientError => e
269
+ raise Zendesk2::Error.new(e)
270
+ end
271
+ end
@@ -1,32 +1,24 @@
1
- class Zendesk2::Client
2
- class Real
3
- def create_category(params={})
4
- request(
5
- :body => {"category" => params},
6
- :method => :post,
7
- :path => "/categories.json",
8
- )
9
- end
10
- end # Real
1
+ class Zendesk2::Client::CreateCategory < Zendesk2::Client::Request
2
+ request_method :post
3
+ request_path { |_| "/categories.json" }
4
+ request_body { |r| {"category" => r.params["category"]} }
11
5
 
12
- class Mock
13
- def create_category(params={})
14
- identity = self.class.new_id
6
+ def self.accepted_attributes
7
+ %w[id name description position]
8
+ end
15
9
 
16
- record = {
17
- "id" => identity,
18
- "url" => url_for("/categories/#{identity}.json"),
19
- "created_at" => Time.now.iso8601,
20
- "updated_at" => Time.now.iso8601,
21
- }.merge(params)
10
+ def mock
11
+ identity = service.serial_id
22
12
 
23
- self.data[:categories][identity] = record
13
+ record = {
14
+ "id" => identity,
15
+ "url" => url_for("/categories/#{identity}.json"),
16
+ "created_at" => Time.now.iso8601,
17
+ "updated_at" => Time.now.iso8601,
18
+ }.merge(Cistern::Hash.slice(params.fetch("category"), *self.class.accepted_attributes))
24
19
 
25
- response(
26
- :method => :post,
27
- :body => {"category" => record},
28
- :path => "/categories.json"
29
- )
30
- end
31
- end # Mock
20
+ service.data[:categories][identity] = record
21
+
22
+ mock_response({"category" => record}, {status: 201})
23
+ end
32
24
  end
@@ -1,33 +1,28 @@
1
- class Zendesk2::Client
2
- class Real
3
- def create_forum(params={})
4
- request(
5
- :body => {"forum" => params},
6
- :method => :post,
7
- :path => "/forums.json",
8
- )
9
- end
10
- end # Real
1
+ class Zendesk2::Client::CreateForum < Zendesk2::Client::Request
2
+ request_method :post
3
+ request_path { |_| "/forums.json" }
4
+ request_body { |r| {"forum" => r.forum_params } }
11
5
 
12
- class Mock
13
- def create_forum(params={})
14
- identity = self.class.new_id
6
+ def self.accepted_attributes
7
+ %w[name description category_id organization_id locale_id locked position forum_type access]
8
+ end
15
9
 
16
- record = {
17
- "id" => identity,
18
- "url" => url_for("/forums/#{identity}.json"),
19
- "created_at" => Time.now.iso8601,
20
- "updated_at" => Time.now.iso8601,
21
- }.merge(params)
10
+ def forum_params
11
+ Cistern::Hash.slice(params.fetch("forum"), *self.class.accepted_attributes)
12
+ end
22
13
 
23
- path = "/forums.json"
24
- self.data[:forums][identity]= record
14
+ def mock
15
+ identity = service.serial_id
25
16
 
26
- response(
27
- :method => :post,
28
- :body => {"forum" => record},
29
- :path => path,
30
- )
31
- end
32
- end # Mock
17
+ record = {
18
+ "id" => identity,
19
+ "url" => url_for("/forums/#{identity}.json"),
20
+ "created_at" => Time.now.iso8601,
21
+ "updated_at" => Time.now.iso8601,
22
+ }.merge(Cistern::Hash.slice(params.fetch("forum"), *self.class.accepted_attributes))
23
+
24
+ service.data[:forums][identity] = record
25
+
26
+ mock_response({"forum" => record}, {status: 201})
27
+ end
33
28
  end
@@ -1,33 +1,29 @@
1
- class Zendesk2::Client
2
- class Real
3
- def create_group(params={})
4
- request(
5
- :body => {"group" => params},
6
- :method => :post,
7
- :path => "/groups.json",
8
- )
9
- end
10
- end # Real
1
+ class Zendesk2::Client::CreateGroup < Zendesk2::Client::Request
2
+ request_method :post
3
+ request_path { |_| "/groups.json" }
4
+ request_body { |r| { "group" => r.group_params } }
11
5
 
12
- class Mock
13
- def create_group(params={})
14
- identity = self.class.new_id
6
+ def self.accepted_attributes
7
+ %w[name]
8
+ end
15
9
 
16
- record = {
17
- "id" => identity,
18
- "url" => url_for("/groups/#{identity}.json"),
19
- "created_at" => Time.now.iso8601,
20
- "updated_at" => Time.now.iso8601,
21
- "deleted" => false,
22
- }.merge(params)
10
+ def group_params
11
+ @_group_params ||= Cistern::Hash.slice(params.fetch("group"), *self.class.accepted_attributes)
12
+ end
23
13
 
24
- self.data[:groups][identity] = record
14
+ def mock(params={})
15
+ identity = service.serial_id
25
16
 
26
- response(
27
- :method => :post,
28
- :body => {"group" => record},
29
- :path => "/groups.json"
30
- )
31
- end
32
- end # Mock
33
- end # Zendesk2::Client
17
+ record = {
18
+ "id" => identity,
19
+ "url" => url_for("/groups/#{identity}.json"),
20
+ "created_at" => Time.now.iso8601,
21
+ "updated_at" => Time.now.iso8601,
22
+ "deleted" => false,
23
+ }.merge(group_params)
24
+
25
+ self.data[:groups][identity] = record
26
+
27
+ mock_response({"group" => record}, {status: 201})
28
+ end
29
+ end
@@ -1,61 +1,55 @@
1
- class Zendesk2::Client
2
- class Real
3
- def create_help_center_article(params={})
4
- section_id = require_parameters(params, "section_id")
5
- path = if locale = params["locale"]
6
- "/help_center/#{locale}/sections/#{section_id}/articles.json"
7
- else
8
- "/help_center/sections/#{section_id}/articles.json"
9
- end
10
-
11
-
12
- request(
13
- :body => {"article" => params},
14
- :method => :post,
15
- :path => path,
16
- )
1
+ class Zendesk2::Client::CreateHelpCenterArticle < Zendesk2::Client::Request
2
+ request_method :post
3
+ request_body { |r| { "article" => r.article_params } }
4
+ request_path { |r|
5
+ if locale = r.article_params["locale"]
6
+ "/help_center/#{locale}/sections/#{r.section_id}/articles.json"
7
+ else
8
+ "/help_center/sections/#{r.section_id}/articles.json"
17
9
  end
18
- end # Real
19
-
20
- class Mock
21
- def create_help_center_article(params={})
22
- params = Cistern::Hash.stringify_keys(params)
23
-
24
- identity = self.class.new_id
25
-
26
- section_id = *require_parameters(params, "section_id")
27
-
28
- locale = params["locale"] ||= "en-us"
29
- position = self.data[:help_center_articles].values.select { |a| a["section_id"] == section_id }.size
30
-
31
- record = {
32
- "id" => identity,
33
- "url" => url_for("/help_center/#{locale}/articles/#{identity}.json"),
34
- "html_url" => html_url_for("/hc/#{locale}/articles/#{identity}.json"),
35
- "author_id" => current_user["id"],
36
- "comments_disabled" => false,
37
- "label_names" => [],
38
- "draft" => false,
39
- "promoted" => false,
40
- "position" => position,
41
- "vote_sum" => 0,
42
- "vote_count" => 0,
43
- "section_id" => section_id,
44
- "created_at" => Time.now.iso8601,
45
- "updated_at" => Time.now.iso8601,
46
- "title" => "",
47
- "body" => "",
48
- "source_locale" => locale,
49
- "outdated" => false,
50
- }.merge(params)
51
-
52
- self.data[:help_center_articles][identity] = record
53
-
54
- response(
55
- :method => :post,
56
- :body => {"article" => record},
57
- :path => "/sections/#{section_id}.json"
58
- )
59
- end
60
- end # Mock
61
- end # Zendesk2::Client
10
+ }
11
+
12
+ def self.accepted_attributes
13
+ %w[author_id body comments_disabled draft label_names locale position promoted section_id title]
14
+ end
15
+
16
+ def article_params
17
+ @_article_params ||= Cistern::Hash.slice(params.fetch("article"), *self.class.accepted_attributes)
18
+ end
19
+
20
+ def section_id
21
+ params.fetch("article").fetch("section_id")
22
+ end
23
+
24
+ def mock
25
+ identity = service.serial_id
26
+
27
+ locale = params["locale"] ||= "en-us"
28
+ position = self.data[:help_center_articles].values.select { |a| a["section_id"] == section_id }.size
29
+
30
+ record = {
31
+ "id" => identity,
32
+ "url" => url_for("/help_center/#{locale}/articles/#{identity}.json"),
33
+ "html_url" => html_url_for("/hc/#{locale}/articles/#{identity}.json"),
34
+ "author_id" => service.current_user["id"],
35
+ "comments_disabled" => false,
36
+ "label_names" => [],
37
+ "draft" => false,
38
+ "promoted" => false,
39
+ "position" => position,
40
+ "vote_sum" => 0,
41
+ "vote_count" => 0,
42
+ "section_id" => section_id,
43
+ "created_at" => Time.now.iso8601,
44
+ "updated_at" => Time.now.iso8601,
45
+ "title" => "",
46
+ "body" => "",
47
+ "source_locale" => locale,
48
+ "outdated" => false,
49
+ }.merge(article_params)
50
+
51
+ self.data[:help_center_articles][identity] = record
52
+
53
+ mock_response("article" => record)
54
+ end
55
+ end