|
| 1 | +# frozen_string_literal: true |
| 2 | + |
| 3 | +namespace :db do |
| 4 | + desc 'Test database connection and RLS status' |
| 5 | + task test_connection: :environment do |
| 6 | + puts '=' * 80 |
| 7 | + puts 'DATABASE CONNECTION TEST' |
| 8 | + puts '=' * 80 |
| 9 | + puts '' |
| 10 | + |
| 11 | + # Test basic connection |
| 12 | + puts '1. Testing database connection...' |
| 13 | + begin |
| 14 | + ActiveRecord::Base.connection.execute('SELECT 1') |
| 15 | + puts ' Connection OK' |
| 16 | + rescue StandardError => e |
| 17 | + puts " Connection FAILED: #{e.message}" |
| 18 | + exit 1 |
| 19 | + end |
| 20 | + |
| 21 | + # Get database info |
| 22 | + puts '' |
| 23 | + puts '2. Database info:' |
| 24 | + result = ActiveRecord::Base.connection.execute( |
| 25 | + "SELECT current_database(), current_user, version()" |
| 26 | + ).first |
| 27 | + puts " Database: #{result['current_database']}" |
| 28 | + puts " User: #{result['current_user']}" |
| 29 | + puts " Version: #{result['version']}" |
| 30 | + |
| 31 | + # Check RLS status |
| 32 | + puts '' |
| 33 | + puts '3. Checking RLS status on tables:' |
| 34 | + tables = %w[users organizations players matches] |
| 35 | + tables.each do |table| |
| 36 | + result = ActiveRecord::Base.connection.execute( |
| 37 | + "SELECT rowsecurity FROM pg_tables WHERE schemaname = 'public' AND tablename = '#{table}'" |
| 38 | + ).first |
| 39 | + |
| 40 | + if result |
| 41 | + status = result['rowsecurity'] ? ' ENABLED' : ' DISABLED' |
| 42 | + puts " #{table}: #{status}" |
| 43 | + else |
| 44 | + puts " #{table}: TABLE NOT FOUND" |
| 45 | + end |
| 46 | + end |
| 47 | + |
| 48 | + # Test user query |
| 49 | + puts '' |
| 50 | + puts '4. Testing User.count (should work with RLS disabled):' |
| 51 | + begin |
| 52 | + count = User.count |
| 53 | + puts " Success! Found #{count} users" |
| 54 | + rescue StandardError => e |
| 55 | + puts " FAILED: #{e.message}" |
| 56 | + puts " This usually means RLS is blocking the query" |
| 57 | + end |
| 58 | + |
| 59 | + # Test User.unscoped |
| 60 | + puts '' |
| 61 | + puts '5. Testing User.unscoped.count (bypasses RLS):' |
| 62 | + begin |
| 63 | + count = User.unscoped.count |
| 64 | + puts " Success! Found #{count} users" |
| 65 | + rescue StandardError => e |
| 66 | + puts " FAILED: #{e.message}" |
| 67 | + end |
| 68 | + |
| 69 | + # Test finding specific user |
| 70 | + puts '' |
| 71 | + puts '6. Testing User.find_by(email: "coach@pain.gg"):' |
| 72 | + begin |
| 73 | + user = User.unscoped.find_by(email: 'coach@pain.gg') |
| 74 | + if user |
| 75 | + puts " Found user: #{user.email} (#{user.organization.name})" |
| 76 | + else |
| 77 | + puts ' User not found in database' |
| 78 | + end |
| 79 | + rescue StandardError => e |
| 80 | + puts " FAILED: #{e.message}" |
| 81 | + end |
| 82 | + |
| 83 | + puts '' |
| 84 | + puts '=' * 80 |
| 85 | + puts 'TEST COMPLETE' |
| 86 | + puts '=' * 80 |
| 87 | + end |
| 88 | +end |
0 commit comments