namespace :users do desc "Create a new user" task :create, %i[username email password company_id] => :environment do |_t, args| username = args[:username] || ask("Username: ") email = args[:email] || ask("Email: ") password = args[:password] || ask("Password: ") { |q| q.echo = "*" } company_id = find_or_validate_company(args[:company_id]) user = User.new( username: username, email: email, password: password, password_confirmation: password, company_id: company_id ) if user.save puts "User created successfully!" puts " Username: #{user.username}" puts " Email: #{user.email}" puts " Company: #{user.company.name}" else puts "Failed to create user:" user.errors.full_messages.each { |msg| puts " - #{msg}" } exit 1 end end desc "Change user password" task :change_password, %i[username new_password] => :environment do |_t, args| username = args[:username] || ask("Username: ") new_password = args[:new_password] || ask("New password: ") { |q| q.echo = "*" } user = User.find_by(username: username) unless user puts "User '#{username}' not found." exit 1 end user.password = new_password user.password_confirmation = new_password if user.save puts "Password changed successfully for user '#{username}'" else puts "Failed to change password:" user.errors.full_messages.each { |msg| puts " - #{msg}" } exit 1 end end desc "Delete a user" task :delete, %i[username] => :environment do |_t, args| username = args[:username] || ask("Username to delete: ") user = User.find_by(username: username) unless user puts "User '#{username}' not found." exit 1 end puts "User details:" puts " Username: #{user.username}" puts " Email: #{user.email}" puts " Company: #{user.company.name}" confirm = ask("Are you sure you want to delete this user? (yes/no): ") unless confirm.downcase == 'yes' puts "User deletion cancelled." exit 0 end if user.destroy puts "User '#{username}' deleted successfully." else puts "Failed to delete user:" user.errors.full_messages.each { |msg| puts " - #{msg}" } exit 1 end end desc "List all users" task list: :environment do users = User.includes(:company).order(:username) if users.empty? puts "No users found." exit 0 end puts "Users List:" puts "=" * 80 printf "%-20s %-30s %-20s %s\n", "USERNAME", "EMAIL", "COMPANY", "CREATED" puts "-" * 80 users.each do |user| printf "%-20s %-30s %-20s %s\n", user.username, user.email, user.company.name, user.created_at.strftime("%Y-%m-%d") end puts "-" * 80 puts "Total: #{users.count} users" end desc "Run automated CRUD tests for user management" task test_crud: :environment do puts "=" * 60 puts "AUTOMATED USER CRUD TEST" puts "=" * 60 # Test 1: Create users puts "\n1. TESTING USER CREATION (dodavanje):" puts "-" * 40 test_users = [ { username: 'testuser1', email: 'test1@example.com', password: 'testpass123' }, { username: 'testuser2', email: 'test2@example.com', password: 'testpass456' } ] test_users.each do |user_data| company_id = find_or_validate_company(nil) user = User.new( username: user_data[:username], email: user_data[:email], password: user_data[:password], password_confirmation: user_data[:password], company_id: company_id ) if user.save puts "✓ Created user: #{user.username} (#{user.email})" else puts "✗ Failed to create #{user_data[:username]}: #{user.errors.full_messages.join(', ')}" end end # Test 2: List users puts "\n2. TESTING USER LISTING:" puts "-" * 40 users = User.where("username LIKE ?", "%test%").order(:username) users.each do |user| puts "✓ Found user: #{user.username} (#{user.email}) - Company: #{user.company.name}" end # Test 3: Change password (mijenjanje sifre) puts "\n3. TESTING PASSWORD CHANGE (mijenjanje sifre):" puts "-" * 40 test_user = User.find_by(username: 'testuser1') if test_user test_user.password = 'newpassword789' test_user.password_confirmation = 'newpassword789' if test_user.save puts "✓ Password changed for: #{test_user.username}" else puts "✗ Failed to change password: #{test_user.errors.full_messages.join(', ')}" end end # Test 4: Show user details puts "\n4. TESTING USER DETAILS:" puts "-" * 40 if test_user puts "✓ User: #{test_user.username}" puts " Email: #{test_user.email}" puts " Company: #{test_user.company.name}" puts " Created: #{test_user.created_at.strftime('%Y-%m-%d %H:%M:%S')}" end # Test 5: Delete user (brisanje) puts "\n5. TESTING USER DELETION (brisanje):" puts "-" * 40 delete_user = User.find_by(username: 'testuser2') if delete_user username = delete_user.username if delete_user.destroy puts "✓ Deleted user: #{username}" else puts "✗ Failed to delete user: #{delete_user.errors.full_messages.join(', ')}" end end # Test 6: Final cleanup puts "\n6. CLEANUP:" puts "-" * 40 remaining_test_users = User.where("username LIKE ? OR email LIKE ?", "%test%", "%test%") deleted_count = remaining_test_users.count remaining_test_users.destroy_all puts "✓ Cleaned up #{deleted_count} remaining test users" puts "\n" + ("=" * 60) puts "CRUD TEST COMPLETED SUCCESSFULLY!" puts "All operations (dodavanje, mijenjanje sifre, brisanje) tested." puts "=" * 60 end desc "Clean up test users (users with 'test' in username or email)" task cleanup_test_users: :environment do test_users = User.where("username LIKE ? OR email LIKE ?", "%test%", "%test%") if test_users.empty? puts "No test users found to clean up." return end puts "Found #{test_users.count} test users to delete:" test_users.each do |user| puts " - #{user.username} (#{user.email})" end confirm = ask("Delete all test users? (yes/no): ") if confirm.downcase == 'yes' deleted_count = test_users.count test_users.destroy_all puts "Deleted #{deleted_count} test users successfully." else puts "Cleanup cancelled." end end desc "Show user details" task :show, %i[username] => :environment do |_t, args| username = args[:username] || ask("Username: ") user = User.find_by(username: username) unless user puts "User '#{username}' not found." exit 1 end puts "User Details:" puts " Username: #{user.username}" puts " Email: #{user.email}" puts " Company: #{user.company.name} (ID: #{user.company.id})" puts " Created: #{user.created_at.strftime('%Y-%m-%d %H:%M:%S')}" puts " Updated: #{user.updated_at.strftime('%Y-%m-%d %H:%M:%S')}" end private def find_or_validate_company(company_id) if company_id.blank? company = Company.first unless company puts "No companies found. Please create a company first." exit 1 end puts "Using company: #{company.name} (ID: #{company.id})" company.id else company = Company.find_by(id: company_id) unless company puts "Company with ID #{company_id} not found." exit 1 end company_id end end def ask(prompt, &_block) require 'io/console' print prompt if block_given? yield.call else $stdin.gets.chomp end end end