mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
89801b2a43
ruby/debug is a new debugger that is going to ship with CRuby. It makes sense for Rails to switch to this one because that is where the language is heading, and because Byebug is not fully compatible with Zeitwerk. See https://github.com/deivid-rodriguez/byebug/issues/564 While ruby/debug has not been heavily tested with Zeitwerk, casual usage seems to suggest it works without issues, including explicit namespaces, which is where Byebug and Zeitwerk conflict. Byebug is terrific, thanks a lot for all these years. ❤️
172 lines
5.6 KiB
Ruby
172 lines
5.6 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require "generators/generators_test_helper"
|
|
require "rails/generators/channel/channel_generator"
|
|
|
|
class ChannelGeneratorTest < Rails::Generators::TestCase
|
|
include GeneratorsTestHelper
|
|
tests Rails::Generators::ChannelGenerator
|
|
|
|
setup do
|
|
use_with_javascript
|
|
use_under_importmap
|
|
end
|
|
|
|
test "shared channel files are created" do
|
|
run_generator ["books"]
|
|
|
|
assert_file "app/channels/application_cable/channel.rb" do |cable|
|
|
assert_match(/module ApplicationCable\n class Channel < ActionCable::Channel::Base\n/, cable)
|
|
end
|
|
|
|
assert_file "app/channels/application_cable/connection.rb" do |cable|
|
|
assert_match(/module ApplicationCable\n class Connection < ActionCable::Connection::Base\n/, cable)
|
|
end
|
|
end
|
|
|
|
test "specific channel files are created under importmap" do
|
|
run_generator ["chat"]
|
|
|
|
assert_file "app/channels/chat_channel.rb" do |channel|
|
|
assert_match(/class ChatChannel < ApplicationCable::Channel/, channel)
|
|
end
|
|
|
|
assert_file "app/javascript/channels/chat_channel.js" do |channel|
|
|
assert_match(/import consumer from "channels\/consumer"\s+consumer\.subscriptions\.create\("ChatChannel/, channel)
|
|
end
|
|
end
|
|
|
|
test "specific channel files are created under node" do
|
|
use_under_node
|
|
generator(["chat"]).stub(:install_javascript_dependencies, true) do
|
|
run_generator_instance
|
|
|
|
assert_file "app/javascript/channels/chat_channel.js" do |channel|
|
|
assert_match(/import consumer from ".\/consumer"\s+consumer\.subscriptions\.create\("ChatChannel/, channel)
|
|
end
|
|
end
|
|
end
|
|
|
|
test "channel with multiple actions is created" do
|
|
run_generator ["chat", "speak", "mute"]
|
|
|
|
assert_file "app/channels/chat_channel.rb" do |channel|
|
|
assert_match(/class ChatChannel < ApplicationCable::Channel/, channel)
|
|
assert_match(/def speak/, channel)
|
|
assert_match(/def mute/, channel)
|
|
end
|
|
|
|
assert_file "app/javascript/channels/chat_channel.js" do |channel|
|
|
assert_match(/import consumer from "channels\/consumer"\s+consumer\.subscriptions\.create\("ChatChannel/, channel)
|
|
assert_match(/,\n\n speak/, channel)
|
|
assert_match(/,\n\n mute: function\(\) \{\n return this\.perform\('mute'\);\n \}\n\}\);/, channel)
|
|
end
|
|
end
|
|
|
|
test "shared channel javascript files are created" do
|
|
run_generator ["books"]
|
|
|
|
assert_file "app/javascript/channels/index.js"
|
|
assert_file "app/javascript/channels/consumer.js"
|
|
end
|
|
|
|
test "import channels in javascript entrypoint" do
|
|
run_generator ["books"]
|
|
|
|
assert_file "app/javascript/application.js" do |entrypoint|
|
|
assert_match %r|import "channels"|, entrypoint
|
|
end
|
|
end
|
|
|
|
test "import channels in javascript entrypoint under node" do
|
|
use_under_node
|
|
generator(["chat"]).stub(:install_javascript_dependencies, true) do
|
|
run_generator_instance
|
|
|
|
assert_file "app/javascript/application.js" do |entrypoint|
|
|
assert_match %r|import "./channels"|, entrypoint
|
|
end
|
|
end
|
|
end
|
|
|
|
test "pin javascript dependencies" do
|
|
run_generator ["chat"]
|
|
|
|
assert_file "config/importmap.rb" do |content|
|
|
assert_match %r|pin "@rails/actioncable"|, content
|
|
assert_match %r|pin_all_from "app/javascript/channels"|, content
|
|
end
|
|
end
|
|
|
|
test "first setup only happens once" do
|
|
run_generator ["chat"]
|
|
assert_file "app/javascript/channels/consumer.js"
|
|
|
|
FileUtils.rm("#{destination_root}/app/javascript/channels/consumer.js")
|
|
run_generator ["another"]
|
|
assert_no_file "app/javascript/channels/consumer.js"
|
|
end
|
|
|
|
test "javascripts not generated when assets are skipped" do
|
|
run_generator ["chat", "--skip-assets"]
|
|
|
|
assert_file "app/channels/chat_channel.rb" do |channel|
|
|
assert_match(/class ChatChannel < ApplicationCable::Channel/, channel)
|
|
end
|
|
|
|
assert_no_file "app/javascript/channels/chat_channel.js"
|
|
end
|
|
|
|
test "invokes default test framework" do
|
|
run_generator %w(chat -t=test_unit)
|
|
|
|
assert_file "test/channels/chat_channel_test.rb" do |test|
|
|
assert_match(/class ChatChannelTest < ActionCable::Channel::TestCase/, test)
|
|
assert_match(/# test "subscribes" do/, test)
|
|
assert_match(/# assert subscription.confirmed\?/, test)
|
|
end
|
|
end
|
|
|
|
test "revoking" do
|
|
run_generator ["chat"]
|
|
run_generator ["chat"], behavior: :revoke
|
|
|
|
assert_no_file "app/channels/chat_channel.rb"
|
|
assert_no_file "app/javascript/channels/chat_channel.js"
|
|
assert_no_file "test/channels/chat_channel_test.rb"
|
|
|
|
assert_file "app/channels/application_cable/channel.rb"
|
|
assert_file "app/channels/application_cable/connection.rb"
|
|
assert_file "app/javascript/channels/consumer.js"
|
|
end
|
|
|
|
test "channel suffix is not duplicated" do
|
|
run_generator ["chat_channel"]
|
|
|
|
assert_no_file "app/channels/chat_channel_channel.rb"
|
|
assert_file "app/channels/chat_channel.rb"
|
|
|
|
assert_no_file "app/javascript/channels/chat_channel_channel.js"
|
|
assert_file "app/javascript/channels/chat_channel.js"
|
|
|
|
assert_no_file "test/channels/chat_channel_channel_test.rb"
|
|
assert_file "test/channels/chat_channel_test.rb"
|
|
end
|
|
|
|
private
|
|
def use_with_javascript
|
|
FileUtils.mkdir_p("#{destination_root}/app/javascript")
|
|
FileUtils.touch("#{destination_root}/app/javascript/application.js")
|
|
end
|
|
|
|
def use_under_importmap
|
|
FileUtils.mkdir_p("#{destination_root}/config")
|
|
FileUtils.touch("#{destination_root}/config/importmap.rb")
|
|
FileUtils.rm_rf("#{destination_root}/package.json")
|
|
end
|
|
|
|
def use_under_node
|
|
FileUtils.touch("#{destination_root}/package.json")
|
|
FileUtils.rm_rf("#{destination_root}/config/importmap.rb")
|
|
end
|
|
end
|