68 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			68 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Ruby
		
	
	
	
| # frozen_string_literal: true
 | |
| require 'fast_spec_helper'
 | |
| 
 | |
| RSpec.describe Gitlab::ClassAttributes do
 | |
|   let(:klass) do
 | |
|     Class.new do
 | |
|       include Gitlab::ClassAttributes
 | |
| 
 | |
|       class << self
 | |
|         attr_reader :counter_1, :counter_2
 | |
| 
 | |
|         # get_class_attribute and set_class_attribute are protected,
 | |
|         # hence those methods are for testing purpose
 | |
|         def get_attribute(name)
 | |
|           get_class_attribute(name)
 | |
|         end
 | |
| 
 | |
|         def set_attribute(name, value)
 | |
|           set_class_attribute(name, value)
 | |
|         end
 | |
|       end
 | |
| 
 | |
|       after_set_class_attribute do
 | |
|         @counter_1 ||= 0
 | |
|         @counter_1 += 1
 | |
|       end
 | |
| 
 | |
|       after_set_class_attribute do
 | |
|         @counter_2 ||= 0
 | |
|         @counter_2 += 2
 | |
|       end
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   let(:subclass) { Class.new(klass) }
 | |
| 
 | |
|   it "returns values set on the class" do
 | |
|     klass.set_attribute(:foo, :bar)
 | |
| 
 | |
|     expect(klass.get_attribute(:foo)).to eq(:bar)
 | |
|   end
 | |
| 
 | |
|   it "returns values set on a superclass" do
 | |
|     klass.set_attribute(:foo, :bar)
 | |
| 
 | |
|     expect(subclass.get_attribute(:foo)).to eq(:bar)
 | |
|   end
 | |
| 
 | |
|   it "returns values from the subclass over attributes from a superclass" do
 | |
|     klass.set_attribute(:foo, :baz)
 | |
|     subclass.set_attribute(:foo, :bar)
 | |
| 
 | |
|     expect(klass.get_attribute(:foo)).to eq(:baz)
 | |
|     expect(subclass.get_attribute(:foo)).to eq(:bar)
 | |
|   end
 | |
| 
 | |
|   it "triggers after hooks after set class values" do
 | |
|     expect(klass.counter_1).to be(nil)
 | |
|     expect(klass.counter_2).to be(nil)
 | |
| 
 | |
|     klass.set_attribute(:foo, :bar)
 | |
|     klass.set_attribute(:foo, :bar)
 | |
| 
 | |
|     expect(klass.counter_1).to eq(2)
 | |
|     expect(klass.counter_2).to eq(4)
 | |
|   end
 | |
| end
 |