Files
MyGoNavi/internal/app/methods_result_diff_test.go

121 lines
3.3 KiB
Go

package app
import (
"testing"
"GoNavi-Wails/internal/connection"
"GoNavi-Wails/internal/resultdiff"
)
func TestResultDiffStartWithEmbeddedRows(t *testing.T) {
a := NewApp()
req := ResultDiffStartRequest{
Database: "db",
Left: resultdiff.DatasetSpec{
Mode: resultdiff.DatasetModeRows,
Columns: []string{"id", "name"},
Rows: []map[string]interface{}{
{"id": 1, "name": "a"},
{"id": 2, "name": "b"},
},
},
Right: resultdiff.DatasetSpec{
Mode: resultdiff.DatasetModeRows,
Columns: []string{"id", "name"},
Rows: []map[string]interface{}{
{"id": 2, "name": "b2"},
{"id": 3, "name": "c"},
},
},
KeyColumns: []string{"id"},
}
res := a.ResultDiffStart(req)
if !res.Success {
t.Fatalf("ResultDiffStart failed: %s", res.Message)
}
start, ok := res.Data.(resultdiff.StartResult)
if !ok {
t.Fatalf("unexpected data type %T", res.Data)
}
if start.Summary.Added != 1 || start.Summary.Removed != 1 || start.Summary.Changed != 1 {
t.Fatalf("summary=%+v", start.Summary)
}
page := a.ResultDiffPage(resultdiff.PageRequest{JobID: start.JobID, Limit: 10})
if !page.Success {
t.Fatalf("page failed: %s", page.Message)
}
pageData, ok := page.Data.(resultdiff.PageResult)
if !ok {
t.Fatalf("page data type %T", page.Data)
}
if pageData.Total != 3 {
t.Fatalf("expected 3 diff rows, got %d", pageData.Total)
}
closeRes := a.ResultDiffClose(start.JobID)
if !closeRes.Success {
t.Fatalf("close failed: %s", closeRes.Message)
}
}
func TestResultDiffStartRequiresKeys(t *testing.T) {
a := NewApp()
res := a.ResultDiffStart(ResultDiffStartRequest{
Left: resultdiff.DatasetSpec{Mode: resultdiff.DatasetModeRows},
Right: resultdiff.DatasetSpec{Mode: resultdiff.DatasetModeRows},
})
if res.Success {
t.Fatal("expected failure without keys")
}
}
func TestResultDiffUploadThenCompute(t *testing.T) {
a := NewApp()
start := a.ResultDiffStart(ResultDiffStartRequest{
KeyColumns: []string{"id"},
Left: resultdiff.DatasetSpec{Mode: resultdiff.DatasetModeRows, Columns: []string{"id", "v"}},
Right: resultdiff.DatasetSpec{Mode: resultdiff.DatasetModeRows, Columns: []string{"id", "v"}},
})
if !start.Success {
t.Fatalf("start: %s", start.Message)
}
startData := start.Data.(resultdiff.StartResult)
jobID := startData.JobID
upL := a.ResultDiffUploadChunk(resultdiff.UploadChunkRequest{
JobID: jobID, Side: "left", Columns: []string{"id", "v"},
Rows: []map[string]interface{}{{"id": 1, "v": 1}}, Done: true,
})
if !upL.Success {
t.Fatalf("upload left: %s", upL.Message)
}
upR := a.ResultDiffUploadChunk(resultdiff.UploadChunkRequest{
JobID: jobID, Side: "right", Columns: []string{"id", "v"},
Rows: []map[string]interface{}{{"id": 1, "v": 2}}, Done: true,
})
if !upR.Success {
t.Fatalf("upload right: %s", upR.Message)
}
comp := a.ResultDiffCompute(jobID)
if !comp.Success {
t.Fatalf("compute: %s", comp.Message)
}
result := comp.Data.(resultdiff.StartResult)
if result.Summary.Changed != 1 {
t.Fatalf("summary=%+v", result.Summary)
}
_ = a.ResultDiffClose(jobID)
}
func TestExtractQueryRows(t *testing.T) {
rows, cols, err := extractQueryRows(connection.QueryResult{
Success: true,
Data: []map[string]interface{}{{"a": 1}},
Fields: []string{"a"},
})
if err != nil || len(rows) != 1 || cols[0] != "a" {
t.Fatalf("rows=%v cols=%v err=%v", rows, cols, err)
}
}