Use dedicated sequence record instead of deal with issues with ids and uuids when using the previous approach

This commit is contained in:
Jorge Manrubia
2025-11-27 11:55:47 +01:00
parent 07b4c55185
commit 2061ab4ab2
8 changed files with 91 additions and 28 deletions
@@ -0,0 +1,42 @@
require "test_helper"
class Account::ExternalIdSequenceTest < ActiveSupport::TestCase
setup do
Account::ExternalIdSequence.delete_all
end
test ".next returns sequential values" do
first_value = Account::ExternalIdSequence.next
second_value = Account::ExternalIdSequence.next
third_value = Account::ExternalIdSequence.next
assert_equal first_value + 1, second_value
assert_equal second_value + 1, third_value
end
test ".next initializes from maximum external_account_id" do
max_id = Account.maximum(:external_account_id) || 0
first_value = Account::ExternalIdSequence.next
assert_equal max_id + 1, first_value
end
test ".next creates single sequence record" do
3.times { Account::ExternalIdSequence.next }
assert_equal 1, Account::ExternalIdSequence.count
end
test ".next is concurrency-safe" do
values = 20.times.map do
Thread.new do
Account::ExternalIdSequence.next
end
end.map(&:value)
assert_equal 20, values.uniq.size, "All values should be unique"
assert_equal values.min..values.max, values.sort.first..values.sort.last
assert_equal 20, values.max - values.min + 1, "Values should be sequential with no gaps"
end
end
+7 -6
View File
@@ -69,12 +69,13 @@ class AccountTest < ActiveSupport::TestCase
assert_equal account1.external_account_id + 1, account2.external_account_id
end
test "external_account_id can be overridden without creating sequence entry" do
custom_id = Account.last.id + 99999
test "external_account_id can be overridden" do
custom_id = 999999
sequence_value_before = Account::ExternalIdSequence.first_or_create!(value: 0).value
assert_no_difference -> { ExternalAccount.count } do
account = Account.create!(name: "Custom ID Account", external_account_id: custom_id)
assert_equal custom_id, account.external_account_id
end
account = Account.create!(name: "Custom ID Account", external_account_id: custom_id)
assert_equal custom_id, account.external_account_id
assert_equal sequence_value_before, Account::ExternalIdSequence.value
end
end