rails_chat 0.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.
- data/Gemfile +3 -0
- data/LICENSE +20 -0
- data/README.md +155 -0
- data/Rakefile +12 -0
- data/app/assets/images/emoticons.png +0 -0
- data/app/assets/javascripts/emoticons.js +127 -0
- data/app/assets/javascripts/emoticons_defination.js +365 -0
- data/app/assets/javascripts/rails_chat.js +72 -0
- data/app/assets/stylesheets/emoticons.css +115 -0
- data/lib/generators/rails_chat/install_generator.rb +27 -0
- data/lib/generators/rails_chat/templates/rails_chat.ru +10 -0
- data/lib/generators/rails_chat/templates/rails_chat.yml +10 -0
- data/lib/rails_chat/engine.rb +16 -0
- data/lib/rails_chat/faye_extension.rb +39 -0
- data/lib/rails_chat/view_helpers.rb +22 -0
- data/lib/rails_chat.rb +78 -0
- data/spec/fixtures/rails_chat.yml +9 -0
- data/spec/javascripts/rails_chat_spec.js +108 -0
- data/spec/javascripts/support/jasmine.yml +73 -0
- data/spec/javascripts/support/jasmine_config.rb +23 -0
- data/spec/javascripts/support/jasmine_runner.rb +32 -0
- data/spec/rails_chat/faye_extension_spec.rb +67 -0
- data/spec/rails_chat_spec.rb +141 -0
- data/spec/spec_helper.rb +8 -0
- metadata +154 -0
@@ -0,0 +1,67 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe RailsChat::FayeExtension do
|
4
|
+
before(:each) do
|
5
|
+
RailsChat.reset_config
|
6
|
+
@faye = RailsChat::FayeExtension.new
|
7
|
+
@message = {"channel" => "/meta/subscribe", "ext" => {}}
|
8
|
+
end
|
9
|
+
|
10
|
+
it "adds an error on an incoming subscription with a bad signature" do
|
11
|
+
@message["subscription"] = "hello"
|
12
|
+
@message["ext"]["rails_chat_signature"] = "bad"
|
13
|
+
@message["ext"]["rails_chat_timestamp"] = "123"
|
14
|
+
message = @faye.incoming(@message, lambda { |m| m })
|
15
|
+
message["error"].should eq("Incorrect signature.")
|
16
|
+
end
|
17
|
+
|
18
|
+
it "has no error when the signature matches the subscription" do
|
19
|
+
sub = RailsChat.subscription(:channel => "hello")
|
20
|
+
@message["subscription"] = sub[:channel]
|
21
|
+
@message["ext"]["rails_chat_signature"] = sub[:signature]
|
22
|
+
@message["ext"]["rails_chat_timestamp"] = sub[:timestamp]
|
23
|
+
message = @faye.incoming(@message, lambda { |m| m })
|
24
|
+
message["error"].should be_nil
|
25
|
+
end
|
26
|
+
|
27
|
+
it "has an error when signature just expired" do
|
28
|
+
RailsChat.config[:signature_expiration] = 1
|
29
|
+
sub = RailsChat.subscription(:timestamp => 123, :channel => "hello")
|
30
|
+
@message["subscription"] = sub[:channel]
|
31
|
+
@message["ext"]["rails_chat_signature"] = sub[:signature]
|
32
|
+
@message["ext"]["rails_chat_timestamp"] = sub[:timestamp]
|
33
|
+
message = @faye.incoming(@message, lambda { |m| m })
|
34
|
+
message["error"].should eq("Signature has expired.")
|
35
|
+
end
|
36
|
+
|
37
|
+
it "has an error when trying to publish to a custom channel with a bad token" do
|
38
|
+
RailsChat.config[:secret_token] = "good"
|
39
|
+
@message["channel"] = "/custom/channel"
|
40
|
+
@message["ext"]["rails_chat_token"] = "bad"
|
41
|
+
message = @faye.incoming(@message, lambda { |m| m })
|
42
|
+
message["error"].should eq("Incorrect token.")
|
43
|
+
end
|
44
|
+
|
45
|
+
it "raises an exception when attempting to call a custom channel without a secret_token set" do
|
46
|
+
@message["channel"] = "/custom/channel"
|
47
|
+
@message["ext"]["rails_chat_token"] = "bad"
|
48
|
+
lambda {
|
49
|
+
message = @faye.incoming(@message, lambda { |m| m })
|
50
|
+
}.should raise_error("No secret_token config set, ensure rails_chat.yml is loaded properly.")
|
51
|
+
end
|
52
|
+
|
53
|
+
it "has no error on other meta calls" do
|
54
|
+
@message["channel"] = "/meta/connect"
|
55
|
+
message = @faye.incoming(@message, lambda { |m| m })
|
56
|
+
message["error"].should be_nil
|
57
|
+
end
|
58
|
+
|
59
|
+
it "should not let message carry the RailsChat token after server's validation" do
|
60
|
+
RailsChat.config[:secret_token] = "good"
|
61
|
+
@message["channel"] = "/custom/channel"
|
62
|
+
@message["ext"]["rails_chat_token"] = RailsChat.config[:secret_token]
|
63
|
+
message = @faye.incoming(@message, lambda { |m| m })
|
64
|
+
message['ext']["rails_chat_token"].should be_nil
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
@@ -0,0 +1,141 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe RailsChat do
|
4
|
+
before(:each) do
|
5
|
+
RailsChat.reset_config
|
6
|
+
end
|
7
|
+
|
8
|
+
it "defaults server to nil" do
|
9
|
+
RailsChat.config[:server].should be_nil
|
10
|
+
end
|
11
|
+
|
12
|
+
it "defaults signature_expiration to nil" do
|
13
|
+
RailsChat.config[:signature_expiration].should be_nil
|
14
|
+
end
|
15
|
+
|
16
|
+
it "defaults subscription timestamp to current time in milliseconds" do
|
17
|
+
time = Time.now
|
18
|
+
Time.stub!(:now).and_return(time)
|
19
|
+
RailsChat.subscription[:timestamp].should eq((time.to_f * 1000).round)
|
20
|
+
end
|
21
|
+
|
22
|
+
it "loads a simple configuration file via load_config" do
|
23
|
+
RailsChat.load_config("spec/fixtures/rails_chat.yml", "production")
|
24
|
+
RailsChat.config[:server].should eq("http://example.com/faye")
|
25
|
+
RailsChat.config[:secret_token].should eq("PRODUCTION_SECRET_TOKEN")
|
26
|
+
RailsChat.config[:signature_expiration].should eq(600)
|
27
|
+
end
|
28
|
+
|
29
|
+
it "raises an exception if an invalid environment is passed to load_config" do
|
30
|
+
lambda {
|
31
|
+
RailsChat.load_config("spec/fixtures/rails_chat.yml", :test)
|
32
|
+
}.should raise_error ArgumentError
|
33
|
+
end
|
34
|
+
|
35
|
+
it "includes channel, server, and custom time in subscription" do
|
36
|
+
RailsChat.config[:server] = "server"
|
37
|
+
subscription = RailsChat.subscription(:timestamp => 123, :channel => "hello")
|
38
|
+
subscription[:timestamp].should eq(123)
|
39
|
+
subscription[:channel].should eq("hello")
|
40
|
+
subscription[:server].should eq("server")
|
41
|
+
end
|
42
|
+
|
43
|
+
it "does a sha1 digest of channel, timestamp, and secret token" do
|
44
|
+
RailsChat.config[:secret_token] = "token"
|
45
|
+
subscription = RailsChat.subscription(:timestamp => 123, :channel => "channel")
|
46
|
+
subscription[:signature].should eq(Digest::SHA1.hexdigest("tokenchannel123"))
|
47
|
+
end
|
48
|
+
|
49
|
+
it "formats a message hash given a channel and a string for eval" do
|
50
|
+
RailsChat.config[:secret_token] = "token"
|
51
|
+
RailsChat.message("chan", "foo").should eq(
|
52
|
+
:ext => {:rails_chat_token => "token"},
|
53
|
+
:channel => "chan",
|
54
|
+
:data => {
|
55
|
+
:channel => "chan",
|
56
|
+
:eval => "foo"
|
57
|
+
}
|
58
|
+
)
|
59
|
+
end
|
60
|
+
|
61
|
+
it "formats a message hash given a channel and a hash" do
|
62
|
+
RailsChat.config[:secret_token] = "token"
|
63
|
+
RailsChat.message("chan", :foo => "bar").should eq(
|
64
|
+
:ext => {:rails_chat_token => "token"},
|
65
|
+
:channel => "chan",
|
66
|
+
:data => {
|
67
|
+
:channel => "chan",
|
68
|
+
:data => {:foo => "bar"}
|
69
|
+
}
|
70
|
+
)
|
71
|
+
end
|
72
|
+
|
73
|
+
it "publish message as json to server using Net::HTTP" do
|
74
|
+
RailsChat.config[:server] = "http://localhost"
|
75
|
+
message = 'foo'
|
76
|
+
form = mock(:post).as_null_object
|
77
|
+
http = mock(:http).as_null_object
|
78
|
+
|
79
|
+
Net::HTTP::Post.should_receive(:new).with('/').and_return(form)
|
80
|
+
form.should_receive(:set_form_data).with(message: 'foo'.to_json)
|
81
|
+
|
82
|
+
Net::HTTP.should_receive(:new).with('localhost', 80).and_return(http)
|
83
|
+
http.should_receive(:start).and_yield(http)
|
84
|
+
http.should_receive(:request).with(form).and_return(:result)
|
85
|
+
|
86
|
+
RailsChat.publish_message(message).should eq(:result)
|
87
|
+
end
|
88
|
+
|
89
|
+
it "it should use HTTPS if the server URL says so" do
|
90
|
+
RailsChat.config[:server] = "https://localhost"
|
91
|
+
http = mock(:http).as_null_object
|
92
|
+
|
93
|
+
Net::HTTP.should_receive(:new).and_return(http)
|
94
|
+
http.should_receive(:use_ssl=).with(true)
|
95
|
+
|
96
|
+
RailsChat.publish_message('foo')
|
97
|
+
end
|
98
|
+
|
99
|
+
it "it should not use HTTPS if the server URL says not to" do
|
100
|
+
RailsChat.config[:server] = "http://localhost"
|
101
|
+
http = mock(:http).as_null_object
|
102
|
+
|
103
|
+
Net::HTTP.should_receive(:new).and_return(http)
|
104
|
+
http.should_receive(:use_ssl=).with(false)
|
105
|
+
|
106
|
+
RailsChat.publish_message('foo')
|
107
|
+
end
|
108
|
+
|
109
|
+
it "raises an exception if no server is specified when calling publish_message" do
|
110
|
+
lambda {
|
111
|
+
RailsChat.publish_message("foo")
|
112
|
+
}.should raise_error(RailsChat::Error)
|
113
|
+
end
|
114
|
+
|
115
|
+
it "publish_to passes message to publish_message call" do
|
116
|
+
RailsChat.should_receive(:message).with("chan", "foo").and_return("message")
|
117
|
+
RailsChat.should_receive(:publish_message).with("message").and_return(:result)
|
118
|
+
RailsChat.publish_to("chan", "foo").should eq(:result)
|
119
|
+
end
|
120
|
+
|
121
|
+
it "has a Faye rack app instance" do
|
122
|
+
RailsChat.faye_app.should be_kind_of(Faye::RackAdapter)
|
123
|
+
end
|
124
|
+
|
125
|
+
it "says signature has expired when time passed in is greater than expiration" do
|
126
|
+
RailsChat.config[:signature_expiration] = 30*60
|
127
|
+
time = RailsChat.subscription[:timestamp] - 31*60*1000
|
128
|
+
RailsChat.signature_expired?(time).should be_true
|
129
|
+
end
|
130
|
+
|
131
|
+
it "says signature has not expired when time passed in is less than expiration" do
|
132
|
+
RailsChat.config[:signature_expiration] = 30*60
|
133
|
+
time = RailsChat.subscription[:timestamp] - 29*60*1000
|
134
|
+
RailsChat.signature_expired?(time).should be_false
|
135
|
+
end
|
136
|
+
|
137
|
+
it "says signature has not expired when expiration is nil" do
|
138
|
+
RailsChat.config[:signature_expiration] = nil
|
139
|
+
RailsChat.signature_expired?(0).should be_false
|
140
|
+
end
|
141
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,154 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rails_chat
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- ! '[CISROR Team, Erfan Mansuri]'
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-10-03 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: faye
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: thin
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: rake
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: rspec
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ~>
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: 2.8.0
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ~>
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: 2.8.0
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: jasmine
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ! '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: 1.1.1
|
86
|
+
type: :development
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: 1.1.1
|
94
|
+
description: ! 'RailsChat is a Ruby gem for use with Rails to publish and subscribe
|
95
|
+
to messages through Faye. It allows you to easily provide real-time updates through
|
96
|
+
an open socket without tying up a Rails process. All channels are private so users
|
97
|
+
can only listen to events you subscribe them to. Refrence gem: https://github.com/ryanb/private_pub'
|
98
|
+
email:
|
99
|
+
executables: []
|
100
|
+
extensions: []
|
101
|
+
extra_rdoc_files: []
|
102
|
+
files:
|
103
|
+
- app/assets/stylesheets/emoticons.css
|
104
|
+
- app/assets/images/emoticons.png
|
105
|
+
- app/assets/javascripts/rails_chat.js
|
106
|
+
- app/assets/javascripts/emoticons.js
|
107
|
+
- app/assets/javascripts/emoticons_defination.js
|
108
|
+
- lib/rails_chat.rb
|
109
|
+
- lib/rails_chat/view_helpers.rb
|
110
|
+
- lib/rails_chat/faye_extension.rb
|
111
|
+
- lib/rails_chat/engine.rb
|
112
|
+
- lib/generators/rails_chat/templates/rails_chat.ru
|
113
|
+
- lib/generators/rails_chat/templates/rails_chat.yml
|
114
|
+
- lib/generators/rails_chat/install_generator.rb
|
115
|
+
- spec/rails_chat/faye_extension_spec.rb
|
116
|
+
- spec/fixtures/rails_chat.yml
|
117
|
+
- spec/javascripts/support/jasmine_runner.rb
|
118
|
+
- spec/javascripts/support/jasmine_config.rb
|
119
|
+
- spec/javascripts/support/jasmine.yml
|
120
|
+
- spec/javascripts/rails_chat_spec.js
|
121
|
+
- spec/spec_helper.rb
|
122
|
+
- spec/rails_chat_spec.rb
|
123
|
+
- Rakefile
|
124
|
+
- Gemfile
|
125
|
+
- LICENSE
|
126
|
+
- README.md
|
127
|
+
homepage:
|
128
|
+
licenses: []
|
129
|
+
post_install_message:
|
130
|
+
rdoc_options: []
|
131
|
+
require_paths:
|
132
|
+
- lib
|
133
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
134
|
+
none: false
|
135
|
+
requirements:
|
136
|
+
- - ! '>='
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
139
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
140
|
+
none: false
|
141
|
+
requirements:
|
142
|
+
- - ! '>='
|
143
|
+
- !ruby/object:Gem::Version
|
144
|
+
version: 1.3.4
|
145
|
+
requirements: []
|
146
|
+
rubyforge_project: rails_chat
|
147
|
+
rubygems_version: 1.8.24
|
148
|
+
signing_key:
|
149
|
+
specification_version: 3
|
150
|
+
summary: ! 'RailsChat is a Ruby gem for use with Rails to publish and subscribe to
|
151
|
+
messages through Faye. It allows you to easily provide real-time updates through
|
152
|
+
an open socket without tying up a Rails process. All channels are private so users
|
153
|
+
can only listen to events you subscribe them to. Refrence gem: https://github.com/ryanb/private_pub'
|
154
|
+
test_files: []
|