| package schema | |
| import ( | |
| "context" | |
| "fmt" | |
| "math/rand" | |
| "testing" | |
| "time" | |
| "github.com/jackc/pgx/v4/pgxpool" | |
| "github.com/stretchr/testify/require" | |
| "go.skia.org/infra/go/emulators" | |
| "go.skia.org/infra/go/emulators/cockroachdb_instance" | |
| ) | |
| const databaseNamePrefix = "schema" | |
| type Machines struct{} | |
| type Tasks struct{} | |
| type Tables struct { | |
| Machines []Machines | |
| Tasks []Tasks | |
| } | |
| func TestTableNames_NonEmpytTables_ReturnsTableNames(t *testing.T) { | |
| require.Equal(t, []string{"machines", "tasks"}, TableNames(Tables{})) | |
| } | |
| func TestTableNames_EmpytTables_ReturnsEmptySlice(t *testing.T) { | |
| require.Empty(t, TableNames(struct{}{})) | |
| } | |
| const schema = `CREATE TABLE IF NOT EXISTS Machines ( | |
| dimensions JSONB NOT NULL, | |
| task_request JSONB, | |
| task_started TIMESTAMPTZ NOT NULL DEFAULT (0)::TIMESTAMPTZ, | |
| machine_id STRING PRIMARY KEY AS (dimensions->'id'->>0) STORED, | |
| running_task bool AS (task_request IS NOT NULL) STORED, | |
| INVERTED INDEX dimensions_gin (dimensions), | |
| INDEX by_running_task (running_task) | |
| ); | |
| CREATE TABLE IF NOT EXISTS Tasks ( | |
| result JSONB NOT NULL, | |
| id STRING NOT NULL PRIMARY KEY, | |
| machine_id STRING NOT NULL, | |
| finished TIMESTAMPTZ NOT NULL, | |
| status STRING NOT NULL DEFAULT '', | |
| INDEX by_machine_id (machine_id), | |
| INDEX by_status (status) | |
| ); | |
| ` | |
| func setupForTest(t *testing.T) *pgxpool.Pool { | |
| cockroachdb_instance.Require(t) | |
| rand.Seed(time.Now().UnixNano()) | |
| databaseName := fmt.Sprintf("%s_%d", databaseNamePrefix, rand.Uint64()) | |
| host := emulators.GetEmulatorHostEnvVar(emulators.CockroachDB) | |
| connectionString := fmt.Sprintf("postgresql://root@%s/%s?sslmode=disable", host, databaseName) | |
| ctx := context.Background() | |
| db, err := pgxpool.Connect(ctx, connectionString) | |
| require.NoError(t, err) | |
| // Create a database in cockroachdb just for this test. | |
| _, err = db.Exec(ctx, fmt.Sprintf(` | |
| CREATE DATABASE %s; | |
| SET DATABASE = %s;`, databaseName, databaseName)) | |
| require.NoError(t, err) | |
| _, err = db.Exec(ctx, schema) | |
| require.NoError(t, err) | |
| t.Cleanup(func() { | |
| db.Close() | |
| }) | |
| return db | |
| } | |
| func TestGetDescriptionCDB(t *testing.T) { | |
| db := setupForTest(t) | |
| desc, err := GetDescription(context.Background(), db, Tables{}, CockroachDBType) | |
| require.NoError(t, err) | |
| expected := Description{ | |
| ColumnNameAndType: map[string]string{ | |
| "machines.dimensions": "jsonb def: nullable:NO", | |
| "machines.machine_id": "text def: nullable:NO", | |
| "machines.running_task": "boolean def: nullable:YES", | |
| "machines.task_request": "jsonb def: nullable:YES", | |
| "machines.task_started": "timestamp with time zone def:0:::INT8::TIMESTAMPTZ nullable:NO", | |
| "tasks.finished": "timestamp with time zone def: nullable:NO", | |
| "tasks.id": "text def: nullable:NO", | |
| "tasks.machine_id": "text def: nullable:NO", | |
| "tasks.result": "jsonb def: nullable:NO", | |
| "tasks.status": "text def:'':::STRING nullable:NO", | |
| }, | |
| IndexNames: []string{ | |
| "machines.dimensions_gin", | |
| "machines.by_running_task", | |
| "tasks.by_status", | |
| "tasks.by_machine_id", | |
| }, | |
| } | |
| require.Equal(t, expected, *desc) | |
| } |