Class: PgSqlTriggers::Testing::SafeExecutor

Inherits:
Object
  • Object
show all
Defined in:
lib/pg_sql_triggers/testing/safe_executor.rb

Instance Method Summary collapse

Constructor Details

#initialize(trigger_registry) ⇒ SafeExecutor

Returns a new instance of SafeExecutor.



6
7
8
# File 'lib/pg_sql_triggers/testing/safe_executor.rb', line 6

def initialize(trigger_registry)
  @trigger = trigger_registry
end

Instance Method Details

#test_execute(test_data: nil) ⇒ Object

Execute trigger in a transaction and rollback



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/pg_sql_triggers/testing/safe_executor.rb', line 11

def test_execute(test_data: nil)
  results = {
    function_created: false,
    trigger_created: false,
    test_insert_executed: false,
    errors: [],
    output: []
  }

  ActiveRecord::Base.transaction do
    # Step 1: Create function
    if @trigger.function_body.present?
      ActiveRecord::Base.connection.execute(@trigger.function_body)
      results[:function_created] = true
      results[:output] << "āœ“ Function created successfully"
    end

    # Step 2: Create trigger
    begin
      sql_parts = DryRun.new(@trigger).generate_sql[:sql_parts]
      trigger_part = sql_parts.find { |p| p[:type] == "CREATE TRIGGER" }
      if trigger_part && trigger_part[:sql]
        ActiveRecord::Base.connection.execute(trigger_part[:sql])
        results[:trigger_created] = true
        results[:output] << "āœ“ Trigger created successfully"
      else
        results[:errors] << "Could not find CREATE TRIGGER SQL in generated SQL parts"
      end
    rescue StandardError => e
      results[:errors] << "Error generating trigger SQL: #{e.message}"
    end

    # Step 3: Test with sample data (if provided)
    if test_data && results[:trigger_created]
      begin
        test_sql = build_test_insert(test_data)
        ActiveRecord::Base.connection.execute(test_sql)
        results[:test_insert_executed] = true
        results[:output] << "āœ“ Test insert executed successfully"
      rescue StandardError => e
        results[:errors] << "Error executing test insert: #{e.message}"
      end
    end

    results[:success] = results[:errors].empty?
  rescue ActiveRecord::StatementInvalid => e
    results[:success] = false
    results[:errors] << e.message
  ensure
    # ALWAYS ROLLBACK - this is a test!
    raise ActiveRecord::Rollback
  end

  results[:output] << "\n⚠ All changes rolled back (test mode)"
  results
end