require "test_helper" class PresenceChannelTest < ActionCable::Channel::TestCase setup do stub_connection(current_user: users(:david)) end test "subscribes" do room = users(:david).rooms.first subscribe room_id: room.id assert subscription.confirmed? assert_has_stream_for room end test "rejects subscription to a room that the user is not a member of" do subscribe room_id: Rooms::Closed.create!(name: "New Room", creator: users(:david)).id assert subscription.rejected? end test "rejects subscription to non-existent room" do subscribe room_id: -1 assert subscription.rejected? end test "rejects subscription without a room" do subscribe room_id: -1 assert subscription.rejected? end test "subscribing marks the membership as connected" do membership = users(:david).memberships.first assert_changes -> { membership.reload.connected? }, from: false, to: true do subscribe room_id: membership.room_id end end test "subscribing tells the user's other tabs when they read the room" do membership = users(:david).memberships.first freeze_time do assert_broadcast_on "user_#{users(:david).id}_reads", { room_id: membership.room_id, at: Time.current.to_f } do subscribe room_id: membership.room_id end end end test "unsubscribing marks the membership as disconnected" do membership = users(:david).memberships.first subscribe room_id: membership.room_id assert_changes -> { membership.reload.connected? }, from: true, to: false do unsubscribe end end end