Friday, September 20, 2024 3:55:39 AM
> settings

Customize


Authenticate

> broadcast_spec.rb
# frozen_string_literal: true

describe ESM::Command::Server::Broadcast, category: "command" do
  include_context "command"
  include_examples "validate_command"

  describe "#execute" do
    include_context "connection_v1"

    let!(:second_server) { ESM::Test.server(for: community) }
    let!(:second_wsc) { WebsocketClient.new(second_server) }
    let(:response) { previous_command.response }

    before do
      # Create cooldowns for the users. This is how broadcast knows who to send messages to.
      create(:cooldown, command_name: "preferences", user: user, community: community, server: server)
      create(:cooldown, command_name: "preferences", user: user, community: community, server: second_server)
      create(:cooldown, command_name: "preferences", user: second_user, community: community, server: second_server)

      grant_command_access!(community, "broadcast")

      wait_for { second_wsc.connected? }.to be(true)
    end

    after do
      second_wsc.disconnect!
    end

    context "when a valid server ID is the target" do
      it "sends a message to the users" do
        execute!(arguments: {broadcast_to: server.server_id, message: "Hello world!"}, prompt_response: "yes")

        # 1: Preview Message
        # 2: Spacer
        # 3: Confirmation
        # 4: Success message
        # 5: Message to first user
        wait_for { ESM::Test.messages.size }.to eq(5)
      end
    end

    context "when 'all' is the target" do
      it "sends a message to every server" do
        execute!(arguments: {broadcast_to: "all", message: "Hello world!"}, prompt_response: "yes")

        # 1: Preview Message
        # 2: Spacer
        # 3: Confirmation
        # 4: Success message
        # 5: Message to first user
        # 6: Message to second user
        wait_for { ESM::Test.messages.size }.to eq(6)
      end
    end

    context "when the target is omitted" do
      it "sends a preview of the message" do
        execute!(arguments: {message: "Hello world!"})

        # 1: Preview Message
        wait_for { ESM::Test.messages.size }.to eq(1)
      end
    end

    context "when the user aborts during confirmation" do
      it "does not send any messages" do
        execute!(
          arguments: {broadcast_to: "all", message: "Hello world!"},
          prompt_response: "no"
        )

        # 1: Preview Message
        # 2: Spacer
        # 3: Confirmation
        # 4: Cancel message
        wait_for { ESM::Test.messages.size }.to eq(4)
      end
    end

    context "when the target is a partial server ID" do
      it "sends the message to the correct server ID" do
        execute!(
          arguments: {
            broadcast_to: server.server_id[(community.community_id.size + 1)..],
            message: "Hello world!"
          },
          prompt_response: "yes"
        )

        # 1: Preview Message
        # 2: Spacer
        # 3: Confirmation
        # 4: Success message
        # 5: Message to first user
        wait_for { ESM::Test.messages.size }.to eq(5)
      end
    end

    context "when the command is executed in a DM" do
      it "raises an exception" do
        execution_args = {
          channel_type: :dm,
          arguments: {broadcast_to: "all", message: "Hello world!"}
        }

        expect { execute!(**execution_args) }.to raise_error(
          ESM::Exception::CheckFailure,
          /this command can only be used in a discord server's \*\*text channel/i
        )
      end
    end
  end
end
All opinions represented herein are my own
- © 2024 itsthedevman
- build 340fbb8