Use dedicated sequence record instead of deal with issues with ids and uuids when using the previous approach
This commit is contained in:
@@ -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
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user