Skip to content

Commit

Permalink
Add tests for tables/columns with comments
Browse files Browse the repository at this point in the history
Cover the cases:
* a column with a comment is added via a create table migration
* a column with a comment is added via an add column migration.
* A new table is added with a comment on the table itself.
  • Loading branch information
andrew-farries committed Jan 10, 2024
1 parent 13827d5 commit 36d94e8
Show file tree
Hide file tree
Showing 3 changed files with 147 additions and 0 deletions.
57 changes: 57 additions & 0 deletions pkg/migrations/op_add_column_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ func TestAddColumn(t *testing.T) {
Type: "integer",
Nullable: false,
Default: ptr("0"),
Comment: ptr("the age of the user"),
},
},
},
Expand Down Expand Up @@ -751,3 +752,59 @@ func TestAddColumnWithCheckConstraint(t *testing.T) {
},
}})
}

func TestAddColumnWithComment(t *testing.T) {
t.Parallel()

ExecuteTests(t, TestCases{{
name: "add column",
migrations: []migrations.Migration{
{
Name: "01_add_table",
Operations: migrations.Operations{
&migrations.OpCreateTable{
Name: "users",
Columns: []migrations.Column{
{
Name: "id",
Type: "serial",
Pk: true,
},
{
Name: "name",
Type: "varchar(255)",
Unique: true,
},
},
},
},
},
{
Name: "02_add_column",
Operations: migrations.Operations{
&migrations.OpAddColumn{
Table: "users",
Column: migrations.Column{
Name: "age",
Type: "integer",
Nullable: false,
Default: ptr("0"),
Comment: ptr("the age of the user"),
},
},
},
},
},
afterStart: func(t *testing.T, db *sql.DB) {
// The comment has been added to the underlying column.
columnName := migrations.TemporaryName("age")
ColumnMustHaveComment(t, db, "public", "users", columnName, "the age of the user")
},
afterRollback: func(t *testing.T, db *sql.DB) {
},
afterComplete: func(t *testing.T, db *sql.DB) {
// The comment is still present on the underlying column.
ColumnMustHaveComment(t, db, "public", "users", "age", "the age of the user")
},
}})
}
48 changes: 48 additions & 0 deletions pkg/migrations/op_common_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,20 @@ func ColumnMustHaveType(t *testing.T, db *sql.DB, schema, table, column, expecte
}
}

func ColumnMustHaveComment(t *testing.T, db *sql.DB, schema, table, column, expectedComment string) {
t.Helper()
if !columnHasComment(t, db, schema, table, column, expectedComment) {
t.Fatalf("Expected column %q to have comment %q", column, expectedComment)
}
}

func TableMustHaveComment(t *testing.T, db *sql.DB, schema, table, expectedComment string) {
t.Helper()
if !tableHasComment(t, db, schema, table, expectedComment) {
t.Fatalf("Expected table %q to have comment %q", table, expectedComment)
}
}

func TableMustHaveColumnCount(t *testing.T, db *sql.DB, schema, table string, n int) {
t.Helper()
if !tableMustHaveColumnCount(t, db, schema, table, n) {
Expand Down Expand Up @@ -400,6 +414,40 @@ func columnHasType(t *testing.T, db *sql.DB, schema, table, column, expectedType
return expectedType == actualType
}

func columnHasComment(t *testing.T, db *sql.DB, schema, table, column, expectedComment string) bool {
t.Helper()

var actualComment string
err := db.QueryRow(fmt.Sprintf(`
SELECT col_description(
%[1]s::regclass,
(SELECT attnum FROM pg_attribute WHERE attname=%[2]s and attrelid=%[1]s::regclass)
)`,
pq.QuoteLiteral(fmt.Sprintf("%s.%s", schema, table)),
pq.QuoteLiteral(column)),
).Scan(&actualComment)
if err != nil {
t.Fatal(err)
}

return expectedComment == actualComment
}

func tableHasComment(t *testing.T, db *sql.DB, schema, table, expectedComment string) bool {
t.Helper()

var actualComment string
err := db.QueryRow(fmt.Sprintf(`
SELECT obj_description(%[1]s::regclass, 'pg_class')`,
pq.QuoteLiteral(fmt.Sprintf("%s.%s", schema, table))),
).Scan(&actualComment)
if err != nil {
t.Fatal(err)
}

return expectedComment == actualComment
}

func MustInsert(t *testing.T, db *sql.DB, schema, version, table string, record map[string]string) {
t.Helper()

Expand Down
42 changes: 42 additions & 0 deletions pkg/migrations/op_create_table_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -230,6 +230,48 @@ func TestCreateTable(t *testing.T) {
})
},
},
{
name: "create table with column and table comments",
migrations: []migrations.Migration{
{
Name: "01_create_table",
Operations: migrations.Operations{
&migrations.OpCreateTable{
Name: "users",
Comment: ptr("the users table"),
Columns: []migrations.Column{
{
Name: "id",
Type: "serial",
Pk: true,
},
{
Name: "name",
Type: "varchar(255)",
Unique: true,
Comment: ptr("the username"),
},
},
},
},
},
},
afterStart: func(t *testing.T, db *sql.DB) {
tableName := migrations.TemporaryName("users")
// The comment has been added to the underlying table.
TableMustHaveComment(t, db, "public", tableName, "the users table")
// The comment has been added to the underlying column.
ColumnMustHaveComment(t, db, "public", tableName, "name", "the username")
},
afterRollback: func(t *testing.T, db *sql.DB) {
},
afterComplete: func(t *testing.T, db *sql.DB) {
// The comment is still present on the underlying table.
TableMustHaveComment(t, db, "public", "users", "the users table")
// The comment is still present on the underlying column.
ColumnMustHaveComment(t, db, "public", "users", "name", "the username")
},
},
})
}

Expand Down

0 comments on commit 36d94e8

Please sign in to comment.