No commit activity in last 3 years
No release in over 3 years
Testing utils for Cable Ready
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Development

Runtime

 Project Readme

CableReady helps you create great real-time user experiences by making it simple to trigger client-side DOM changes from server-side Ruby.

This gem makes the testing of your broadcast classes easier by providing custom matchers that will verify that the expected message was broadcasted to the expected channel.

📚 Docs

🚀 Install

Open Gemfile and add the following line to the test group:

group :test do
  gem 'cable-ready-testing'
end

now load the library for RSpec by editing the file spec/rails_helper.rb and loading the gem after initializing the environment with the following line:

require 'cable_ready/testing/rspec'

you are now ready to use the matchers inside your RSpec tests.

🎲 Usage

Let's consider the following usage of Cable Ready:

class Broadcaster
  include CableReady::Broadcaster

  def call(channel_name, selector)
    cable_ready[channel_name].outer_html(
      selector: selector,
      html: 'html'
    )

    cable_ready.broadcast
  end
end

without custom matchers you may end-up with the following test:

RSpec.describe Broadcaster do
  subject { described_class.new }

  describe '#call' do
    it 'broadcasts the html' do
      cable_ready = double(outer_html: double)

      expect(CableReady::Channels.instance)
        .to receive(:[])
        .with('custom_channel')
        .and_return(cable_ready)
      expect(cable_ready)
        .to receive(:outer_html)
        .with(selector: '#some-div', html: 'html')
      expect(CableReady::Channels.instance)
        .to receive(:broadcast).once

      subject.call('custom_channel', '#some-div')
    end
  end
end

after using cable-ready-testing gem:

RSpec.describe Broadcaster do
  subject { described_class.new }

  describe '#call' do
    it 'broadcasts the html' do
      expect {
        subject.call('custom_channel', '#some-div')
      }.to mutated_element('#some-div')
       .on_channel('custom_channel')
       .with(:outer_html, { 'html' => 'html' })
    end
  end
end

📝 Documentation

The following matchers are available:

  • mudated_element
  • mutated_attribute
  • mutated_css_class
  • mutated_dataset
  • mutated_style
  • mutated_element

Mentioned above matchers work the same way, you should choose the right one depending on the context. If you are calling cable_ready["MyChannel"].set_dataset_property then use mutated_dataset matcher, etc. Always chain them with .on_channel and .with.

📝 License

CableReady testing lib is released under the MIT License.