Back to Repositories

Testing Serialized Field Management in rails_admin

This integration test suite validates serialized field handling in Rails Admin, focusing on both standard Rails and Mongoid implementations. The tests verify proper serialization, deserialization, and persistence of complex data structures like arrays and hashes.

Test Coverage Overview

The test suite comprehensively covers serialized field functionality in Rails Admin across different contexts.

  • Standard Rails serialized object handling with roles array
  • Mongoid-specific serialization for array and hash fields
  • Data persistence verification
  • Empty value handling and field clearing

Implementation Analysis

The testing approach utilizes RSpec’s request specs to simulate user interactions with the Rails Admin interface.

Key patterns include:
  • Factory-based test data generation using FactoryBot
  • Form interaction simulation using Capybara
  • Dynamic configuration of Rails Admin models
  • Explicit verification of serialized data persistence

Technical Details

  • Testing Framework: RSpec
  • Feature Testing: Capybara
  • Data Generation: FactoryBot
  • ORM Support: ActiveRecord and Mongoid
  • Configuration: Dynamic model configuration via RailsAdmin.config

Best Practices Demonstrated

The test suite exemplifies several testing best practices for complex data handling.

  • Isolated test contexts for different serialization scenarios
  • Explicit setup and teardown of test data
  • Clear separation of concerns between Rails and Mongoid tests
  • Comprehensive edge case coverage including empty value handling

railsadminteam/rails_admin

spec/integration/fields/serialized_spec.rb

            
# frozen_string_literal: true

require 'spec_helper'

RSpec.describe 'Serialized field', type: :request do
  subject { page }

  context 'with serialized objects' do
    before do
      RailsAdmin.config do |c|
        c.model User do
          configure :roles, :serialized
        end
      end

      @user = FactoryBot.create :user

      visit edit_path(model_name: 'user', id: @user.id)

      fill_in 'user[roles]', with: %(['admin', 'user'])
      click_button 'Save' # first(:button, "Save").click

      @user.reload
    end

    it 'saves the serialized data' do
      expect(@user.roles).to eq(%w[admin user])
    end
  end

  context 'with serialized objects of Mongoid', mongoid: true do
    before do
      @field_test = FactoryBot.create :field_test

      visit edit_path(model_name: 'field_test', id: @field_test.id)
    end

    it 'saves the serialized data' do
      fill_in 'field_test[array_field]', with: '[4, 2]'
      fill_in 'field_test[hash_field]', with: '{ a: 6, b: 2 }'
      click_button 'Save' # first(:button, "Save").click

      @field_test.reload
      expect(@field_test.array_field).to eq([4, 2])
      expect(@field_test.hash_field).to eq('a' => 6, 'b' => 2)
    end

    it 'clears data when empty string is passed' do
      fill_in 'field_test[array_field]', with: ''
      fill_in 'field_test[hash_field]', with: ''
      click_button 'Save' # first(:button, "Save").click

      @field_test.reload
      expect(@field_test.array_field).to eq(nil)
      expect(@field_test.hash_field).to eq(nil)
    end
  end
end