Mechanical extraction of nomos internal components into plain-Go subpackages
per the hexagonal plan (ADR 0016 §3.1 rule 3):
turngate/ — per-session turn serialization (plan 2026-08-03 F1)
retrycap/ — per-turn run retry cap (maxRunRetries=3)
messagequeue/ — operator-message queue for busy-turn re-entry (F2)
assent/ — chat-assent detection (isAssent, isTypedConfirmation,
ExtractPendingApprovals), decoupled from agent via
[]string input instead of persistedCall
session/ — store (chat sessions, plan execution, DB persistence),
migration runner + local emitEvent to break adapter
dependency
internal/migrate/ — shared migration runner extracted from postgres pool,
used by both the oikos postgres adapter and session tests.
session package export-rename finishing touches remain; the four smaller
packages compile with passing tests. Depguard rules and ADR-0016 leaf-note
update deferred to a followup. VERSION 0.35.1.
108 lines
2.8 KiB
Go
108 lines
2.8 KiB
Go
package migrate
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func nonEmpty(stmts []string) []string {
|
|
var out []string
|
|
for _, s := range stmts {
|
|
if strings.TrimSpace(s) != "" {
|
|
out = append(out, s)
|
|
}
|
|
}
|
|
return out
|
|
}
|
|
|
|
func TestSplitSQLBasic(t *testing.T) {
|
|
stmts := nonEmpty(SplitSQL("CREATE TABLE a (id int); CREATE TABLE b (id int);"))
|
|
if len(stmts) != 2 {
|
|
t.Fatalf("got %d statements, want 2: %#v", len(stmts), stmts)
|
|
}
|
|
}
|
|
|
|
func TestSplitSQLDollarQuotedFunction(t *testing.T) {
|
|
sql := `CREATE FUNCTION f() RETURNS int AS $$
|
|
SELECT 1; SELECT 2;
|
|
$$ LANGUAGE sql;
|
|
CREATE TABLE t (id int);`
|
|
stmts := nonEmpty(SplitSQL(sql))
|
|
if len(stmts) != 2 {
|
|
t.Fatalf("got %d statements, want 2: %#v", len(stmts), stmts)
|
|
}
|
|
if !strings.Contains(stmts[0], "SELECT 1; SELECT 2;") {
|
|
t.Errorf("dollar-quoted body was split: %q", stmts[0])
|
|
}
|
|
}
|
|
|
|
func TestSplitSQLTaggedDollarQuote(t *testing.T) {
|
|
sql := `DO $body$ BEGIN PERFORM 1; END $body$;SELECT 1;`
|
|
stmts := nonEmpty(SplitSQL(sql))
|
|
if len(stmts) != 2 {
|
|
t.Fatalf("got %d statements, want 2: %#v", len(stmts), stmts)
|
|
}
|
|
}
|
|
|
|
func TestSplitSQLSemicolonInComment(t *testing.T) {
|
|
sql := "-- comment with ; semicolon\nCREATE TABLE t (id int); -- trailing; note\nSELECT 1;"
|
|
stmts := nonEmpty(SplitSQL(sql))
|
|
if len(stmts) != 2 {
|
|
t.Fatalf("got %d statements, want 2: %#v", len(stmts), stmts)
|
|
}
|
|
}
|
|
|
|
func TestSplitSQLSemicolonInStringLiteral(t *testing.T) {
|
|
sql := `SELECT 'hello; world'; INSERT INTO t VALUES (1);`
|
|
stmts := nonEmpty(SplitSQL(sql))
|
|
if len(stmts) != 2 {
|
|
t.Fatalf("got %d statements, want 2: %#v", len(stmts), stmts)
|
|
}
|
|
}
|
|
|
|
func TestSplitSQLDollarSignInStringLiteral(t *testing.T) {
|
|
sql := `SELECT '$100'; SELECT 2;`
|
|
stmts := nonEmpty(SplitSQL(sql))
|
|
if len(stmts) != 2 {
|
|
t.Fatalf("got %d statements, want 2: %#v", len(stmts), stmts)
|
|
}
|
|
}
|
|
|
|
func TestSplitSQLBlockComment(t *testing.T) {
|
|
sql := `SELECT 1; /* block; with; semicolons */ SELECT 2;`
|
|
stmts := nonEmpty(SplitSQL(sql))
|
|
if len(stmts) != 2 {
|
|
t.Fatalf("got %d statements, want 2: %#v", len(stmts), stmts)
|
|
}
|
|
}
|
|
|
|
func TestSplitSQLBlockCommentWithDollarQuote(t *testing.T) {
|
|
sql := `/* $$ not a dollar quote */ SELECT 1;`
|
|
stmts := nonEmpty(SplitSQL(sql))
|
|
if len(stmts) != 1 {
|
|
t.Fatalf("got %d statements, want 1: %#v", len(stmts), stmts)
|
|
}
|
|
}
|
|
|
|
func TestSplitSQLDoubledQuoteInString(t *testing.T) {
|
|
sql := `SELECT 'O''Brien'; SELECT 2;`
|
|
stmts := nonEmpty(SplitSQL(sql))
|
|
if len(stmts) != 2 {
|
|
t.Fatalf("got %d statements, want 2: %#v", len(stmts), stmts)
|
|
}
|
|
}
|
|
|
|
func TestSplitSQLEmptyInput(t *testing.T) {
|
|
stmts := nonEmpty(SplitSQL(""))
|
|
if len(stmts) != 0 {
|
|
t.Fatalf("got %d statements, want 0", len(stmts))
|
|
}
|
|
}
|
|
|
|
func TestSplitSQLNoSemicolon(t *testing.T) {
|
|
stmts := nonEmpty(SplitSQL("SELECT 1"))
|
|
if len(stmts) != 1 {
|
|
t.Fatalf("got %d statements, want 1", len(stmts))
|
|
}
|
|
}
|