zendesk_api 0.4.0.rc1 → 0.4.0.rc2

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile.lock CHANGED
@@ -7,7 +7,7 @@ GIT
7
7
  PATH
8
8
  remote: .
9
9
  specs:
10
- zendesk_api (0.4.0.rc1)
10
+ zendesk_api (0.4.0.rc2)
11
11
  faraday (>= 0.8.0)
12
12
  faraday_middleware (>= 0.8.7)
13
13
  hashie (>= 1.2)
@@ -25,15 +25,15 @@ GEM
25
25
  activesupport (3.2.13)
26
26
  i18n (= 0.6.1)
27
27
  multi_json (~> 1.0)
28
- addressable (2.3.3)
29
- backports (3.1.1)
28
+ addressable (2.3.4)
29
+ backports (3.3.2)
30
30
  bond (0.4.3)
31
31
  bond (0.4.3-java)
32
- bootstrap-sass (2.3.1.0)
32
+ bootstrap-sass (2.3.2.0)
33
33
  sass (~> 3.2)
34
34
  bouncy-castle-java (1.5.0147)
35
35
  builder (3.0.4)
36
- bump (0.4.0)
36
+ bump (0.4.2)
37
37
  chunky_png (1.2.8)
38
38
  coderay (1.0.9)
39
39
  coderay_bash (1.0.5)
@@ -42,10 +42,11 @@ GEM
42
42
  chunky_png (~> 1.2)
43
43
  fssm (>= 0.2.7)
44
44
  sass (~> 3.1)
45
- crack (0.3.2)
45
+ crack (0.4.0)
46
+ safe_yaml (~> 0.9.0)
46
47
  daemons (1.1.9)
47
- database_cleaner (0.9.1)
48
- diff-lcs (1.2.2)
48
+ database_cleaner (1.0.1)
49
+ diff-lcs (1.2.4)
49
50
  eventmachine (1.0.3)
50
51
  eventmachine (1.0.3-java)
51
52
  faraday (0.8.7)
@@ -53,32 +54,32 @@ GEM
53
54
  faraday_middleware (0.9.0)
54
55
  faraday (>= 0.7.4, < 0.9)
55
56
  fssm (0.2.10)
56
- haml (4.0.1)
57
+ haml (4.0.3)
57
58
  tilt
58
- hashie (2.0.4)
59
+ hashie (2.0.5)
59
60
  i18n (0.6.1)
60
61
  inflection (1.0.0)
61
- jruby-openssl (0.8.7)
62
+ jruby-openssl (0.8.8)
62
63
  bouncy-castle-java (>= 1.5.0147)
63
64
  json (1.8.0)
64
65
  mime-types (1.23)
65
- mongoid (3.1.2)
66
+ mongoid (3.1.4)
66
67
  activemodel (~> 3.2)
67
- moped (~> 1.4.2)
68
+ moped (~> 1.4)
68
69
  origin (~> 1.0)
69
70
  tzinfo (~> 0.3.22)
70
- moped (1.4.5)
71
- multi_json (1.7.2)
72
- newrelic_rpm (3.6.0.78)
73
- origin (1.0.11)
71
+ moped (1.5.0)
72
+ multi_json (1.7.7)
73
+ newrelic_rpm (3.6.4.122)
74
+ origin (1.1.0)
74
75
  rack (1.5.2)
75
76
  rack-protection (1.5.0)
76
77
  rack
77
78
  rack-ssl-enforcer (0.2.5)
78
79
  rack-test (0.6.2)
79
80
  rack (>= 1.0)
80
- rake (10.0.4)
81
- redcarpet (2.2.2)
81
+ rake (10.1.0)
82
+ redcarpet (2.3.0)
82
83
  ripl (0.7.0)
83
84
  bond (~> 0.4.2)
84
85
  rspec (2.13.0)
@@ -88,34 +89,35 @@ GEM
88
89
  rspec-core (2.13.1)
89
90
  rspec-expectations (2.13.0)
90
91
  diff-lcs (>= 1.1.3, < 2.0)
91
- rspec-mocks (2.13.0)
92
- sass (3.2.7)
92
+ rspec-mocks (2.13.1)
93
+ safe_yaml (0.9.3)
94
+ sass (3.2.9)
93
95
  simplecov (0.7.1)
94
96
  multi_json (~> 1.0)
95
97
  simplecov-html (~> 0.7.1)
96
98
  simplecov-html (0.7.1)
97
- sinatra (1.3.6)
99
+ sinatra (1.4.3)
98
100
  rack (~> 1.4)
99
- rack-protection (~> 1.3)
100
- tilt (~> 1.3, >= 1.3.3)
101
- sinatra-contrib (1.3.2)
101
+ rack-protection (~> 1.4)
102
+ tilt (~> 1.3, >= 1.3.4)
103
+ sinatra-contrib (1.4.0)
102
104
  backports (>= 2.0)
103
105
  eventmachine
104
106
  rack-protection
105
107
  rack-test
106
- sinatra (~> 1.3.0)
108
+ sinatra (~> 1.4.2)
107
109
  tilt (~> 1.3)
108
110
  thin (1.5.1)
109
111
  daemons (>= 1.0.9)
110
112
  eventmachine (>= 0.12.6)
111
113
  rack (>= 1.0.0)
112
- tilt (1.3.6)
114
+ tilt (1.4.1)
113
115
  tzinfo (0.3.37)
114
- vcr (2.4.0)
116
+ vcr (2.5.0)
115
117
  webmock (1.9.3)
116
118
  addressable (>= 2.2.7)
117
119
  crack (>= 0.3.2)
118
- yard (0.8.5.2)
120
+ yard (0.8.6.1)
119
121
 
120
122
  PLATFORMS
121
123
  java
data/Readme.md CHANGED
@@ -13,6 +13,7 @@ Please check out the [wiki](https://github.com/zendesk/zendesk_api_client_rb/wik
13
13
  * Version 0.0.5 brings with it a change to the top-level namespace. All references to Zendesk should now use ZendeskAPI.
14
14
  * Version 0.3.0 changed the license from MIT to Apache Version 2.
15
15
  * Version 0.3.2 introduced a regression when side-loading roles on users. This was fixed in 0.3.4.
16
+ * Version 0.4.0rc1 changes the way errors are handled. Please see the [wiki page](https://github.com/zendesk/zendesk_api_client_rb/wiki/Errors) for more info.
16
17
 
17
18
  ## Installation
18
19
 
@@ -32,6 +33,237 @@ Add it to your Gemfile
32
33
 
33
34
  and follow normal [Bundler](http://gembundler.com/) installation and execution procedures.
34
35
 
36
+ ## Configuration
37
+
38
+ Configuration is done through a block returning an instance of ZendeskAPI::Client.
39
+ The block is mandatory and if not passed, an ArgumentError will be thrown.
40
+
41
+ ```ruby
42
+ require 'zendesk_api'
43
+
44
+ client = ZendeskAPI::Client.new do |config|
45
+ # Mandatory:
46
+
47
+ config.url = "<- your-zendesk-url ->" # e.g. https://mydesk.zendesk.com/api/v2
48
+
49
+ config.username = "login.email@zendesk.com"
50
+
51
+ # Choose one of the following depending on your authentication choice
52
+ config.token = "your zendesk token"
53
+ config.password = "your zendesk password"
54
+
55
+ # Optional:
56
+
57
+ # Retry uses middleware to notify the user
58
+ # when hitting the rate limit, sleep automatically,
59
+ # then retry the request.
60
+ config.retry = true
61
+
62
+ # Logger prints to STDERR by default, to e.g. print to stdout:
63
+ require 'logger'
64
+ config.logger = Logger.new(STDOUT)
65
+
66
+ # Changes Faraday adapter
67
+ # config.adapter = :patron
68
+
69
+ # Merged with the default client options hash
70
+ # config.client_options = { :ssl => false }
71
+
72
+ # When getting the error 'hostname does not match the server certificate'
73
+ # use the API at https://yoursubdomain.zendesk.com/api/v2
74
+ end
75
+ ```
76
+
77
+ Note: This ZendeskAPI API client only supports basic authentication at the moment.
78
+
79
+ ## Usage
80
+
81
+ The result of configuration is an instance of ZendeskAPI::Client which can then be used in two different methods.
82
+
83
+ One way to use the client is to pass it in as an argument to individual classes.
84
+
85
+ ```ruby
86
+ ZendeskAPI::Ticket.new(client, :id => 1, :priority => "urgent") # doesn't actually send a request, must explicitly call #save
87
+ ZendeskAPI::Ticket.create(client, :subject => "Test Ticket", :comment => { :value => "This is a test" }, :submitter_id => client.current_user.id, :priority => "urgent")
88
+ ZendeskAPI::Ticket.find(client, :id => 1)
89
+ ZendeskAPI::Ticket.delete(client, :id => 1)
90
+ ```
91
+
92
+ Another way is to use the instance methods under client.
93
+
94
+ ```ruby
95
+ client.tickets.first
96
+ client.tickets.find(:id => 1)
97
+ client.tickets.create(:subject => "Test Ticket", :comment => { :value => "This is a test" }, :submitter_id => client.current_user.id, :priority => "urgent")
98
+ client.tickets.delete(:id => 1)
99
+ ```
100
+
101
+ The methods under ZendeskAPI::Client (such as .tickets) return an instance of ZendeskAPI::Collection a lazy-loaded list of that resource.
102
+ Actual requests may not be sent until an explicit ZendeskAPI::Collection#fetch, ZendeskAPI::Collection#to_a, or an applicable methods such
103
+ as #each.
104
+
105
+ ### Caveats
106
+
107
+ Resource updating is implemented by sending only the `changed?` attributes to the server (see `ZendeskAPI::TrackChanges`).
108
+ Unfortunately, this module only hooks into `Hash` meaning any changes to an `Array`not resulting in a new instance will not be tracked and sent.
109
+
110
+ ```
111
+ zendesk_api_client_rb $ bundle console
112
+ > a = ZendeskAPI::Trackie.new(:tags => []).tap(&:clear_changes)
113
+ > a.changed?(:tags)
114
+ => false
115
+ > a.tags << "my_new_tag"
116
+ => ["my_new_tag"]
117
+ > a.changed?(:tags)
118
+ => false
119
+ > a.tags += %w{my_other_tag}
120
+ => ["my_new_tag", "my_other_tag"]
121
+ > a.changed?(:tags)
122
+ => true
123
+ ```
124
+
125
+ ### Pagination
126
+
127
+ ZendeskAPI::Collections can be paginated:
128
+
129
+ ```ruby
130
+ tickets = client.tickets.page(2).per_page(3)
131
+ next_page = tickets.next # => 3
132
+ tickets.fetch # GET /api/v2/tickets?page=3&per_page=3
133
+ previous_page = tickets.prev # => 2
134
+ tickets.fetch # GET /api/v2/tickets?page=2&per_page=3
135
+ ```
136
+
137
+ Iteration over all resources and pages is handled by Collection#all
138
+
139
+ ```ruby
140
+ client.tickets.all do |resource|
141
+ # every resource, from all pages, will be yielded to this block
142
+ end
143
+ ```
144
+
145
+ If given a block with two arguments, the page number is also passed in.
146
+
147
+ ```ruby
148
+ client.tickets.all do |resource, page_number|
149
+ # all resources will be yielded along with the page number
150
+ end
151
+ ```
152
+
153
+ ### Callbacks
154
+
155
+ Callbacks can be added to the ZendeskAPI::Client instance and will be called (with the response env) after all response middleware on a successful request.
156
+
157
+ ```ruby
158
+ client.insert_callback do |env|
159
+ puts env[:response_headers]
160
+ end
161
+ ```
162
+
163
+ ### Resource management
164
+
165
+ Individual resources can be created, modified, saved, and destroyed.
166
+
167
+ ```ruby
168
+ ticket = client.tickets[0] # ZendeskAPI::Ticket.find(client, :id => 1)
169
+ ticket.priority = "urgent"
170
+ ticket.attributes # => { "priority" => "urgent" }
171
+ ticket.save # Will PUT => true
172
+ ticket.destroy # => true
173
+
174
+ ZendeskAPI::Ticket.new(client, { :priority => "urgent" })
175
+ ticket.new_record? # => true
176
+ ticket.save # Will POST
177
+ ```
178
+
179
+ ### Side-loading
180
+
181
+ **Warning: this is an experimental feature. Abuse it and lose it.**
182
+
183
+ To facilitate a smaller number of requests and easier manipulation of associated data we allow "side-loading", or inclusion, of selected resources.
184
+
185
+ For example:
186
+ A ZendeskAPI::Ticket is associated with ZendeskAPI::User through the requester_id field.
187
+ API requests for that ticket return a structure similar to this:
188
+ ```json
189
+ "ticket": {
190
+ "id": 1,
191
+ "url": "http.....",
192
+ "requester_id": 7,
193
+ ...
194
+ }
195
+ ```
196
+
197
+ Calling ZendeskAPI::Ticket#requester automatically fetches and loads the user referenced above (`/api/v2/users/7`).
198
+ Using side-loading, however, the user can be partially loaded in the same request as the ticket.
199
+
200
+ ```ruby
201
+ tickets = client.tickets.include(:users)
202
+ # Or client.tickets(include: :users)
203
+ # Does *NOT* make a request to the server since it is already loaded
204
+ tickets.first.requester # => #<ZendeskAPI::User id=...>
205
+ ```
206
+
207
+ OR
208
+
209
+ ```ruby
210
+ ticket = client.tickets.find(:id => 1, :include => :users)
211
+ ticket.requester # => #<ZendeskAPI::User id=...>
212
+ ```
213
+
214
+ Currently, this feature is limited to only a few resources and their associations.
215
+ They are documented on [developer.zendesk.com](http://developer.zendesk.com/documentation/rest_api/introduction.html#side-loading-\(beta\)).
216
+
217
+ ### Search
218
+
219
+ Searching is done through the client. Returned is an instance of ZendeskAPI::Collection:
220
+
221
+ ```ruby
222
+ client.search(:query => "my search query") # /api/v2/search.json?query=...
223
+ client.users.search(:query => "my new query") # /api/v2/users/search.json?query=...
224
+ ```
225
+
226
+ ### Special case: Custom resources paths
227
+
228
+ API endpoints such as tickets/recent or topics/show_many can be accessed through chaining.
229
+ They will too return an instance of ZendeskAPI::Collection.
230
+
231
+ ```ruby
232
+ client.tickets.recent
233
+ client.topics.show_many(:verb => :post, :ids => [1, 2, 3])
234
+ ```
235
+
236
+ ### Special Case: Current user
237
+
238
+ Use either of the following to obtain the current user instance:
239
+
240
+ ```ruby
241
+ client.users.find(:id => 'me')
242
+ client.current_user
243
+ ```
244
+
245
+ ### Special Case: Importing a ticket
246
+
247
+ Bulk importing tickets allows you to move large amounts of data into Zendesk.
248
+
249
+ ```ruby
250
+ ticket = ZendeskAPI::Ticket.import(client, :subject => "Help", :comments => [{ :author_id => 19, :value => "This is a comment" }])
251
+ ```
252
+
253
+ http://developer.zendesk.com/documentation/rest_api/ticket_import.html
254
+
255
+ ### Attaching files
256
+
257
+ Files can be attached to ticket comments using either a path or the File class and will
258
+ be automatically uploaded and attached.
259
+
260
+ ```ruby
261
+ ticket = ZendeskAPI::Ticket.new(client, :comment => { :value => "attachments" })
262
+ ticket.comment.uploads << "img.jpg"
263
+ ticket.comment.uploads << File.new("img.jpg")
264
+ ticket.save
265
+ ```
266
+
35
267
  ## Note on Patches/Pull Requests
36
268
  1. Fork the project.
37
269
  2. Make your feature addition or bug fix.
@@ -4,10 +4,10 @@ module ZendeskAPI
4
4
  # Executes a POST if it is a {Data#new_record?}, otherwise a PUT.
5
5
  # Merges returned attributes on success.
6
6
  # @return [Boolean] Success?
7
- def save!(options={})
7
+ def save!(options = {})
8
8
  return false if respond_to?(:destroyed?) && destroyed?
9
9
 
10
- if new_record?
10
+ if new_record? && !options[:force_update]
11
11
  method = :post
12
12
  req_path = path
13
13
  else
@@ -23,7 +23,10 @@ module ZendeskAPI
23
23
  req.body = attributes_for_save.merge(@global_params)
24
24
  end
25
25
 
26
- @attributes.replace @attributes.deep_merge(@response.body[self.class.singular_resource_name] || {})
26
+ if @response.body && @response.body[self.class.singular_resource_name]
27
+ @attributes.replace @attributes.deep_merge(@response.body[self.class.singular_resource_name] || {})
28
+ end
29
+
27
30
  @attributes.clear_changes
28
31
  clear_associations
29
32
  true
@@ -92,6 +95,7 @@ module ZendeskAPI
92
95
 
93
96
  new(client, response.body[singular_resource_name]).tap do |resource|
94
97
  resource.set_includes(resource, includes, response.body)
98
+ resource.attributes.clear_changes
95
99
  end
96
100
  end
97
101
 
@@ -195,15 +199,7 @@ module ZendeskAPI
195
199
  ZendeskAPI::Client.check_deprecated_namespace_usage attributes, singular_resource_name
196
200
  resource = new(client, { :id => attributes.delete(:id), :global => attributes.delete(:global) })
197
201
  resource.attributes.merge!(attributes)
198
- resource.tap(&:save!)
199
- end
200
-
201
- private
202
-
203
- def _update(client, attributes = {})
204
- ZendeskAPI::Client.check_deprecated_namespace_usage attributes, singular_resource_name
205
- resource = new(client, { :id => attributes.delete(:id), :global => attributes.delete(:global) })
206
- resource.attributes.merge!(attributes)
202
+ resource.save!(:force_update => resource.is_a?(SingularResource))
207
203
  resource
208
204
  end
209
205
  end
@@ -32,12 +32,13 @@ module ZendeskAPI
32
32
  method = method.to_s
33
33
  options = args.last.is_a?(Hash) ? args.pop : {}
34
34
 
35
- @resource_cache[method] ||= {}
35
+ @resource_cache[method] ||= { :class => nil, :cache => ZendeskAPI::LRUCache.new }
36
36
 
37
- if !options.delete(:reload) && (cached = @resource_cache[method][options.hash])
37
+ if !options.delete(:reload) && (cached = @resource_cache[method][:cache].read(options.hash))
38
38
  cached
39
39
  else
40
- @resource_cache[method][options.hash] = ZendeskAPI::Collection.new(self, ZendeskAPI.const_get(ZendeskAPI::Helpers.modulize_string(Inflection.singular(method))), options)
40
+ @resource_cache[method][:class] ||= ZendeskAPI.const_get(ZendeskAPI::Helpers.modulize_string(Inflection.singular(method)))
41
+ @resource_cache[method][:cache].write(options.hash, ZendeskAPI::Collection.new(self, @resource_cache[method][:class], options))
41
42
  end
42
43
  end
43
44
 
@@ -142,7 +143,10 @@ module ZendeskAPI
142
143
  builder.use Faraday::Request::BasicAuthentication, config.username, config.password
143
144
  end
144
145
 
145
- builder.use ZendeskAPI::Middleware::Request::EtagCache, :cache => config.cache
146
+ if config.cache
147
+ builder.use ZendeskAPI::Middleware::Request::EtagCache, :cache => config.cache
148
+ end
149
+
146
150
  builder.use ZendeskAPI::Middleware::Request::Upload
147
151
  builder.request :multipart
148
152
  builder.request :json
@@ -30,7 +30,13 @@ module ZendeskAPI
30
30
 
31
31
  @app.call(env).on_complete do
32
32
  if cached && env[:status] == 304 # not modified
33
- env.merge!(:body => cached[:body], :response_headers => cached[:response_headers])
33
+ env[:body] = cached[:body]
34
+ env[:response_headers].merge!(
35
+ :etag => cached[:response_headers][:etag],
36
+ :content_type => cached[:response_headers][:content_type],
37
+ :content_length => cached[:response_headers][:content_length],
38
+ :content_encoding => cached[:response_headers][:content_encoding]
39
+ )
34
40
  elsif env[:status] == 200 && env[:response_headers]["Etag"] # modified and cacheable
35
41
  @cache.write(cache_key(env), env)
36
42
  end
@@ -35,16 +35,6 @@ module ZendeskAPI
35
35
 
36
36
  alias :model_key :resource_name
37
37
 
38
- # @private
39
- def only_send_unnested_params
40
- @unnested_params = true
41
- end
42
-
43
- # @private
44
- def unnested_params
45
- @unnested_params ||= false
46
- end
47
-
48
38
  def namespace(namespace)
49
39
  @namespace = namespace
50
40
  end
@@ -145,11 +135,7 @@ module ZendeskAPI
145
135
  private
146
136
 
147
137
  def attributes_for_save
148
- if self.class.unnested_params
149
- attributes.changes
150
- else
151
- { self.class.singular_resource_name.to_sym => attributes.changes }
152
- end
138
+ { self.class.singular_resource_name.to_sym => attributes.changes }
153
139
  end
154
140
  end
155
141
 
@@ -188,5 +174,9 @@ module ZendeskAPI
188
174
  include Destroy
189
175
  end
190
176
 
191
- class SingularResource < Resource; end
177
+ class SingularResource < Resource
178
+ def attributes_for_save
179
+ { self.class.resource_name.to_sym => attributes.changes }
180
+ end
181
+ end
192
182
  end
@@ -11,13 +11,6 @@ module ZendeskAPI
11
11
 
12
12
  class Locale < ReadResource; end
13
13
 
14
- class CRMData < DataResource
15
- class << self
16
- alias :resource_name :singular_resource_name
17
- end
18
- end
19
-
20
- class CRMDataStatus < DataResource; end
21
14
  class CustomRole < DataResource; end
22
15
  class Role < DataResource; end
23
16
  class Topic < Resource; end
@@ -52,9 +45,13 @@ module ZendeskAPI
52
45
 
53
46
  def id; token; end
54
47
 
55
- only_send_unnested_params
56
-
57
48
  has_many Attachment
49
+
50
+ private
51
+
52
+ def attributes_for_save
53
+ attributes.changes
54
+ end
58
55
  end
59
56
 
60
57
  class MobileDevice < Resource
@@ -71,7 +68,6 @@ module ZendeskAPI
71
68
  end
72
69
 
73
70
  class ForumSubscription < Resource
74
- only_send_unnested_params
75
71
  has Forum
76
72
  has User
77
73
  end
@@ -90,7 +86,6 @@ module ZendeskAPI
90
86
  end
91
87
 
92
88
  class TopicSubscription < Resource
93
- only_send_unnested_params
94
89
  has Topic
95
90
  has User
96
91
  end
@@ -111,9 +106,14 @@ module ZendeskAPI
111
106
  end
112
107
 
113
108
  class TopicVote < SingularResource
114
- only_send_unnested_params
115
109
  has Topic
116
110
  has User
111
+
112
+ private
113
+
114
+ def attributes_for_save
115
+ attributes.changes
116
+ end
117
117
  end
118
118
 
119
119
  has Forum
@@ -394,9 +394,6 @@ module ZendeskAPI
394
394
  has_many TopicSubscription
395
395
  has_many :topic_comments, :class => TopicComment
396
396
  has_many :topic_votes, :class => Topic::TopicVote
397
-
398
- has CRMData
399
- has CRMDataStatus, :path => 'crm_data/status'
400
397
  end
401
398
 
402
399
  class UserField < Resource; end
@@ -1,3 +1,3 @@
1
1
  module ZendeskAPI
2
- VERSION = "0.4.0.rc1"
2
+ VERSION = "0.4.0.rc2"
3
3
  end
@@ -199,6 +199,11 @@ describe ZendeskAPI::Client do
199
199
  subject.tickets.should be_instance_of(ZendeskAPI::Collection)
200
200
 
201
201
  subject.instance_variable_get(:@resource_cache)["tickets"].should_not be_empty
202
+ subject.instance_variable_get(:@resource_cache)["tickets"][:class].should == ZendeskAPI::Ticket
203
+ subject.instance_variable_get(:@resource_cache)["tickets"][:cache].should be_instance_of(ZendeskAPI::LRUCache)
204
+
205
+ ZendeskAPI.should_not_receive(:const_get)
206
+ subject.tickets.should be_instance_of(ZendeskAPI::Collection)
202
207
  end
203
208
 
204
209
  it "should not cache calls with different options" do
@@ -5,16 +5,17 @@ describe ZendeskAPI::Middleware::Request::EtagCache do
5
5
  client.config.cache.size = 1
6
6
 
7
7
  stub_json_request(:get, %r{blergh}, '{"x":1}', :headers => {"Etag" => "x"})
8
- response = client.connection.get("blergh")
9
- response.status.should == 200
10
- response.body.should == {"x"=>1}
11
-
12
- headers = response.headers
8
+ first_response = client.connection.get("blergh")
9
+ first_response.status.should == 200
10
+ first_response.body.should == {"x"=>1}
13
11
 
14
12
  stub_request(:get, %r{blergh}).to_return(:status => 304, :headers => {"Etag" => "x"})
15
13
  response = client.connection.get("blergh")
16
14
  response.status.should == 304
17
15
  response.body.should == {"x"=>1}
18
- response.headers.should == headers
16
+
17
+ %w{content_encoding content_type content_length etag}.each do |header|
18
+ response.headers[header].should == first_response.headers[header]
19
+ end
19
20
  end
20
21
  end
@@ -413,6 +413,16 @@ describe ZendeskAPI::Resource do
413
413
  end.to_not raise_error(ArgumentError)
414
414
  end
415
415
  end
416
+
417
+ context "#update" do
418
+ before do
419
+ stub_json_request(:put, %r{/singular_test_resource})
420
+ end
421
+
422
+ it "should always PUT" do
423
+ ZendeskAPI::SingularTestResource.update(client, :test => :test)
424
+ end
425
+ end
416
426
  end
417
427
 
418
428
  context "Ticket#assignee" do
@@ -73,7 +73,7 @@ module TestHelper
73
73
 
74
74
  def stub_json_request(verb, path_matcher, body = json, options = {})
75
75
  stub_request(verb, path_matcher).to_return(Hashie::Mash.new(
76
- :body => body, :headers => { :content_type => "application/json" }
76
+ :body => body, :headers => { :content_type => "application/json", :content_length => body.size }
77
77
  ).deep_merge(options))
78
78
  end
79
79
  end
@@ -1,5 +1,12 @@
1
1
  require 'core/spec_helper'
2
2
 
3
3
  describe ZendeskAPI::Activity do
4
+ before do
5
+ VCR.use_cassette("ticket_activity") do
6
+ ticket.comment = { :value => "test", :author_id => agent.id }
7
+ ticket.save!
8
+ end
9
+ end
10
+
4
11
  it_should_be_readable :activities
5
12
  end
@@ -117,7 +117,8 @@ describe ZendeskAPI::Ticket do
117
117
  end
118
118
 
119
119
  threads.map! do |thread|
120
- thread.join(3)
120
+ thread.join(5)
121
+ fail("could not get response in 5 seconds") unless thread[:response]
121
122
  thread[:response][:status]
122
123
  end
123
124
 
@@ -25,6 +25,7 @@ describe ZendeskAPI::User, :delete_after do
25
25
 
26
26
  it "should include role" do
27
27
  if subject
28
+ subject.changes.key?(:role_id).should be_false
28
29
  subject.role.should_not be_nil
29
30
  subject.role.id.should be_nil
30
31
  subject.role.name.should == "admin"
@@ -42,6 +43,7 @@ describe ZendeskAPI::User, :delete_after do
42
43
 
43
44
  it "should include role" do
44
45
  if subject
46
+ subject.changes.key?(:role_id).should be_false
45
47
  subject.role.should_not be_nil
46
48
  subject.role.id.should be_nil
47
49
  subject.role.name.should == "agent"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zendesk_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0.rc1
4
+ version: 0.4.0.rc2
5
5
  prerelease: 6
6
6
  platform: ruby
7
7
  authors:
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2013-05-29 00:00:00.000000000 Z
13
+ date: 2013-06-20 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: bump
@@ -475,7 +475,6 @@ files:
475
475
  - spec/live/bookmark_spec.rb
476
476
  - spec/live/category_spec.rb
477
477
  - spec/live/collection_spec.rb
478
- - spec/live/crm_spec.rb
479
478
  - spec/live/custom_role_spec.rb
480
479
  - spec/live/forum_spec.rb
481
480
  - spec/live/forum_subscription_spec.rb
@@ -571,7 +570,6 @@ test_files:
571
570
  - spec/live/bookmark_spec.rb
572
571
  - spec/live/category_spec.rb
573
572
  - spec/live/collection_spec.rb
574
- - spec/live/crm_spec.rb
575
573
  - spec/live/custom_role_spec.rb
576
574
  - spec/live/forum_spec.rb
577
575
  - spec/live/forum_subscription_spec.rb
@@ -1,11 +0,0 @@
1
- require 'core/spec_helper'
2
-
3
- describe ZendeskAPI::CRMData do
4
- # TODO
5
- # it_should_be_readable user, :crm_data
6
- end
7
-
8
- describe ZendeskAPI::CRMDataStatus do
9
- # TODO
10
- # it_should_be_readable user, :crm_data_status
11
- end