diff --git a/CHANGELOG.markdown b/CHANGELOG.markdown index e642c88..7889b71 100644 --- a/CHANGELOG.markdown +++ b/CHANGELOG.markdown @@ -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) diff --git a/lib/pusher-fake/connection.rb b/lib/pusher-fake/connection.rb index e557484..9269649 100644 --- a/lib/pusher-fake/connection.rb +++ b/lib/pusher-fake/connection.rb @@ -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}") diff --git a/lib/pusher-fake/server/application.rb b/lib/pusher-fake/server/application.rb index 335bbd6..9cd2913 100644 --- a/lib/pusher-fake/server/application.rb +++ b/lib/pusher-fake/server/application.rb @@ -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 {} diff --git a/spec/lib/pusher-fake/connection_spec.rb b/spec/lib/pusher-fake/connection_spec.rb index 9b70430..fc154cd 100644 --- a/spec/lib/pusher-fake/connection_spec.rb +++ b/spec/lib/pusher-fake/connection_spec.rb @@ -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) } diff --git a/spec/lib/pusher-fake/server/application_spec.rb b/spec/lib/pusher-fake/server/application_spec.rb index 07c47fd..1a571c0 100644 --- a/spec/lib/pusher-fake/server/application_spec.rb +++ b/spec/lib/pusher-fake/server/application_spec.rb @@ -168,21 +168,23 @@ 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 @@ -190,7 +192,26 @@ 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