diff --git a/spec/tasks/db_create_spec.cr b/spec/tasks/db_create_spec.cr new file mode 100644 index 000000000..2fe5887b4 --- /dev/null +++ b/spec/tasks/db_create_spec.cr @@ -0,0 +1,11 @@ +require "../spec_helper" + +describe Db::Create do + it "raises a connection error when unable to connect" do + Avram.temp_config(database_to_migrate: DatabaseWithIncorrectSettings) do + expect_raises(Avram::ConnectionError, /Failed to connect to database/) do + Db::Create.new(quiet: true).call + end + end + end +end diff --git a/src/avram/migrator/runner.cr b/src/avram/migrator/runner.cr index fe25dc79a..9c8df7060 100644 --- a/src/avram/migrator/runner.cr +++ b/src/avram/migrator/runner.cr @@ -144,12 +144,12 @@ class Avram::Migrator::Runner "sudo apt-get update && sudo apt-get install postgresql postgresql-contrib".colorize(:green) end - def self.run(command : String) + def self.run(command : String, output : IO = STDOUT) error_messages = IO::Memory.new ENV["PGPASSWORD"] = self.db_password if self.db_password result = Process.run command, shell: true, - output: STDOUT, + output: output, error: error_messages ENV.delete("PGPASSWORD") if self.db_password unless result.success? diff --git a/src/avram/tasks/db/create.cr b/src/avram/tasks/db/create.cr index 9a727f2f1..b3ecc387c 100644 --- a/src/avram/tasks/db/create.cr +++ b/src/avram/tasks/db/create.cr @@ -1,4 +1,5 @@ class Db::Create < LuckyCli::Task + alias Migrator = Avram::Migrator summary "Create the database" def initialize(@quiet : Bool = false) @@ -19,8 +20,26 @@ class Db::Create < LuckyCli::Task end def call - Avram::Migrator.run do - Avram::Migrator::Runner.create_db(@quiet) + attempt_to_connect + Migrator.run do + Migrator::Runner.create_db(@quiet) end + rescue + uri = URI.parse(connection_url) + raise Avram::ConnectionError.new(uri, Avram.settings.database_to_migrate) + end + + private def connection_url : String + Avram::PostgresURL.build( + database: "", + hostname: Migrator::Runner.db_host.to_s, + username: Migrator::Runner.db_user.to_s, + password: Migrator::Runner.db_password.to_s, + port: Migrator::Runner.db_port.to_s + ) + end + + private def attempt_to_connect + Migrator::Runner.run("psql -q -l #{connection_url}", output: IO::Memory.new) end end