summaryrefslogtreecommitdiff
path: root/spec/support/shared_examples/row_lock_shared_examples.rb
blob: 24fb2d41bdfcbe2af66e353a56c1ffe36a80ff50 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# frozen_string_literal: true

# Ensure that a SQL command to lock this row(s) was requested.
# Ensure a transaction also occurred.
# Be careful! This form of spec is not foolproof, but better than nothing.

RSpec.shared_examples 'locked row' do
  it "has locked row" do
    table_name = row.class.table_name
    ids_regex = /SELECT.*FROM.*#{table_name}.*"#{table_name}"."id" = #{row.id}.+FOR NO KEY UPDATE/m

    expect(recorded_queries.log).to include a_string_matching 'SAVEPOINT'
    expect(recorded_queries.log).to include a_string_matching ids_regex
  end
end

RSpec.shared_examples 'locked rows' do
  it "has locked rows" do
    table_name = rows.first.class.table_name

    row_ids = rows.map(&:id).join(', ')
    ids_regex = /SELECT.+FROM.+"#{table_name}".+"#{table_name}"."id" IN \(#{row_ids}\).+FOR UPDATE/m

    expect(recorded_queries.log).to include a_string_matching 'SAVEPOINT'
    expect(recorded_queries.log).to include a_string_matching ids_regex
  end
end