ably-rest 0.7.5 → 0.8.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (76) hide show
  1. checksums.yaml +8 -8
  2. data/.travis.yml +2 -0
  3. data/README.md +41 -15
  4. data/SPEC.md +654 -518
  5. data/lib/submodules/ably-ruby/.gitignore +1 -0
  6. data/lib/submodules/ably-ruby/.gitmodules +3 -0
  7. data/lib/submodules/ably-ruby/README.md +54 -26
  8. data/lib/submodules/ably-ruby/SPEC.md +468 -322
  9. data/lib/submodules/ably-ruby/ably.gemspec +4 -2
  10. data/lib/submodules/ably-ruby/lib/ably/auth.rb +185 -131
  11. data/lib/submodules/ably-ruby/lib/ably/models/message.rb +1 -1
  12. data/lib/submodules/ably-ruby/lib/ably/models/paginated_resource.rb +31 -44
  13. data/lib/submodules/ably-ruby/lib/ably/models/presence_message.rb +2 -2
  14. data/lib/submodules/ably-ruby/lib/ably/models/protocol_message.rb +1 -2
  15. data/lib/submodules/ably-ruby/lib/ably/models/stat.rb +67 -24
  16. data/lib/submodules/ably-ruby/lib/ably/models/stats_types.rb +131 -0
  17. data/lib/submodules/ably-ruby/lib/ably/models/token_details.rb +101 -0
  18. data/lib/submodules/ably-ruby/lib/ably/models/token_request.rb +108 -0
  19. data/lib/submodules/ably-ruby/lib/ably/modules/async_wrapper.rb +3 -2
  20. data/lib/submodules/ably-ruby/lib/ably/modules/http_helpers.rb +1 -1
  21. data/lib/submodules/ably-ruby/lib/ably/modules/message_emitter.rb +2 -2
  22. data/lib/submodules/ably-ruby/lib/ably/realtime.rb +3 -7
  23. data/lib/submodules/ably-ruby/lib/ably/realtime/channel.rb +32 -5
  24. data/lib/submodules/ably-ruby/lib/ably/realtime/channel/channel_manager.rb +1 -0
  25. data/lib/submodules/ably-ruby/lib/ably/realtime/client.rb +4 -8
  26. data/lib/submodules/ably-ruby/lib/ably/realtime/connection.rb +5 -3
  27. data/lib/submodules/ably-ruby/lib/ably/realtime/presence.rb +12 -1
  28. data/lib/submodules/ably-ruby/lib/ably/rest.rb +3 -7
  29. data/lib/submodules/ably-ruby/lib/ably/rest/channel.rb +13 -10
  30. data/lib/submodules/ably-ruby/lib/ably/rest/client.rb +19 -20
  31. data/lib/submodules/ably-ruby/lib/ably/rest/presence.rb +14 -12
  32. data/lib/submodules/ably-ruby/lib/ably/version.rb +1 -1
  33. data/lib/submodules/ably-ruby/spec/acceptance/realtime/channel_history_spec.rb +74 -23
  34. data/lib/submodules/ably-ruby/spec/acceptance/realtime/channel_spec.rb +3 -3
  35. data/lib/submodules/ably-ruby/spec/acceptance/realtime/client_spec.rb +18 -18
  36. data/lib/submodules/ably-ruby/spec/acceptance/realtime/connection_failures_spec.rb +5 -5
  37. data/lib/submodules/ably-ruby/spec/acceptance/realtime/connection_spec.rb +12 -12
  38. data/lib/submodules/ably-ruby/spec/acceptance/realtime/message_spec.rb +5 -5
  39. data/lib/submodules/ably-ruby/spec/acceptance/realtime/presence_history_spec.rb +56 -13
  40. data/lib/submodules/ably-ruby/spec/acceptance/realtime/presence_spec.rb +8 -8
  41. data/lib/submodules/ably-ruby/spec/acceptance/realtime/stats_spec.rb +1 -1
  42. data/lib/submodules/ably-ruby/spec/acceptance/realtime/time_spec.rb +1 -1
  43. data/lib/submodules/ably-ruby/spec/acceptance/rest/auth_spec.rb +262 -158
  44. data/lib/submodules/ably-ruby/spec/acceptance/rest/base_spec.rb +11 -9
  45. data/lib/submodules/ably-ruby/spec/acceptance/rest/channel_spec.rb +28 -21
  46. data/lib/submodules/ably-ruby/spec/acceptance/rest/channels_spec.rb +1 -1
  47. data/lib/submodules/ably-ruby/spec/acceptance/rest/client_spec.rb +30 -27
  48. data/lib/submodules/ably-ruby/spec/acceptance/rest/encoders_spec.rb +1 -1
  49. data/lib/submodules/ably-ruby/spec/acceptance/rest/message_spec.rb +10 -10
  50. data/lib/submodules/ably-ruby/spec/acceptance/rest/presence_spec.rb +93 -56
  51. data/lib/submodules/ably-ruby/spec/acceptance/rest/stats_spec.rb +50 -45
  52. data/lib/submodules/ably-ruby/spec/acceptance/rest/time_spec.rb +1 -1
  53. data/lib/submodules/ably-ruby/spec/rspec_config.rb +3 -2
  54. data/lib/submodules/ably-ruby/spec/shared/client_initializer_behaviour.rb +36 -28
  55. data/lib/submodules/ably-ruby/spec/spec_helper.rb +3 -0
  56. data/lib/submodules/ably-ruby/spec/support/api_helper.rb +3 -3
  57. data/lib/submodules/ably-ruby/spec/support/markdown_spec_formatter.rb +1 -1
  58. data/lib/submodules/ably-ruby/spec/support/test_app.rb +20 -33
  59. data/lib/submodules/ably-ruby/spec/unit/auth_spec.rb +18 -1
  60. data/lib/submodules/ably-ruby/spec/unit/models/paginated_resource_spec.rb +81 -72
  61. data/lib/submodules/ably-ruby/spec/unit/models/stats_spec.rb +289 -0
  62. data/lib/submodules/ably-ruby/spec/unit/models/token_details_spec.rb +111 -0
  63. data/lib/submodules/ably-ruby/spec/unit/models/token_request_spec.rb +110 -0
  64. data/lib/submodules/ably-ruby/spec/unit/modules/async_wrapper_spec.rb +1 -1
  65. data/lib/submodules/ably-ruby/spec/unit/realtime/client_spec.rb +1 -1
  66. data/lib/submodules/ably-ruby/spec/unit/realtime/realtime_spec.rb +1 -1
  67. data/lib/submodules/ably-ruby/spec/unit/rest/channel_spec.rb +1 -1
  68. data/lib/submodules/ably-ruby/spec/unit/rest/client_spec.rb +8 -8
  69. data/lib/submodules/ably-ruby/spec/unit/rest/rest_spec.rb +1 -1
  70. data/lib/submodules/ably-ruby/spec/unit/util/crypto_spec.rb +1 -1
  71. metadata +9 -7
  72. data/lib/submodules/ably-ruby/lib/ably/models/token.rb +0 -74
  73. data/lib/submodules/ably-ruby/spec/resources/crypto-data-128.json +0 -56
  74. data/lib/submodules/ably-ruby/spec/resources/crypto-data-256.json +0 -56
  75. data/lib/submodules/ably-ruby/spec/unit/models/stat_spec.rb +0 -113
  76. data/lib/submodules/ably-ruby/spec/unit/models/token_spec.rb +0 -86
@@ -23,10 +23,6 @@ module Ably
23
23
  # @param (see Ably::Rest::Client#initialize)
24
24
  # @option options (see Ably::Rest::Client#initialize)
25
25
  #
26
- # @yield (see Ably::Rest::Client#initialize)
27
- # @yieldparam (see Ably::Rest::Client#initialize)
28
- # @yieldreturn (see Ably::Rest::Client#initialize)
29
- #
30
26
  # @return [Ably::Rest::Client]
31
27
  #
32
28
  # @example
@@ -34,10 +30,10 @@ module Ably
34
30
  # client = Ably::Rest.new('key.id:secret')
35
31
  #
36
32
  # # create a new client authenticating with basic auth and a client_id
37
- # client = Ably::Rest.new(api_key: 'key.id:secret', client_id: 'john')
33
+ # client = Ably::Rest.new(key: 'key.id:secret', client_id: 'john')
38
34
  #
39
- def self.new(options, &token_request_block)
40
- Ably::Rest::Client.new(options, &token_request_block)
35
+ def self.new(options)
36
+ Ably::Rest::Client.new(options)
41
37
  end
42
38
  end
43
39
  end
@@ -20,7 +20,7 @@ module Ably
20
20
  # @param name [String] The name of the channel
21
21
  # @param channel_options [Hash] Channel options, currently reserved for Encryption options
22
22
  # @option channel_options [Boolean] :encrypted setting this to true for this channel will encrypt & decrypt all messages automatically
23
- # @option channel_options [Hash] :cipher_params A hash of options to configure the encryption. *:key* is required, all other options are optional. See {Ably::Util::Crypto#initialize} for a list of `cipher_params` options
23
+ # @option channel_options [Hash] :cipher_params A hash of options to configure the encryption. *:key* is required, all other options are optional. See {Ably::Util::Crypto#initialize} for a list of +cipher_params+ options
24
24
  #
25
25
  def initialize(client, name, channel_options = {})
26
26
  ensure_utf_8 :name, name
@@ -52,19 +52,22 @@ module Ably
52
52
  [201, 204].include?(response.status)
53
53
  end
54
54
 
55
- # Return the message history of the channel
55
+ # Return the message of the channel
56
56
  #
57
- # @param [Hash] options the options for the message history request
58
- # @option options [Integer,Time] :start Time or millisecond since epoch
59
- # @option options [Integer,Time] :end Time or millisecond since epoch
60
- # @option options [Symbol] :direction `:forwards` or `:backwards`
61
- # @option options [Integer] :limit Maximum number of messages to retrieve up to 10,000
62
- # @option options [Symbol] :by `:message`, `:bundle` or `:hour`. Defaults to `:message`
57
+ # @param [Hash] options the options for the message history request
58
+ # @option options [Integer,Time] :start Ensure earliest time or millisecond since epoch for any messages retrieved is +:start+
59
+ # @option options [Integer,Time] :end Ensure latest time or millisecond since epoch for any messages retrieved is +:end+
60
+ # @option options [Symbol] :direction +:forwards+ or +:backwards+, defaults to +:backwards+
61
+ # @option options [Integer] :limit Maximum number of messages to retrieve up to 1,000, defaults to 100
62
+ #
63
+ # @return [Ably::Models::PaginatedResource<Ably::Models::Message>] First {Ably::Models::PaginatedResource page} of {Ably::Models::Message} objects accessible with {Ably::Models::PaginatedResource#items #items}.
63
64
  #
64
- # @return [Ably::Models::PaginatedResource<Ably::Models::Message>] An Array of {Ably::Models::Message} objects that supports paging (#next_page, #first_page)
65
65
  def history(options = {})
66
66
  url = "#{base_path}/messages"
67
- options = options.dup
67
+ options = {
68
+ :direction => :backwards,
69
+ :limit => 100
70
+ }.merge(options)
68
71
 
69
72
  [:start, :end].each { |option| options[option] = as_since_epoch(options[option]) if options.has_key?(option) }
70
73
 
@@ -70,18 +70,16 @@ module Ably
70
70
  # @param [Hash,String] options an options Hash used to configure the client and the authentication, or String with an API key or Token ID
71
71
  # @option options (see Ably::Auth#authorise)
72
72
  # @option options [Boolean] :tls TLS is used by default, providing a value of false disables TLS. Please note Basic Auth is disallowed without TLS as secrets cannot be transmitted over unsecured connections.
73
- # @option options [String] :api_key API key comprising the key ID and key secret in a single string
74
- # @option options [Boolean] :use_token_auth Will force Basic Auth if set to false, and TOken auth if set to true
73
+ # @option options [String] :key API key comprising the key name and key secret in a single string
74
+ # @option options [String] :token Token string or {Models::TokenDetails} used to authenticate requests
75
+ # @option options [String] :token_details {Models::TokenDetails} used to authenticate requests
76
+ # @option options [Boolean] :use_token_auth Will force Basic Auth if set to false, and Token auth if set to true
75
77
  # @option options [String] :environment Specify 'sandbox' when testing the client library against an alternate Ably environment
76
78
  # @option options [Symbol] :protocol Protocol used to communicate with Ably, :json and :msgpack currently supported. Defaults to :msgpack
77
79
  # @option options [Boolean] :use_binary_protocol Protocol used to communicate with Ably, defaults to true and uses MessagePack protocol. This option will overide :protocol option
78
80
  # @option options [Logger::Severity,Symbol] :log_level Log level for the standard Logger that outputs to STDOUT. Defaults to Logger::ERROR, can be set to :fatal (Logger::FATAL), :error (Logger::ERROR), :warn (Logger::WARN), :info (Logger::INFO), :debug (Logger::DEBUG) or :none
79
81
  # @option options [Logger] :logger A custom logger can be used however it must adhere to the Ruby Logger interface, see http://www.ruby-doc.org/stdlib-1.9.3/libdoc/logger/rdoc/Logger.html
80
82
  #
81
- # @yield (see Ably::Auth#authorise)
82
- # @yieldparam (see Ably::Auth#authorise)
83
- # @yieldreturn (see Ably::Auth#authorise)
84
- #
85
83
  # @return [Ably::Rest::Client]
86
84
  #
87
85
  # @example
@@ -89,17 +87,17 @@ module Ably
89
87
  # client = Ably::Rest::Client.new('key.id:secret')
90
88
  #
91
89
  # # create a new client and configure a client ID used for presence
92
- # client = Ably::Rest::Client.new(api_key: 'key.id:secret', client_id: 'john')
90
+ # client = Ably::Rest::Client.new(key: 'key.id:secret', client_id: 'john')
93
91
  #
94
- def initialize(options, &token_request_block)
92
+ def initialize(options)
95
93
  raise ArgumentError, 'Options Hash is expected' if options.nil?
96
94
 
97
95
  options = options.clone
98
96
  if options.kind_of?(String)
99
97
  options = if options.match(/^[\w]{2,}\.[\w]{2,}:[\w]{2,}$/)
100
- { api_key: options }
98
+ { key: options }
101
99
  else
102
- { token_id: options }
100
+ { token: options }
103
101
  end
104
102
  end
105
103
 
@@ -127,7 +125,7 @@ module Ably
127
125
  raise ArgumentError, 'Protocol is invalid. Must be either :msgpack or :json' unless [:msgpack, :json].include?(@protocol)
128
126
 
129
127
  @options = options.freeze
130
- @auth = Auth.new(self, options, &token_request_block)
128
+ @auth = Auth.new(self, options)
131
129
  @channels = Ably::Rest::Channels.new(self)
132
130
  @encoders = []
133
131
 
@@ -146,24 +144,25 @@ module Ably
146
144
  # Retrieve the Stats for the application
147
145
  #
148
146
  # @param [Hash] options the options for the stats request
149
- # @option options [Integer,Time] :start Time or millisecond since epoch
150
- # @option options [Integer,Time] :end Time or millisecond since epoch
151
- # @option options [Symbol] :direction `:forwards` or `:backwards`
152
- # @option options [Integer] :limit Maximum number of stats to retrieve up to 10,000
153
- # @option options [Symbol] :by `:minute`, `:hour`, `:day` or `:month`. Defaults to `:minute`
147
+ # @option options [Integer,Time] :start Ensure earliest time or millisecond since epoch for any stats retrieved is +:start+
148
+ # @option options [Integer,Time] :end Ensure latest time or millisecond since epoch for any stats retrieved is +:end+
149
+ # @option options [Symbol] :direction +:forwards+ or +:backwards+, defaults to +:backwards+
150
+ # @option options [Integer] :limit Maximum number of messages to retrieve up to 1,000, defaults to 100
151
+ # @option options [Symbol] :unit `:minute`, `:hour`, `:day` or `:month`. Defaults to `:minute`
154
152
  #
155
- # @return [Ably::Models::PaginatedResource<Ably::Models::Stat>] An Array of Stats
153
+ # @return [Ably::Models::PaginatedResource<Ably::Models::Stats>] An Array of Stats
156
154
  #
157
155
  def stats(options = {})
158
156
  options = {
159
- :direction => :forwards,
160
- :by => :minute
157
+ :direction => :backwards,
158
+ :unit => :minute,
159
+ :limit => 100
161
160
  }.merge(options)
162
161
 
163
162
  [:start, :end].each { |option| options[option] = as_since_epoch(options[option]) if options.has_key?(option) }
164
163
 
165
164
  paginated_options = {
166
- coerce_into: 'Ably::Models::Stat'
165
+ coerce_into: 'Ably::Models::Stats'
167
166
  }
168
167
 
169
168
  url = '/stats'
@@ -23,15 +23,14 @@ module Ably
23
23
  # Obtain the set of members currently present for a channel
24
24
  #
25
25
  # @param [Hash] options the options for the set of members present
26
- # @option options [Integer,Time] :start Time or millisecond since epoch
27
- # @option options [Integer,Time] :end Time or millisecond since epoch
28
- # @option options [Symbol] :direction `:forwards` or `:backwards`
29
- # @option options [Integer] :limit Maximum number of members to retrieve up to 10,000
26
+ # @option options [Integer] :limit Maximum number of members to retrieve up to 1,000, defaults to 100
30
27
  #
31
- # @return [Ably::Models::PaginatedResource<Ably::Models::PresenceMessage>] An Array of {Ably::Models::PresenceMessage} objects that supports paging (#next_page, #first_page)
28
+ # @return [Ably::Models::PaginatedResource<Ably::Models::PresenceMessage>] First {Ably::Models::PaginatedResource page} of {Ably::Models::PresenceMessage} objects accessible with {Ably::Models::PaginatedResource#items #items}.
32
29
  #
33
30
  def get(options = {})
34
- options = options.dup
31
+ options = options = {
32
+ :limit => 100
33
+ }.merge(options)
35
34
 
36
35
  paginated_options = {
37
36
  coerce_into: 'Ably::Models::PresenceMessage',
@@ -50,16 +49,19 @@ module Ably
50
49
  # Return the presence messages history for the channel
51
50
  #
52
51
  # @param [Hash] options the options for the message history request
53
- # @option options [Integer,Time] :start Time or millisecond since epoch
54
- # @option options [Integer,Time] :end Time or millisecond since epoch
55
- # @option options [Symbol] :direction `:forwards` or `:backwards`
56
- # @option options [Integer] :limit Maximum number of presence messages to retrieve up to 10,000
52
+ # @option options [Integer,Time] :start Ensure earliest time or millisecond since epoch for any presence messages retrieved is +:start+
53
+ # @option options [Integer,Time] :end Ensure latest time or millisecond since epoch for any presence messages retrieved is +:end+
54
+ # @option options [Symbol] :direction +:forwards+ or +:backwards+, defaults to +:backwards+
55
+ # @option options [Integer] :limit Maximum number of messages to retrieve up to 1,000, defaults to 100
57
56
  #
58
- # @return [Ably::Models::PaginatedResource<Ably::Models::PresenceMessage>] An Array of {Ably::Models::PresenceMessage} objects that supports paging (#next_page, #first_page)
57
+ # @return [Ably::Models::PaginatedResource<Ably::Models::PresenceMessage>] First {Ably::Models::PaginatedResource page} of {Ably::Models::PresenceMessage} objects accessible with {Ably::Models::PaginatedResource#items #items}.
59
58
  #
60
59
  def history(options = {})
61
60
  url = "#{base_path}/history"
62
- options = options.dup
61
+ options = options = {
62
+ :direction => :backwards,
63
+ :limit => 100
64
+ }.merge(options)
63
65
 
64
66
  [:start, :end].each { |option| options[option] = as_since_epoch(options[option]) if options.has_key?(option) }
65
67
 
@@ -1,3 +1,3 @@
1
1
  module Ably
2
- VERSION = '0.7.5'
2
+ VERSION = '0.8.1'
3
3
  end
@@ -3,10 +3,11 @@ require 'spec_helper'
3
3
 
4
4
  describe Ably::Realtime::Channel, '#history', :event_machine do
5
5
  vary_by_protocol do
6
- let(:default_options) { options.merge(api_key: api_key, environment: environment, protocol: protocol) }
6
+ let(:default_options) { options.merge(key: api_key, environment: environment, protocol: protocol) }
7
7
 
8
8
  let(:client) { Ably::Realtime::Client.new(default_options) }
9
9
  let(:channel) { client.channel(channel_name) }
10
+ let(:rest_channel) { client.rest_client.channel(channel_name) }
10
11
 
11
12
  let(:client2) { Ably::Realtime::Client.new(default_options) }
12
13
  let(:channel2) { client2.channel(channel_name) }
@@ -21,20 +22,20 @@ describe Ably::Realtime::Channel, '#history', :event_machine do
21
22
  channel.publish('event', payload) do |message|
22
23
  history = channel.history
23
24
  expect(history).to be_a(Ably::Util::SafeDeferrable)
24
- history.callback do |messages|
25
- expect(messages.count).to eql(1)
26
- expect(messages).to be_a(Ably::Models::PaginatedResource)
25
+ history.callback do |page|
26
+ expect(page.items.count).to eql(1)
27
+ expect(page).to be_a(Ably::Models::PaginatedResource)
27
28
  stop_reactor
28
29
  end
29
30
  end
30
31
  end
31
32
 
32
33
  context 'with a single client publishing and receiving' do
33
- it 'retrieves real-time history' do
34
+ it 'retrieves realtime history' do
34
35
  channel.publish('event', payload) do |message|
35
- channel.history do |history|
36
- expect(history.length).to eql(1)
37
- expect(history[0].data).to eql(payload)
36
+ channel.history do |page|
37
+ expect(page.items.length).to eql(1)
38
+ expect(page.items[0].data).to eql(payload)
38
39
  stop_reactor
39
40
  end
40
41
  end
@@ -42,15 +43,15 @@ describe Ably::Realtime::Channel, '#history', :event_machine do
42
43
  end
43
44
 
44
45
  context 'with two clients publishing messages on the same channel' do
45
- it 'retrieves real-time history on both channels' do
46
+ it 'retrieves realtime history on both channels' do
46
47
  channel.publish('event', payload) do |message|
47
48
  channel2.publish('event', payload) do |message|
48
- channel.history do |history|
49
- expect(history.length).to eql(2)
50
- expect(history.map(&:data).uniq).to eql([payload])
49
+ channel.history do |page|
50
+ expect(page.items.length).to eql(2)
51
+ expect(page.items.map(&:data).uniq).to eql([payload])
51
52
 
52
- channel2.history do |history_2|
53
- expect(history_2.length).to eql(2)
53
+ channel2.history do |page_2|
54
+ expect(page_2.items.length).to eql(2)
54
55
  stop_reactor
55
56
  end
56
57
  end
@@ -65,18 +66,18 @@ describe Ably::Realtime::Channel, '#history', :event_machine do
65
66
  let(:limit) { 15 }
66
67
 
67
68
  def ensure_message_history_direction_and_paging_is_correct(direction)
68
- channel.history(direction: direction, limit: limit) do |history|
69
- expect(history.length).to eql(limit)
69
+ channel.history(direction: direction, limit: limit) do |history_page|
70
+ expect(history_page.items.length).to eql(limit)
70
71
  limit.times do |index|
71
- expect(history[index].data).to eql("history#{index}")
72
+ expect(history_page.items[index].data).to eql("history#{index}")
72
73
  end
73
74
 
74
- history.next_page do |history|
75
- expect(history.length).to eql(limit)
75
+ history_page.next do |next_page|
76
+ expect(next_page.items.length).to eql(limit)
76
77
  limit.times do |index|
77
- expect(history[index].data).to eql("history#{index + limit}")
78
+ expect(next_page.items[index].data).to eql("history#{index + limit}")
78
79
  end
79
- expect(history.last_page?).to eql(true)
80
+ expect(next_page).to be_last
80
81
 
81
82
  stop_reactor
82
83
  end
@@ -141,8 +142,8 @@ describe Ably::Realtime::Channel, '#history', :event_machine do
141
142
  channel.subscribe('event') do |message|
142
143
  messages << message
143
144
  if messages.count == batches * messages_per_batch
144
- channel.history do |history|
145
- expect(history.map(&:id).sort).to eql(messages.map(&:id).sort)
145
+ channel.history do |page|
146
+ expect(page.items.map(&:id).sort).to eql(messages.map(&:id).sort)
146
147
  stop_reactor
147
148
  end
148
149
  end
@@ -150,5 +151,55 @@ describe Ably::Realtime::Channel, '#history', :event_machine do
150
151
  end
151
152
  end
152
153
  end
154
+
155
+ context 'with option until_attach: true' do
156
+ let(:event) { random_str }
157
+ let(:message_before_attach) { random_str }
158
+ let(:message_after_attach) { random_str }
159
+
160
+ it 'retrieves all messages before channel was attached' do
161
+ rest_channel.publish event, message_before_attach
162
+
163
+ channel.attach do
164
+ channel.publish(event, message_after_attach) do
165
+ channel.history(until_attach: true) do |messages|
166
+ expect(messages.items.count).to eql(1)
167
+ expect(messages.items.first.data).to eql(message_before_attach)
168
+ stop_reactor
169
+ end
170
+ end
171
+ end
172
+ end
173
+
174
+ context 'and two pages of messages' do
175
+ it 'retrieves two pages of messages before channel was attached' do
176
+ 10.times { rest_channel.publish event, message_before_attach }
177
+
178
+ channel.attach do
179
+ 10.times { rest_channel.publish event, message_after_attach }
180
+
181
+ EventMachine.add_timer(0.5) do
182
+ channel.history(until_attach: true, limit: 5) do |messages|
183
+ expect(messages.items.count).to eql(5)
184
+ expect(messages.items.map(&:data).uniq.first).to eql(message_before_attach)
185
+
186
+ messages.next do |next_page_messages|
187
+ expect(next_page_messages.items.count).to eql(5)
188
+ expect(next_page_messages.items.map(&:data).uniq.first).to eql(message_before_attach)
189
+ expect(next_page_messages).to be_last
190
+
191
+ stop_reactor
192
+ end
193
+ end
194
+ end
195
+ end
196
+ end
197
+ end
198
+
199
+ it 'raises an exception unless state is attached' do
200
+ expect { channel.history(until_attach: true) }.to raise_error(ArgumentError, /not attached/)
201
+ stop_reactor
202
+ end
203
+ end
153
204
  end
154
205
  end
@@ -3,7 +3,7 @@ require 'spec_helper'
3
3
 
4
4
  describe Ably::Realtime::Channel, :event_machine do
5
5
  vary_by_protocol do
6
- let(:default_options) { { api_key: api_key, environment: environment, protocol: protocol } }
6
+ let(:default_options) { { key: api_key, environment: environment, protocol: protocol } }
7
7
  let(:client_options) { default_options }
8
8
 
9
9
  let(:client) { Ably::Realtime::Client.new(client_options) }
@@ -158,7 +158,7 @@ describe Ably::Realtime::Channel, :event_machine do
158
158
 
159
159
  context 'failure as a result of insufficient key permissions' do
160
160
  let(:restricted_client) do
161
- Ably::Realtime::Client.new(default_options.merge(api_key: restricted_api_key, log_level: :fatal))
161
+ Ably::Realtime::Client.new(default_options.merge(key: restricted_api_key, log_level: :fatal))
162
162
  end
163
163
  let(:restricted_channel) { restricted_client.channel("cannot_subscribe") }
164
164
 
@@ -202,7 +202,7 @@ describe Ably::Realtime::Channel, :event_machine do
202
202
  restricted_channel.once(:failed) do
203
203
  restricted_client.close do
204
204
  # A direct call to #authorise is synchronous
205
- restricted_client.auth.authorise(api_key: api_key)
205
+ restricted_client.auth.authorise(key: api_key)
206
206
 
207
207
  restricted_client.connect do
208
208
  restricted_channel.once(:attached) do
@@ -4,7 +4,7 @@ require 'spec_helper'
4
4
  describe Ably::Realtime::Client, :event_machine do
5
5
  vary_by_protocol do
6
6
  let(:default_options) do
7
- { api_key: api_key, environment: environment, protocol: protocol }
7
+ { key: api_key, environment: environment, protocol: protocol }
8
8
  end
9
9
 
10
10
  let(:client_options) { default_options }
@@ -15,11 +15,11 @@ describe Ably::Realtime::Client, :event_machine do
15
15
 
16
16
  context 'initialization' do
17
17
  context 'basic auth' do
18
- it 'is enabled by default with a provided :api_key option' do
18
+ it 'is enabled by default with a provided :key option' do
19
19
  connection.on(:connected) do
20
- expect(auth_params[:key_id]).to_not be_nil
20
+ expect(auth_params[:key]).to_not be_nil
21
21
  expect(auth_params[:access_token]).to be_nil
22
- expect(subject.auth.current_token).to be_nil
22
+ expect(subject.auth.current_token_details).to be_nil
23
23
  stop_reactor
24
24
  end
25
25
  end
@@ -44,26 +44,26 @@ describe Ably::Realtime::Client, :event_machine do
44
44
  [true, false].each do |tls_enabled|
45
45
  context "with TLS #{tls_enabled ? 'enabled' : 'disabled'}" do
46
46
  let(:capability) { { :foo => ["publish"] } }
47
- let(:token) { Ably::Realtime::Client.new(default_options).auth.request_token(capability: capability) }
48
- let(:client_options) { default_options.merge(token_id: token.id) }
47
+ let(:token_details) { Ably::Realtime::Client.new(default_options).auth.request_token(capability: capability) }
48
+ let(:client_options) { default_options.merge(token: token_details.token) }
49
49
 
50
- context 'and a pre-generated Token provided with the :token_id option' do
50
+ context 'and a pre-generated Token provided with the :token option' do
51
51
  it 'connects using token auth' do
52
52
  connection.on(:connected) do
53
53
  expect(auth_params[:access_token]).to_not be_nil
54
- expect(auth_params[:key_id]).to be_nil
55
- expect(subject.auth.current_token).to be_nil
54
+ expect(auth_params[:key]).to be_nil
55
+ expect(subject.auth.current_token_details).to be_nil
56
56
  stop_reactor
57
57
  end
58
58
  end
59
59
  end
60
60
 
61
- context 'with valid :api_key and :use_token_auth option set to true' do
61
+ context 'with valid :key and :use_token_auth option set to true' do
62
62
  let(:client_options) { default_options.merge(use_token_auth: true) }
63
63
 
64
64
  it 'automatically authorises on connect and generates a token' do
65
65
  connection.on(:connected) do
66
- expect(subject.auth.current_token).to_not be_nil
66
+ expect(subject.auth.current_token_details).to_not be_nil
67
67
  expect(auth_params[:access_token]).to_not be_nil
68
68
  stop_reactor
69
69
  end
@@ -79,7 +79,7 @@ describe Ably::Realtime::Client, :event_machine do
79
79
  connection.on(:connected) do
80
80
  expect(connection.state).to eq(:connected)
81
81
  expect(auth_params[:access_token]).to_not be_nil
82
- expect(auth_params[:key_id]).to be_nil
82
+ expect(auth_params[:key]).to be_nil
83
83
  stop_reactor
84
84
  end
85
85
  end
@@ -88,27 +88,27 @@ describe Ably::Realtime::Client, :event_machine do
88
88
  end
89
89
  end
90
90
 
91
- context 'with token_request_block' do
91
+ context 'with a Proc for the :auth_callback option' do
92
92
  let(:client_id) { random_str }
93
93
  let(:auth) { subject.auth }
94
94
 
95
95
  subject do
96
- Ably::Realtime::Client.new(client_options) do
96
+ Ably::Realtime::Client.new(client_options.merge(auth_callback: Proc.new do
97
97
  @block_called = true
98
98
  auth.create_token_request(client_id: client_id)
99
- end
99
+ end))
100
100
  end
101
101
 
102
- it 'calls the block' do
102
+ it 'calls the Proc' do
103
103
  connection.on(:connected) do
104
104
  expect(@block_called).to eql(true)
105
105
  stop_reactor
106
106
  end
107
107
  end
108
108
 
109
- it 'uses the token request when requesting a new token' do
109
+ it 'uses the token request returned from the callback when requesting a new token' do
110
110
  connection.on(:connected) do
111
- expect(auth.current_token.client_id).to eql(client_id)
111
+ expect(auth.current_token_details.client_id).to eql(client_id)
112
112
  stop_reactor
113
113
  end
114
114
  end