connfu-client 0.1

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.
Files changed (94) hide show
  1. data/.rspec +3 -0
  2. data/.rvmrc +2 -0
  3. data/Gemfile +5 -0
  4. data/Gemfile.lock +120 -0
  5. data/LICENSE.txt +661 -0
  6. data/README.rdoc +398 -0
  7. data/Rakefile +38 -0
  8. data/bin/.DS_Store +0 -0
  9. data/bin/connfu-client +94 -0
  10. data/connfu-client.gemspec +41 -0
  11. data/examples/conference/application.rb +68 -0
  12. data/examples/conference/conference.rb +33 -0
  13. data/examples/conference/conference_app.rb +25 -0
  14. data/examples/conference/connfu.log +5 -0
  15. data/examples/conference/wall.rb +11 -0
  16. data/examples/provisioning/app/get.rb +29 -0
  17. data/examples/provisioning/channels/get.rb +34 -0
  18. data/examples/provisioning/rss/create.rb +28 -0
  19. data/examples/provisioning/rss/delete.rb +27 -0
  20. data/examples/provisioning/rss/get.rb +32 -0
  21. data/examples/provisioning/rss/put.rb +29 -0
  22. data/examples/provisioning/setup.rb +2 -0
  23. data/examples/provisioning/twitter/create.rb +31 -0
  24. data/examples/provisioning/twitter/delete.rb +27 -0
  25. data/examples/provisioning/twitter/get.rb +32 -0
  26. data/examples/provisioning/twitter/put.rb +29 -0
  27. data/examples/provisioning/voice/create.rb +26 -0
  28. data/examples/provisioning/voice/delete.rb +27 -0
  29. data/examples/provisioning/voice/get.rb +36 -0
  30. data/examples/provisioning/voice/phones/create.rb +26 -0
  31. data/examples/provisioning/voice/phones/delete.rb +28 -0
  32. data/examples/provisioning/voice/phones/get.rb +38 -0
  33. data/examples/provisioning/voice/put.rb +38 -0
  34. data/examples/provisioning/voice/whitelist/create.rb +26 -0
  35. data/examples/provisioning/voice/whitelist/delete.rb +27 -0
  36. data/examples/provisioning/voice/whitelist/get.rb +36 -0
  37. data/examples/provisioning/voice/whitelist/put.rb +27 -0
  38. data/lib/connfu.rb +134 -0
  39. data/lib/connfu/cli/generator.rb +71 -0
  40. data/lib/connfu/connfu_logger.rb +88 -0
  41. data/lib/connfu/connfu_message_formatter.rb +134 -0
  42. data/lib/connfu/connfu_stream.rb +182 -0
  43. data/lib/connfu/dispatcher.rb +164 -0
  44. data/lib/connfu/dsl.rb +84 -0
  45. data/lib/connfu/events.rb +32 -0
  46. data/lib/connfu/listener.rb +85 -0
  47. data/lib/connfu/listener_channel.rb +100 -0
  48. data/lib/connfu/message.rb +74 -0
  49. data/lib/connfu/provisioning.rb +12 -0
  50. data/lib/connfu/provisioning/application.rb +374 -0
  51. data/lib/connfu/provisioning/base.rb +95 -0
  52. data/lib/connfu/provisioning/channel.rb +79 -0
  53. data/lib/connfu/provisioning/phone.rb +55 -0
  54. data/lib/connfu/provisioning/rss.rb +21 -0
  55. data/lib/connfu/provisioning/twitter.rb +28 -0
  56. data/lib/connfu/provisioning/voice.rb +89 -0
  57. data/lib/connfu/provisioning/whitelist.rb +62 -0
  58. data/lib/connfu/version.rb +6 -0
  59. data/lib/rdoc/generator/template/connfu/_context.rhtml +209 -0
  60. data/lib/rdoc/generator/template/connfu/_head.rhtml +7 -0
  61. data/lib/rdoc/generator/template/connfu/class.rhtml +38 -0
  62. data/lib/rdoc/generator/template/connfu/file.rhtml +36 -0
  63. data/lib/rdoc/generator/template/connfu/index.rhtml +13 -0
  64. data/lib/rdoc/generator/template/connfu/resources/apple-touch-icon.png +0 -0
  65. data/lib/rdoc/generator/template/connfu/resources/css/github.css +129 -0
  66. data/lib/rdoc/generator/template/connfu/resources/css/main.css +339 -0
  67. data/lib/rdoc/generator/template/connfu/resources/css/panel.css +389 -0
  68. data/lib/rdoc/generator/template/connfu/resources/css/reset.css +53 -0
  69. data/lib/rdoc/generator/template/connfu/resources/favicon.ico +0 -0
  70. data/lib/rdoc/generator/template/connfu/resources/i/arrows.png +0 -0
  71. data/lib/rdoc/generator/template/connfu/resources/i/results_bg.png +0 -0
  72. data/lib/rdoc/generator/template/connfu/resources/i/tree_bg.png +0 -0
  73. data/lib/rdoc/generator/template/connfu/resources/js/highlight.pack.js +1 -0
  74. data/lib/rdoc/generator/template/connfu/resources/js/jquery-1.3.2.min.js +19 -0
  75. data/lib/rdoc/generator/template/connfu/resources/js/jquery-effect.js +593 -0
  76. data/lib/rdoc/generator/template/connfu/resources/js/main.js +20 -0
  77. data/lib/rdoc/generator/template/connfu/resources/js/searchdoc.js +628 -0
  78. data/lib/rdoc/generator/template/connfu/resources/panel/index.html +72 -0
  79. data/lib/rdoc/generator/template/connfu/se_index.rhtml +8 -0
  80. data/spec/connfu_message_formatter_spec.rb +88 -0
  81. data/spec/connfu_spec.rb +51 -0
  82. data/spec/connfu_stream_spec.rb +84 -0
  83. data/spec/dispatcher_spec.rb +227 -0
  84. data/spec/dsl_spec.rb +159 -0
  85. data/spec/listener_channel_spec.rb +130 -0
  86. data/spec/listener_spec.rb +67 -0
  87. data/spec/provisioning/application_spec.rb +47 -0
  88. data/spec/provisioning/channel_shared_examples.rb +52 -0
  89. data/spec/provisioning/channel_spec.rb +13 -0
  90. data/spec/provisioning/phone_spec.rb +88 -0
  91. data/spec/provisioning/voice_spec.rb +138 -0
  92. data/spec/provisioning_spec.rb +500 -0
  93. data/spec/spec_helper.rb +51 -0
  94. metadata +298 -0
@@ -0,0 +1,13 @@
1
+ #
2
+ # connFu is a platform of Telefonica delivered by Bluevia Labs
3
+ # Please, check out www.connfu.com and if you need more information
4
+ # contact us at mailto:support@connfu.com
5
+ #
6
+
7
+ require 'spec_helper'
8
+ require 'provisioning/channel_shared_examples'
9
+
10
+
11
+ describe Connfu::Provisioning::Channel do
12
+ it_should_behave_like "Channel", Connfu::Provisioning::Channel.new(channel_attrs.merge({"uid" => CHANNEL_KEY, "type" => ""}))
13
+ end
@@ -0,0 +1,88 @@
1
+ #
2
+ # connFu is a platform of Telefonica delivered by Bluevia Labs
3
+ # Please, check out www.connfu.com and if you need more information
4
+ # contact us at mailto:support@connfu.com
5
+ #
6
+
7
+ require 'connfu'
8
+
9
+ require 'spec_helper'
10
+
11
+ describe Connfu::Provisioning::Phone do
12
+
13
+ before(:each) do
14
+ @phone = Connfu::Provisioning::Phone.new(VOICE_KEY, PHONE_NUMBER, COUNTRY)
15
+ end
16
+
17
+ # Matcher that helps to test if an Application instance is well defined after retrieving data using prov API
18
+ RSpec::Matchers.define :be_well_defined_as_phone do |voice_key, phone_number, country|
19
+ match do |phone|
20
+ phone.should be_instance_of(Connfu::Provisioning::Phone)
21
+ phone.voice.should eql(voice_key)
22
+ phone.phone_number.should eql(phone_number)
23
+ phone.country.should eql(country)
24
+ end
25
+ end
26
+
27
+ context "while initializing" do
28
+ it "should set properly the instance attributes" do
29
+ @phone.should be_well_defined_as_phone(VOICE_KEY, PHONE_NUMBER, COUNTRY)
30
+ end
31
+
32
+ it "should retrieve the country instance variable using the [] method" do
33
+ @phone[:country].should eql(COUNTRY)
34
+ end
35
+
36
+ it "should retrieve the phone_number instance variable using the [] method" do
37
+ @phone[:phone_number].should eql(PHONE_NUMBER)
38
+ end
39
+
40
+ it "should retrieve the voice instance variable using the [] method" do
41
+ @phone[:voice].should eql(VOICE_KEY)
42
+ end
43
+
44
+ it "should retrieve nil using the [] method when the instance variable does not exists" do
45
+ @phone[:foo].should be_nil
46
+ end
47
+ end
48
+
49
+ context "while hashing" do
50
+ it "should include the country and phone_number" do
51
+ phone_hash = @phone.to_hash
52
+ phone_hash.should be_instance_of(Hash)
53
+ ["country", "phone_number"].each{|key|
54
+ phone_hash.should have_key(key)
55
+ }
56
+ end
57
+
58
+ it "should include the valid country value" do
59
+ phone_hash = @phone.to_hash
60
+ phone_hash["country"].should eql(COUNTRY)
61
+ end
62
+
63
+ it "should include the valid phone_number value" do
64
+ phone_hash = @phone.to_hash
65
+ phone_hash["phone_number"].should eql(PHONE_NUMBER)
66
+ end
67
+ end
68
+
69
+ context "while unmarshaling" do
70
+ let(:raw) {
71
+ {"phone_number" => PHONE_NUMBER, "country" => COUNTRY}
72
+ }
73
+
74
+ it "should unmarshal successfully a single phone data" do
75
+ value = Connfu::Provisioning::Phone.unmarshal(VOICE_KEY, raw)
76
+ value.should be_well_defined_as_phone(VOICE_KEY, PHONE_NUMBER, COUNTRY)
77
+ end
78
+
79
+ it "should unmarshal successfully a raw data with two phones" do
80
+ values = Connfu::Provisioning::Phone.unmarshal(VOICE_KEY, [raw, raw])
81
+ values.each{|value|
82
+ value.should be_well_defined_as_phone(VOICE_KEY, PHONE_NUMBER, COUNTRY)
83
+ }
84
+ end
85
+ end
86
+
87
+
88
+ end
@@ -0,0 +1,138 @@
1
+ #
2
+ # connFu is a platform of Telefonica delivered by Bluevia Labs
3
+ # Please, check out www.connfu.com and if you need more information
4
+ # contact us at mailto:support@connfu.com
5
+ #
6
+
7
+ require 'spec_helper'
8
+ require 'provisioning/channel_shared_examples'
9
+
10
+ describe Connfu::Provisioning::Voice do
11
+
12
+ voice_attrs = channel_attrs.merge({:uid => VOICE_KEY,
13
+ :topic => TOPIC,
14
+ :welcome_message => WELCOME_MESSAGE,
15
+ :rejected_message => REJECTED_MESSAGE})
16
+
17
+
18
+ context "Voice" do
19
+
20
+ let(:phone) do
21
+ Connfu::Provisioning::Phone.new(VOICE_KEY, PHONE_NUMBER, COUNTRY)
22
+ end
23
+
24
+ RSpec::Matchers.define :have_defined_voice_attributes do |expected|
25
+ match do |voice|
26
+ [:uid, :topic, :welcome_message, :rejected_message].each { |attribute|
27
+ voice.send(attribute).should eql(expected[attribute])
28
+ }
29
+ voice.type.should eql("voice")
30
+ end
31
+ end
32
+
33
+ it_should_behave_like "Channel", Connfu::Provisioning::Voice.new(voice_attrs)
34
+
35
+ describe "while creating a Voice instance" do
36
+ it "should initialize properly the meaning attributes" do
37
+ voice = Connfu::Provisioning::Voice.new(voice_attrs)
38
+
39
+ voice.should be_instance_of(Connfu::Provisioning::Voice)
40
+ voice.should have_defined_voice_attributes voice_attrs
41
+ end
42
+
43
+ it "should have an empty phones list" do
44
+ voice = Connfu::Provisioning::Voice.new(voice_attrs)
45
+
46
+ voice.phones.should be_instance_of(Array)
47
+ voice.phones.length.should eql(0)
48
+ end
49
+
50
+ end
51
+
52
+ describe "handling phones" do
53
+
54
+ it "should be empty after initializing" do
55
+ voice = Connfu::Provisioning::Voice.new(voice_attrs)
56
+ voice.phones.should be_instance_of(Array)
57
+ voice.phones.length.should eql(0)
58
+
59
+ end
60
+
61
+ it "should add a phone to the array phone list" do
62
+ voice = Connfu::Provisioning::Voice.new(voice_attrs)
63
+
64
+ voice.phones.push(phone)
65
+ voice.phones.length.should eql(1)
66
+ voice.phones[0].should be_instance_of(Connfu::Provisioning::Phone)
67
+ end
68
+
69
+ it "should add a phone to the array phone list using the << method" do
70
+ voice = Connfu::Provisioning::Voice.new(voice_attrs)
71
+
72
+ voice << phone
73
+ voice.phones.length.should eql(1)
74
+ voice.phones[0].should be_instance_of(Connfu::Provisioning::Phone)
75
+ end
76
+ end
77
+
78
+ describe "to_hash method" do
79
+
80
+ # Matcher that helps to test if a Voice channel is well defined after retrieving data using prov API
81
+ RSpec::Matchers.define :have_voice_details do |uid, phones|
82
+ match do |actual| # actual should be the Connfu::Provisioning::Voice instance
83
+ actual.should be_instance_of(Hash)
84
+
85
+ ["uid", "type", "phones"].each{|key|
86
+ actual.should have_key(key)
87
+ }
88
+
89
+ actual["uid"].should eql(uid)
90
+ actual["type"].should eql("voice")
91
+
92
+ actual["phones"].should be_instance_of(Array)
93
+ actual["phones"].length.should eql(phones.length)
94
+
95
+ actual["phones"].each_with_index{|phone, index|
96
+ phone.should be_instance_of(Hash)
97
+ ["phone_number", "country"].each{|key|
98
+ phone.should have_key(key)
99
+ }
100
+ phone["phone_number"].should eql(phones[index][:phone_number])
101
+ phone["country"].should eql(phones[index][:country])
102
+ }
103
+ end
104
+ end
105
+
106
+ it "should retrieved uid, type and phones attributes (empty phones)" do
107
+ voice = Connfu::Provisioning::Voice.new(voice_attrs)
108
+ voice.to_hash.should have_voice_details(VOICE_KEY, [])
109
+ end
110
+
111
+ it "should retrieved uid, type and phones attributes (phones with elements)" do
112
+ voice = Connfu::Provisioning::Voice.new(voice_attrs)
113
+ voice << phone
114
+ voice.to_hash.should have_voice_details(VOICE_KEY, [phone])
115
+ end
116
+
117
+ it "should retrieved uid, type and phones attributes (phones two elements)" do
118
+ voice = Connfu::Provisioning::Voice.new(voice_attrs)
119
+ voice << phone
120
+ voice << phone
121
+ voice.to_hash.should have_voice_details(VOICE_KEY, [phone, phone])
122
+ end
123
+
124
+ it "should retrieved uid, type and phones attributes (phones hundred elements)" do
125
+ voice = Connfu::Provisioning::Voice.new(voice_attrs)
126
+ data = []
127
+ 100.times do
128
+ voice << phone
129
+ data << phone
130
+ end
131
+ voice.to_hash.should have_voice_details(VOICE_KEY, data)
132
+ end
133
+
134
+ end
135
+ end
136
+
137
+
138
+ end
@@ -0,0 +1,500 @@
1
+ #
2
+ # connFu is a platform of Telefonica delivered by Bluevia Labs
3
+ # Please, check out www.connfu.com and if you need more information
4
+ # contact us at mailto:support@connfu.com
5
+ #
6
+
7
+ require 'spec_helper'
8
+
9
+ require 'webmock/rspec'
10
+
11
+ describe Connfu::Provisioning do
12
+
13
+ before(:each) do
14
+ @application = Connfu::Provisioning::Application.new(API_KEY, ENDPOINT)
15
+ end
16
+
17
+ # Matcher that helps to test if a Voice channel is well defined after retrieving data using prov API
18
+ RSpec::Matchers.define :be_well_defined_as_voice do |uid, phones|
19
+ match do |actual| # actual should be the Connfu::Provisioning::Voice instance
20
+ actual.should be_instance_of(Connfu::Provisioning::Voice)
21
+ ["uid", "type", "phones"].each { |key|
22
+ actual.to_hash.should have_key(key)
23
+ }
24
+ actual.uid.should eql(uid)
25
+ actual.type.should eql("voice")
26
+
27
+ actual.should respond_to("topic")
28
+ actual.should respond_to("welcome_message")
29
+ actual.should respond_to("rejected_message")
30
+ actual.should respond_to("privacy")
31
+
32
+ actual.phones.should be_instance_of(Array)
33
+ actual.phones.length.should eql(phones.length)
34
+
35
+ actual.phones.each_with_index { |phone, index|
36
+ ["phone_number", "country"].each { |key|
37
+ phone.should respond_to(key.to_sym)
38
+ }
39
+ phone.phone_number.should eql(phones[index][:phone_number])
40
+ phone.country.should eql(phones[index][:country])
41
+ }
42
+ end
43
+ end
44
+
45
+ # Matcher that helps to test if a Twitter channel is well defined after retrieving data using prov API
46
+ RSpec::Matchers.define :be_well_defined_as_twitter do |uid, twitter_accounts|
47
+ match do |actual| # actual should be the Connfu::Provisioning::Twitter instance
48
+ actual.should be_instance_of(Connfu::Provisioning::Twitter)
49
+ ["uid", "type", "accounts"].each { |key|
50
+ actual.to_hash.should have_key(key)
51
+ }
52
+
53
+ actual.uid.should eql(uid)
54
+ actual.type.should eql("twitter")
55
+
56
+ actual.accounts.should be_instance_of(Array)
57
+ actual.accounts.length.should eql(twitter_accounts.length)
58
+
59
+ actual.accounts.each_with_index { |account, index|
60
+ account.should have_key("name")
61
+ account["name"].should eql(twitter_accounts[index])
62
+ }
63
+ end
64
+ end
65
+
66
+ context "channels" do
67
+
68
+ context "all channels" do
69
+ it "should retrieve all the channels that owns an application" do
70
+ stub_request(:get, "#{ENDPOINT}/channels/?").
71
+ with(:headers => {'Accept'=>'application/json', 'AUTH_TOKEN' => "#{API_KEY}"}).
72
+ to_return(:status => 200, :body => '[{"accounts":[{"name":"juandebravo"},{"name":"connfudev"}],"created_at":"2011-07-26T22:13:06+03:00","filter":"","uid":"twitter","updated_at":"2011-08-07T13:07:57+03:00","user_id":"user_id","type":"twitter"},{"country":"uk","created_at":"2011-08-07T14:39:14+03:00","phone":"441111112222","topic":"conference","uid":"juan-voice","updated_at":"2011-08-07T14:41:25+03:00","user_id":"user_id","type":"voice"}]', :headers => {})
73
+
74
+ channels = @application.get_channels
75
+ channels.should be_instance_of(Array)
76
+ channels.length.should eql(2)
77
+ voice_channels = channels.select { |channel| channel.instance_of?(Connfu::Provisioning::Voice) }
78
+ twitter_channels = channels.select { |channel| channel.instance_of?(Connfu::Provisioning::Twitter) }
79
+ voice_channels.length.should eql(1)
80
+ twitter_channels.length.should eql(1)
81
+ end
82
+ end
83
+
84
+ context "twitter" do
85
+ it "should create a Twitter channel application with one origin speficied as array" do
86
+ stub_request(:post, "#{ENDPOINT}/channels/twitter").
87
+ with(:body => create_twitter_channel_request(["juan"]), :headers => {'Accept'=>'application/json', 'Content-Type' => 'application/json', 'AUTH_TOKEN' => "#{API_KEY}"}).
88
+ to_return(:status => 201, :body => "", :headers => {:location => "#{ENDPOINT}/channels/twitter/#{TWITTER_KEY}"})
89
+
90
+ response = @application.create_twitter_channel(TWITTER_KEY, ["juan"])
91
+ response.should eql("#{ENDPOINT}/channels/twitter/#{TWITTER_KEY}")
92
+ end
93
+
94
+ it "should create a Twitter channel application with one origins speficied as hash (string)" do
95
+ stub_request(:post, "#{ENDPOINT}/channels/twitter").
96
+ with(:body => create_twitter_channel_request(["juan"]), :headers => {'Accept'=>'application/json', 'Content-Type' => 'application/json', 'AUTH_TOKEN' => "#{API_KEY}"}).
97
+ to_return(:status => 201, :body => "", :headers => {:location => "#{ENDPOINT}/channels/twitter/#{TWITTER_KEY}"})
98
+
99
+ response = @application.create_twitter_channel(TWITTER_KEY, {:origin => "juan"})
100
+ response.should eql("#{ENDPOINT}/channels/twitter/#{TWITTER_KEY}")
101
+ end
102
+
103
+ it "should create a Twitter channel application with one origins speficied as hash (array)" do
104
+ stub_request(:post, "#{ENDPOINT}/channels/twitter").
105
+ with(:body => create_twitter_channel_request(["juan"]), :headers => {'Accept'=>'application/json', 'Content-Type' => 'application/json', 'AUTH_TOKEN' => "#{API_KEY}"}).
106
+ to_return(:status => 201, :body => "", :headers => {:location => "#{ENDPOINT}/channels/twitter/#{TWITTER_KEY}"})
107
+
108
+ response = @application.create_twitter_channel(TWITTER_KEY, {:origin => ["juan"]})
109
+ response.should eql("#{ENDPOINT}/channels/twitter/#{TWITTER_KEY}")
110
+ end
111
+
112
+ it "should create a Twitter channel application with two origins speficied as Hash" do
113
+ stub_request(:post, "#{ENDPOINT}/channels/twitter").
114
+ with(:body => create_twitter_channel_request(["juan", "connfu"]), :headers => {'Accept'=>'application/json', 'Content-Type' => 'application/json', 'AUTH_TOKEN' => "#{API_KEY}"}).
115
+ to_return(:status => 201, :body => "", :headers => {:location => "#{ENDPOINT}/channels/twitter/#{TWITTER_KEY}"})
116
+
117
+ response = @application.create_twitter_channel(TWITTER_KEY, {:origin => ["juan", "connfu"]})
118
+ response.should eql("#{ENDPOINT}/channels/twitter/#{TWITTER_KEY}")
119
+ end
120
+
121
+ it "should create a Twitter channel application with two origins speficied as Array" do
122
+ stub_request(:post, "#{ENDPOINT}/channels/twitter").
123
+ with(:body => create_twitter_channel_request(["juan", "connfu"]), :headers => {'Accept'=>'application/json', 'Content-Type' => 'application/json', 'AUTH_TOKEN' => "#{API_KEY}"}).
124
+ to_return(:status => 201, :body => "", :headers => {:location => "#{ENDPOINT}/channels/twitter/#{TWITTER_KEY}"})
125
+
126
+ response = @application.create_twitter_channel(TWITTER_KEY, ["juan", "connfu"])
127
+ response.should eql("#{ENDPOINT}/channels/twitter/#{TWITTER_KEY}")
128
+ end
129
+
130
+ it "should create a Twitter channel application with one mention" do
131
+ stub_request(:post, "#{ENDPOINT}/channels/twitter").
132
+ with(:body => create_twitter_channel_request(["juan"], TWITTER_KEY, "(recipients:juan)"), :headers => {'Accept'=>'application/json', 'Content-Type' => 'application/json', 'AUTH_TOKEN' => "#{API_KEY}"}).
133
+ to_return(:status => 201, :body => "", :headers => {:location => "#{ENDPOINT}/channels/twitter/#{TWITTER_KEY}"})
134
+
135
+ response = @application.create_twitter_channel(TWITTER_KEY, {:mentions => ["juan"]})
136
+ response.should be_kind_of(Array)
137
+ response[0].should eql("#{ENDPOINT}/channels/twitter/#{TWITTER_KEY}")
138
+ end
139
+
140
+ it "should retrieve a channel information when the channel exists" do
141
+ stub_request(:get, "#{ENDPOINT}/channels/twitter/#{TWITTER_KEY}?").
142
+ with(:headers => {'Accept'=>'application/json', 'AUTH_TOKEN' => "#{API_KEY}"}).
143
+ to_return(:status => 200, :body => "{'accounts':[{'name':'juandebravo'}],'created_at':'2011-09-06T05:33:39+00:00','filter':'','uid':'#{TWITTER_KEY}','updated_at':'2011-09-06T05:33:39+00:00'}", :headers => {})
144
+
145
+ twitter = @application.get_twitter_channel(TWITTER_KEY)
146
+
147
+ twitter.should be_well_defined_as_twitter(TWITTER_KEY, ['juandebravo'])
148
+ end
149
+
150
+ it "should retrieve a list of one channel information when app has only one twitter channel" do
151
+ stub_request(:get, "#{ENDPOINT}/channels/twitter/?").
152
+ with(:headers => {'Accept'=>'application/json', 'AUTH_TOKEN' => "#{API_KEY}"}).
153
+ to_return(:status => 200, :body => "[{'accounts':[{'name':'juandebravo'}],'created_at':'2011-09-06T05:33:39+00:00','filter':'','uid':'#{TWITTER_KEY}','updated_at':'2011-09-06T05:33:39+00:00'}]", :headers => {})
154
+
155
+ twitters = @application.get_twitter_channel
156
+
157
+ twitters.should be_instance_of(Array)
158
+ twitters.length.should eql(1)
159
+ twitters[0].should be_well_defined_as_twitter(TWITTER_KEY, ['juandebravo'])
160
+
161
+ end
162
+
163
+ it "should retrieve a list of twitter channels information" do
164
+ stub_request(:get, "#{ENDPOINT}/channels/twitter/?").
165
+ with(:headers => {'Accept'=>'application/json', 'AUTH_TOKEN' => "#{API_KEY}"}).
166
+ to_return(:status => 200, :body => "[{'accounts':[{'name':'juandebravo'}],'created_at':'2011-09-06T05:33:39+00:00','filter':'','uid':'#{TWITTER_KEY}-0','updated_at':'2011-09-06T05:33:39+00:00'},{'accounts':[{'name':'juandebravo'}],'created_at':'2011-09-06T05:33:39+00:00','filter':'','uid':'#{TWITTER_KEY}-1','updated_at':'2011-09-06T05:33:39+00:00'}]", :headers => {})
167
+
168
+ twitters = @application.get_twitter_channel
169
+
170
+ twitters.should be_instance_of(Array)
171
+ twitters.length.should eql(2)
172
+ twitters.each_with_index { |twitter, index|
173
+ twitter.should be_well_defined_as_twitter("#{TWITTER_KEY}-#{index}", ['juandebravo'])
174
+ }
175
+ end
176
+
177
+ end
178
+
179
+ context "voice" do
180
+
181
+ it "should create a Voice channel application with the default privacy attribute" do
182
+ stub_request(:post, "#{ENDPOINT}/channels/voice").
183
+ with(:body => "{\"uid\":\"#{VOICE_KEY}\",\"country\":\"de\",\"privacy\":\"whitelisted\"}", :headers => {'Accept'=>'application/json', 'Content-Type' => 'application/json', 'AUTH_TOKEN' => "#{API_KEY}"}).
184
+ to_return(:status => 201, :body => "", :headers => {:location => "#{ENDPOINT}/channels/voice/#{VOICE_KEY}"})
185
+
186
+ response = @application.create_voice_channel(VOICE_KEY, "de")
187
+ response.should eql("#{ENDPOINT}/channels/voice/#{VOICE_KEY}")
188
+ end
189
+
190
+ it "should create a Voice channel application with a privacy attribute (public)" do
191
+ stub_request(:post, "#{ENDPOINT}/channels/voice").
192
+ with(:body => "{\"uid\":\"#{VOICE_KEY}\",\"country\":\"de\",\"privacy\":\"public\"}", :headers => {'Accept'=>'application/json', 'Content-Type' => 'application/json', 'AUTH_TOKEN' => "#{API_KEY}"}).
193
+ to_return(:status => 201, :body => "", :headers => {:location => "#{ENDPOINT}/channels/voice/#{VOICE_KEY}"})
194
+
195
+ response = @application.create_voice_channel(VOICE_KEY, "de", Connfu::Provisioning::Voice::Privacy::PUBLIC)
196
+ response.should eql("#{ENDPOINT}/channels/voice/#{VOICE_KEY}")
197
+ end
198
+
199
+ it "should create a Voice channel application with a privacy attribute (whitelisted)" do
200
+ stub_request(:post, "#{ENDPOINT}/channels/voice").
201
+ with(:body => "{\"uid\":\"#{VOICE_KEY}\",\"country\":\"de\",\"privacy\":\"whitelisted\"}", :headers => {'Accept'=>'application/json', 'Content-Type' => 'application/json', 'AUTH_TOKEN' => "#{API_KEY}"}).
202
+ to_return(:status => 201, :body => "", :headers => {:location => "#{ENDPOINT}/channels/voice/#{VOICE_KEY}"})
203
+
204
+ response = @application.create_voice_channel(VOICE_KEY, "de", Connfu::Provisioning::Voice::Privacy::WHITELIST)
205
+ response.should eql("#{ENDPOINT}/channels/voice/#{VOICE_KEY}")
206
+ end
207
+
208
+ it "should retrieve a channel information when the channel exists" do
209
+ stub_request(:get, "#{ENDPOINT}/channels/voice/#{VOICE_KEY}?").
210
+ with(:headers => {'Accept'=>'application/json', 'AUTH_TOKEN' => "#{API_KEY}"}).
211
+ to_return(:status => 200, :body => "{'created_at':'2011-08-25T14:16:44+03:00','rejected_message':'You are not allowed to join this conference','privacy':'whitelisted','topic':'hello_man','uid':'#{VOICE_KEY}','updated_at':'2011-08-25T15:10:12+03:00','welcome_message':'Welcome to connFu, you are going to join the conference','phones':[{'country':'#{COUNTRY}','phone_number':'#{PHONE_NUMBER}'}]}", :headers => {})
212
+
213
+ voice = @application.get_voice_channel(VOICE_KEY)
214
+
215
+ voice.should be_well_defined_as_voice(VOICE_KEY, [{:phone_number => PHONE_NUMBER, :country => COUNTRY}])
216
+ end
217
+
218
+ it "should retrieve a list of channels information" do
219
+ stub_request(:get, "#{ENDPOINT}/channels/voice/?").
220
+ with(:headers => {'Accept'=>'application/json', 'AUTH_TOKEN' => "#{API_KEY}"}).
221
+ to_return(:status => 200, :body => "[{'created_at':'2011-08-25T14:16:44+03:00','rejected_message':'You are not allowed to join this conference','topic':'hello_man','uid':'#{VOICE_KEY}-0','updated_at':'2011-08-25T15:10:12+03:00','welcome_message':'Welcome to connFu, you are going to join the conference','phones':[{'country':'#{COUNTRY}','phone_number':'#{PHONE_NUMBER}'}]}, {'created_at':'2011-08-25T14:16:44+03:00','rejected_message':'You are not allowed to join this conference','topic':'hello_man','uid':'#{VOICE_KEY}-1','updated_at':'2011-08-25T15:10:12+03:00','welcome_message':'Welcome to connFu, you are going to join the conference','phones':[{'country':'#{COUNTRY}','phone_number':'#{PHONE_NUMBER}'}]}]", :headers => {})
222
+
223
+ voices = @application.get_voice_channel
224
+
225
+ voices.should be_instance_of(Array)
226
+ voices.length.should eql(2)
227
+ voices.each_with_index { |voice, index|
228
+ voice.should be_well_defined_as_voice("#{VOICE_KEY}-#{index}", [{:phone_number => PHONE_NUMBER, :country => COUNTRY}])
229
+ }
230
+ end
231
+
232
+ it "should retrieve a list of one channel information when app has only one voice channel" do
233
+ stub_request(:get, "#{ENDPOINT}/channels/voice/?").
234
+ with(:headers => {'Accept'=>'application/json', 'AUTH_TOKEN' => "#{API_KEY}"}).
235
+ to_return(:status => 200, :body => "[{'created_at':'2011-08-25T14:16:44+03:00','rejected_message':'You are not allowed to join this conference','topic':'hello_man','uid':'#{VOICE_KEY}','updated_at':'2011-08-25T15:10:12+03:00','welcome_message':'Welcome to connFu, you are going to join the conference','phones':[{'country':'#{COUNTRY}','phone_number':'#{PHONE_NUMBER}'}]}]", :headers => {})
236
+
237
+ voice = @application.get_voice_channel
238
+ voice.should be_instance_of(Array)
239
+ voice.length.should eql(1)
240
+ voice = voice.pop
241
+ voice.should be_well_defined_as_voice(VOICE_KEY, [{:phone_number => PHONE_NUMBER, :country => COUNTRY}])
242
+ end
243
+
244
+ it "should delete a channel when the channel exists" do
245
+ stub_request(:delete, "#{ENDPOINT}/channels/voice/#{VOICE_KEY}?").
246
+ with(:headers => {'Accept'=>'application/json', 'AUTH_TOKEN' => "#{API_KEY}"}).
247
+ to_return(:status => 200, :body => "", :headers => {})
248
+
249
+ response = @application.delete_voice_channel(VOICE_KEY)
250
+ response.should eql("")
251
+
252
+ end
253
+
254
+ it "should update a topic in a Voice channel application" do
255
+ stub_request(:put, "#{ENDPOINT}/channels/voice/#{VOICE_KEY}").
256
+ with(:body => '{"topic":"new-topic"}', :headers => {'Accept'=>'application/json', 'Content-Type' => 'application/json', 'AUTH_TOKEN' => "#{API_KEY}"}).
257
+ to_return(:status => 200)
258
+
259
+ response = @application.update_voice_channel(VOICE_KEY, "new-topic")
260
+ response.should eql("")
261
+ end
262
+
263
+ it "should update a topic in a Voice channel application using a Hash parameter" do
264
+ stub_request(:put, "#{ENDPOINT}/channels/voice/#{VOICE_KEY}").
265
+ with(:body => '{"topic":"new-topic"}', :headers => {'Accept'=>'application/json', 'Content-Type' => 'application/json', 'AUTH_TOKEN' => "#{API_KEY}"}).
266
+ to_return(:status => 200)
267
+
268
+ response = @application.update_voice_channel(VOICE_KEY, {"topic" => "new-topic"})
269
+ response.should eql("")
270
+ end
271
+
272
+ it "should update a welcome_message in a Voice channel application" do
273
+ stub_request(:put, "#{ENDPOINT}/channels/voice/#{VOICE_KEY}").
274
+ with(:body => '{"welcome_message":"new-welcome_message"}', :headers => {'Accept'=>'application/json', 'Content-Type' => 'application/json', 'AUTH_TOKEN' => "#{API_KEY}"}).
275
+ to_return(:status => 200)
276
+
277
+ response = @application.update_voice_channel(VOICE_KEY, {:welcome_message => "new-welcome_message"})
278
+ response.should eql("")
279
+ end
280
+
281
+ it "should update a rejected_message in a Voice channel application" do
282
+ stub_request(:put, "#{ENDPOINT}/channels/voice/#{VOICE_KEY}").
283
+ with(:body => '{"rejected_message":"new-rejected_message"}', :headers => {'Accept'=>'application/json', 'Content-Type' => 'application/json', 'AUTH_TOKEN' => "#{API_KEY}"}).
284
+ to_return(:status => 200)
285
+
286
+ response = @application.update_voice_channel(VOICE_KEY, {"rejected_message" => "new-rejected_message"})
287
+ response.should eql("")
288
+ end
289
+
290
+ it "should update a topic, welcome_message and rejected_message in a Voice channel application" do
291
+ stub_request(:put, "#{ENDPOINT}/channels/voice/#{VOICE_KEY}").
292
+ with(:body => '{"topic":"new-topic","welcome_message":"new-welcome_message","rejected_message":"new-rejected_message"}', :headers => {'Accept'=>'application/json', 'Content-Type' => 'application/json', 'AUTH_TOKEN' => "#{API_KEY}"}).
293
+ to_return(:status => 200)
294
+
295
+ response = @application.update_voice_channel(VOICE_KEY, {"topic" => "new-topic", "welcome_message" => "new-welcome_message", "rejected_message" => "new-rejected_message"})
296
+ response.should eql("")
297
+ end
298
+
299
+
300
+ context "phone numbers" do
301
+
302
+ it "should process a phone number list with one number" do
303
+ stub_request(:get, "#{ENDPOINT}/channels/voice/#{VOICE_KEY}/phones/?").
304
+ with(:headers => {'Accept'=>'application/json', 'AUTH_TOKEN' => "#{API_KEY}"}).
305
+ to_return(:status => 200, :body => "[{'country':'#{COUNTRY}','phone_number':'#{PHONE_NUMBER}'}]", :headers => {})
306
+
307
+ voice_numbers = @application.get_phones(VOICE_KEY)
308
+ voice_numbers.should be_an_instance_of(Array)
309
+ voice_numbers.length.should eql(1)
310
+ voice_numbers.each { |voice_number|
311
+ voice_number.should be_instance_of(Connfu::Provisioning::Phone)
312
+ voice_number.country.should eql(COUNTRY)
313
+ voice_number.phone_number.should eql(PHONE_NUMBER)
314
+ }
315
+ end
316
+
317
+ it "should process a phone number list with two numbers" do
318
+ stub_request(:get, "#{ENDPOINT}/channels/voice/#{VOICE_KEY}/phones/?").
319
+ with(:headers => {'Accept'=>'application/json', 'AUTH_TOKEN' => "#{API_KEY}"}).
320
+ to_return(:status => 200, :body => "[{'country':'#{COUNTRY}','phone_number':'#{PHONE_NUMBER}'},{'country':'#{COUNTRY}','phone_number':'#{PHONE_NUMBER}'}]", :headers => {})
321
+
322
+ voice_numbers = @application.get_phones(VOICE_KEY)
323
+ voice_numbers.should be_an_instance_of(Array)
324
+ voice_numbers.length.should eql(2)
325
+ voice_numbers.each { |voice_number|
326
+ voice_number.should be_instance_of(Connfu::Provisioning::Phone)
327
+ voice_number.country.should eql(COUNTRY)
328
+ voice_number.phone_number.should eql(PHONE_NUMBER)
329
+ }
330
+ end
331
+
332
+ it "should process an empty phone number list" do
333
+ stub_request(:get, "#{ENDPOINT}/channels/voice/#{VOICE_KEY}/phones/?").
334
+ with(:headers => {'Accept'=>'application/json', 'AUTH_TOKEN' => "#{API_KEY}"}).
335
+ to_return(:status => 200, :body => "[]", :headers => {})
336
+
337
+ voice_numbers = @application.get_phones(VOICE_KEY)
338
+ voice_numbers.should be_an_instance_of(Array)
339
+ voice_numbers.length.should eql(0)
340
+ end
341
+
342
+ it "should delete a phone number" do
343
+ stub_request(:delete, "#{ENDPOINT}/channels/voice/#{VOICE_KEY}/phones/#{PHONE_NUMBER}?").
344
+ with(:headers => {'Accept'=>'application/json', 'AUTH_TOKEN' => "#{API_KEY}"}).
345
+ to_return(:status => 200, :body => "", :headers => {})
346
+
347
+ response = @application.delete_phone(VOICE_KEY, PHONE_NUMBER)
348
+ response.should eql("")
349
+
350
+ end
351
+
352
+
353
+ end
354
+
355
+ context "whitelist" do
356
+ it "should process a whitelist with one number" do
357
+ stub_request(:get, "#{ENDPOINT}/channels/voice/#{VOICE_KEY}/whitelisted/?").
358
+ with(:headers => {'Accept'=>'application/json', 'AUTH_TOKEN' => "#{API_KEY}"}).
359
+ to_return(:status => 200, :body => '[{"name":"juan","phone":"972542279538"}]', :headers => {})
360
+
361
+ whitelist = @application.get_whitelist(VOICE_KEY)
362
+ whitelist.should be_an_instance_of(Connfu::Provisioning::Whitelist)
363
+ whitelist.users.should be_an_instance_of(Array)
364
+ whitelist.users.length.should eql(1)
365
+ whitelist.users.each { |user|
366
+ user.should be_instance_of(Connfu::Provisioning::WhitelistUser)
367
+ }
368
+ whitelist.users[0].name.should eql("juan")
369
+ whitelist.users[0].phone.should eql("972542279538")
370
+ end
371
+
372
+ it "should process a whitelist with more than one number" do
373
+ stub_request(:get, "#{ENDPOINT}/channels/voice/#{VOICE_KEY}/whitelisted/?").
374
+ with(:headers => {'Accept'=>'application/json', 'AUTH_TOKEN' => "#{API_KEY}"}).
375
+ to_return(:status => 200, :body => '[{"name":"juan","phone":"972542279538"},{"name":"juandebravo","phone":"972542279531"}]', :headers => {})
376
+
377
+ whitelist = @application.get_whitelist(VOICE_KEY)
378
+ whitelist.should be_an_instance_of(Connfu::Provisioning::Whitelist)
379
+ whitelist.users.should be_an_instance_of(Array)
380
+ whitelist.users.length.should eql(2)
381
+ whitelist.each { |user|
382
+ user.should be_instance_of(Connfu::Provisioning::WhitelistUser)
383
+ }
384
+
385
+ end
386
+
387
+ it "should process a whitelist number" do
388
+ stub_request(:get, "#{ENDPOINT}/channels/voice/#{VOICE_KEY}/whitelisted/#{PHONE_NUMBER}?").
389
+ with(:headers => {'Accept'=>'application/json', 'AUTH_TOKEN' => "#{API_KEY}"}).
390
+ to_return(:status => 200, :body => "{'name':'juan','phone':'#{PHONE_NUMBER}'}", :headers => {})
391
+
392
+ whitelist_number = @application.get_whitelist(VOICE_KEY, PHONE_NUMBER)
393
+ whitelist_number.should be_an_instance_of(Connfu::Provisioning::WhitelistUser)
394
+ whitelist_number.name.should eql("juan")
395
+ whitelist_number.phone.should eql(PHONE_NUMBER)
396
+ end
397
+
398
+ it "should delete a whitelist list" do
399
+ stub_request(:delete, "#{ENDPOINT}/channels/voice/#{VOICE_KEY}/whitelisted/?").
400
+ with(:headers => {'Accept'=>'application/json', 'AUTH_TOKEN' => "#{API_KEY}"}).
401
+ to_return(:status => 200, :body => "", :headers => {})
402
+
403
+ response = @application.delete_whitelist(VOICE_KEY)
404
+ response.should eql("")
405
+
406
+ end
407
+
408
+ it "should delete a whitelist number" do
409
+ stub_request(:delete, "#{ENDPOINT}/channels/voice/#{VOICE_KEY}/whitelisted/#{PHONE_NUMBER}?").
410
+ with(:headers => {'Accept'=>'application/json', 'AUTH_TOKEN' => "#{API_KEY}"}).
411
+ to_return(:status => 200, :body => "", :headers => {})
412
+
413
+ response = @application.delete_whitelist(VOICE_KEY, PHONE_NUMBER)
414
+ response.should eql("")
415
+
416
+ end
417
+
418
+ it "should create a whitelist number with 2 parameters (name, phone)" do
419
+
420
+ stub_request(:post, "#{ENDPOINT}/channels/voice/#{VOICE_KEY}/whitelisted").
421
+ with(:body => "{\"name\":\"juan\",\"phone\":\"#{PHONE_NUMBER}\"}", :headers => {'Accept'=>'application/json', 'AUTH_TOKEN' => "#{API_KEY}"}).
422
+ to_return(:status => 200, :body => "", :headers => {})
423
+
424
+ response = @application.add_whitelist(VOICE_KEY, 'juan', PHONE_NUMBER)
425
+ response.should eql("")
426
+
427
+ end
428
+
429
+ it "should create a whitelist number with 1 parameter (WhitelistUser)" do
430
+
431
+ stub_request(:post, "#{ENDPOINT}/channels/voice/#{VOICE_KEY}/whitelisted").
432
+ with(:body => "{\"name\":\"juan\",\"phone\":\"#{PHONE_NUMBER}\"}", :headers => {'Accept'=>'application/json', 'AUTH_TOKEN' => "#{API_KEY}"}).
433
+ to_return(:status => 200, :body => "", :headers => {})
434
+
435
+ response = @application.add_whitelist(VOICE_KEY, Connfu::Provisioning::WhitelistUser.new('juan', PHONE_NUMBER))
436
+ response.should eql("")
437
+
438
+ end
439
+
440
+ it "should update a whitelist number with 1 parameter (WhitelistUser)" do
441
+
442
+ stub_request(:put, "#{ENDPOINT}/channels/voice/#{VOICE_KEY}/whitelisted/#{PHONE_NUMBER}").
443
+ with(:body => "{\"name\":\"juanito\"}", :headers => {'Accept'=>'application/json', 'AUTH_TOKEN' => "#{API_KEY}"}).
444
+ to_return(:status => 200, :body => "", :headers => {})
445
+
446
+ response = @application.update_whitelist(VOICE_KEY, Connfu::Provisioning::WhitelistUser.new('juanito', PHONE_NUMBER))
447
+ response.should eql("")
448
+
449
+ end
450
+ end
451
+ end
452
+
453
+ context "rss" do
454
+ it "should create a RSS channel application" do
455
+ stub_request(:post, "#{ENDPOINT}/channels/rss").
456
+ with(:body => "{\"uid\":\"#{RSS_KEY}\",\"uri\":\"http://connfu.com/rss\"}", :headers => {'Accept'=>'application/json', 'Content-Type' => 'application/json', 'AUTH_TOKEN' => "#{API_KEY}"}).
457
+ to_return(:status => 201, :body => "", :headers => {:location => "#{ENDPOINT}/channels/voice/#{RSS_KEY}"})
458
+
459
+ response = @application.create_rss_channel(RSS_KEY, "http://connfu.com/rss")
460
+ response.should eql("#{ENDPOINT}/channels/voice/#{RSS_KEY}")
461
+ end
462
+
463
+ it "should retrieve a RSS channel information when the channel exists" do
464
+ stub_request(:get, "#{ENDPOINT}/channels/rss/#{RSS_KEY}?").
465
+ with(:headers => {'Accept'=>'application/json', 'AUTH_TOKEN' => "#{API_KEY}"}).
466
+ to_return(:status => 200, :body => "{'created_at':'2011-07-17T20:57:01+03:00','uri':'http://connfu.com/rss','uid':#{RSS_KEY},'updated_at':'2011-07-17T20:57:01+03:00'}", :headers => {})
467
+
468
+ rss = @application.get_rss_channel(RSS_KEY)
469
+ rss.uid.should eql(RSS_KEY)
470
+ rss.uri.should eql("http://connfu.com/rss")
471
+ end
472
+
473
+ it "should retrieve all the RSS channels information when no name provided as argument" do
474
+ stub_request(:get, "#{ENDPOINT}/channels/rss/?").
475
+ with(:headers => {'Accept'=>'application/json', 'AUTH_TOKEN' => "#{API_KEY}"}).
476
+ to_return(:status => 200, :body => "[{'created_at':'2011-07-17T20:57:01+03:00','uri':'http://connfu.com/rss','uid':#{RSS_KEY}-0,'updated_at':'2011-07-17T20:57:01+03:00'}, {'created_at':'2011-07-17T20:57:01+03:00','uri':'http://connfu.com/rss','uid':#{RSS_KEY}-1,'updated_at':'2011-07-17T20:57:01+03:00'}]", :headers => {})
477
+
478
+ rss = @application.get_rss_channel
479
+
480
+ rss.should be_instance_of(Array)
481
+ rss.length.should eql(2)
482
+ rss.each_with_index { |channel, index|
483
+ channel.uid.should eql("#{RSS_KEY}-#{index}")
484
+ channel.uri.should eql("http://connfu.com/rss")
485
+ }
486
+
487
+ end
488
+
489
+ it "should delete a channel when the channel exists" do
490
+ stub_request(:delete, "#{ENDPOINT}/channels/rss/#{RSS_KEY}?").
491
+ with(:headers => {'Accept'=>'application/json', 'AUTH_TOKEN' => "#{API_KEY}"}).
492
+ to_return(:status => 200, :body => "", :headers => {})
493
+
494
+ response = @application.delete_rss_channel(RSS_KEY)
495
+ response.should eql("")
496
+ end
497
+ end
498
+ end
499
+
500
+ end