
Since both projects are developed together and by the same team, we also want to have the same code structure and utility methods available in both projects. Therefore, this commit changes many files, but without a functional change.
109 lines
4.3 KiB
Ruby
109 lines
4.3 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'rails_helper'
|
|
|
|
RSpec.describe Prometheus::Controller do
|
|
let(:codeocean_config) { instance_double(CodeOcean::Config) }
|
|
let(:prometheus_config) { {prometheus_exporter: {enabled: true}} }
|
|
|
|
def stub_metrics
|
|
metrics = %i[@instance_count @rfc_count @rfc_commented_count]
|
|
%i[increment decrement observe].each do |method|
|
|
metrics.each do |metric|
|
|
allow(described_class.instance_variable_get(metric)).to receive(method)
|
|
end
|
|
end
|
|
end
|
|
|
|
before do
|
|
allow(CodeOcean::Config).to receive(:new).with(:code_ocean).and_return(codeocean_config)
|
|
allow(codeocean_config).to receive(:read).and_return(prometheus_config)
|
|
|
|
ApplicationRecord.include Prometheus::Record
|
|
described_class.initialize_metrics
|
|
stub_metrics
|
|
end
|
|
|
|
describe 'instance count' do
|
|
it 'initializes the metrics with the current database entries' do
|
|
create_list(:proxy_exercise, 3)
|
|
described_class.register_metrics
|
|
stub_metrics
|
|
described_class.initialize_instance_count
|
|
expect(described_class.instance_variable_get(:@instance_count)).to(have_received(:observe).with(ProxyExercise.count, class: ProxyExercise.name).once)
|
|
end
|
|
|
|
it 'gets notified when an object is created' do
|
|
allow(described_class).to receive(:create_notification)
|
|
proxy_exercise = create(:proxy_exercise)
|
|
expect(described_class).to have_received(:create_notification).with(proxy_exercise).once
|
|
end
|
|
|
|
it 'gets notified when an object is destroyed' do
|
|
allow(described_class).to receive(:destroy_notification)
|
|
proxy_exercise = create(:proxy_exercise).destroy
|
|
expect(described_class).to have_received(:destroy_notification).with(proxy_exercise).once
|
|
end
|
|
|
|
it 'increments gauge when creating a new instance' do
|
|
create(:proxy_exercise)
|
|
expect(described_class.instance_variable_get(:@instance_count)).to(
|
|
have_received(:increment).with(class: ProxyExercise.name).once
|
|
)
|
|
end
|
|
|
|
it 'decrements gauge when deleting an object' do
|
|
create(:proxy_exercise).destroy
|
|
expect(described_class.instance_variable_get(:@instance_count)).to(
|
|
have_received(:decrement).with(class: ProxyExercise.name).once
|
|
)
|
|
end
|
|
end
|
|
|
|
describe 'rfc count' do
|
|
context 'when initializing an rfc' do
|
|
it 'updates rfc count when creating an ongoing rfc' do
|
|
create(:rfc)
|
|
expect(described_class.instance_variable_get(:@rfc_count)).to(
|
|
have_received(:increment).with(state: RequestForComment::ONGOING).once
|
|
)
|
|
end
|
|
end
|
|
|
|
context 'when changing the state of an rfc' do
|
|
let(:rfc) { create(:rfc) }
|
|
|
|
it 'updates rfc count when soft-solving an rfc' do
|
|
rfc.full_score_reached = true
|
|
rfc.save
|
|
expect(described_class.instance_variable_get(:@rfc_count)).to(have_received(:increment).with(state: RequestForComment::SOFT_SOLVED).once)
|
|
expect(described_class.instance_variable_get(:@rfc_count)).to(have_received(:decrement).with(state: RequestForComment::ONGOING).once)
|
|
end
|
|
|
|
it 'updates rfc count when solving an rfc' do
|
|
rfc.solved = true
|
|
rfc.save
|
|
expect(described_class.instance_variable_get(:@rfc_count)).to(have_received(:increment).with(state: RequestForComment::SOLVED).once)
|
|
expect(described_class.instance_variable_get(:@rfc_count)).to(have_received(:decrement).with(state: RequestForComment::ONGOING).once)
|
|
end
|
|
end
|
|
|
|
context 'when commenting an rfc' do
|
|
it 'updates comment metric when commenting an rfc' do
|
|
create(:rfc_with_comment)
|
|
expect(described_class.instance_variable_get(:@rfc_commented_count)).to have_received(:increment).once
|
|
end
|
|
|
|
it 'does not update comment metric when commenting an rfc that already has a comment' do
|
|
rfc = create(:rfc_with_comment)
|
|
expect(described_class.instance_variable_get(:@rfc_commented_count)).to have_received(:increment).once
|
|
|
|
Comment.create(file: rfc.file, user: rfc.user, text: "comment a for rfc #{rfc.question}")
|
|
Comment.create(file: rfc.file, user: rfc.user, text: "comment b for rfc #{rfc.question}")
|
|
# instance count has only been updated for the creation of the commented rfc and not for additional comments
|
|
expect(described_class.instance_variable_get(:@rfc_commented_count)).to have_received(:increment).once
|
|
end
|
|
end
|
|
end
|
|
end
|