Files
gas-stack/pkg/schema/lint/checks_test.go

76 lines
2.3 KiB
Go

package lint_test
import (
"slices"
"testing"
_ "github.com/mattn/go-sqlite3"
"github.com/stretchr/testify/require"
"git.offline-twitter.com/offline-labs/gas-stack/pkg/schema"
"git.offline-twitter.com/offline-labs/gas-stack/pkg/schema/lint"
)
func TestFailureCases(t *testing.T) {
testCases := []struct {
sqlFile string
expectedFailures []string
}{
{"test_schemas/failure-has-foreign-key-no-index.sql", []string{"require_indexes_for_foreign_keys"}},
{"test_schemas/failure-has-ints.sql", []string{"forbid_int_type"}},
{"test_schemas/failure-has-nulls.sql", []string{"require_not_null"}},
{"test_schemas/failure-no-strict.sql", []string{"require_strict"}},
{"test_schemas/failure-rowid-on-without-rowid.sql", []string{"forbid_rowid_on_without_rowid_table"}},
{"test_schemas/failure-missing-rowid.sql", []string{"require_explicit_rowid"}},
{"test_schemas/failure-non-integer-rowid.sql", []string{"require_explicit_rowid"}},
{"test_schemas/failure-non-primary-key-rowid.sql", []string{"require_explicit_rowid"}},
{"test_schemas/failure-total.sql", []string{
"require_not_null",
"require_explicit_primary_key",
"forbid_int_type",
"require_strict",
"require_indexes_for_foreign_keys",
"require_explicit_rowid",
}},
}
for _, testCase := range testCases {
t.Run(testCase.sqlFile, func(t *testing.T) {
schema, err := schema.SchemaFromSQLFile(testCase.sqlFile)
require.NoError(t, err)
for _, check := range lint.Checks {
results := check.Execute(schema)
isFailure := len(results) > 0
isFailureExpected := slices.Contains(testCase.expectedFailures, check.Name)
if isFailure != isFailureExpected {
if isFailureExpected {
t.Errorf("Expected check '%s' to fail, but it passed: %s", check.Name, testCase.sqlFile)
} else {
t.Errorf("Expected check '%s' to pass, but it failed: %s (%q.%q)",
check.Name,
testCase.sqlFile,
results[0].TableName, results[0].ColumnName,
)
}
}
}
})
}
}
func TestSuccessCase(t *testing.T) {
file := "test_schemas/success.sql"
schema, err := schema.SchemaFromSQLFile(file)
require.NoError(t, err)
for _, check := range lint.Checks {
results := check.Execute(schema)
for _, r := range results {
t.Errorf("Unexpected error in file %q: %#v", file, r)
}
}
}