zendesk2 1.4.2 → 1.5.3

Sign up to get free protection for your applications and to get access to all the features.
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