From f8f6dbf3ee15560c438fa0f2ff448c60e40ca3e8 Mon Sep 17 00:00:00 2001 From: Valentine Frolov Date: Wed, 30 Sep 2026 12:07:30 +0300 Subject: [PATCH] fix(#1247): give the marker of repeatedly an _id when it has none --- lib/fbe/repeatedly.rb | 4 +++- test/fbe/test_repeatedly.rb | 47 +++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/lib/fbe/repeatedly.rb b/lib/fbe/repeatedly.rb index aa793151..145fd49c 100644 --- a/lib/fbe/repeatedly.rb +++ b/lib/fbe/repeatedly.rb @@ -4,6 +4,7 @@ # SPDX-License-Identifier: MIT require 'others' +require 'securerandom' require 'tago' require_relative '../fbe' require_relative 'fb' @@ -33,7 +34,7 @@ # f.issues_found = count_issues # # PMP might have: hours_between_checks=6 # end -def Fbe.repeatedly(area, p_every_hours, fb: Fbe.fb, judge: $judge, loog: $loog, &) +def Fbe.repeatedly(area, p_every_hours, fb: Fbe.fb, judge: $judge, loog: $loog, &) # rubocop:disable Metrics/AbcSize raise(Fbe::Error, 'The area is nil') if area.nil? raise(Fbe::Error, 'The p_every_hours is nil') if p_every_hours.nil? raise(Fbe::Error, 'The fb is nil') if fb.nil? @@ -58,6 +59,7 @@ def Fbe.repeatedly(area, p_every_hours, fb: Fbe.fb, judge: $judge, loog: $loog, f.what = 'repeatedly' f.judge = judge end + f._id = SecureRandom.random_number(9_999_999_999_999) if f['_id'].nil? attrs = {} yield( others(fact: f, map: attrs) do |k, *rest| diff --git a/test/fbe/test_repeatedly.rb b/test/fbe/test_repeatedly.rb index 318d7139..c7e3c368 100644 --- a/test/fbe/test_repeatedly.rb +++ b/test/fbe/test_repeatedly.rb @@ -227,4 +227,51 @@ def test_prefers_the_configured_interval_over_the_daily_default end assert(ran, "the judge stayed idle #{hours + 1} hours later, while the interval is #{hours}, seed is #{seed}") end + + def test_replaces_property_on_the_second_run_on_a_plain_factbase + seed = Random.new_seed + count = Random.new(seed).rand(1..1_000_000) + fb = Factbase.new + 2.times do |i| + Time.stub(:now, Time.now + (i * 25 * 60 * 60)) do + Fbe.repeatedly('качество', 'every_x_hours', fb:, judge: 'test', loog: Loog::NULL) do |f| + f.servers_checked = count + i + end + end + end + assert_equal([count + 1], fb.query('(always)').each.first['servers_checked'], "second run is lost, seed #{seed}") + end + + def test_runs_again_on_an_old_marker_without_id + seed = Random.new_seed + count = Random.new(seed).rand(1..1_000_000) + fb = Factbase.new + m = fb.insert + m.what = 'repeatedly' + m.judge = 'test' + m.when = Time.now - (25 * 60 * 60) + m.servers_checked = count + Fbe.repeatedly('качество', 'every_x_hours', fb:, judge: 'test', loog: Loog::NULL) do |f| + f.servers_checked = count + 1 + end + assert_equal( + [count + 1], fb.query('(always)').each.first['servers_checked'], + "old marker is not updated, seed #{seed}" + ) + end + + def test_keeps_the_id_of_a_marker_that_has_one + seed = Random.new_seed + id = Random.new(seed).rand(1..1_000_000) + fb = Factbase.new + m = fb.insert + m._id = id + m.what = 'repeatedly' + m.judge = 'test' + m.when = Time.now - (25 * 60 * 60) + Fbe.repeatedly('качество', 'every_x_hours', fb:, judge: 'test', loog: Loog::NULL) do |f| + f.servers_checked = id + end + assert_equal([id], fb.query('(always)').each.first['_id'], "marker got another id, seed #{seed}") + end end