Skip to content

Commit

Permalink
Double encode JSON data to match Pusher.
Browse files Browse the repository at this point in the history
  • Loading branch information
tristandunn committed Mar 2, 2014
1 parent 283c84d commit 0e66227
Show file tree
Hide file tree
Showing 5 changed files with 45 additions and 16 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

## 1.0.0 — Unreleased

* Double encode JSON data to match Pusher. (Tristan Dunn, Adrien Jarthon)
* Treat socket_id as a string to match Pusher. (Tristan Dunn, Adrien Jarthon)
* Add verbose logging. (Tristan Dunn)
* Miscellaneous clean up. (Tristan Dunn)
Expand Down
2 changes: 1 addition & 1 deletion lib/pusher-fake/connection.rb
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ def id
# @param [Hash] data The event data.
# @param [String] channel The channel name.
def emit(event, data = {}, channel = nil)
message = { event: event, data: data }
message = { event: event, data: MultiJson.dump(data) }
message[:channel] = channel if channel

PusherFake.log("SEND #{id}: #{message}")
Expand Down
11 changes: 9 additions & 2 deletions lib/pusher-fake/server/application.rb
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,15 @@ def self.call(environment)
# @return [Hash] An empty hash.
def self.events(request)
event = MultiJson.load(request.body.read)
event["channels"].each do |channel|
Channel.factory(channel).emit(event["name"], event["data"], socket_id: event["socket_id"])
data = begin
MultiJson.load(event["data"])
rescue MultiJson::LoadError
event["data"]
end

event["channels"].each do |channel_name|
channel = Channel.factory(channel_name)
channel.emit(event["name"], data, socket_id: event["socket_id"])
end

{}
Expand Down
2 changes: 1 addition & 1 deletion spec/lib/pusher-fake/connection_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@
let(:event) { "name" }
let(:socket) { stub(:send) }
let(:channel) { "channel" }
let(:message) { { event: event, data: data } }
let(:message) { { event: event, data: MultiJson.dump(data) } }
let(:channel_json) { MultiJson.dump(message.merge(channel: channel)) }

subject { PusherFake::Connection.new(socket) }
Expand Down
45 changes: 33 additions & 12 deletions spec/lib/pusher-fake/server/application_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -168,29 +168,50 @@
end

describe PusherFake::Server::Application, ".events" do
let(:body) { stub(read: json) }
let(:data) { mock }
let(:json) { mock }
let(:name) { "event-name" }
let(:event) { { "channels" => channels, "name" => name, "data" => data, "socket_id" => socket_id } }
let(:request) { stub(body: body) }
let(:channels) { ["channel-1", "channel-2"] }
let(:channel_1) { stub(emit: true) }
let(:channel_2) { stub(emit: true) }
let(:socket_id) { stub }
let(:body) { stub(read: event_json) }
let(:data) { { "example" => "data" } }
let(:name) { "event-name" }
let(:event) { { "channels" => channels, "name" => name, "data" => data_json, "socket_id" => socket_id } }
let(:request) { stub(body: body) }
let(:channels) { ["channel-1", "channel-2"] }
let(:channel_1) { stub(emit: true) }
let(:channel_2) { stub(emit: true) }
let(:data_json) { data.to_json }
let(:socket_id) { stub }
let(:event_json) { mock }

subject { PusherFake::Server::Application }

before do
MultiJson.stubs(load: event)
MultiJson.stubs(:load).with(event_json).returns(event)
MultiJson.stubs(:load).with(data_json).returns(data)
PusherFake::Channel.stubs(:factory).with(channels[0]).returns(channel_1)
PusherFake::Channel.stubs(:factory).with(channels[1]).returns(channel_2)
end

it "parses the request body as JSON" do
subject.events(request)

expect(MultiJson).to have_received(:load).with(json)
expect(MultiJson).to have_received(:load).with(event_json)
end

it "parses the event data as JSON" do
subject.events(request)

expect(MultiJson).to have_received(:load).with(data_json)
end

it "handles invalid JSON for event data" do
event["data"] = data = "fake"

MultiJson.stubs(:load).with(data).raises(MultiJson::LoadError)

expect {
subject.events(request)
}.to_not raise_error

expect(channel_1).to have_received(:emit).with(name, data, socket_id: socket_id)
expect(channel_2).to have_received(:emit).with(name, data, socket_id: socket_id)
end

it "creates channels by name" do
Expand Down

0 comments on commit 0e66227

Please sign in to comment.