zendesk_api 0.0.9
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +7 -0
- data/.rspec +2 -0
- data/.travis.yml +5 -0
- data/.yardopts +1 -0
- data/Gemfile +6 -0
- data/Gemfile.lock +59 -0
- data/LICENSE +19 -0
- data/Rakefile +49 -0
- data/Readme.md +178 -0
- data/lib/zendesk_api.rb +10 -0
- data/lib/zendesk_api/actions.rb +176 -0
- data/lib/zendesk_api/association.rb +267 -0
- data/lib/zendesk_api/client.rb +150 -0
- data/lib/zendesk_api/collection.rb +233 -0
- data/lib/zendesk_api/configuration.rb +52 -0
- data/lib/zendesk_api/core_ext/inflection.rb +13 -0
- data/lib/zendesk_api/core_ext/modulize.rb +10 -0
- data/lib/zendesk_api/core_ext/snakecase.rb +12 -0
- data/lib/zendesk_api/lru_cache.rb +38 -0
- data/lib/zendesk_api/middleware/request/etag_cache.rb +38 -0
- data/lib/zendesk_api/middleware/request/retry.rb +39 -0
- data/lib/zendesk_api/middleware/request/upload.rb +32 -0
- data/lib/zendesk_api/middleware/response/callback.rb +19 -0
- data/lib/zendesk_api/middleware/response/deflate.rb +18 -0
- data/lib/zendesk_api/middleware/response/gzip.rb +18 -0
- data/lib/zendesk_api/middleware/response/parse_iso_dates.rb +29 -0
- data/lib/zendesk_api/rescue.rb +44 -0
- data/lib/zendesk_api/resource.rb +133 -0
- data/lib/zendesk_api/resources/forum.rb +51 -0
- data/lib/zendesk_api/resources/misc.rb +66 -0
- data/lib/zendesk_api/resources/playlist.rb +64 -0
- data/lib/zendesk_api/resources/ticket.rb +76 -0
- data/lib/zendesk_api/resources/user.rb +44 -0
- data/lib/zendesk_api/track_changes.rb +72 -0
- data/lib/zendesk_api/trackie.rb +8 -0
- data/lib/zendesk_api/verbs.rb +43 -0
- data/lib/zendesk_api/version.rb +3 -0
- data/live/Readme.md +4 -0
- data/live/activity_spec.rb +5 -0
- data/live/audit_spec.rb +5 -0
- data/live/bookmark_spec.rb +11 -0
- data/live/category_spec.rb +12 -0
- data/live/collection_spec.rb +68 -0
- data/live/crm_spec.rb +11 -0
- data/live/custom_role_spec.rb +5 -0
- data/live/forum_spec.rb +14 -0
- data/live/forum_subscription_spec.rb +12 -0
- data/live/group_membership_spec.rb +18 -0
- data/live/group_spec.rb +14 -0
- data/live/identity_spec.rb +14 -0
- data/live/locale_spec.rb +11 -0
- data/live/macro_spec.rb +5 -0
- data/live/mobile_device_spec.rb +11 -0
- data/live/organization_spec.rb +12 -0
- data/live/satisfaction_rating_spec.rb +6 -0
- data/live/setting_spec.rb +5 -0
- data/live/suspended_ticket_spec.rb +8 -0
- data/live/ticket_field_spec.rb +12 -0
- data/live/ticket_metrics_spec.rb +6 -0
- data/live/ticket_spec.rb +88 -0
- data/live/topic_comment_spec.rb +13 -0
- data/live/topic_spec.rb +18 -0
- data/live/topic_subscription_spec.rb +12 -0
- data/live/topic_vote_spec.rb +13 -0
- data/live/upload_spec.rb +9 -0
- data/live/user_spec.rb +13 -0
- data/live/view_spec.rb +6 -0
- data/spec/association_spec.rb +210 -0
- data/spec/client_spec.rb +149 -0
- data/spec/collection_spec.rb +302 -0
- data/spec/configuration_spec.rb +24 -0
- data/spec/create_resource_spec.rb +39 -0
- data/spec/data_resource_spec.rb +229 -0
- data/spec/fixtures/Argentina.gif +0 -0
- data/spec/fixtures/Argentina2.gif +0 -0
- data/spec/fixtures/credentials.yml.example +3 -0
- data/spec/fixtures/test_resources.rb +8 -0
- data/spec/fixtures/zendesk.rb +88 -0
- data/spec/lru_cache_spec.rb +26 -0
- data/spec/macros/resource_macros.rb +157 -0
- data/spec/middleware/request/etag_cache_spec.rb +17 -0
- data/spec/middleware/request/retry_spec.rb +47 -0
- data/spec/middleware/request/test.jpg +0 -0
- data/spec/middleware/request/upload_spec.rb +74 -0
- data/spec/middleware/response/callback_spec.rb +17 -0
- data/spec/middleware/response/deflate_spec.rb +15 -0
- data/spec/middleware/response/gzip_spec.rb +19 -0
- data/spec/middleware/response/parse_iso_dates_spec.rb +44 -0
- data/spec/playlist_spec.rb +95 -0
- data/spec/read_resource_spec.rb +37 -0
- data/spec/rescue_spec.rb +94 -0
- data/spec/resource_spec.rb +332 -0
- data/spec/spec_helper.rb +120 -0
- data/spec/string_spec.rb +7 -0
- data/spec/trackie_spec.rb +39 -0
- data/zendesk_api.gemspec +38 -0
- metadata +364 -0
data/live/upload_spec.rb
ADDED
data/live/user_spec.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ZendeskAPI::User, :delete_after do
|
4
|
+
def valid_attributes
|
5
|
+
{ :name => "Test U.", :email => "test@example.org" }
|
6
|
+
end
|
7
|
+
|
8
|
+
it_should_be_creatable
|
9
|
+
it_should_be_updatable :name
|
10
|
+
it_should_be_deletable :find => [:active?, false]
|
11
|
+
it_should_be_readable :users
|
12
|
+
it_should_be_readable organization, :users
|
13
|
+
end
|
data/live/view_spec.rb
ADDED
@@ -0,0 +1,210 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ZendeskAPI::Association do
|
4
|
+
let(:instance) { ZendeskAPI::TestResource.new(client, :id => 1) }
|
5
|
+
let(:child) { ZendeskAPI::TestResource::TestChild.new(client, :id => 1, :test_resource_id => 2) }
|
6
|
+
|
7
|
+
describe "setting/getting" do
|
8
|
+
context "has" do
|
9
|
+
before do
|
10
|
+
ZendeskAPI::TestResource.associations.clear
|
11
|
+
ZendeskAPI::TestResource.has :child, :class => :test_child
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should cache an set object" do
|
15
|
+
instance.child = child
|
16
|
+
instance.child.should == child
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should set id on set if it was there" do
|
20
|
+
instance.child_id = nil
|
21
|
+
instance.child = child
|
22
|
+
instance.child_id.should == child.id
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should not set id on set if it was not there" do
|
26
|
+
instance.child = child
|
27
|
+
instance.child_id.should == nil
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should build a object set via hash" do
|
31
|
+
instance.child = {:id => 2}
|
32
|
+
instance.child.id.should == 2
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should build a object set via id" do
|
36
|
+
instance.child = 2
|
37
|
+
instance.child.id.should == 2
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should fetch a unknown object" do
|
41
|
+
stub_json_request(:get, %r{test_resources/1/child}, json(:test_child => {:id => 2}))
|
42
|
+
instance.child.id.should == 2
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should fetch an object known by id" do
|
46
|
+
stub_json_request(:get, %r{test_resources/1/child/5}, json(:test_child => {:id => 5}))
|
47
|
+
instance.child_id = 5
|
48
|
+
instance.child.id.should == 5
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should handle client errors" do
|
52
|
+
stub_request(:get, %r{test_resources/1/child/5}).to_return(:status => 500)
|
53
|
+
instance.child_id = 5
|
54
|
+
expect { silence_logger { instance.child } }.to_not raise_error
|
55
|
+
end
|
56
|
+
|
57
|
+
it "should handle resource not found errors" do
|
58
|
+
stub_request(:get, %r{test_resources/1/child/5}).to_return(:status => 404)
|
59
|
+
instance.child_id = 5
|
60
|
+
silence_logger{ instance.child.should be_nil }
|
61
|
+
end
|
62
|
+
|
63
|
+
it "is not used when not used" do
|
64
|
+
instance.child_used?.should == false
|
65
|
+
end
|
66
|
+
|
67
|
+
it "is used when used" do
|
68
|
+
instance.child = child
|
69
|
+
instance.child_used?.should == true
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
context "has_many" do
|
74
|
+
it "should cache a set object" do
|
75
|
+
instance.children = [child]
|
76
|
+
instance.children.map(&:id).should == [1]
|
77
|
+
end
|
78
|
+
|
79
|
+
it "should set ids" do
|
80
|
+
instance.children_ids = []
|
81
|
+
instance.children = [child]
|
82
|
+
instance.children_ids.should == [child.id]
|
83
|
+
end
|
84
|
+
|
85
|
+
it "should build and cache objects set via hash" do
|
86
|
+
instance.children = [{:id => 2}]
|
87
|
+
instance.children.map(&:id).should == [2]
|
88
|
+
end
|
89
|
+
|
90
|
+
it "should build a object set via id" do
|
91
|
+
instance.children = [2]
|
92
|
+
instance.children.map(&:id).should == [2]
|
93
|
+
end
|
94
|
+
|
95
|
+
it "should fetch unknown objects" do
|
96
|
+
stub_json_request(:get, %r{test_resources/1/children}, json(:test_children => [{:id => 2}, {:id => 3}]))
|
97
|
+
instance.children.map(&:id).should == [2,3]
|
98
|
+
end
|
99
|
+
|
100
|
+
it "is not used when not used" do
|
101
|
+
instance.children_used?.should == false
|
102
|
+
end
|
103
|
+
|
104
|
+
it "is used when used" do
|
105
|
+
instance.children = [child]
|
106
|
+
instance.children_used?.should == true
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
context "class only" do
|
112
|
+
subject { described_class.new(:class => ZendeskAPI::TestResource) }
|
113
|
+
|
114
|
+
it "should generate resource path" do
|
115
|
+
subject.generate_path.should == "test_resources"
|
116
|
+
end
|
117
|
+
|
118
|
+
context "with an instance" do
|
119
|
+
it "should generate a specific resource path" do
|
120
|
+
subject.generate_path(instance).should == "test_resources/1"
|
121
|
+
end
|
122
|
+
|
123
|
+
context "with_id => false" do
|
124
|
+
it "should generate general resource path" do
|
125
|
+
subject.generate_path(instance, :with_id => false).should == "test_resources"
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
context "with an instance that is a new record" do
|
130
|
+
it "should generate general resource path" do
|
131
|
+
subject.generate_path(ZendeskAPI::TestResource.new(client)).should == "test_resources"
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
context "with a specified path" do
|
137
|
+
before(:each) { subject.options[:path] = "blergh" }
|
138
|
+
|
139
|
+
it "should generate general resource path" do
|
140
|
+
subject.generate_path.should == "blergh"
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
context "with a passed in id" do
|
145
|
+
it "should generate specific resource path" do
|
146
|
+
opts = { :id => 1 }
|
147
|
+
subject.generate_path(opts).should == "test_resources/1"
|
148
|
+
opts.should be_empty
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
context "class with a specified parent" do
|
154
|
+
subject { described_class.new(:class => ZendeskAPI::TestResource::TestChild, :parent => instance) }
|
155
|
+
|
156
|
+
it "should generate nested resource path" do
|
157
|
+
subject.generate_path.should == "test_resources/1/children"
|
158
|
+
end
|
159
|
+
|
160
|
+
context "with an instance" do
|
161
|
+
it "should generate a specific nested resource path" do
|
162
|
+
subject.generate_path(child).should == "test_resources/1/children/1"
|
163
|
+
end
|
164
|
+
|
165
|
+
context "with_id => false" do
|
166
|
+
it "should generate nested resource path" do
|
167
|
+
subject.generate_path(child, :with_id => false).should == "test_resources/1/children"
|
168
|
+
end
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
context "with a specified path" do
|
173
|
+
before(:each) { subject.options[:path] = "blergh" }
|
174
|
+
|
175
|
+
it "should generate nested resource path" do
|
176
|
+
subject.generate_path.should == "test_resources/1/blergh"
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
context "class with a parent id" do
|
182
|
+
subject { described_class.new(:class => ZendeskAPI::TestResource::TestChild) }
|
183
|
+
|
184
|
+
it "should raise an error if not passed an instance or id" do
|
185
|
+
expect { subject.generate_path }.to raise_error(ArgumentError)
|
186
|
+
end
|
187
|
+
|
188
|
+
it "should generate specific nested resource path" do
|
189
|
+
subject.generate_path(child).should == "test_resources/2/children/1"
|
190
|
+
end
|
191
|
+
|
192
|
+
context "with parent id passed in" do
|
193
|
+
it "should generate nested resource path" do
|
194
|
+
opts = { :test_resource_id => 3 }
|
195
|
+
subject.generate_path(opts).should == "test_resources/3/children"
|
196
|
+
opts.should be_empty
|
197
|
+
end
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
context "with a singular resource" do
|
202
|
+
subject { described_class.new(:class => ZendeskAPI::SingularTestResource) }
|
203
|
+
|
204
|
+
context "with an instance" do
|
205
|
+
it "should not generate a specific resource path" do
|
206
|
+
subject.generate_path(ZendeskAPI::SingularTestResource.new(client, :id => 1)).should == "singular_test_resources"
|
207
|
+
end
|
208
|
+
end
|
209
|
+
end
|
210
|
+
end
|
data/spec/client_spec.rb
ADDED
@@ -0,0 +1,149 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
class SimpleClient < ZendeskAPI::Client
|
4
|
+
def build_connection
|
5
|
+
"FOO"
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
describe ZendeskAPI::Client do
|
10
|
+
subject { client }
|
11
|
+
|
12
|
+
context "#initialize" do
|
13
|
+
it "should require a block" do
|
14
|
+
expect { ZendeskAPI::Client.new }.to raise_error(ArgumentError)
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should raise an exception when url isn't ssl" do
|
18
|
+
expect do
|
19
|
+
ZendeskAPI::Client.new do |config|
|
20
|
+
config.url = "http://www.google.com"
|
21
|
+
end
|
22
|
+
end.to raise_error(ArgumentError)
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should not raise an exception when url isn't ssl and allow_http is set to true" do
|
26
|
+
expect do
|
27
|
+
ZendeskAPI::Client.new do |config|
|
28
|
+
config.allow_http = true
|
29
|
+
config.url = "http://www.google.com/"
|
30
|
+
end
|
31
|
+
end.to_not raise_error
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should handle valid url" do
|
35
|
+
expect do
|
36
|
+
ZendeskAPI::Client.new do |config|
|
37
|
+
config.url = "https://example.zendesk.com/"
|
38
|
+
end.to_not raise_error
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
context "#logger" do
|
43
|
+
before(:each) do
|
44
|
+
@client = ZendeskAPI::Client.new do |config|
|
45
|
+
config.url = "https://example.zendesk.com/"
|
46
|
+
config.logger = subject
|
47
|
+
end
|
48
|
+
|
49
|
+
stub_request(:get, %r{/bs$}).to_return(:status => 200)
|
50
|
+
end
|
51
|
+
|
52
|
+
context "with true value" do
|
53
|
+
subject { true }
|
54
|
+
|
55
|
+
it "should log in faraday" do
|
56
|
+
@client.connection.builder.handlers.should include(Faraday::Response::Logger)
|
57
|
+
end
|
58
|
+
|
59
|
+
context "with a request" do
|
60
|
+
it "should log" do
|
61
|
+
client.config.logger.should_receive(:info).at_least(:once)
|
62
|
+
@client.connection.get('/bs')
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
context "with false value" do
|
68
|
+
subject { false }
|
69
|
+
|
70
|
+
it "should not log" do
|
71
|
+
@client.connection.builder.handlers.should_not include(Faraday::Response::Logger)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
context "with a nil value" do
|
76
|
+
subject { nil }
|
77
|
+
|
78
|
+
it "should log" do
|
79
|
+
@client.connection.builder.handlers.should include(Faraday::Response::Logger)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
context "with a logger" do
|
84
|
+
let(:out){ StringIO.new }
|
85
|
+
subject { Logger.new(out) }
|
86
|
+
|
87
|
+
it "should log" do
|
88
|
+
@client.connection.builder.handlers.should include(Faraday::Response::Logger)
|
89
|
+
end
|
90
|
+
|
91
|
+
context "with a request" do
|
92
|
+
it "should log to the subject" do
|
93
|
+
out.should_receive(:write).at_least(:once)
|
94
|
+
@client.connection.get('/bs')
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
context "#current_user" do
|
102
|
+
before(:each) do
|
103
|
+
stub_json_request(:get, %r{users/me}, json("user" => {}))
|
104
|
+
end
|
105
|
+
|
106
|
+
it "should be a user instance" do
|
107
|
+
client.current_user.should be_instance_of(ZendeskAPI::User)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
context "#connection" do
|
112
|
+
it "should initially be false" do
|
113
|
+
subject.instance_variable_get(:@connection).should be_false
|
114
|
+
end
|
115
|
+
|
116
|
+
it "connection should be initialized on first call to #connection" do
|
117
|
+
subject.connection.should be_instance_of(Faraday::Connection)
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
context "resources" do
|
122
|
+
it "should return an instance of ZendeskAPI::Collection if there is no method" do
|
123
|
+
subject.tickets.should be_instance_of(ZendeskAPI::Collection)
|
124
|
+
subject.instance_variable_defined?(:@tickets).should be_true
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
context "#play" do
|
129
|
+
# TODO may be able to be replaced by VCR
|
130
|
+
before(:each) do
|
131
|
+
stub_request(:get, %r{play}).to_return do
|
132
|
+
{ :status => 302 }
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
it "should return an instance of ZendeskAPI::Playlist" do
|
137
|
+
subject.play(1).should be_instance_of(ZendeskAPI::Playlist)
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
it "can be subclassed" do
|
142
|
+
client = SimpleClient.new do |config|
|
143
|
+
config.allow_http = true
|
144
|
+
end
|
145
|
+
client.config.allow_http.should == true
|
146
|
+
client.connection.should == "FOO"
|
147
|
+
client.connection.object_id.should == client.connection.object_id # it's cached
|
148
|
+
end
|
149
|
+
end
|
@@ -0,0 +1,302 @@
|
|
1
|
+
require 'spec_helper.rb'
|
2
|
+
|
3
|
+
describe ZendeskAPI::Collection do
|
4
|
+
subject do
|
5
|
+
ZendeskAPI::Collection.new(client, ZendeskAPI::TestResource)
|
6
|
+
end
|
7
|
+
|
8
|
+
context "initialization" do
|
9
|
+
it "should set the resource class" do
|
10
|
+
subject.instance_variable_get(:@resource_class).should == ZendeskAPI::TestResource
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should initially be empty" do
|
14
|
+
subject.instance_variable_defined?(:@resources).should be_false
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
context "with array option passed in" do
|
19
|
+
subject { ZendeskAPI::Collection.new(client, ZendeskAPI::TestResource, :ids => [1, 2, 3, 4]) }
|
20
|
+
|
21
|
+
it "should join array with commas" do
|
22
|
+
subject.instance_variable_get(:@options)[:ids].should == "1,2,3,4"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
context "deferral" do
|
27
|
+
before(:each) do
|
28
|
+
stub_json_request(:any, %r{test_resources}, json(:test_resource => {}))
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should defer #create to the resource class" do
|
32
|
+
subject.create
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should defer #find to the resource class" do
|
36
|
+
subject.find(:id => 1)
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should defer #destroy to the resource class" do
|
40
|
+
subject.destroy(:id => 1)
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should defer #update to the resource class" do
|
44
|
+
subject.update(:id => 1)
|
45
|
+
end
|
46
|
+
|
47
|
+
context "with a class with a parent" do
|
48
|
+
let(:association) do
|
49
|
+
ZendeskAPI::Association.new(:class => ZendeskAPI::TestResource::TestChild,
|
50
|
+
:parent => ZendeskAPI::TestResource.new(client, :id => 1))
|
51
|
+
end
|
52
|
+
|
53
|
+
subject do
|
54
|
+
ZendeskAPI::Collection.new(client, ZendeskAPI::TestResource::TestChild,
|
55
|
+
:association => association)
|
56
|
+
end
|
57
|
+
|
58
|
+
before(:each) do
|
59
|
+
stub_json_request(:any, %r{/test_resources/\d+/child}, json("test_child" => {}))
|
60
|
+
end
|
61
|
+
|
62
|
+
it "should defer #create to the resource class with the parent id" do
|
63
|
+
subject.create
|
64
|
+
end
|
65
|
+
|
66
|
+
it "should defer #destroy the resource class with the parent id" do
|
67
|
+
subject.destroy(:id => 1)
|
68
|
+
end
|
69
|
+
|
70
|
+
it "should defer #find to the resource class with the parent id" do
|
71
|
+
subject.find(:id => 1)
|
72
|
+
end
|
73
|
+
|
74
|
+
it "should defer #update to the resource class with the parent id" do
|
75
|
+
subject.update(:id => 1)
|
76
|
+
end
|
77
|
+
|
78
|
+
context "on object push" do
|
79
|
+
before(:each) do
|
80
|
+
stub_json_request(:get, %r{test_resources/\d+/children}, json(:test_children => []))
|
81
|
+
subject << { :id => 1 }
|
82
|
+
end
|
83
|
+
|
84
|
+
it "should pass association" do
|
85
|
+
subject.last.association.should == association
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
context "pagination with no options and no data" do
|
92
|
+
it "should return an empty array on #next" do
|
93
|
+
subject.next.should be_empty
|
94
|
+
end
|
95
|
+
|
96
|
+
it "should return an empty array on #prev" do
|
97
|
+
subject.prev.should be_empty
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
context "pagination with options and no data" do
|
102
|
+
before(:each) { subject.per_page(5).page(2) }
|
103
|
+
|
104
|
+
it "should set per_page option" do
|
105
|
+
subject.per_page(10).should == subject
|
106
|
+
subject.instance_variable_get(:@options)["per_page"].should == 10
|
107
|
+
end
|
108
|
+
|
109
|
+
it "should set page option" do
|
110
|
+
subject.page(10).should == subject
|
111
|
+
subject.instance_variable_get(:@options)["page"].should == 10
|
112
|
+
end
|
113
|
+
|
114
|
+
it "should increate page option" do
|
115
|
+
subject.next.should == 3
|
116
|
+
end
|
117
|
+
|
118
|
+
it "should decreate page option" do
|
119
|
+
subject.prev.should == 1
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
context "fetch" do
|
124
|
+
it "does not fetch if associated is a new record" do
|
125
|
+
ZendeskAPI::Category.new(client).forums.fetch.should == []
|
126
|
+
ZendeskAPI::Category.new(client).forums.to_a.should == []
|
127
|
+
end
|
128
|
+
|
129
|
+
context "with client error" do
|
130
|
+
before(:each) do
|
131
|
+
stub_request(:get, %r{test_resources}).to_return(:status => 500)
|
132
|
+
end
|
133
|
+
|
134
|
+
it "should properly be handled" do
|
135
|
+
silence_logger { subject.fetch(true).should be_empty }
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
context "with unfetchable resource" do
|
140
|
+
subject { ZendeskAPI::Collection.new(client, ZendeskAPI::NilResource) }
|
141
|
+
|
142
|
+
it "should not call connection" do
|
143
|
+
client.connection.should_not_receive(:get)
|
144
|
+
subject.fetch(true).should be_empty
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
context "save" do
|
150
|
+
let(:options) { { :abc => 1 } }
|
151
|
+
before(:each) do
|
152
|
+
stub_json_request(:get, %r{test_resources}, json(:test_resources => []))
|
153
|
+
subject.clear_cache
|
154
|
+
end
|
155
|
+
|
156
|
+
context "with a hash" do
|
157
|
+
let(:object) { mock('ZendeskAPI::TestResource', :changes => [:xxx]) }
|
158
|
+
|
159
|
+
it "should call create with those options" do
|
160
|
+
ZendeskAPI::TestResource.should_receive(:new).
|
161
|
+
with(client, options.merge(:association => subject.association)).
|
162
|
+
and_return(object)
|
163
|
+
|
164
|
+
subject << options
|
165
|
+
|
166
|
+
object.should_receive(:save)
|
167
|
+
subject.save
|
168
|
+
|
169
|
+
subject.should include(object)
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
context "with a new object" do
|
174
|
+
let(:object) { ZendeskAPI::TestResource.new(client, options) }
|
175
|
+
before(:each) do
|
176
|
+
subject << object
|
177
|
+
end
|
178
|
+
|
179
|
+
it "should save object" do
|
180
|
+
object.should_receive(:save)
|
181
|
+
subject.save
|
182
|
+
end
|
183
|
+
|
184
|
+
it "should have object in collection" do
|
185
|
+
subject.should include(object)
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
context "with everything else" do
|
190
|
+
it "should pass to new, since this is how attachment handles it" do
|
191
|
+
attachment = mock(:changes => [:xxx])
|
192
|
+
ZendeskAPI::TestResource.should_receive(:new).with(client, "img.jpg").and_return attachment
|
193
|
+
subject << "img.jpg"
|
194
|
+
|
195
|
+
attachment.should_receive :save
|
196
|
+
subject.save
|
197
|
+
end
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
context "without real data" do
|
202
|
+
subject do
|
203
|
+
ZendeskAPI::Collection.new(client, ZendeskAPI::User)
|
204
|
+
end
|
205
|
+
|
206
|
+
before(:each) do
|
207
|
+
stub_json_request(:get, %r{users\?page=2}, json(
|
208
|
+
:users => [{:id => 2}],
|
209
|
+
:next_page => "/users?page=3&per_page=1",
|
210
|
+
:previous_page => "/users?page=1&per_page=1"
|
211
|
+
))
|
212
|
+
|
213
|
+
subject.per_page(1).page(2)
|
214
|
+
subject.fetch(true)
|
215
|
+
end
|
216
|
+
|
217
|
+
context "pagination with no options" do
|
218
|
+
before(:each) do
|
219
|
+
stub_json_request(:get, %r{users\?page=(1|3)}, json(:users => [{:id => 3}]))
|
220
|
+
|
221
|
+
subject.per_page(nil).page(nil)
|
222
|
+
end
|
223
|
+
|
224
|
+
it "should find the next page by calling fetch" do
|
225
|
+
current = subject.to_a.dup
|
226
|
+
nxt = subject.next
|
227
|
+
|
228
|
+
nxt.size.should == 1
|
229
|
+
nxt.should_not == current
|
230
|
+
end
|
231
|
+
|
232
|
+
it "should find the prev page by calling fetch" do
|
233
|
+
current = subject.to_a.dup
|
234
|
+
prev = subject.prev
|
235
|
+
|
236
|
+
prev.size.should == 1
|
237
|
+
prev.should_not == current
|
238
|
+
end
|
239
|
+
end
|
240
|
+
|
241
|
+
context "pagination with options", :vcr do
|
242
|
+
before(:each) { subject.per_page(1).page(2) }
|
243
|
+
|
244
|
+
it "should increase page option and not call fetch" do
|
245
|
+
subject.next.should == 3
|
246
|
+
end
|
247
|
+
|
248
|
+
it "should decrease page option and not call fetch" do
|
249
|
+
subject.prev.should == 1
|
250
|
+
end
|
251
|
+
|
252
|
+
context "with page == 1" do
|
253
|
+
before do
|
254
|
+
subject.page(1)
|
255
|
+
subject.clear_cache
|
256
|
+
subject.should_not_receive(:fetch)
|
257
|
+
end
|
258
|
+
|
259
|
+
it "should do nothing on #prev" do
|
260
|
+
subject.prev.should == []
|
261
|
+
end
|
262
|
+
end
|
263
|
+
end
|
264
|
+
end
|
265
|
+
|
266
|
+
context "method missing" do
|
267
|
+
before(:each) { subject.stub(:fetch).and_return([1, 2, nil, 3]) }
|
268
|
+
|
269
|
+
it "should pass all methods not defined to resources" do
|
270
|
+
subject.compact.should == [1, 2, 3]
|
271
|
+
end
|
272
|
+
|
273
|
+
it "should take a block" do
|
274
|
+
subject.map {|i| i.to_i + 1}.should == [2, 3, 1, 4]
|
275
|
+
end
|
276
|
+
|
277
|
+
it "should create a new collection if it isn't an array method" do
|
278
|
+
subject.recent.should be_instance_of(ZendeskAPI::Collection)
|
279
|
+
end
|
280
|
+
|
281
|
+
it "should pass the correct query_path to the new collection" do
|
282
|
+
subject.recent.instance_variable_get(:@collection_path).last.should == :recent
|
283
|
+
end
|
284
|
+
end
|
285
|
+
|
286
|
+
|
287
|
+
context "with different path" do
|
288
|
+
subject do
|
289
|
+
ZendeskAPI::Collection.new(client, ZendeskAPI::TestResource, :collection_path => ["test_resources", "active"])
|
290
|
+
end
|
291
|
+
|
292
|
+
before(:each) do
|
293
|
+
stub_json_request(:post, %r{test_resources/active})
|
294
|
+
end
|
295
|
+
|
296
|
+
context "deferral" do
|
297
|
+
it "should defer #create to the resource class with proper path" do
|
298
|
+
subject.create
|
299
|
+
end
|
300
|
+
end
|
301
|
+
end
|
302
|
+
end
|