Skip to content

siposdani87/mongoid-fixture-kit

Repository files navigation

mongoid-fixture_kit

Version Download License

Buy Me A Coffee

This package is a Ruby gem that provides a way to load sample data into a MongoDB database for testing purposes. It provides a simple and convenient way to manage test data by defining fixtures in YAML files, which can be loaded into the database before running tests.

This library aims to provide fixtures for Mongoid the same way you have them with ActiveRecord.

Getting Started

Installing

gem 'mongoid-fixture_kit'

Usage

In your tests, add:

class ActiveSupport::TestCase
  include Mongoid::FixtureKit::TestHelper
  self.fixture_path = "#{Rails.root}/test/fixtures"
end

This is also done by ActiveRecord, but magically in the railties.

Then when you want to access a fixture:

class UsersControllerTest < ActionController::TestCase
  setup do
    @user = users(:user_1)
  end

  test 'should show user' do
    get :show, params: { id: @user }
    assert_response :success
  end
end

Features

  • Creation of a document from a YAML file
  • ERB inside YAML files
  • $LABEL interpolation in fixture values
  • belongs_to relations
  • Polymorphic belongs_to
  • has_many relations
  • has_and_belongs_to_many relations
  • Embedded documents (embeds_one, embeds_many)
  • DEFAULTS key for shared fixture attributes
  • TestHelper module to include in your tests

ERB in Fixtures

You can use ERB in your YAML fixture files to generate dynamic data:

<% 5.times do |i| %>
school<%= i %>:
  name: School <%= i %>
<% end %>

Label Interpolation

Use $LABEL in fixture values to reference the fixture's own name:

user_john:
  username: $LABEL
  email: $LABEL@example.com

This will set username to "user_john" and email to "user_john@example.com".

Defaults

Use the DEFAULTS key to define shared attributes for all fixtures in a file:

DEFAULTS:
  role: member

admin:
  name: Admin
  role: admin

regular_user:
  name: Regular User

The DEFAULTS entry is removed during loading and is not inserted as a document.

Compatibility

Dependency Supported versions
Ruby 3.1, 3.2, 3.3, 3.4
Mongoid 7.x, 8.x, 9.x
Rails (ActiveSupport) 7.0+

Notes

Documents are stored with a special attribute __fixture_name which is used to retrieve it and establish relations.

Mongoid::Document has a attr_accessor defined for __fixture_name, so it doesn't pose any problem if you try to dup a document for example.

Changes compared to ActiveRecord

  • There is an option to load fixtures only once.
  • Fixture accessor methods are defined publicly.

These changes are here to let you create another class holding persistent data inside your tests.

class TestData
  include Mongoid::FixtureKit::TestHelper

  self.fixture_path = "#{Rails.root}/test/fixtures_universes"
  self.load_fixtures_once = true

  def TestData.instance
    @instance ||= ->(){
      instance = new
      instance.setup_fixtures
      instance
    }.call
  end

  private_class_method :new
end

class ActiveSupport::TestCase
  include Mongoid::FixtureKit::TestHelper
  self.fixture_path = "#{Rails.root}/test/fixtures"

  def data
    TestData.instance
  end
end

# somewhere else
test 'should validate complex data structure' do
  assert_nothing_raised do
    DataStructure.process(data.structures(:complex))
  end
end

License

The original version of this library is mongoid-fixture_set by Geoffroy Planquart in 2014

Bugs or Requests

If you encounter any problems feel free to open an issue. If you feel the library is missing a feature, please raise a ticket. Pull request are also welcome.

DigitalOcean Referral Badge

Developer

Dániel Sipos

Sponsors

This project is generously supported by TrophyMap, I18Nature, and several other amazing organizations.

About

A Ruby gem for loading sample data into MongoDB for testing purposes. Simplifies test data management by defining fixtures in YAML files that are loaded into the database before running tests.

Topics

Resources

License

Stars

Watchers

Forks

Contributors