Sha256: 214e82e0416c027aa3e5c0fb43190c6912e2fa53647e2eafb9f39556d823225e

Contents?: true

Size: 1.39 KB

Versions: 3

Compression:

Stored size: 1.39 KB

Contents

require 'models'

RSpec.describe "ActiveRecord::Base subclass with #actable" do
  subject { Product }

  let(:pen_attributes) { {name: 'pen', price: 0.8, color: 'red'} }
  let(:pen) { Pen.new pen_attributes }

  it "has a polymorphic belongs_to :actable relation" do
    association = subject.reflect_on_all_associations.find { |r| r.name == :actable }
    expect(association).to_not be_nil
    expect(association.macro).to eq(:belongs_to)
    expect(association).to be_polymorphic
  end

  describe "#actable?" do
    it "returns true for actable models" do
      expect(Product.actable?).to be true
    end

    it "returns false for none actable models" do
      expect(Pen.actable?).to be false
    end
  end

  describe ".specific" do
    it "return specific submodel" do
      pen.save
      expect(Product.find(pen.acting_as.id).specific).to eq(pen)
    end
  end

  it "raises NoMethodError for undefined methods on specific" do
    pen.save
    expect{ pen.product.raise_error }.to raise_error(NoMethodError, /undefined method `non_existant_method' for #<Pen/)
  end

  it "deletes specific subclass on destroy" do
    pen.save
    pen.product.destroy
    expect { pen.reload }.to raise_error(ActiveRecord::RecordNotFound)
  end

  it "saves submodel on save" do
    pen.save
    product = pen.acting_as
    product.specific.color = 'blue'
    product.save
    pen.reload
    expect(pen.color).to eq('blue')
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
active_record-acts_as-1.0.2 spec/actable_spec.rb
active_record-acts_as-1.0.1 spec/actable_spec.rb
active_record-acts_as-1.0.0 spec/actable_spec.rb