mirror of
https://github.com/wanderer-industries/wanderer
synced 2025-12-05 15:25:34 +00:00
127 lines
3.3 KiB
Elixir
127 lines
3.3 KiB
Elixir
defmodule Mix.Tasks.Test.Setup do
|
|
@moduledoc """
|
|
Sets up the test database environment.
|
|
|
|
This task will:
|
|
- Create the test database if it doesn't exist
|
|
- Run all migrations
|
|
- Verify the setup is correct
|
|
|
|
## Usage
|
|
|
|
mix test.setup
|
|
|
|
## Options
|
|
|
|
--force Drop the existing test database and recreate it
|
|
--quiet Reduce output verbosity
|
|
--seed Seed the database with test fixtures after setup
|
|
|
|
## Examples
|
|
|
|
mix test.setup
|
|
mix test.setup --force
|
|
mix test.setup --seed
|
|
mix test.setup --force --seed --quiet
|
|
|
|
"""
|
|
|
|
use Mix.Task
|
|
|
|
alias WandererApp.DatabaseSetup
|
|
|
|
@shortdoc "Sets up the test database environment"
|
|
|
|
@impl Mix.Task
|
|
def run(args) do
|
|
# Parse options
|
|
{opts, _} =
|
|
OptionParser.parse!(args,
|
|
strict: [force: :boolean, quiet: :boolean, seed: :boolean],
|
|
aliases: [f: :force, q: :quiet, s: :seed]
|
|
)
|
|
|
|
# Configure logger level based on quiet option
|
|
if opts[:quiet] do
|
|
Logger.configure(level: :warning)
|
|
else
|
|
Logger.configure(level: :info)
|
|
end
|
|
|
|
# Set the environment to test
|
|
Mix.env(:test)
|
|
|
|
try do
|
|
# Load the application configuration
|
|
Mix.Task.run("loadconfig")
|
|
|
|
# Start the application
|
|
{:ok, _} = Application.ensure_all_started(:wanderer_app)
|
|
|
|
if opts[:force] do
|
|
Mix.shell().info("🔄 Forcing database recreation...")
|
|
_ = DatabaseSetup.drop_database()
|
|
end
|
|
|
|
case DatabaseSetup.setup_test_database() do
|
|
:ok ->
|
|
if opts[:seed] do
|
|
Mix.shell().info("🌱 Seeding test data...")
|
|
|
|
case DatabaseSetup.seed_test_data() do
|
|
:ok ->
|
|
Mix.shell().info("✅ Test database setup and seeding completed successfully!")
|
|
|
|
{:error, reason} ->
|
|
Mix.shell().error("❌ Test data seeding failed: #{inspect(reason)}")
|
|
System.halt(1)
|
|
end
|
|
else
|
|
Mix.shell().info("✅ Test database setup completed successfully!")
|
|
end
|
|
|
|
{:error, reason} ->
|
|
Mix.shell().error("❌ Test database setup failed: #{inspect(reason)}")
|
|
print_troubleshooting_help()
|
|
System.halt(1)
|
|
end
|
|
rescue
|
|
error ->
|
|
Mix.shell().error("❌ Unexpected error during database setup: #{inspect(error)}")
|
|
print_troubleshooting_help()
|
|
System.halt(1)
|
|
end
|
|
end
|
|
|
|
defp print_troubleshooting_help do
|
|
Mix.shell().info("""
|
|
|
|
🔧 Troubleshooting Tips:
|
|
|
|
1. Ensure PostgreSQL is running:
|
|
• On macOS: brew services start postgresql
|
|
• On Ubuntu: sudo service postgresql start
|
|
• Using Docker: docker run --name postgres -e POSTGRES_PASSWORD=postgres -p 5432:5432 -d postgres
|
|
|
|
2. Check database configuration in config/test.exs:
|
|
• Username: postgres
|
|
• Password: postgres
|
|
• Host: localhost
|
|
• Port: 5432
|
|
|
|
3. Verify database permissions:
|
|
• Ensure the postgres user can create databases
|
|
• Try connecting manually: psql -U postgres -h localhost
|
|
|
|
4. For connection refused errors:
|
|
• Check if PostgreSQL is listening on the correct port
|
|
• Verify firewall settings
|
|
|
|
5. Force recreation if corrupted:
|
|
• Run: mix test.setup --force
|
|
|
|
📚 For more help, see: https://hexdocs.pm/ecto/Ecto.Adapters.Postgres.html
|
|
""")
|
|
end
|
|
end
|