mirror of
https://github.com/empayre/fleet.git
synced 2024-11-06 17:05:18 +00:00
38b8c9cc58
#15555 Probably the best way to review this is commit by commit: - First commit does the actual moving. - Second commit fixes golangci-lint issues (in the least effort way to avoid refactoring or rearrangement of some of the code). - Third commit moves a printf to before the migration step is executed. In the past some customers hitting migration issues (like migration steps hanging or taking long to execute) and wanted to know which one was it. The only way to know was to look at the repository and looking for the next migration after the last one logged. Checks: - [X] Manual QA for all new/changed functionality Manual tests: - `make fleet && make db-reset`. - Adding a new migration via `make migration name=Foobar` and then running `./build/fleet prepare db`. - Enrolling a new device to Fleet (smoke test).
148 lines
2.7 KiB
Go
148 lines
2.7 KiB
Go
package goose
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func TestSemicolons(t *testing.T) {
|
|
|
|
type testData struct {
|
|
line string
|
|
result bool
|
|
}
|
|
|
|
tests := []testData{
|
|
{
|
|
line: "END;",
|
|
result: true,
|
|
},
|
|
{
|
|
line: "END; -- comment",
|
|
result: true,
|
|
},
|
|
{
|
|
line: "END ; -- comment",
|
|
result: true,
|
|
},
|
|
{
|
|
line: "END -- comment",
|
|
result: false,
|
|
},
|
|
{
|
|
line: "END -- comment ;",
|
|
result: false,
|
|
},
|
|
{
|
|
line: "END \" ; \" -- comment",
|
|
result: false,
|
|
},
|
|
}
|
|
|
|
for _, test := range tests {
|
|
r := endsWithSemicolon(test.line)
|
|
if r != test.result {
|
|
t.Errorf("incorrect semicolon. got %v, want %v", r, test.result)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestSplitStatements(t *testing.T) {
|
|
|
|
type testData struct {
|
|
sql string
|
|
direction bool
|
|
count int
|
|
}
|
|
|
|
tests := []testData{
|
|
{
|
|
sql: functxt,
|
|
direction: true,
|
|
count: 2,
|
|
},
|
|
{
|
|
sql: functxt,
|
|
direction: false,
|
|
count: 2,
|
|
},
|
|
{
|
|
sql: multitxt,
|
|
direction: true,
|
|
count: 2,
|
|
},
|
|
{
|
|
sql: multitxt,
|
|
direction: false,
|
|
count: 2,
|
|
},
|
|
}
|
|
|
|
for _, test := range tests {
|
|
stmts := splitSQLStatements(strings.NewReader(test.sql), test.direction)
|
|
if len(stmts) != test.count {
|
|
t.Errorf("incorrect number of stmts. got %v, want %v", len(stmts), test.count)
|
|
}
|
|
}
|
|
}
|
|
|
|
var functxt = `-- +goose Up
|
|
CREATE TABLE IF NOT EXISTS histories (
|
|
id BIGSERIAL PRIMARY KEY,
|
|
current_value varchar(2000) NOT NULL,
|
|
created_at timestamp with time zone NOT NULL
|
|
);
|
|
|
|
-- +goose StatementBegin
|
|
CREATE OR REPLACE FUNCTION histories_partition_creation( DATE, DATE )
|
|
returns void AS $$
|
|
DECLARE
|
|
create_query text;
|
|
BEGIN
|
|
FOR create_query IN SELECT
|
|
'CREATE TABLE IF NOT EXISTS histories_'
|
|
|| TO_CHAR( d, 'YYYY_MM' )
|
|
|| ' ( CHECK( created_at >= timestamp '''
|
|
|| TO_CHAR( d, 'YYYY-MM-DD 00:00:00' )
|
|
|| ''' AND created_at < timestamp '''
|
|
|| TO_CHAR( d + INTERVAL '1 month', 'YYYY-MM-DD 00:00:00' )
|
|
|| ''' ) ) inherits ( histories );'
|
|
FROM generate_series( $1, $2, '1 month' ) AS d
|
|
LOOP
|
|
EXECUTE create_query;
|
|
END LOOP; -- LOOP END
|
|
END; -- FUNCTION END
|
|
$$
|
|
language plpgsql;
|
|
-- +goose StatementEnd
|
|
|
|
-- +goose Down
|
|
drop function histories_partition_creation(DATE, DATE);
|
|
drop TABLE histories;
|
|
`
|
|
|
|
// test multiple up/down transitions in a single script
|
|
var multitxt = `-- +goose Up
|
|
CREATE TABLE post (
|
|
id int NOT NULL,
|
|
title text,
|
|
body text,
|
|
PRIMARY KEY(id)
|
|
);
|
|
|
|
-- +goose Down
|
|
DROP TABLE post;
|
|
|
|
-- +goose Up
|
|
CREATE TABLE fancier_post (
|
|
id int NOT NULL,
|
|
title text,
|
|
body text,
|
|
created_on timestamp without time zone,
|
|
PRIMARY KEY(id)
|
|
);
|
|
|
|
-- +goose Down
|
|
DROP TABLE fancier_post;
|
|
`
|