File: row_lock_shared_examples.rb

package info (click to toggle)
gitlab 17.6.5-19
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 629,368 kB
  • sloc: ruby: 1,915,304; javascript: 557,307; sql: 60,639; xml: 6,509; sh: 4,567; makefile: 1,239; python: 406
file content (31 lines) | stat: -rw-r--r-- 1,188 bytes parent folder | download
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
28
29
30
31
# 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 |timeout: false|
  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

    expect(recorded_queries.log).to include a_string_matching 'LOCK_TIMEOUT' if timeout
  end
end

RSpec.shared_examples 'locked rows' do |timeout: false|
  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

    expect(recorded_queries.log).to include a_string_matching 'LOCK_TIMEOUT' if timeout
  end
end