Sha256: ff6c2438805c979e3df3f2ed25264f55f730ffdac3f3a0bc8f1f9f84af509caf

Contents?: true

Size: 1.67 KB

Versions: 1

Compression:

Stored size: 1.67 KB

Contents

# encoding: utf-8

require 'spec_helper'

describe 'Joining and grouping relations' do
  let(:env) do
    Environment.setup(test: 'memory://test') do
      schema do
        base_relation :users do
          repository :test

          attribute :user_id, Integer
          attribute :name, String

          key :user_id
        end

        base_relation :tasks do
          repository :test

          attribute :id, Integer
          attribute :user_id, Integer
          attribute :title, String

          key :id
        end
      end

      mapping do
        relation(:users) do
          model User
          map :user_id, :name
        end

        relation(:tasks) do
          model Task
          map :id, :user_id, :title
        end
      end
    end
  end

  before do
    User = mock_model(:user_id, :name, :tasks)
    Task = mock_model(:id, :user_id, :title)

    env.schema[:users].insert([[1, 'Jane']])
    env.schema[:tasks].insert([[2, 1, 'Task 1'], [3, 1, 'Task 2']])
  end

  after do
    Object.send(:remove_const, :User) if defined?(User)
    Object.send(:remove_const, :Task) if defined?(Task)
  end

  specify 'loading a user with grouped tasks' do
    users = env[:users]
    tasks = env[:tasks]

    loaded_user = users.join(tasks).group(:tasks => tasks).project([:user_id, :name, :tasks]).one

    tuple = {
      :name => 'Jane',
      :tasks => [
        { :id => 2, :user_id => 1, :title => 'Task 1' },
        { :id => 3, :user_id => 1, :title => 'Task 2' }
      ]
    }

    task1 = Task.new(tuple[:tasks].first)
    task2 = Task.new(tuple[:tasks].last)
    user = User.new(:name => tuple[:name], :tasks => [task1, task2])

    expect(loaded_user).to eql(user)
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
rom-0.2.0 spec/integration/join_and_group_spec.rb