Back to Repositories

Testing Field Configuration Management in Rails Admin

This test suite validates the field configuration functionality in Rails Admin, focusing on field visibility, properties, and configuration methods. It ensures proper handling of field definitions, visibility controls, and type modifications through the DSL.

Test Coverage Overview

The test suite provides comprehensive coverage of the HasFields module functionality in Rails Admin:

  • Field visibility management and DSL-based field additions
  • Handling of field bindings and visibility conditions
  • Property assignment for field overrides
  • Field order preservation during type changes
  • Multiple field configuration capabilities

Implementation Analysis

The testing approach employs RSpec to validate Rails Admin’s field configuration system. It uses example-based testing with specific scenarios for field visibility, binding behaviors, and configuration modifications. The implementation leverages RSpec’s expectation syntax and context-specific test cases to verify field management functionality.

Technical Details

  • Testing Framework: RSpec
  • Test Environment: Rails Admin configuration context
  • Test Objects: Team model with various field configurations
  • Key Methods: configure, _fields, field visibility checks
  • Configuration Patterns: DSL-based field definitions

Best Practices Demonstrated

The test suite exemplifies several testing best practices including isolation of test cases, thorough edge case coverage, and clear test organization. It demonstrates proper use of RSpec’s expect syntax, before blocks for setup, and comprehensive verification of both positive and negative scenarios.

railsadminteam/rails_admin

spec/rails_admin/config/has_fields_spec.rb

            
# frozen_string_literal: true

require 'spec_helper'

RSpec.describe RailsAdmin::Config::HasFields do
  it 'shows hidden fields when added through the DSL' do
    expect(RailsAdmin.config(Team).fields.detect { |f| f.name == :division_id }).not_to be_visible

    RailsAdmin.config do |config|
      config.model Team do
        field :division_id
      end
    end

    expect(RailsAdmin.config(Team).fields.detect { |f| f.name == :division_id }).to be_visible
  end

  it 'does not set visibility for fields with bindings' do
    RailsAdmin.config do |config|
      config.model Team do
        field :division do
          visible do
            bindings[:controller].current_user.email == '[email protected]'
          end
        end
      end
    end
    expect { RailsAdmin.config(Team).fields.detect { |f| f.name == :division } }.not_to raise_error
    expect { RailsAdmin.config(Team).fields.detect { |f| f.name == :division }.visible? }.to raise_error(/undefined method `\[\]' for nil/)
  end

  it 'assigns properties to new one on overriding existing field' do
    RailsAdmin.config do |config|
      config.model Team do
        field :players, :has_and_belongs_to_many_association
      end
    end
    expect(RailsAdmin.config(Team).fields.detect { |f| f.name == :players }.properties).not_to be_nil
  end

  describe '#configure' do
    it 'does not change the order of existing fields, if some field types of them are changed' do
      original_fields_order = RailsAdmin.config(Team).fields.map(&:name)

      RailsAdmin.config do |config|
        config.model Team do
          configure :players, :enum do
            enum { [] }
          end

          configure :revenue, :integer
        end
      end

      expect(RailsAdmin.config(Team).fields.map(&:name)).to eql(original_fields_order)
    end

    it 'allows passing multiple fields to share the same configuration' do
      target_field_names = %i[players revenue]

      original_config = RailsAdmin.config(Team).fields.select { |field| target_field_names.include?(field.name) }
      original_config.each { |field| expect(field).to be_visible }

      RailsAdmin.config do |config|
        config.model Team do
          configure target_field_names do
            visible false
          end
        end
      end

      updated_config = RailsAdmin.config(Team).fields.select { |field| target_field_names.include?(field.name) }
      updated_config.each { |field| expect(field).to_not be_visible }
    end
  end

  describe '#_fields' do
    let(:config) { RailsAdmin.config(Team) }
    before do
      RailsAdmin.config(Team) do
        field :id
        field :wins, :boolean
      end
    end

    it "does not cause FrozenError by changing exiting field's type" do
      # Reference the fields for readonly
      config.edit.send(:_fields, true)

      RailsAdmin.config(Team) do
        field :wins, :integer
      end
      expect(config.fields.map(&:name)).to match_array %i[id wins]
    end
  end
end