gas-stack/pkg/schema/parse_test.go
wispem-wantex 8245f89305
All checks were successful
CI / release-test (push) Successful in 12s
Add parsing of schema indexes
2025-08-23 16:58:41 -07:00

80 lines
2.8 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)
schema_sql, err := os.ReadFile("../../sample_data/test_schemas/food.sql")
require.NoError(t, err)
db := schema.InitDB(string(schema_sql))
schema := schema.SchemaFromDB(db)
expected_tbls := []string{"food_types", "foods", "units", "ingredients", "recipes", "iterations", "db_version"}
for _, tbl_name := range expected_tbls {
_, is_ok := schema.Tables[tbl_name]
assert.True(is_ok)
}
foods := schema.Tables["foods"]
assert.Equal(foods.TableName, "foods")
assert.Equal(foods.TypeName, "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
units_name_idx, isOk := schema.Indexes["sqlite_autoindex_units_1"]
require.True(t, isOk)
assert.True(units_name_idx.IsUnique)
assert.Equal("units", units_name_idx.TableName)
assert.Equal([]string{"name"}, units_name_idx.Columns)
// Non-unique, declared index
foods_protein_idx, isOk := schema.Indexes["foods_protein"]
require.True(t, isOk)
assert.False(foods_protein_idx.IsUnique)
assert.Equal("foods", foods_protein_idx.TableName)
assert.Equal([]string{"protein"}, foods_protein_idx.Columns)
// Multi-column index
ingr_seq_idx, isOk := schema.Indexes["sqlite_autoindex_ingredients_1"]
require.True(t, isOk)
assert.True(ingr_seq_idx.IsUnique)
assert.Equal("ingredients", ingr_seq_idx.TableName)
assert.Equal([]string{"in_recipe_id", "list_order"}, ingr_seq_idx.Columns)
}