80 lines
2.7 KiB
Go
80 lines
2.7 KiB
Go
package schema_test
|
|
|
|
import (
|
|
"os"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"git.offline-twitter.com/offline-labs/gas-stack/pkg/schema"
|
|
)
|
|
|
|
func TestParseSchema(t *testing.T) {
|
|
assert := assert.New(t)
|
|
schemaSQL, err := os.ReadFile("../../sample_data/test_schemas/food.sql")
|
|
require.NoError(t, err)
|
|
|
|
db := schema.InitDB(string(schemaSQL))
|
|
schema := schema.SchemaFromDB(db)
|
|
expectedTbls := []string{"food_types", "foods", "units", "ingredients", "recipes", "iterations", "db_version"}
|
|
for _, tblName := range expectedTbls {
|
|
_, isOk := schema.Tables[tblName]
|
|
assert.True(isOk)
|
|
}
|
|
|
|
foods := schema.Tables["foods"]
|
|
assert.Equal(foods.TableName, "foods")
|
|
assert.Equal(foods.GoTypeName, "Food")
|
|
assert.Equal(foods.TypeIDName, "FoodID")
|
|
assert.Equal(foods.IsStrict, true)
|
|
assert.Len(foods.Columns, 20)
|
|
assert.Equal(foods.Columns[0].Name, "rowid")
|
|
assert.Equal(foods.Columns[0].Type, "integer")
|
|
assert.Equal(foods.Columns[0].IsNotNull, false) // Explicit not-null
|
|
assert.Equal(foods.Columns[0].IsPrimaryKey, true)
|
|
assert.Equal(foods.Columns[0].IsForeignKey, false)
|
|
assert.Equal(foods.Columns[1].Name, "name")
|
|
assert.Equal(foods.Columns[1].Type, "text")
|
|
assert.Equal(foods.Columns[1].IsNotNull, true)
|
|
assert.Equal(foods.Columns[1].HasDefaultValue, false)
|
|
assert.Equal(foods.Columns[1].IsPrimaryKey, false)
|
|
assert.Equal(foods.Columns[16].Name, "mass")
|
|
assert.Equal(foods.Columns[16].Type, "real")
|
|
assert.Equal(foods.Columns[16].HasDefaultValue, true)
|
|
assert.Equal(foods.Columns[16].DefaultValue, "100")
|
|
|
|
ingredients := schema.Tables["ingredients"]
|
|
assert.Equal(ingredients.Columns[0].Name, "rowid")
|
|
assert.Equal(ingredients.Columns[0].IsPrimaryKey, true)
|
|
assert.Equal(ingredients.Columns[1].Name, "food_id")
|
|
assert.Equal(ingredients.Columns[1].IsForeignKey, true)
|
|
assert.Equal(ingredients.Columns[1].ForeignKeyTargetTable, "foods")
|
|
assert.Equal(ingredients.Columns[1].ForeignKeyTargetColumn, "rowid")
|
|
|
|
// -------
|
|
// Indexes
|
|
// -------
|
|
|
|
// Unique index
|
|
unitsNameIdx, isOk := schema.Indexes["sqlite_autoindex_units_1"]
|
|
require.True(t, isOk)
|
|
assert.True(unitsNameIdx.IsUnique)
|
|
assert.Equal("units", unitsNameIdx.TableName)
|
|
assert.Equal([]string{"name"}, unitsNameIdx.Columns)
|
|
|
|
// Non-unique, declared index
|
|
foodsProteinIdx, isOk := schema.Indexes["foods_protein"]
|
|
require.True(t, isOk)
|
|
assert.False(foodsProteinIdx.IsUnique)
|
|
assert.Equal("foods", foodsProteinIdx.TableName)
|
|
assert.Equal([]string{"protein"}, foodsProteinIdx.Columns)
|
|
|
|
// Multi-column index
|
|
ingrSeqIdx, isOk := schema.Indexes["sqlite_autoindex_ingredients_1"]
|
|
require.True(t, isOk)
|
|
assert.True(ingrSeqIdx.IsUnique)
|
|
assert.Equal("ingredients", ingrSeqIdx.TableName)
|
|
assert.Equal([]string{"in_recipe_id", "list_order"}, ingrSeqIdx.Columns)
|
|
}
|