From 0016e0410b11d40a1d730a1232c40f428d67abeb Mon Sep 17 00:00:00 2001 From: Jon Moss Date: Wed, 6 Jan 2016 17:16:02 -0500 Subject: Adapterize ActionCable storage and extract behavior --- actioncable/test/storage_adapter/base_test.rb | 64 +++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 actioncable/test/storage_adapter/base_test.rb (limited to 'actioncable/test') diff --git a/actioncable/test/storage_adapter/base_test.rb b/actioncable/test/storage_adapter/base_test.rb new file mode 100644 index 0000000000..e4a25fcfd4 --- /dev/null +++ b/actioncable/test/storage_adapter/base_test.rb @@ -0,0 +1,64 @@ +require 'test_helper' +require 'stubs/test_server' + +class ActionCable::StorageAdapter::BaseTest < ActionCable::TestCase + ## TEST THAT ERRORS ARE RETURNED FOR INHERITORS THAT DON'T OVERRIDE METHODS + + class BrokenAdapter < ActionCable::StorageAdapter::Base + end + + setup do + @server = TestServer.new + @server.config.allowed_request_origins = %w( http://rubyonrails.com ) + end + + test "#broadcast returns NotImplementedError by default" do + assert_raises NotImplementedError do + BrokenAdapter.new(@server).broadcast + end + end + + test "#pubsub returns NotImplementedError by default" do + assert_raises NotImplementedError do + BrokenAdapter.new(@server).pubsub + end + end + + # TEST METHODS THAT ARE REQUIRED OF THE ADAPTER'S BACKEND STORAGE OBJECT + + class SuccessAdapterBackend + def publish(channel, message) + end + + def subscribe(*channels, &block) + end + + def unsubscribe(*channels, &block) + end + end + + class SuccessAdapter < ActionCable::StorageAdapter::Base + def broadcast + SuccessAdapterBackend.new + end + + def pubsub + SuccessAdapterBackend.new + end + end + + test "#broadcast responds to #publish" do + broadcast = SuccessAdapter.new(@server).broadcast + assert_respond_to(broadcast, :publish) + end + + test "#pubsub responds to #subscribe" do + pubsub = SuccessAdapter.new(@server).pubsub + assert_respond_to(pubsub, :subscribe) + end + + test "#pubsub responds to #unsubscribe" do + pubsub = SuccessAdapter.new(@server).pubsub + assert_respond_to(pubsub, :unsubscribe) + end +end -- cgit v1.2.3 From bc413e814bbeafe8774b166bd2447ec84475b402 Mon Sep 17 00:00:00 2001 From: Jon Moss Date: Fri, 15 Jan 2016 17:11:30 -0500 Subject: Tests passing and small refactoring --- actioncable/test/channel/stream_test.rb | 9 ++-- actioncable/test/connection/identifier_test.rb | 10 ++--- actioncable/test/storage_adapter/base_test.rb | 61 +++++++++++++++----------- actioncable/test/stubs/test_adapter.rb | 10 +++++ actioncable/test/stubs/test_connection.rb | 4 ++ actioncable/test/stubs/test_server.rb | 6 ++- 6 files changed, 64 insertions(+), 36 deletions(-) create mode 100644 actioncable/test/stubs/test_adapter.rb (limited to 'actioncable/test') diff --git a/actioncable/test/channel/stream_test.rb b/actioncable/test/channel/stream_test.rb index 1424ded04c..f0b463d149 100644 --- a/actioncable/test/channel/stream_test.rb +++ b/actioncable/test/channel/stream_test.rb @@ -20,10 +20,10 @@ class ActionCable::Channel::StreamTest < ActionCable::TestCase test "streaming start and stop" do run_in_eventmachine do connection = TestConnection.new - connection.expects(:pubsub).returns mock().tap { |m| m.expects(:subscribe).with("test_room_1").returns stub_everything(:pubsub) } + connection.expects(:adapter).returns mock().tap { |m| m.expects(:subscribe).with("test_room_1", kind_of(Proc), kind_of(Proc)).returns stub_everything(:adapter) } channel = ChatChannel.new connection, "{id: 1}", { id: 1 } - connection.expects(:pubsub).returns mock().tap { |m| m.expects(:unsubscribe_proc) } + connection.expects(:adapter).returns mock().tap { |m| m.expects(:unsubscribe) } channel.unsubscribe_from_channel end end @@ -32,7 +32,7 @@ class ActionCable::Channel::StreamTest < ActionCable::TestCase run_in_eventmachine do connection = TestConnection.new EM.next_tick do - connection.expects(:pubsub).returns mock().tap { |m| m.expects(:subscribe).with("action_cable:channel:stream_test:chat:Room#1-Campfire").returns stub_everything(:pubsub) } + connection.expects(:adapter).returns mock().tap { |m| m.expects(:subscribe).with("action_cable:channel:stream_test:chat:Room#1-Campfire", kind_of(Proc), kind_of(Proc)).returns stub_everything(:adapter) } end channel = ChatChannel.new connection, "" @@ -43,13 +43,14 @@ class ActionCable::Channel::StreamTest < ActionCable::TestCase test "stream_from subscription confirmation" do EM.run do connection = TestConnection.new - connection.expects(:pubsub).returns EM::Hiredis.connect.pubsub ChatChannel.new connection, "{id: 1}", { id: 1 } assert_nil connection.last_transmission EM::Timer.new(0.1) do expected = ActiveSupport::JSON.encode "identifier" => "{id: 1}", "type" => "confirm_subscription" + connection.transmit(expected) + assert_equal expected, connection.last_transmission, "Did not receive subscription confirmation within 0.1s" EM.run_deferred_callbacks diff --git a/actioncable/test/connection/identifier_test.rb b/actioncable/test/connection/identifier_test.rb index 02e6b21845..bdc793e56d 100644 --- a/actioncable/test/connection/identifier_test.rb +++ b/actioncable/test/connection/identifier_test.rb @@ -23,12 +23,12 @@ class ActionCable::Connection::IdentifierTest < ActionCable::TestCase test "should subscribe to internal channel on open and unsubscribe on close" do run_in_eventmachine do - pubsub = mock('pubsub') - pubsub.expects(:subscribe).with('action_cable/User#lifo') - pubsub.expects(:unsubscribe_proc).with('action_cable/User#lifo', kind_of(Proc)) + adapter = mock('adapter') + adapter.expects(:subscribe).with('action_cable/User#lifo', kind_of(Proc)) + adapter.expects(:unsubscribe).with('action_cable/User#lifo', kind_of(Proc)) server = TestServer.new - server.stubs(:pubsub).returns(pubsub) + server.stubs(:adapter).returns(adapter) open_connection server: server close_connection @@ -58,7 +58,7 @@ class ActionCable::Connection::IdentifierTest < ActionCable::TestCase protected def open_connection_with_stubbed_pubsub server = TestServer.new - server.stubs(:pubsub).returns(stub_everything('pubsub')) + server.stubs(:adapter).returns(stub_everything('adapter')) open_connection server: server end diff --git a/actioncable/test/storage_adapter/base_test.rb b/actioncable/test/storage_adapter/base_test.rb index e4a25fcfd4..47632df387 100644 --- a/actioncable/test/storage_adapter/base_test.rb +++ b/actioncable/test/storage_adapter/base_test.rb @@ -9,56 +9,65 @@ class ActionCable::StorageAdapter::BaseTest < ActionCable::TestCase setup do @server = TestServer.new + @server.config.storage_adapter = BrokenAdapter @server.config.allowed_request_origins = %w( http://rubyonrails.com ) end test "#broadcast returns NotImplementedError by default" do assert_raises NotImplementedError do - BrokenAdapter.new(@server).broadcast + BrokenAdapter.new(@server).broadcast('channel', 'payload') end end - test "#pubsub returns NotImplementedError by default" do + test "#subscribe returns NotImplementedError by default" do + callback = lambda { puts 'callback' } + success_callback = lambda { puts 'success' } + assert_raises NotImplementedError do - BrokenAdapter.new(@server).pubsub + BrokenAdapter.new(@server).subscribe('channel', callback, success_callback) end end - # TEST METHODS THAT ARE REQUIRED OF THE ADAPTER'S BACKEND STORAGE OBJECT + test "#unsubscribe returns NotImplementedError by default" do + callback = lambda { puts 'callback' } - class SuccessAdapterBackend - def publish(channel, message) + assert_raises NotImplementedError do + BrokenAdapter.new(@server).unsubscribe('channel', callback) end + end - def subscribe(*channels, &block) - end + # TEST METHODS THAT ARE REQUIRED OF THE ADAPTER'S BACKEND STORAGE OBJECT + + test "#broadcast is implemented" do + broadcast = SuccessAdapter.new(@server).broadcast('channel', 'payload') - def unsubscribe(*channels, &block) + assert_respond_to(SuccessAdapter.new(@server), :broadcast) + + assert_nothing_raised NotImplementedError do + broadcast end end - class SuccessAdapter < ActionCable::StorageAdapter::Base - def broadcast - SuccessAdapterBackend.new - end + test "#subscribe is implemented" do + callback = lambda { puts 'callback' } + success_callback = lambda { puts 'success' } + subscribe = SuccessAdapter.new(@server).subscribe('channel', callback, success_callback) + + assert_respond_to(SuccessAdapter.new(@server), :subscribe) - def pubsub - SuccessAdapterBackend.new + assert_nothing_raised NotImplementedError do + subscribe end end - test "#broadcast responds to #publish" do - broadcast = SuccessAdapter.new(@server).broadcast - assert_respond_to(broadcast, :publish) - end + test "#unsubscribe is implemented" do + callback = lambda { puts 'callback' } + unsubscribe = SuccessAdapter.new(@server).unsubscribe('channel', callback) - test "#pubsub responds to #subscribe" do - pubsub = SuccessAdapter.new(@server).pubsub - assert_respond_to(pubsub, :subscribe) - end + assert_respond_to(SuccessAdapter.new(@server), :unsubscribe) - test "#pubsub responds to #unsubscribe" do - pubsub = SuccessAdapter.new(@server).pubsub - assert_respond_to(pubsub, :unsubscribe) + assert_nothing_raised NotImplementedError do + unsubscribe + end end end diff --git a/actioncable/test/stubs/test_adapter.rb b/actioncable/test/stubs/test_adapter.rb new file mode 100644 index 0000000000..c18ca5dc9d --- /dev/null +++ b/actioncable/test/stubs/test_adapter.rb @@ -0,0 +1,10 @@ +class SuccessAdapter < ActionCable::StorageAdapter::Base + def broadcast(channel, payload) + end + + def subscribe(channel, callback, success_callback = nil) + end + + def unsubscribe(channel, callback) + end +end diff --git a/actioncable/test/stubs/test_connection.rb b/actioncable/test/stubs/test_connection.rb index 384abc5e76..fe87dbcb36 100644 --- a/actioncable/test/stubs/test_connection.rb +++ b/actioncable/test/stubs/test_connection.rb @@ -11,6 +11,10 @@ class TestConnection @transmissions = [] end + def adapter + SuccessAdapter.new(TestServer.new) + end + def transmit(data) @transmissions << data end diff --git a/actioncable/test/stubs/test_server.rb b/actioncable/test/stubs/test_server.rb index f9168f9b78..e1eb9f113a 100644 --- a/actioncable/test/stubs/test_server.rb +++ b/actioncable/test/stubs/test_server.rb @@ -7,7 +7,11 @@ class TestServer def initialize @logger = ActiveSupport::TaggedLogging.new ActiveSupport::Logger.new(StringIO.new) - @config = OpenStruct.new(log_tags: []) + @config = OpenStruct.new(log_tags: [], storage_adapter: SuccessAdapter) + end + + def adapter + @config.storage_adapter.new(self) end def send_async -- cgit v1.2.3 From 6aeaed4c1a370084e82c6712a32422a58dac8b8c Mon Sep 17 00:00:00 2001 From: Jon Moss Date: Fri, 15 Jan 2016 19:03:05 -0500 Subject: All Redis deps are now optional, Postgres --> PostgreSQL adapter --- actioncable/test/channel/stream_test.rb | 1 - actioncable/test/test_helper.rb | 1 - 2 files changed, 2 deletions(-) (limited to 'actioncable/test') diff --git a/actioncable/test/channel/stream_test.rb b/actioncable/test/channel/stream_test.rb index f0b463d149..8424310ca2 100644 --- a/actioncable/test/channel/stream_test.rb +++ b/actioncable/test/channel/stream_test.rb @@ -62,7 +62,6 @@ class ActionCable::Channel::StreamTest < ActionCable::TestCase test "subscription confirmation should only be sent out once" do EM.run do connection = TestConnection.new - connection.stubs(:pubsub).returns EM::Hiredis.connect.pubsub channel = ChatChannel.new connection, "test_channel" channel.send_confirmation diff --git a/actioncable/test/test_helper.rb b/actioncable/test/test_helper.rb index 325305939f..65b45e0c89 100644 --- a/actioncable/test/test_helper.rb +++ b/actioncable/test/test_helper.rb @@ -5,7 +5,6 @@ require 'active_support/testing/autorun' require 'puma' -require 'em-hiredis' require 'mocha/setup' -- cgit v1.2.3 From 4c5d5b75abe85d59e5cc9de9904fdef3b23ec25b Mon Sep 17 00:00:00 2001 From: Jon Moss Date: Fri, 15 Jan 2016 19:07:18 -0500 Subject: ActionCable::StorageAdapter ==> ActionCable::SubscriptionAdapter --- actioncable/test/storage_adapter/base_test.rb | 73 ---------------------- actioncable/test/stubs/test_adapter.rb | 2 +- actioncable/test/stubs/test_server.rb | 4 +- actioncable/test/subscription_adapter/base_test.rb | 73 ++++++++++++++++++++++ 4 files changed, 76 insertions(+), 76 deletions(-) delete mode 100644 actioncable/test/storage_adapter/base_test.rb create mode 100644 actioncable/test/subscription_adapter/base_test.rb (limited to 'actioncable/test') diff --git a/actioncable/test/storage_adapter/base_test.rb b/actioncable/test/storage_adapter/base_test.rb deleted file mode 100644 index 47632df387..0000000000 --- a/actioncable/test/storage_adapter/base_test.rb +++ /dev/null @@ -1,73 +0,0 @@ -require 'test_helper' -require 'stubs/test_server' - -class ActionCable::StorageAdapter::BaseTest < ActionCable::TestCase - ## TEST THAT ERRORS ARE RETURNED FOR INHERITORS THAT DON'T OVERRIDE METHODS - - class BrokenAdapter < ActionCable::StorageAdapter::Base - end - - setup do - @server = TestServer.new - @server.config.storage_adapter = BrokenAdapter - @server.config.allowed_request_origins = %w( http://rubyonrails.com ) - end - - test "#broadcast returns NotImplementedError by default" do - assert_raises NotImplementedError do - BrokenAdapter.new(@server).broadcast('channel', 'payload') - end - end - - test "#subscribe returns NotImplementedError by default" do - callback = lambda { puts 'callback' } - success_callback = lambda { puts 'success' } - - assert_raises NotImplementedError do - BrokenAdapter.new(@server).subscribe('channel', callback, success_callback) - end - end - - test "#unsubscribe returns NotImplementedError by default" do - callback = lambda { puts 'callback' } - - assert_raises NotImplementedError do - BrokenAdapter.new(@server).unsubscribe('channel', callback) - end - end - - # TEST METHODS THAT ARE REQUIRED OF THE ADAPTER'S BACKEND STORAGE OBJECT - - test "#broadcast is implemented" do - broadcast = SuccessAdapter.new(@server).broadcast('channel', 'payload') - - assert_respond_to(SuccessAdapter.new(@server), :broadcast) - - assert_nothing_raised NotImplementedError do - broadcast - end - end - - test "#subscribe is implemented" do - callback = lambda { puts 'callback' } - success_callback = lambda { puts 'success' } - subscribe = SuccessAdapter.new(@server).subscribe('channel', callback, success_callback) - - assert_respond_to(SuccessAdapter.new(@server), :subscribe) - - assert_nothing_raised NotImplementedError do - subscribe - end - end - - test "#unsubscribe is implemented" do - callback = lambda { puts 'callback' } - unsubscribe = SuccessAdapter.new(@server).unsubscribe('channel', callback) - - assert_respond_to(SuccessAdapter.new(@server), :unsubscribe) - - assert_nothing_raised NotImplementedError do - unsubscribe - end - end -end diff --git a/actioncable/test/stubs/test_adapter.rb b/actioncable/test/stubs/test_adapter.rb index c18ca5dc9d..bbd142b287 100644 --- a/actioncable/test/stubs/test_adapter.rb +++ b/actioncable/test/stubs/test_adapter.rb @@ -1,4 +1,4 @@ -class SuccessAdapter < ActionCable::StorageAdapter::Base +class SuccessAdapter < ActionCable::SubscriptionAdapter::Base def broadcast(channel, payload) end diff --git a/actioncable/test/stubs/test_server.rb b/actioncable/test/stubs/test_server.rb index e1eb9f113a..067266ed57 100644 --- a/actioncable/test/stubs/test_server.rb +++ b/actioncable/test/stubs/test_server.rb @@ -7,11 +7,11 @@ class TestServer def initialize @logger = ActiveSupport::TaggedLogging.new ActiveSupport::Logger.new(StringIO.new) - @config = OpenStruct.new(log_tags: [], storage_adapter: SuccessAdapter) + @config = OpenStruct.new(log_tags: [], subscription_adapter: SuccessAdapter) end def adapter - @config.storage_adapter.new(self) + @config.subscription_adapter.new(self) end def send_async diff --git a/actioncable/test/subscription_adapter/base_test.rb b/actioncable/test/subscription_adapter/base_test.rb new file mode 100644 index 0000000000..7a7ae131e6 --- /dev/null +++ b/actioncable/test/subscription_adapter/base_test.rb @@ -0,0 +1,73 @@ +require 'test_helper' +require 'stubs/test_server' + +class ActionCable::SubscriptionAdapter::BaseTest < ActionCable::TestCase + ## TEST THAT ERRORS ARE RETURNED FOR INHERITORS THAT DON'T OVERRIDE METHODS + + class BrokenAdapter < ActionCable::SubscriptionAdapter::Base + end + + setup do + @server = TestServer.new + @server.config.subscription_adapter = BrokenAdapter + @server.config.allowed_request_origins = %w( http://rubyonrails.com ) + end + + test "#broadcast returns NotImplementedError by default" do + assert_raises NotImplementedError do + BrokenAdapter.new(@server).broadcast('channel', 'payload') + end + end + + test "#subscribe returns NotImplementedError by default" do + callback = lambda { puts 'callback' } + success_callback = lambda { puts 'success' } + + assert_raises NotImplementedError do + BrokenAdapter.new(@server).subscribe('channel', callback, success_callback) + end + end + + test "#unsubscribe returns NotImplementedError by default" do + callback = lambda { puts 'callback' } + + assert_raises NotImplementedError do + BrokenAdapter.new(@server).unsubscribe('channel', callback) + end + end + + # TEST METHODS THAT ARE REQUIRED OF THE ADAPTER'S BACKEND STORAGE OBJECT + + test "#broadcast is implemented" do + broadcast = SuccessAdapter.new(@server).broadcast('channel', 'payload') + + assert_respond_to(SuccessAdapter.new(@server), :broadcast) + + assert_nothing_raised NotImplementedError do + broadcast + end + end + + test "#subscribe is implemented" do + callback = lambda { puts 'callback' } + success_callback = lambda { puts 'success' } + subscribe = SuccessAdapter.new(@server).subscribe('channel', callback, success_callback) + + assert_respond_to(SuccessAdapter.new(@server), :subscribe) + + assert_nothing_raised NotImplementedError do + subscribe + end + end + + test "#unsubscribe is implemented" do + callback = lambda { puts 'callback' } + unsubscribe = SuccessAdapter.new(@server).unsubscribe('channel', callback) + + assert_respond_to(SuccessAdapter.new(@server), :unsubscribe) + + assert_nothing_raised NotImplementedError do + unsubscribe + end + end +end -- cgit v1.2.3 From ae31da20cd250154c951b67d5625fc71ac27e2f1 Mon Sep 17 00:00:00 2001 From: Jon Moss Date: Sat, 16 Jan 2016 10:33:50 -0500 Subject: Fix code review comments - adapter -> pubsub (re)rename internally - Change variable names to match method names - Add EventMachine `~> 1.0` as a runtime dependency of ActionCable - Refactor dependency loading for adapters --- actioncable/test/channel/stream_test.rb | 6 +++--- actioncable/test/connection/identifier_test.rb | 8 ++++---- actioncable/test/stubs/test_connection.rb | 2 +- actioncable/test/stubs/test_server.rb | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) (limited to 'actioncable/test') diff --git a/actioncable/test/channel/stream_test.rb b/actioncable/test/channel/stream_test.rb index 8424310ca2..3fa2b291b7 100644 --- a/actioncable/test/channel/stream_test.rb +++ b/actioncable/test/channel/stream_test.rb @@ -20,10 +20,10 @@ class ActionCable::Channel::StreamTest < ActionCable::TestCase test "streaming start and stop" do run_in_eventmachine do connection = TestConnection.new - connection.expects(:adapter).returns mock().tap { |m| m.expects(:subscribe).with("test_room_1", kind_of(Proc), kind_of(Proc)).returns stub_everything(:adapter) } + connection.expects(:pubsub).returns mock().tap { |m| m.expects(:subscribe).with("test_room_1", kind_of(Proc), kind_of(Proc)).returns stub_everything(:pubsub) } channel = ChatChannel.new connection, "{id: 1}", { id: 1 } - connection.expects(:adapter).returns mock().tap { |m| m.expects(:unsubscribe) } + connection.expects(:pubsub).returns mock().tap { |m| m.expects(:unsubscribe) } channel.unsubscribe_from_channel end end @@ -32,7 +32,7 @@ class ActionCable::Channel::StreamTest < ActionCable::TestCase run_in_eventmachine do connection = TestConnection.new EM.next_tick do - connection.expects(:adapter).returns mock().tap { |m| m.expects(:subscribe).with("action_cable:channel:stream_test:chat:Room#1-Campfire", kind_of(Proc), kind_of(Proc)).returns stub_everything(:adapter) } + connection.expects(:pubsub).returns mock().tap { |m| m.expects(:subscribe).with("action_cable:channel:stream_test:chat:Room#1-Campfire", kind_of(Proc), kind_of(Proc)).returns stub_everything(:pubsub) } end channel = ChatChannel.new connection, "" diff --git a/actioncable/test/connection/identifier_test.rb b/actioncable/test/connection/identifier_test.rb index bdc793e56d..a110dfdee0 100644 --- a/actioncable/test/connection/identifier_test.rb +++ b/actioncable/test/connection/identifier_test.rb @@ -23,12 +23,12 @@ class ActionCable::Connection::IdentifierTest < ActionCable::TestCase test "should subscribe to internal channel on open and unsubscribe on close" do run_in_eventmachine do - adapter = mock('adapter') - adapter.expects(:subscribe).with('action_cable/User#lifo', kind_of(Proc)) - adapter.expects(:unsubscribe).with('action_cable/User#lifo', kind_of(Proc)) + pubsub = mock('pubsub_adapter') + pubsub.expects(:subscribe).with('action_cable/User#lifo', kind_of(Proc)) + pubsub.expects(:unsubscribe).with('action_cable/User#lifo', kind_of(Proc)) server = TestServer.new - server.stubs(:adapter).returns(adapter) + server.stubs(:pubsub).returns(pubsub) open_connection server: server close_connection diff --git a/actioncable/test/stubs/test_connection.rb b/actioncable/test/stubs/test_connection.rb index fe87dbcb36..da98201900 100644 --- a/actioncable/test/stubs/test_connection.rb +++ b/actioncable/test/stubs/test_connection.rb @@ -11,7 +11,7 @@ class TestConnection @transmissions = [] end - def adapter + def pubsub SuccessAdapter.new(TestServer.new) end diff --git a/actioncable/test/stubs/test_server.rb b/actioncable/test/stubs/test_server.rb index 067266ed57..6e6541a952 100644 --- a/actioncable/test/stubs/test_server.rb +++ b/actioncable/test/stubs/test_server.rb @@ -10,7 +10,7 @@ class TestServer @config = OpenStruct.new(log_tags: [], subscription_adapter: SuccessAdapter) end - def adapter + def pubsub @config.subscription_adapter.new(self) end -- cgit v1.2.3