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) }