# frozen_string_literal: true

require 'rails_helper'

RSpec.describe(List, type: :model) do
  let(:user) { FactoryBot.build(:user) }

  describe 'name mangling' do
    subject do
      List.new(user: user, display_name: display_name).tap(&:validate)
    end

    {
      'great list' => 'great-list',
      'followers' => '-followers-',
      '  followers  ' => '-followers-',
      "  the game  \t\nyes" => 'the-game-yes',

      # not nice, but this is just the way it is:
      "\u{1f98a} :3" => '3',
      "\u{1f98a}" => ''
    }.each do |display_name, expected_name|
      context "when display name is #{display_name.inspect}" do
        let(:display_name) { display_name }

        its(:name) { should eq expected_name }
      end
    end
  end

  describe 'validations' do
    subject do
      List.new(user: user, display_name: display_name).validate
    end

    context "when display name is 'great list' (valid)" do
      let(:display_name) { 'great list' }

      it { is_expected.to be true }
    end

    context "when display name is '1' (valid)" do
      let(:display_name) { '1' }

      it { is_expected.to be true }
    end

    context 'when display name is the letter E 621 times (invalid, too long)' do
      let(:display_name) { 'E' * 621 }

      it { is_expected.to be false }
    end

    context 'when display name is an empty string (invalid, as `name` would be empty)' do
      let(:display_name) { '' }

      it { is_expected.to be false }
    end

    context "when display name is \u{1f98a} (invalid, as `name` would be empty)" do
      let(:display_name) { "\u{1f98a}" }

      it { is_expected.to be false }
    end
  end
end