package postgresql import ( "database/sql" "errors" "fmt" "testing" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" ) func TestAccPostgresqlDatabase_Basic(t *testing.T) { resource.Test(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, Providers: testAccProviders, CheckDestroy: testAccCheckPostgresqlDatabaseDestroy, Steps: []resource.TestStep{ { Config: testAccPostgreSQLDatabaseConfig, Check: resource.ComposeTestCheckFunc( testAccCheckPostgresqlDatabaseExists("postgresql_database.mydb"), resource.TestCheckResourceAttr( "postgresql_database.mydb", "name", "mydb"), resource.TestCheckResourceAttr( "postgresql_database.mydb", "owner", "myrole"), resource.TestCheckResourceAttr( "postgresql_database.default_opts", "owner", "myrole"), resource.TestCheckResourceAttr( "postgresql_database.default_opts", "name", "default_opts_name"), resource.TestCheckResourceAttr( "postgresql_database.default_opts", "template", "template0"), resource.TestCheckResourceAttr( "postgresql_database.default_opts", "encoding", "UTF8"), resource.TestCheckResourceAttr( "postgresql_database.default_opts", "lc_collate", "C"), resource.TestCheckResourceAttr( "postgresql_database.default_opts", "lc_ctype", "C"), resource.TestCheckResourceAttr( "postgresql_database.default_opts", "tablespace_name", "pg_default"), resource.TestCheckResourceAttr( "postgresql_database.default_opts", "connection_limit", "-1"), resource.TestCheckResourceAttr( "postgresql_database.default_opts", "allow_connections", "true"), resource.TestCheckResourceAttr( "postgresql_database.default_opts", "is_template", "false"), resource.TestCheckResourceAttr( "postgresql_database.modified_opts", "owner", "myrole"), resource.TestCheckResourceAttr( "postgresql_database.modified_opts", "name", "custom_template_db"), resource.TestCheckResourceAttr( "postgresql_database.modified_opts", "template", "template0"), resource.TestCheckResourceAttr( "postgresql_database.modified_opts", "encoding", "UTF8"), resource.TestCheckResourceAttr( "postgresql_database.modified_opts", "lc_collate", "en_US.UTF-8"), resource.TestCheckResourceAttr( "postgresql_database.modified_opts", "lc_ctype", "en_US.UTF-8"), resource.TestCheckResourceAttr( "postgresql_database.modified_opts", "tablespace_name", "pg_default"), resource.TestCheckResourceAttr( "postgresql_database.modified_opts", "connection_limit", "10"), resource.TestCheckResourceAttr( "postgresql_database.modified_opts", "allow_connections", "false"), resource.TestCheckResourceAttr( "postgresql_database.modified_opts", "is_template", "true"), resource.TestCheckResourceAttr( "postgresql_database.pathological_opts", "owner", "myrole"), resource.TestCheckResourceAttr( "postgresql_database.pathological_opts", "name", "bad_template_db"), resource.TestCheckResourceAttr( "postgresql_database.pathological_opts", "template", "template0"), resource.TestCheckResourceAttr( "postgresql_database.pathological_opts", "encoding", "LATIN1"), resource.TestCheckResourceAttr( "postgresql_database.pathological_opts", "lc_collate", "C"), resource.TestCheckResourceAttr( "postgresql_database.pathological_opts", "lc_ctype", "C"), resource.TestCheckResourceAttr( "postgresql_database.pathological_opts", "tablespace_name", "pg_default"), resource.TestCheckResourceAttr( "postgresql_database.pathological_opts", "connection_limit", "0"), resource.TestCheckResourceAttr( "postgresql_database.pathological_opts", "allow_connections", "true"), resource.TestCheckResourceAttr( "postgresql_database.pathological_opts", "is_template", "true"), ), }, }, }) } func TestAccPostgresqlDatabase_DefaultOwner(t *testing.T) { resource.Test(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, Providers: testAccProviders, CheckDestroy: testAccCheckPostgresqlDatabaseDestroy, Steps: []resource.TestStep{ { Config: testAccPostgreSQLDatabaseConfig, Check: resource.ComposeTestCheckFunc( testAccCheckPostgresqlDatabaseExists("postgresql_database.mydb_default_owner"), resource.TestCheckResourceAttr( "postgresql_database.mydb_default_owner", "name", "mydb_default_owner"), resource.TestCheckResourceAttrSet( "postgresql_database.mydb_default_owner", "owner"), ), }, }, }) } func testAccCheckPostgresqlDatabaseDestroy(s *terraform.State) error { client := testAccProvider.Meta().(*Client) for _, rs := range s.RootModule().Resources { if rs.Type != "postgresql_database" { continue } exists, err := checkDatabaseExists(client, rs.Primary.ID) if err != nil { return fmt.Errorf("Error checking db %s", err) } if exists { return errors.New("Db still exists after destroy") } } return nil } func testAccCheckPostgresqlDatabaseExists(n string) resource.TestCheckFunc { return func(s *terraform.State) error { rs, ok := s.RootModule().Resources[n] if !ok { return fmt.Errorf("Resource not found: %s", n) } if rs.Primary.ID == "" { return errors.New("No ID is set") } client := testAccProvider.Meta().(*Client) exists, err := checkDatabaseExists(client, rs.Primary.ID) if err != nil { return fmt.Errorf("Error checking db %s", err) } if !exists { return errors.New("Db not found") } return nil } } func checkDatabaseExists(client *Client, dbName string) (bool, error) { conn, err := client.Connect() if err != nil { return false, err } defer conn.Close() var _rez int err = conn.QueryRow("SELECT 1 from pg_database d WHERE datname=$1", dbName).Scan(&_rez) switch { case err == sql.ErrNoRows: return false, nil case err != nil: return false, fmt.Errorf("Error reading info about database: %s", err) default: return true, nil } } var testAccPostgreSQLDatabaseConfig = ` resource "postgresql_role" "myrole" { name = "myrole" login = true } resource "postgresql_database" "mydb" { name = "mydb" owner = "${postgresql_role.myrole.name}" } resource "postgresql_database" "mydb2" { name = "mydb2" owner = "${postgresql_role.myrole.name}" } resource "postgresql_database" "default_opts" { name = "default_opts_name" owner = "${postgresql_role.myrole.name}" template = "template0" encoding = "UTF8" lc_collate = "C" lc_ctype = "C" tablespace_name = "pg_default" connection_limit = -1 allow_connections = true is_template = false } resource "postgresql_database" "modified_opts" { name = "custom_template_db" owner = "${postgresql_role.myrole.name}" template = "template0" encoding = "UTF8" lc_collate = "en_US.UTF-8" lc_ctype = "en_US.UTF-8" tablespace_name = "pg_default" connection_limit = 10 allow_connections = false is_template = true } resource "postgresql_database" "pathological_opts" { name = "bad_template_db" owner = "${postgresql_role.myrole.name}" template = "template0" encoding = "LATIN1" lc_collate = "C" lc_ctype = "C" tablespace_name = "pg_default" connection_limit = 0 allow_connections = true is_template = true } resource "postgresql_database" "mydb_default_owner" { name = "mydb_default_owner" } `