package dashboard import ( "context" "os" "testing" "time" "github.com/itworx/pulse/internal/database" ) func TestDashboardVersionIsImmutableInPostgreSQL(t *testing.T) { dsn := os.Getenv("PULSE_TEST_DATABASE_URL") if dsn == "" { t.Skip("PULSE_TEST_DATABASE_URL is not set") } ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) defer cancel() pool, err := database.NewPool(ctx, database.Config{URL: dsn}) if err != nil { t.Fatal(err) } defer pool.Close() if err := database.Migrate(ctx, pool); err != nil { t.Fatal(err) } const dashboardID = "00000000-0000-0000-0000-0000000000d1" const versionID = "00000000-0000-0000-0000-0000000000f1" _, _ = pool.Exec(ctx, `DELETE FROM dashboards WHERE id=$1`, dashboardID) if _, err := pool.Exec(ctx, `INSERT INTO dashboards (id,slug,name,scope) VALUES ($1,'m3-test','M3 test','system')`, dashboardID); err != nil { t.Fatal(err) } if _, err := pool.Exec(ctx, `INSERT INTO dashboard_versions (id,dashboard_id,version_number,schema_version,document) VALUES ($1,$2,1,1,'{}')`, versionID, dashboardID); err != nil { t.Fatal(err) } if _, err := pool.Exec(ctx, `UPDATE dashboard_versions SET change_summary='mutated' WHERE id=$1`, versionID); err == nil { t.Fatal("expected immutable update failure") } if _, err := pool.Exec(ctx, `DELETE FROM dashboards WHERE id=$1`, dashboardID); err != nil { t.Fatal(err) } }