hanami-utils/spec/hanami/utils/class_attribute_spec.rb

148 lines
3.6 KiB
Ruby

require 'hanami/utils/class_attribute'
RSpec.describe Hanami::Utils::ClassAttribute do
before do
class ClassAttributeTest
include Hanami::Utils::ClassAttribute
class_attribute :callbacks, :functions, :values
self.callbacks = [:a]
self.values = [1]
end
class SubclassAttributeTest < ClassAttributeTest
class_attribute :subattribute
self.functions = %i(x y)
self.subattribute = 42
end
class SubSubclassAttributeTest < SubclassAttributeTest
end
class Vehicle
include Hanami::Utils::ClassAttribute
class_attribute :engines, :wheels
self.engines = 0
self.wheels = 0
end
class Car < Vehicle
self.engines = 1
self.wheels = 4
end
class Airplane < Vehicle
self.engines = 4
self.wheels = 16
end
class SmallAirplane < Airplane
self.engines = 2
self.wheels = 8
end
end
after do
%i(ClassAttributeTest
SubclassAttributeTest
SubSubclassAttributeTest
Vehicle
Car
Airplane
SmallAirplane).each do |const|
Object.send :remove_const, const
end
end
it 'sets the given value' do
expect(ClassAttributeTest.callbacks).to eq([:a])
end
describe 'inheritance' do
around do |example|
@debug = $DEBUG
$DEBUG = true
example.run
$DEBUG = @debug
end
it 'the value it is inherited by subclasses' do
expect(SubclassAttributeTest.callbacks).to eq([:a])
end
it 'if the superclass value changes it does not affects subclasses' do
ClassAttributeTest.functions = [:y]
expect(SubclassAttributeTest.functions).to eq(%i(x y))
end
it 'if the subclass value changes it does not affects superclass' do
SubclassAttributeTest.values = [3, 2]
expect(ClassAttributeTest.values).to eq([1])
end
describe 'when the subclass is defined in a different namespace' do
before do
module Lts
module Routing
class Resource
class Action
include Hanami::Utils::ClassAttribute
class_attribute :verb
end
class New < Action
self.verb = :get
end
end
class Resources < Resource
class New < Resource::New
end
end
end
end
end
it 'refers to the superclass value' do
expect(Lts::Routing::Resources::New.verb).to eq :get
end
end
# it 'if the subclass value changes it affects subclasses' do
# values = [3,2]
# SubclassAttributeTest.values = values
# expect(SubclassAttributeTest.values).to eq(values)
# expect(SubSubclassAttributeTest.values).to eq(values)
# end
it 'if the subclass defines an attribute it should not be available for the superclass' do
$DEBUG = @debug
expect { ClassAttributeTest.subattribute }.to raise_error(NoMethodError)
end
it 'if the subclass defines an attribute it should be available for its subclasses' do
expect(SubSubclassAttributeTest.subattribute).to eq 42
end
it 'preserves values within the inheritance chain' do
expect(Vehicle.engines).to eq 0
expect(Vehicle.wheels).to eq 0
expect(Car.engines).to eq 1
expect(Car.wheels).to eq 4
expect(Airplane.engines).to eq 4
expect(Airplane.wheels).to eq 16
expect(SmallAirplane.engines).to eq 2
expect(SmallAirplane.wheels).to eq 8
end
it "doesn't print warnings when it gets inherited" do
expect { Class.new(Vehicle) }.not_to output.to_stdout
end
end
end