Sha256: 9a1bdca2122b718045507e7b4d039c0f8eae22d075f3c3dc8d1043ea6cb0e556

Contents?: true

Size: 1.53 KB

Versions: 1

Compression:

Stored size: 1.53 KB

Contents

require 'spec_helper'

RSpec.describe ROM::SQL::ProjectionDSL, :sqlite, helpers: true do
  include_context 'database setup'

  subject(:dsl) do
    ROM::SQL::ProjectionDSL.new(schema)
  end

  let(:schema) do
    define_schema(:users, id: ROM::SQL::Types::Serial, name: ROM::SQL::Types::String)
  end

  let(:ds) do
    conn[:users]
  end

  describe '#call' do
    it 'evaluates the block and returns an array with attribute types' do
      literals = dsl
                   .call { int::count(id).as(:count) }
                   .map { |attr| attr.sql_literal(ds) }

      expect(literals).to eql(["count(`id`) AS 'count'"])
    end
  end

  describe '#method_missing' do
    it 'responds to methods matching attribute names' do
      expect(dsl.id).to eql(schema[:id])
      expect(dsl.name).to eql(schema[:name])
    end

    it 'responds to methods matching type identifiers' do
      expect(dsl.int).to eql(ROM::SQL::Types::Int)
      expect(dsl.string).to eql(ROM::SQL::Types::String)
      expect(dsl.bool).to eql(ROM::SQL::Types::Bool)
    end

    it 'responds to methods matching type names' do
      expect(dsl.DateTime).to eql(ROM::SQL::Types::DateTime)
    end

    it 'returns sql functions with return type specified' do
      function = ROM::SQL::Function.new(ROM::SQL::Types::String).upper(schema[:name])

      expect(dsl.string::upper(schema[:name])).to eql(function)
    end

    it 'raises NoMethodError when there is no matching attribute or type' do
      expect { dsl.not_here }.to raise_error(NoMethodError, /not_here/)
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
rom-sql-1.0.0.beta1 spec/unit/projection_dsl_spec.rb