feat(writer): 🎉 Add support for unique constraints in schema generation
All checks were successful
CI / Test (1.24) (push) Successful in -26m26s
CI / Test (1.25) (push) Successful in -26m18s
CI / Lint (push) Successful in -26m25s
CI / Build (push) Successful in -26m35s
Release / Build and Release (push) Successful in -26m29s
Integration Tests / Integration Tests (push) Successful in -26m11s
All checks were successful
CI / Test (1.24) (push) Successful in -26m26s
CI / Test (1.25) (push) Successful in -26m18s
CI / Lint (push) Successful in -26m25s
CI / Build (push) Successful in -26m35s
Release / Build and Release (push) Successful in -26m29s
Integration Tests / Integration Tests (push) Successful in -26m11s
* Implement unique constraint handling in GenerateSchemaStatements * Add writeUniqueConstraints method for generating SQL statements * Create unit test for unique constraints in writer_test.go
This commit is contained in:
@@ -164,6 +164,76 @@ func TestWriteForeignKeys(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestWriteUniqueConstraints(t *testing.T) {
|
||||
// Create a test database with unique constraints
|
||||
db := models.InitDatabase("testdb")
|
||||
schema := models.InitSchema("public")
|
||||
|
||||
// Create table with unique constraints
|
||||
table := models.InitTable("users", "public")
|
||||
|
||||
// Add columns
|
||||
emailCol := models.InitColumn("email", "users", "public")
|
||||
emailCol.Type = "varchar(255)"
|
||||
emailCol.NotNull = true
|
||||
table.Columns["email"] = emailCol
|
||||
|
||||
guidCol := models.InitColumn("guid", "users", "public")
|
||||
guidCol.Type = "uuid"
|
||||
guidCol.NotNull = true
|
||||
table.Columns["guid"] = guidCol
|
||||
|
||||
// Add unique constraints
|
||||
emailConstraint := &models.Constraint{
|
||||
Name: "uq_email",
|
||||
Type: models.UniqueConstraint,
|
||||
Schema: "public",
|
||||
Table: "users",
|
||||
Columns: []string{"email"},
|
||||
}
|
||||
table.Constraints["uq_email"] = emailConstraint
|
||||
|
||||
guidConstraint := &models.Constraint{
|
||||
Name: "uq_guid",
|
||||
Type: models.UniqueConstraint,
|
||||
Schema: "public",
|
||||
Table: "users",
|
||||
Columns: []string{"guid"},
|
||||
}
|
||||
table.Constraints["uq_guid"] = guidConstraint
|
||||
|
||||
schema.Tables = append(schema.Tables, table)
|
||||
db.Schemas = append(db.Schemas, schema)
|
||||
|
||||
// Create writer with output to buffer
|
||||
var buf bytes.Buffer
|
||||
options := &writers.WriterOptions{}
|
||||
writer := NewWriter(options)
|
||||
writer.writer = &buf
|
||||
|
||||
// Write the database
|
||||
err := writer.WriteDatabase(db)
|
||||
if err != nil {
|
||||
t.Fatalf("WriteDatabase failed: %v", err)
|
||||
}
|
||||
|
||||
output := buf.String()
|
||||
|
||||
// Print output for debugging
|
||||
t.Logf("Generated SQL:\n%s", output)
|
||||
|
||||
// Verify unique constraints are present
|
||||
if !strings.Contains(output, "-- Unique constraints for schema: public") {
|
||||
t.Errorf("Output missing unique constraints header")
|
||||
}
|
||||
if !strings.Contains(output, "ADD CONSTRAINT uq_email UNIQUE (email)") {
|
||||
t.Errorf("Output missing uq_email unique constraint\nFull output:\n%s", output)
|
||||
}
|
||||
if !strings.Contains(output, "ADD CONSTRAINT uq_guid UNIQUE (guid)") {
|
||||
t.Errorf("Output missing uq_guid unique constraint\nFull output:\n%s", output)
|
||||
}
|
||||
}
|
||||
|
||||
func TestWriteTable(t *testing.T) {
|
||||
// Create a single table
|
||||
table := models.InitTable("products", "public")
|
||||
|
||||
Reference in New Issue
Block a user