zendesk2 0.4.4 → 0.4.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +14 -0
- data/lib/zendesk2/client/models/categories.rb +1 -1
- data/lib/zendesk2/client/models/forums.rb +1 -1
- data/lib/zendesk2/client/models/groups.rb +1 -1
- data/lib/zendesk2/client/models/membership.rb +1 -1
- data/lib/zendesk2/client/models/organization.rb +2 -0
- data/lib/zendesk2/client/models/organizations.rb +1 -1
- data/lib/zendesk2/client/models/ticket_audits.rb +1 -1
- data/lib/zendesk2/client/models/ticket_comments.rb +1 -1
- data/lib/zendesk2/client/models/ticket_metrics.rb +1 -1
- data/lib/zendesk2/client/models/tickets.rb +1 -1
- data/lib/zendesk2/client/models/topic_comments.rb +1 -1
- data/lib/zendesk2/client/models/topics.rb +1 -1
- data/lib/zendesk2/client/models/user_field.rb +59 -0
- data/lib/zendesk2/client/models/user_fields.rb +11 -0
- data/lib/zendesk2/client/models/user_identity.rb +1 -1
- data/lib/zendesk2/client/models/users.rb +1 -1
- data/lib/zendesk2/client/requests/create_membership.rb +10 -0
- data/lib/zendesk2/client/requests/create_user.rb +2 -12
- data/lib/zendesk2/client/requests/create_user_field.rb +44 -0
- data/lib/zendesk2/client/requests/destroy_user.rb +1 -0
- data/lib/zendesk2/client/requests/destroy_user_field.rb +27 -0
- data/lib/zendesk2/client/requests/get_category.rb +7 -14
- data/lib/zendesk2/client/requests/get_group.rb +6 -14
- data/lib/zendesk2/client/requests/get_membership.rb +6 -14
- data/lib/zendesk2/client/requests/get_organization.rb +7 -14
- data/lib/zendesk2/client/requests/get_organization_memberships.rb +1 -1
- data/lib/zendesk2/client/requests/get_ticket.rb +6 -14
- data/lib/zendesk2/client/requests/get_ticket_audit.rb +7 -18
- data/lib/zendesk2/client/requests/get_ticket_field.rb +6 -15
- data/lib/zendesk2/client/requests/get_ticket_fields.rb +1 -1
- data/lib/zendesk2/client/requests/get_ticket_metric.rb +6 -17
- data/lib/zendesk2/client/requests/get_topic_comment.rb +3 -6
- data/lib/zendesk2/client/requests/get_topic_comments.rb +1 -1
- data/lib/zendesk2/client/requests/get_user.rb +9 -13
- data/lib/zendesk2/client/requests/get_user_field.rb +25 -0
- data/lib/zendesk2/client/requests/get_user_fields.rb +18 -0
- data/lib/zendesk2/client/requests/get_user_identity.rb +6 -15
- data/lib/zendesk2/client/requests/get_user_memberships.rb +1 -1
- data/lib/zendesk2/client/requests/mark_membership_default.rb +2 -6
- data/lib/zendesk2/client/requests/mark_user_identity_primary.rb +3 -6
- data/lib/zendesk2/client/requests/update_group.rb +8 -14
- data/lib/zendesk2/client/requests/update_topic_comment.rb +2 -2
- data/lib/zendesk2/client/requests/update_user_field.rb +28 -0
- data/lib/zendesk2/client.rb +79 -15
- data/lib/zendesk2/collection.rb +1 -18
- data/lib/zendesk2/paged_collection.rb +100 -0
- data/lib/zendesk2/version.rb +1 -1
- data/lib/zendesk2.rb +9 -7
- data/spec/categories_spec.rb +6 -4
- data/spec/forums_spec.rb +7 -4
- data/spec/groups_spec.rb +6 -3
- data/spec/memberships_spec.rb +31 -5
- data/spec/organizations_spec.rb +6 -3
- data/spec/shared/zendesk_resource.rb +66 -48
- data/spec/ticket_fields_spec.rb +6 -3
- data/spec/tickets_spec.rb +6 -3
- data/spec/topic_comments_spec.rb +6 -5
- data/spec/topics_spec.rb +7 -5
- data/spec/user_fields_spec.rb +12 -0
- data/spec/user_identities_spec.rb +7 -7
- data/spec/users_spec.rb +7 -4
- metadata +12 -6
- data/spec/config_spec.rb +0 -17
- data/spec/shared/resource.rb +0 -66
data/lib/zendesk2/collection.rb
CHANGED
@@ -3,8 +3,6 @@
|
|
3
3
|
class Zendesk2::Collection < Cistern::Collection
|
4
4
|
def self.inherited(klass)
|
5
5
|
klass.send(:attribute, :count)
|
6
|
-
klass.send(:attribute, :next_page_link, {:aliases => "next_page"})
|
7
|
-
klass.send(:attribute, :previous_page_link, {:aliases => "previous_page"})
|
8
6
|
klass.send(:extend, ClassMethods)
|
9
7
|
end
|
10
8
|
|
@@ -13,21 +11,6 @@ class Zendesk2::Collection < Cistern::Collection
|
|
13
11
|
def model_method; self.class.model_method; end
|
14
12
|
def model_root; self.class.model_root; end
|
15
13
|
|
16
|
-
def new_page
|
17
|
-
page = self.clone
|
18
|
-
%w[count next_page_link previous_page_link].each { |k| page.attributes.delete(k) }
|
19
|
-
page.records = []
|
20
|
-
page
|
21
|
-
end
|
22
|
-
|
23
|
-
def next_page
|
24
|
-
new_page.all("url" => next_page_link) if next_page_link
|
25
|
-
end
|
26
|
-
|
27
|
-
def previous_page
|
28
|
-
new_page.all("url" => previous_page_link) if previous_page_link
|
29
|
-
end
|
30
|
-
|
31
14
|
# Attempt creation of resource and explode if unsuccessful
|
32
15
|
# @raise [Zendesk2::Error] if creation was unsuccessful
|
33
16
|
# @return [Cistern::Model]
|
@@ -50,7 +33,7 @@ class Zendesk2::Collection < Cistern::Collection
|
|
50
33
|
body = connection.send(collection_method, scoped_attributes).body
|
51
34
|
|
52
35
|
self.load(body[collection_root])
|
53
|
-
self.merge_attributes(Cistern::Hash.slice(body, "count"
|
36
|
+
self.merge_attributes(Cistern::Hash.slice(body, "count"))
|
54
37
|
self
|
55
38
|
end
|
56
39
|
|
@@ -0,0 +1,100 @@
|
|
1
|
+
# @abstract Subclass and set #{collection_method}, #{collection_root}, #{model_method}, #{model_root} and #{model}
|
2
|
+
# adds {#create!} method to {Cistern::Collection}.
|
3
|
+
class Zendesk2::PagedCollection < Zendesk2::Collection
|
4
|
+
def self.inherited(klass)
|
5
|
+
klass.send(:attribute, :count)
|
6
|
+
klass.send(:attribute, :next_page_link, {:aliases => "next_page"})
|
7
|
+
klass.send(:attribute, :previous_page_link, {:aliases => "previous_page"})
|
8
|
+
klass.send(:extend, ClassMethods)
|
9
|
+
end
|
10
|
+
|
11
|
+
def collection_method; self.class.collection_method; end
|
12
|
+
def collection_root; self.class.collection_root; end
|
13
|
+
def model_method; self.class.model_method; end
|
14
|
+
def model_root; self.class.model_root; end
|
15
|
+
|
16
|
+
def new_page
|
17
|
+
page = self.clone
|
18
|
+
%w[count next_page_link previous_page_link].each { |k| page.attributes.delete(k) }
|
19
|
+
page.records = []
|
20
|
+
page
|
21
|
+
end
|
22
|
+
|
23
|
+
def next_page
|
24
|
+
new_page.all("url" => next_page_link) if next_page_link
|
25
|
+
end
|
26
|
+
|
27
|
+
def previous_page
|
28
|
+
new_page.all("url" => previous_page_link) if previous_page_link
|
29
|
+
end
|
30
|
+
|
31
|
+
# Attempt creation of resource and explode if unsuccessful
|
32
|
+
# @raise [Zendesk2::Error] if creation was unsuccessful
|
33
|
+
# @return [Cistern::Model]
|
34
|
+
def create!(attributes={})
|
35
|
+
model = self.new(attributes.merge(Zendesk2.stringify_keys(self.attributes)))
|
36
|
+
model.save!
|
37
|
+
end
|
38
|
+
|
39
|
+
# Quietly attempt creation of resource. Check {#new_record?} and {#errors} for success
|
40
|
+
# @see {#create!} to raise an exception on failure
|
41
|
+
# @return [Cistern::Model, FalseClass]
|
42
|
+
def create(attributes={})
|
43
|
+
model = self.new(attributes.merge(Zendesk2.stringify_keys(self.attributes)))
|
44
|
+
model.save
|
45
|
+
end
|
46
|
+
|
47
|
+
# Fetch a collection of resources
|
48
|
+
def all(params={})
|
49
|
+
scoped_attributes = self.class.scopes.inject({}){|r,k| r.merge(k.to_s => send(k))}.merge(params)
|
50
|
+
body = connection.send(collection_method, scoped_attributes).body
|
51
|
+
|
52
|
+
self.load(body[collection_root])
|
53
|
+
self.merge_attributes(Cistern::Hash.slice(body, "count", "next_page", "previous_page"))
|
54
|
+
self
|
55
|
+
end
|
56
|
+
|
57
|
+
# Fetch a single of resource
|
58
|
+
# @overload get!(identity)
|
59
|
+
# fetch a un-namespaced specific record or a namespaced record under the current {#scopes}
|
60
|
+
# @param [Integer] identity identity of the record
|
61
|
+
# @overload get!(scope)
|
62
|
+
# directly fetch a namespaced record
|
63
|
+
# @param [Hash] scope parameters to fetch record
|
64
|
+
# @example Fetch a record without contextual scoping
|
65
|
+
# self.identities.all("user_id" => 2, "id" => 4) # context defined directly
|
66
|
+
# @example Fetch a record with contextual scoping
|
67
|
+
# self.identities("user_id" => 2).get(4) # context defined in collection
|
68
|
+
# user.identities.get(4) # context defined by encapsulating model
|
69
|
+
# @raise [Zendesk2::Error] if the record cannot be found or other request error
|
70
|
+
# @return [Zendesk2::Model] fetched resource corresponding to value of {Zendesk2::Collection#model}
|
71
|
+
def get!(identity_or_hash)
|
72
|
+
scoped_attributes = self.class.scopes.inject({}){|r,k| r.merge(k.to_s => send(k))}
|
73
|
+
if identity_or_hash.is_a?(Hash)
|
74
|
+
scoped_attributes.merge!(identity_or_hash)
|
75
|
+
else scoped_attributes.merge!("id" => identity_or_hash)
|
76
|
+
end
|
77
|
+
|
78
|
+
if data = self.connection.send(model_method, scoped_attributes).body[self.model_root]
|
79
|
+
new(data)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
# Quiet version of {#get!}
|
84
|
+
# @see #get!
|
85
|
+
# @return [Zendesk2::Model] Fetched model when successful
|
86
|
+
# @return [NilClass] return nothing if record cannot be found
|
87
|
+
def get(*args)
|
88
|
+
get!(*args)
|
89
|
+
rescue Zendesk2::Error
|
90
|
+
nil
|
91
|
+
end
|
92
|
+
|
93
|
+
module ClassMethods
|
94
|
+
attr_accessor :collection_method, :collection_root, :model_method, :model_root
|
95
|
+
|
96
|
+
def scopes
|
97
|
+
@scopes ||= []
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
data/lib/zendesk2/version.rb
CHANGED
data/lib/zendesk2.rb
CHANGED
@@ -14,13 +14,15 @@ require 'time'
|
|
14
14
|
require 'yaml'
|
15
15
|
|
16
16
|
module Zendesk2
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
17
|
+
require 'zendesk2/attributes'
|
18
|
+
require 'zendesk2/attributes'
|
19
|
+
require 'zendesk2/error'
|
20
|
+
require 'zendesk2/client'
|
21
|
+
require 'zendesk2/searchable'
|
22
|
+
require 'zendesk2/logger'
|
23
|
+
require 'zendesk2/model'
|
24
|
+
require 'zendesk2/collection'
|
25
|
+
require 'zendesk2/paged_collection'
|
24
26
|
|
25
27
|
def self.defaults
|
26
28
|
@defaults ||= if File.exists?(File.expand_path("~/.zendesk2"))
|
data/spec/categories_spec.rb
CHANGED
@@ -2,8 +2,10 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe "categories" do
|
4
4
|
let(:client) { create_client }
|
5
|
-
|
6
|
-
|
7
|
-
lambda {
|
8
|
-
lambda { {name: Zendesk2.uuid} }
|
5
|
+
|
6
|
+
include_examples "zendesk resource", {
|
7
|
+
:collection => lambda { client.categories },
|
8
|
+
:create_params => lambda { { name: Zendesk2.uuid } },
|
9
|
+
:update_params => lambda { { name: Zendesk2.uuid } },
|
10
|
+
}
|
9
11
|
end
|
data/spec/forums_spec.rb
CHANGED
@@ -2,8 +2,11 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe "forums" do
|
4
4
|
let(:client) { create_client }
|
5
|
-
|
6
|
-
|
7
|
-
lambda {
|
8
|
-
lambda { {name: Zendesk2.uuid} }
|
5
|
+
|
6
|
+
include_examples "zendesk resource", {
|
7
|
+
:collection => lambda { client.forums },
|
8
|
+
:create_params => lambda { { name: Zendesk2.uuid } },
|
9
|
+
:update_params => lambda { { name: Zendesk2.uuid } },
|
10
|
+
:delayed_destroy => true,
|
11
|
+
}
|
9
12
|
end
|
data/spec/groups_spec.rb
CHANGED
@@ -2,9 +2,12 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe "groups" do
|
4
4
|
let(:client) { create_client }
|
5
|
-
|
6
|
-
|
7
|
-
lambda {
|
5
|
+
|
6
|
+
include_examples "zendesk resource", {
|
7
|
+
:collection => lambda { client.groups },
|
8
|
+
:create_params => lambda { { name: Zendesk2.uuid } },
|
9
|
+
:update_params => lambda { { name: Zendesk2.uuid } },
|
10
|
+
}
|
8
11
|
|
9
12
|
it "should list assignable groups" do
|
10
13
|
client.groups.create(name: Zendesk2.uuid) # assignable by default
|
data/spec/memberships_spec.rb
CHANGED
@@ -6,11 +6,11 @@ describe "memberships" do
|
|
6
6
|
let(:organization) { client.organizations.create!(name: Zendesk2.uuid) }
|
7
7
|
|
8
8
|
include_examples "zendesk resource", {
|
9
|
-
:
|
10
|
-
:collection
|
11
|
-
:paged
|
12
|
-
:update
|
13
|
-
:search
|
9
|
+
:create_params => lambda { {organization_id: organization.id, user_id: user.id} },
|
10
|
+
:collection => lambda { client.memberships(user: user) },
|
11
|
+
:paged => false,
|
12
|
+
:update => false,
|
13
|
+
:search => false,
|
14
14
|
}
|
15
15
|
|
16
16
|
it "should be marked as default" do
|
@@ -50,4 +50,30 @@ describe "memberships" do
|
|
50
50
|
user.memberships.to_a.should == [user_membership]
|
51
51
|
another_user.memberships.size.should == 2
|
52
52
|
end
|
53
|
+
|
54
|
+
describe "create_membership" do
|
55
|
+
it "should error when organization does not exist" do
|
56
|
+
expect {
|
57
|
+
client.create_membership("user_id" => user.identity, "organization_id" => 99)
|
58
|
+
}.to raise_exception(Zendesk2::Error, /RecordInvalid/)
|
59
|
+
end
|
60
|
+
|
61
|
+
it "should error when missing parameters" do
|
62
|
+
expect { client.create_membership({}) }.to raise_exception(ArgumentError, "missing parameters: user_id, organization_id")
|
63
|
+
end
|
64
|
+
|
65
|
+
it "should error when creating a duplicate membership" do
|
66
|
+
client.create_membership("user_id" => user.identity, "organization_id" => organization.identity)
|
67
|
+
|
68
|
+
expect {
|
69
|
+
client.create_membership("user_id" => user.identity, "organization_id" => organization.identity)
|
70
|
+
}.to raise_exception(Zendesk2::Error, /RecordInvalid/)
|
71
|
+
end
|
72
|
+
|
73
|
+
it "should error when user does not exist" do
|
74
|
+
expect {
|
75
|
+
client.create_membership("user_id" => 99, "organization_id" => organization.identity)
|
76
|
+
}.to raise_exception(Zendesk2::Error, /RecordNotFound/)
|
77
|
+
end
|
78
|
+
end
|
53
79
|
end
|
data/spec/organizations_spec.rb
CHANGED
@@ -2,9 +2,12 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe "organizations" do
|
4
4
|
let(:client) { create_client }
|
5
|
-
|
6
|
-
|
7
|
-
lambda {
|
5
|
+
|
6
|
+
include_examples "zendesk resource", {
|
7
|
+
:collection => lambda { client.organizations },
|
8
|
+
:create_params => lambda { { name: Zendesk2.uuid } },
|
9
|
+
:update_params => lambda { { name: Zendesk2.uuid } },
|
10
|
+
}
|
8
11
|
|
9
12
|
describe "with an organization" do
|
10
13
|
let(:organization) { client.organizations.create(name: Zendesk2.uuid) }
|
@@ -1,64 +1,82 @@
|
|
1
1
|
shared_examples "zendesk resource" do |options={}|
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
2
|
+
context "as a resource" do
|
3
|
+
let!(:collection) { instance_exec(&options[:collection]) }
|
4
|
+
let(:create_params) { instance_exec(&options[:create_params]) || {} }
|
5
|
+
let(:update_params) { instance_exec(&options[:update_params]) }
|
6
|
+
let(:fetch_params) { options[:fetch_params] || lambda { |r| r.identity } }
|
6
7
|
|
7
|
-
|
8
|
-
record
|
9
|
-
record.identity.should_not be_nil
|
10
|
-
end
|
8
|
+
let(:record) { @record }
|
9
|
+
after(:each) { @record && @record.destroy }
|
11
10
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
11
|
+
it "should be created" do
|
12
|
+
@record = collection.create!(create_params)
|
13
|
+
record.identity.should_not be_nil
|
14
|
+
end
|
16
15
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
end
|
16
|
+
it "should be fetched" do
|
17
|
+
@record = collection.create!(create_params)
|
18
|
+
collection.get!(fetch_params.call(record)).should == record
|
19
|
+
end
|
22
20
|
|
23
|
-
|
24
|
-
|
25
|
-
|
21
|
+
if options.fetch(:paged, true)
|
22
|
+
context "paging" do
|
23
|
+
before(:each) do
|
24
|
+
@resources = 3.times.map { collection.create!(instance_exec(&options[:create_params])) }
|
25
|
+
end
|
26
26
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
27
|
+
after(:each) { @resources.each { |r| r.destroy } }
|
28
|
+
|
29
|
+
it "should retrieve first page" do
|
30
|
+
collection.all("per_page" => "1").size.should == 1
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should retrieve next page" do
|
34
|
+
first_page = collection.all("per_page" => 1)
|
35
|
+
second_page = collection.all("per_page" => 1).next_page
|
36
|
+
second_page.should_not == first_page
|
37
|
+
end
|
32
38
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
39
|
+
it "should retreive previous page" do
|
40
|
+
first_page = collection.all("per_page" => "1")
|
41
|
+
previous_to_second_page = collection.all("per_page" => 1).next_page.previous_page
|
42
|
+
previous_to_second_page.should == first_page
|
43
|
+
end
|
44
|
+
end
|
45
|
+
else
|
46
|
+
context "paging" do
|
47
|
+
it "should not be present" do
|
48
|
+
collection.class.attributes.should_not have_key(:next_page_link)
|
49
|
+
collection.class.attributes.should_not have_key(:previous_page_link)
|
50
|
+
collection.class.attributes.should have_key(:count)
|
51
|
+
end
|
37
52
|
end
|
38
53
|
end
|
39
|
-
end
|
40
54
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
55
|
+
if options.fetch(:update, true)
|
56
|
+
it "should be updated" do
|
57
|
+
@record = collection.create!(create_params)
|
58
|
+
record.merge_attributes(update_params)
|
59
|
+
record.save
|
60
|
+
update_params.each {|k,v| record.send(k).should == v}
|
61
|
+
end
|
47
62
|
end
|
48
|
-
end
|
49
63
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
record.should be_destroyed
|
55
|
-
end
|
64
|
+
it "should be destroyed" do
|
65
|
+
@record = collection.create!(create_params)
|
66
|
+
record.identity.should_not be_nil
|
67
|
+
record.destroy
|
56
68
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
69
|
+
if !options.fetch(:delayed_destroy, false) && !Zendesk2::Client.mocking?
|
70
|
+
record.should be_destroyed
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
if options.fetch(:search, true) && Zendesk2::Client.mocking?
|
75
|
+
# Search index takes 2-3 minutes according to the docs
|
76
|
+
it "should search" do
|
77
|
+
@record = collection.create!(create_params)
|
78
|
+
collection.search(create_params).should include(record)
|
79
|
+
end
|
62
80
|
end
|
63
81
|
end
|
64
82
|
end
|
data/spec/ticket_fields_spec.rb
CHANGED
@@ -3,7 +3,10 @@ require 'spec_helper'
|
|
3
3
|
describe "ticket_fields" do
|
4
4
|
let(:client) { create_client }
|
5
5
|
|
6
|
-
|
7
|
-
lambda {
|
8
|
-
lambda { { title: Zendesk2.uuid } }
|
6
|
+
include_examples "zendesk resource", {
|
7
|
+
:collection => lambda { client.ticket_fields },
|
8
|
+
:create_params => lambda { { title: Zendesk2.uuid, type: "text" } },
|
9
|
+
:update_params => lambda { { title: Zendesk2.uuid } },
|
10
|
+
:paged => false,
|
11
|
+
}
|
9
12
|
end
|
data/spec/tickets_spec.rb
CHANGED
@@ -2,9 +2,12 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe "tickets" do
|
4
4
|
let(:client) { create_client }
|
5
|
-
|
6
|
-
|
7
|
-
lambda {
|
5
|
+
|
6
|
+
include_examples "zendesk resource", {
|
7
|
+
:collection => lambda { client.tickets },
|
8
|
+
:create_params => lambda { {subject: Zendesk2.uuid, description: Zendesk2.uuid} },
|
9
|
+
:update_params => lambda { {subject: Zendesk2.uuid} },
|
10
|
+
}
|
8
11
|
|
9
12
|
describe "when creating a ticket" do
|
10
13
|
let!(:requester_email) { "#{Zendesk2.uuid}@example.org" }
|