Added users support
This commit is contained in:
271
lib/tasks/users.rake
Normal file
271
lib/tasks/users.rake
Normal file
@@ -0,0 +1,271 @@
|
||||
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
|
||||
Reference in New Issue
Block a user