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
@@ -1,47 +1,35 @@
1
- class Zendesk2::Client
2
- class Real
3
- def create_help_center_category(params={})
4
- params = Cistern::Hash.stringify_keys(params)
5
-
6
- require_parameters(params, "name")
7
-
8
- request(
9
- :body => {"category" => params},
10
- :method => :post,
11
- :path => "/help_center/categories.json",
12
- )
13
- end
14
- end # Real
15
-
16
- class Mock
17
- def create_help_center_category(params={})
18
- params = Cistern::Hash.stringify_keys(params)
19
-
20
- require_parameters(params, "name")
21
-
22
- identity = self.class.new_id
23
-
24
- locale = params["locale"] ||= "en-us"
25
- position = self.data[:help_center_categories].size
26
-
27
- record = {
28
- "id" => identity,
29
- "url" => url_for("/help_center/#{locale}/categories/#{identity}.json"),
30
- "html_url" => html_url_for("/hc/#{locale}/categories/#{identity}.json"),
31
- "author_id" => current_user["id"],
32
- "position" => position,
33
- "created_at" => Time.now.iso8601,
34
- "updated_at" => Time.now.iso8601,
35
- "description" => "",
36
- }.merge(params)
37
-
38
- self.data[:help_center_categories][identity] = record
39
-
40
- response(
41
- :method => :post,
42
- :body => {"category" => record},
43
- :path => "/categories.json"
44
- )
45
- end
46
- end # Mock
47
- end # Zendesk2::Client
1
+ class Zendesk2::Client::CreateHelpCenterCategory < Zendesk2::Client::Request
2
+ request_method :post
3
+ request_path { |_| "/help_center/categories.json" }
4
+ request_body { |r| {"category" => r.category_params} }
5
+
6
+ def self.accepted_attributes
7
+ %w[category_id description locale name position sorting]
8
+ end
9
+
10
+ def category_params
11
+ Cistern::Hash.slice(params.fetch("category"), *self.class.accepted_attributes)
12
+ end
13
+
14
+ def mock
15
+ identity = service.serial_id
16
+
17
+ locale = params["locale"] ||= "en-us"
18
+ position = self.data[:help_center_categories].size
19
+
20
+ record = {
21
+ "id" => identity,
22
+ "url" => url_for("/help_center/#{locale}/categories/#{identity}.json"),
23
+ "html_url" => html_url_for("/hc/#{locale}/categories/#{identity}.json"),
24
+ "author_id" => service.current_user["id"],
25
+ "position" => position,
26
+ "created_at" => Time.now.iso8601,
27
+ "updated_at" => Time.now.iso8601,
28
+ "description" => "",
29
+ }.merge(category_params)
30
+
31
+ self.data[:help_center_categories][identity] = record
32
+
33
+ mock_response("category" => record)
34
+ end
35
+ end
@@ -1,55 +1,49 @@
1
- class Zendesk2::Client
2
- class Real
3
- def create_help_center_section(params={})
4
- category_id = require_parameters(params, "category_id")
5
-
6
- request(
7
- :body => {"section" => params},
8
- :method => :post,
9
- :path => "/help_center/categories/#{category_id}/sections.json",
10
- )
11
- end
12
- end # Real
13
-
14
- class Mock
15
- def create_help_center_section(params={})
16
- params = Cistern::Hash.stringify_keys(params)
17
-
18
- identity = self.class.new_id
19
-
20
- category_id = require_parameters(params, "category_id")
21
-
22
- locale = params["locale"] ||= "en-us"
23
- position = self.data[:help_center_sections].values.select { |a| a["category_id"] == category_id }.size
24
-
25
- record = {
26
- "id" => identity,
27
- "url" => url_for("/help_center/#{locale}/sections/#{identity}.json"),
28
- "html_url" => html_url_for("/hc/#{locale}/sections/#{identity}.json"),
29
- "author_id" => current_user["id"],
30
- "comments_disabled" => false,
31
- "label_names" => [],
32
- "draft" => false,
33
- "promoted" => false,
34
- "position" => position,
35
- "vote_sum" => 0,
36
- "vote_count" => 0,
37
- "category_id" => category_id,
38
- "created_at" => Time.now.iso8601,
39
- "updated_at" => Time.now.iso8601,
40
- "name" => "",
41
- "body" => "",
42
- "source_locale" => locale,
43
- "outdated" => false,
44
- }.merge(params)
45
-
46
- self.data[:help_center_sections][identity] = record
47
-
48
- response(
49
- :method => :post,
50
- :body => {"section" => record},
51
- :path => "/sections/#{category_id}.json"
52
- )
53
- end
54
- end # Mock
55
- end # Zendesk2::Client
1
+ class Zendesk2::Client::CreateHelpCenterSection < Zendesk2::Client::Request
2
+ request_method :post
3
+ request_path { |r| "/help_center/categories/#{r.category_id}/sections.json" }
4
+ request_body { |r| { "section" => r.section_params } }
5
+
6
+ def self.accepted_attributes
7
+ %w[category_id description locale name position sorting]
8
+ end
9
+
10
+ def section_params
11
+ Cistern::Hash.slice(params.fetch("section"), *self.class.accepted_attributes)
12
+ end
13
+
14
+ def category_id
15
+ params.fetch("section").fetch("category_id")
16
+ end
17
+
18
+ def mock
19
+ identity = service.serial_id
20
+
21
+ locale = params["locale"] ||= "en-us"
22
+ position = self.data[:help_center_sections].values.select { |a| a["category_id"] == category_id }.size
23
+
24
+ record = {
25
+ "id" => identity,
26
+ "url" => url_for("/help_center/#{locale}/sections/#{identity}.json"),
27
+ "html_url" => html_url_for("/hc/#{locale}/sections/#{identity}.json"),
28
+ "author_id" => service.current_user["id"],
29
+ "comments_disabled" => false,
30
+ "label_names" => [],
31
+ "draft" => false,
32
+ "promoted" => false,
33
+ "position" => position,
34
+ "vote_sum" => 0,
35
+ "vote_count" => 0,
36
+ "category_id" => category_id,
37
+ "created_at" => Time.now.iso8601,
38
+ "updated_at" => Time.now.iso8601,
39
+ "name" => "",
40
+ "body" => "",
41
+ "source_locale" => locale,
42
+ "outdated" => false,
43
+ }.merge(section_params)
44
+
45
+ service.data[:help_center_sections][identity] = record
46
+
47
+ mock_response("section" => record)
48
+ end
49
+ end
@@ -1,49 +1,49 @@
1
- class Zendesk2::Client
2
- class Real
3
- def create_membership(params={})
4
- require_parameters(params, "user_id", "organization_id")
5
-
6
- user_id = params["user_id"]
7
-
8
- request(
9
- :body => {"organization_membership" => params },
10
- :method => :post,
11
- :path => "/users/#{user_id}/organization_memberships.json",
12
- )
1
+ class Zendesk2::Client::CreateMembership < Zendesk2::Client::Request
2
+ request_method :post
3
+ request_path { |r| "/users/#{r.user_id}/organization_memberships.json" }
4
+ request_body { |r| { "organization_membership" => r.membership_params } }
5
+
6
+ def self.accepted_params
7
+ %w[user_id organization_id default]
8
+ end
9
+
10
+ def membership_params
11
+ @_membership_params ||= Cistern::Hash.slice(params.fetch("membership"), *self.class.accepted_params)
12
+ end
13
+
14
+ def user_id
15
+ params.fetch("membership").fetch("user_id").to_i
16
+ end
17
+
18
+ def organization_id
19
+ params.fetch("membership").fetch("organization_id").to_i
20
+ end
21
+
22
+ def mock
23
+ find!(:users, user_id)
24
+ find!(:organizations, organization_id,
25
+ :error => :invalid,
26
+ :details => {
27
+ "organization" => [ { "description" => "Organization cannot be blank" } ],
28
+ })
29
+
30
+ if self.data[:memberships].values.find { |m| m["user_id"] == user_id && m["organization_id"] == organization_id }
31
+ error!(:invalid, description: { "user_id" => [ { "description" => "User has already been taken" } ] })
13
32
  end
14
- end # Real
15
33
 
16
- class Mock
17
- def create_membership(params={})
18
- require_parameters(params, "user_id", "organization_id")
34
+ resource_id = service.serial_id
19
35
 
20
- user_id = params["user_id"]
21
- organization_id = params["organization_id"]
36
+ default_membership = false # !self.data[:memberships].values.find { |m| m["user_id"] == user_id && m["default"] }
22
37
 
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
38
+ resource = {
39
+ "id" => resource_id,
40
+ "user_id" => user_id,
41
+ "organization_id" => organization_id,
42
+ "default" => default_membership,
43
+ }
28
44
 
29
- resource_id = self.class.new_id
45
+ self.data[:memberships][resource_id] = resource
30
46
 
31
- default_membership = false # !self.data[:memberships].values.find { |m| m["user_id"] == user_id && m["default"] }
32
-
33
- resource = {
34
- "id" => resource_id,
35
- "user_id" => user_id,
36
- "organization_id" => organization_id,
37
- "default" => default_membership,
38
- }
39
-
40
- self.data[:memberships][resource_id] = resource
41
-
42
- response(
43
- :method => :post,
44
- :body => { "organization_membership" => resource },
45
- :path => "/users/#{user_id}/organization_memberships.json",
46
- )
47
- end
48
- end # Mock
47
+ mock_response("organization_membership" => resource)
48
+ end
49
49
  end
@@ -1,46 +1,36 @@
1
- class Zendesk2::Client
2
- class Real
3
- def create_organization(params={})
4
- request(
5
- :body => {"organization" => params},
6
- :method => :post,
7
- :path => "/organizations.json",
8
- )
1
+ class Zendesk2::Client::CreateOrganization < Zendesk2::Client::Request
2
+ request_method :post
3
+ request_path { |_| "/organizations.json" }
4
+ request_body { |r| { "organization" => Cistern::Hash.except(r.params["organization"], "id") } }
5
+
6
+ def self.accepted_attributes
7
+ %w[details domain_names external_id group_id organization_fields shared_comments shared_tickets tags name notes]
8
+ end
9
+
10
+ def mock
11
+ identity = service.serial_id
12
+
13
+ record = {
14
+ "id" => identity,
15
+ "url" => url_for("/organizations/#{identity}.json"),
16
+ "created_at" => Time.now.iso8601,
17
+ "updated_at" => Time.now.iso8601,
18
+ }.merge(Cistern::Hash.slice(params.fetch("organization"), *self.class.accepted_attributes))
19
+
20
+ unless record["name"]
21
+ error!(:invalid, details: { "name" => [ { "description" => "Name cannot be blank" } ]})
9
22
  end
10
- end # Real
11
23
 
12
- class Mock
13
- def create_organization(_params={})
14
- params = Cistern::Hash.stringify_keys(_params)
15
- identity = self.class.new_id
16
-
17
- record = {
18
- "id" => identity,
19
- "url" => url_for("/organizations/#{identity}.json"),
20
- "created_at" => Time.now.iso8601,
21
- "updated_at" => Time.now.iso8601,
22
- }.merge(params)
23
-
24
-
25
- unless record["name"]
26
- error!(:invalid, details: { "name" => [ { "description" => "Name cannot be blank" } ]})
27
- end
28
-
29
- if self.data[:organizations].values.find { |o| o["name"] == record["name"]}
30
- error!(:invalid, details: {"name" => [ { "description" => "Name: has already been taken" } ]})
31
- end
24
+ if self.data[:organizations].values.find { |o| o["name"].downcase == record["name"].downcase }
25
+ error!(:invalid, details: {"name" => [ { "description" => "Name: has already been taken" } ]})
26
+ end
32
27
 
33
- if record["external_id"] && self.data[:organizations].values.find { |o| o["external_id"] == record["external_id"] }
34
- error!(:invalid, details: {"name" => [ { "description" => "External has already been taken" } ]})
35
- end
28
+ if record["external_id"] && self.data[:organizations].values.find { |o| o["external_id"] == record["external_id"] }
29
+ error!(:invalid, details: {"name" => [ { "description" => "External has already been taken" } ]})
30
+ end
36
31
 
37
- self.data[:organizations][identity] = record
32
+ self.data[:organizations][identity] = record
38
33
 
39
- response(
40
- :method => :post,
41
- :body => {"organization" => record},
42
- :path => "/organizations.json"
43
- )
44
- end
45
- end # Mock
34
+ mock_response({"organization" => record}, {status: 201})
35
+ end
46
36
  end
@@ -1,96 +1,87 @@
1
- class Zendesk2::Client
2
- class Real
3
- def create_ticket(params={})
4
- request(
5
- :body => {"ticket" => params},
6
- :method => :post,
7
- :path => "/tickets.json",
8
- )
9
- end
10
- end # Real
1
+ class Zendesk2::Client::CreateTicket < Zendesk2::Client::Request
2
+ request_method :post
3
+ request_path { |_| "/tickets.json" }
4
+ request_body { |r| {"ticket" => r.ticket_params} }
11
5
 
12
- class Mock
13
- def create_ticket(params={})
14
- params = Cistern::Hash.stringify_keys(params)
6
+ def self.accepted_attributes
7
+ %w[external_id via priority requester requester_id submitter_id assignee_id organization_id subject description custom_fields recipient status collaborator_ids tags]
8
+ end
15
9
 
16
- identity = self.class.new_id
10
+ def ticket_params
11
+ @_ticket_params ||= Cistern::Hash.slice(params.fetch("ticket"), *self.class.accepted_attributes)
12
+ end
17
13
 
18
- if params["description"].nil? || params["description"] == ""
19
- error!(:invalid, :details => {"base" => [{"description" => "Description: cannot be blank"}]})
20
- end
14
+ def mock
15
+ create_params = ticket_params.dup
16
+
17
+ if create_params["description"].nil? || create_params["description"] == ""
18
+ error!(:invalid, :details => {"base" => [{"description" => "Description: cannot be blank"}]})
19
+ end
21
20
 
22
- requester_id = params.delete('requester_id')
23
-
24
- if requester = params.delete('requester')
25
- if !requester['name'] || requester['name'].size < 1
26
- response(
27
- :path => "/tickets.json",
28
- :method => :post,
29
- :status => 422,
30
- :body => {
31
- "error" => "RecordInvalid",
32
- "description" => "Record validation errors",
33
- "details" => {
34
- "requester" => [
35
- {
36
- "description" => "Requester Name: is too short (minimum is 1 characters)"
37
- }
38
- ]}})
39
- end
40
-
41
- user_id = if known_user = self.users.search(email: requester['email']).first
42
- known_user.identity
43
- else
44
- # name is not required in this case
45
- create_user(requester).body["user"]["id"]
46
- end.to_s
47
-
48
- params['requester_id'] = user_id
21
+ requester_id = create_params.delete('requester_id')
22
+
23
+ if requester = create_params.delete('requester')
24
+ if !requester['name'] || requester['name'].size < 1
25
+ error!(:invalid,
26
+ :details => {
27
+ "requester" => [
28
+ {
29
+ "description" => "Requester Name: is too short (minimum is 1 characters)"
30
+ }
31
+ ]})
49
32
  end
50
33
 
51
- requested_custom_fields = (params.delete("custom_fields") || [])
34
+ user_id = if known_user = service.users.search(email: requester['email']).first
35
+ known_user.identity
36
+ else
37
+ # name is not required in this case
38
+ service.create_user("user" => requester).body["user"]["id"]
39
+ end
40
+
41
+ create_params['requester_id'] = user_id.to_i
42
+ end
43
+
44
+ requested_custom_fields = (create_params.delete("custom_fields") || [])
52
45
 
53
- custom_fields = requested_custom_fields.map do |cf|
54
- field_id = cf["id"].to_i
55
- if self.data[:ticket_fields][field_id.to_s]
56
- {"id" => field_id, "value" => cf["value"] }
57
- else
58
- # @fixme error ?!
59
- end
60
- end.compact
46
+ custom_fields = requested_custom_fields.map do |cf|
47
+ field_id = cf["id"].to_i
61
48
 
62
- self.data[:ticket_fields].each do |field_id, field|
63
- requested_custom_fields.find { |cf| cf["id"].to_i == field_id.to_i } ||
64
- custom_fields << {"id" => field_id.to_i, "value" => nil }
49
+ if service.data[:ticket_fields][field_id]
50
+ {"id" => field_id, "value" => cf["value"] }
51
+ else
52
+ # @fixme error ?!
65
53
  end
54
+ end.compact
66
55
 
67
- record = {
68
- "id" => identity,
69
- "url" => url_for("/tickets/#{identity}.json"),
70
- "created_at" => Time.now.iso8601,
71
- "updated_at" => Time.now.iso8601,
72
- "priority" => nil,
73
- "collaborator_ids" => [],
74
- "custom_fields" => custom_fields,
75
- }.merge(params)
76
-
77
- record["requester_id"] ||= (requester_id && requester_id.to_s) || current_user["id"].to_s
78
- record["submitter_id"] = current_user["id"].to_s
79
-
80
- # @note invalid requester id does NOT cause a 404 or 422
81
- record["organization_id"] = if requester = self.data[:users][record["requester_id"]]
82
- requester["organization_id"]
83
- else
84
- nil
85
- end
86
-
87
- self.data[:tickets][identity] = record
88
-
89
- response(
90
- :method => :post,
91
- :body => {"ticket" => record},
92
- :path => "/tickets.json"
93
- )
56
+ service.data[:ticket_fields].each do |field_id, field|
57
+ requested_custom_fields.find { |cf| cf["id"] == field_id } ||
58
+ custom_fields << {"id" => field_id, "value" => nil }
94
59
  end
95
- end # Mock
96
- end # Zendesk2::Client
60
+
61
+ identity = service.serial_id
62
+
63
+ record = {
64
+ "id" => identity,
65
+ "url" => url_for("/tickets/#{identity}.json"),
66
+ "created_at" => Time.now.iso8601,
67
+ "updated_at" => Time.now.iso8601,
68
+ "priority" => nil,
69
+ "collaborator_ids" => [],
70
+ "custom_fields" => custom_fields,
71
+ }.merge(create_params)
72
+
73
+ record["requester_id"] ||= (requester_id && requester_id.to_i) || service.current_user["id"]
74
+ record["submitter_id"] = service.current_user["id"].to_s
75
+
76
+ # @note invalid requester id does NOT cause a 404 or 422
77
+ record["organization_id"] = if requester = service.data[:users][record["requester_id"].to_i]
78
+ requester["organization_id"]
79
+ else
80
+ nil
81
+ end
82
+
83
+ service.data[:tickets][identity] = record
84
+
85
+ mock_response("ticket" => record)
86
+ end
87
+ end