Skip to content

Relation with association can not be finalized #26

Description

@v-kolesnikov

Relation can not be finalized if it has at least one defined association.

#!/usr/bin/env ruby

require 'bundler/inline'

gemfile(true) do
  gem 'dry-struct', '~> 0.3.1'
  gem 'rom-mongo', github: 'rom-rb/rom-mongo', branch: :master
  gem 'rspec'
end

require 'rspec'
require 'rspec/autorun'

require 'rom-mongo'

RSpec.configure do |config|
  config.color = true
  config.formatter = :documentation
end

RSpec.describe ROM::Mongo do
  let(:conn) { Mongo::Client.new('mongodb://0.0.0.0:27017/rom_mongo') }
  let(:conf) { ROM::Configuration.new(:mongo, conn) }
  let(:container) { ROM.container(conf) }

  before do
    conn[:users].drop

    conf.relation(:users) do
      schema(:users) do
        attribute :_id,   ROM::Types.Definition(BSON::ObjectId)
        attribute :name,  ROM::Types::String
        attribute :email, ROM::Types::String
      end
    end
  end

  it { expect { container }.not_to raise_error }

  describe 'relation with association' do
    before do
      conf.relation(:tasks) do
        schema(:tasks) do
          attribute :_id,     ROM::Types.Definition(BSON::ObjectId)
          attribute :user_id, ROM::Types::Int

          associations do
            belongs_to :user, foreign_key: :u_id
          end
        end
      end
    end

    it { expect { container }.not_to raise_error }
  end
end
Failures:

  1) ROM::Mongo relation with association should not raise Exception
     Failure/Error: it { expect { container }.not_to raise_error }

       expected no Exception, got #<LocalJumpError: no block given (yield)> with backtrace:
         # /Users/v.kolesnikov/.rvm/gems/ruby-2.5.0/gems/rom-core-4.1.0/lib/rom/schema.rb:380:in `finalize_associations!'
         # /Users/v.kolesnikov/.rvm/gems/ruby-2.5.0/gems/rom-core-4.1.0/lib/rom/schema.rb:44:in `block (2 levels) in <class:Schema>'
         # /Users/v.kolesnikov/.rvm/gems/ruby-2.5.0/gems/rom-core-4.1.0/lib/rom/registry.rb:61:in `block in each'
         # /Users/v.kolesnikov/.rvm/gems/ruby-2.5.0/gems/rom-core-4.1.0/lib/rom/registry.rb:61:in `each'
         # /Users/v.kolesnikov/.rvm/gems/ruby-2.5.0/gems/rom-core-4.1.0/lib/rom/registry.rb:61:in `each'
         # /Users/v.kolesnikov/.rvm/gems/ruby-2.5.0/gems/rom-core-4.1.0/lib/rom/schema.rb:42:in `block in <class:Schema>'
         # /Users/v.kolesnikov/.rvm/gems/ruby-2.5.0/gems/rom-core-4.1.0/lib/rom/support/notifications.rb:141:in `trigger'
         # /Users/v.kolesnikov/.rvm/gems/ruby-2.5.0/gems/rom-core-4.1.0/lib/rom/support/notifications.rb:69:in `block in trigger'
         # /Users/v.kolesnikov/.rvm/gems/ruby-2.5.0/gems/rom-core-4.1.0/lib/rom/support/notifications.rb:68:in `each'
         # /Users/v.kolesnikov/.rvm/gems/ruby-2.5.0/gems/rom-core-4.1.0/lib/rom/support/notifications.rb:68:in `trigger'
         # /Users/v.kolesnikov/.rvm/gems/ruby-2.5.0/gems/rom-core-4.1.0/lib/rom/setup/finalize/finalize_relations.rb:59:in `run!'
         # /Users/v.kolesnikov/.rvm/gems/ruby-2.5.0/gems/rom-core-4.1.0/lib/rom/setup/finalize.rb:86:in `load_relations'
         # /Users/v.kolesnikov/.rvm/gems/ruby-2.5.0/gems/rom-core-4.1.0/lib/rom/setup/finalize.rb:62:in `run!'
         # /Users/v.kolesnikov/.rvm/gems/ruby-2.5.0/gems/rom-core-4.1.0/lib/rom/create_container.rb:38:in `finalize'
         # /Users/v.kolesnikov/.rvm/gems/ruby-2.5.0/gems/rom-core-4.1.0/lib/rom/create_container.rb:14:in `initialize'
         # /Users/v.kolesnikov/.rvm/gems/ruby-2.5.0/gems/rom-core-4.1.0/lib/rom/create_container.rb:59:in `initialize'
         # /Users/v.kolesnikov/.rvm/gems/ruby-2.5.0/gems/rom-core-4.1.0/lib/rom/create_container.rb:65:in `new'
         # /Users/v.kolesnikov/.rvm/gems/ruby-2.5.0/gems/rom-core-4.1.0/lib/rom/create_container.rb:65:in `container'
         # ./associations_spec.rb:24:in `block (2 levels) in <main>'
         # ./associations_spec.rb:54:in `block (4 levels) in <main>'
         # ./associations_spec.rb:54:in `block (3 levels) in <main>'
     # ./associations_spec.rb:54:in `block (3 levels) in <main>'

It can be fixed by defining self own finalize_associations! method for ROM::Mongo::Schema or inheriting this class from ROM::Memory::Schema.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions