# frozen_string_literal: true

RSpec.describe Licensee::LicenseField do
  let(:expected_count) { 7 }

  context 'class' do
    it 'returns all license fields' do
      expect(described_class.all.count).to eql(expected_count)
      expect(described_class.all.first).to be_a(described_class)
    end

    it 'returns all license field keys' do
      expect(described_class.keys.count).to eql(expected_count)
      expect(described_class.keys.first).to be_a(String)
      expect(described_class.keys.first).to eql('fullname')
    end

    context 'from a hash' do
      let(:hash) { { 'name' => 'foo', 'description' => 'bar' } }

      it 'builds from a hash' do
        field = described_class.from_hash(hash)
        expect(field.name).to eql('foo')
        expect(field.description).to eql('bar')
      end
    end

    it 'retrieves a specific field' do
      field = described_class.find('year')
      expect(field.description).to eql('The current year')
    end

    context 'from an array' do
      let(:array) { %w[year fullname] }
      let(:fields) { described_class.from_array(array) }

      it 'returns an array of LicenseFields' do
        expect(fields.count).to be(2)
        expect(fields.first).to be_a(described_class)
        expect(fields.first.name).to eql('year')
        expect(fields.last.name).to eql('fullname')
      end
    end

    context 'from content' do
      let(:content) { 'Foo [year] bar [baz] [fullname]' }
      let(:fields) { described_class.from_content(content) }

      it 'pulls fields from content' do
        expect(fields.count).to be(2)
        expect(fields.first.key).to eql('year')
        expect(fields[1].key).to eql('fullname')
      end
    end
  end

  it 'stores and exposes values' do
    field = described_class.new('foo', 'bar')
    expect(field.name).to eql('foo')
    expect(field.key).to eql('foo')
    expect(field.description).to eql('bar')
  end

  it 'returns the field label' do
    field = described_class.new('foo', 'bar')
    expect(field.label).to eql('Foo')
  end

  it "doesn't error for licenses without bodies" do
    other = Licensee::License.find('other')
    expect(other.fields).to be_empty
  end

  it 'converts fullname to two words' do
    field = described_class.new('fullname', 'foo')
    expect(field.label).to eql('Full name')
  end

  it 'returns the label for #to_s' do
    field = described_class.new('foo', 'bar')
    expect(field.to_s).to eql('Foo')
  end

  it 'returns the raw text' do
    field = described_class.new('fullname')
    expect(field.raw_text).to eql('[fullname]')
  end

  context 'spec_helper' do
    it 'substitutes all fields' do
      expected = described_class.keys.sort
      expect(field_values.keys.map(&:to_s).sort).to eql(expected)
    end
  end
end