zendesk_api 0.0.9
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.
- 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
|