|
1 | 1 | package plan |
2 | 2 |
|
3 | 3 | import ( |
| 4 | + "fmt" |
| 5 | + "os" |
| 6 | + "path/filepath" |
4 | 7 | "strings" |
5 | 8 | "testing" |
6 | 9 |
|
@@ -56,6 +59,53 @@ func TestPlanSummary(t *testing.T) { |
56 | 59 | } |
57 | 60 | } |
58 | 61 |
|
| 62 | +func TestPlanJSONRoundTrip(t *testing.T) { |
| 63 | + testDataDir := "../../testdata/migrate" |
| 64 | + versions := []string{"v1", "v2", "v3", "v4", "v5"} |
| 65 | + |
| 66 | + for _, version := range versions { |
| 67 | + t.Run(fmt.Sprintf("version_%s", version), func(t *testing.T) { |
| 68 | + planFilePath := filepath.Join(testDataDir, version, "plan.json") |
| 69 | + |
| 70 | + // Read the original plan.json file |
| 71 | + originalJSON, err := os.ReadFile(planFilePath) |
| 72 | + if err != nil { |
| 73 | + t.Fatalf("Failed to read %s: %v", planFilePath, err) |
| 74 | + } |
| 75 | + |
| 76 | + // First FromJSON: Load plan from JSON |
| 77 | + plan1, err := FromJSON(originalJSON, "public") |
| 78 | + if err != nil { |
| 79 | + t.Fatalf("Failed to parse JSON from %s: %v", planFilePath, err) |
| 80 | + } |
| 81 | + |
| 82 | + // First ToJSON: Convert plan back to JSON |
| 83 | + json1, err := plan1.ToJSON() |
| 84 | + if err != nil { |
| 85 | + t.Fatalf("Failed to convert plan to JSON (first): %v", err) |
| 86 | + } |
| 87 | + |
| 88 | + // Compare original JSON with first round-trip JSON |
| 89 | + if string(originalJSON) != json1 { |
| 90 | + t.Errorf("JSON round-trip failed for %s: original and round-trip JSON differ", version) |
| 91 | + t.Logf("Original JSON length: %d", len(originalJSON)) |
| 92 | + t.Logf("Round-trip JSON length: %d", len(json1)) |
| 93 | + // For debugging, show first difference |
| 94 | + minLen := len(originalJSON) |
| 95 | + if len(json1) < minLen { |
| 96 | + minLen = len(json1) |
| 97 | + } |
| 98 | + for i := 0; i < minLen; i++ { |
| 99 | + if originalJSON[i] != json1[i] { |
| 100 | + t.Logf("First difference at position %d: original=%c, round-trip=%c", i, originalJSON[i], json1[i]) |
| 101 | + break |
| 102 | + } |
| 103 | + } |
| 104 | + } |
| 105 | + }) |
| 106 | + } |
| 107 | +} |
| 108 | + |
59 | 109 | func TestPlanToJSON(t *testing.T) { |
60 | 110 | oldSQL := `CREATE TABLE users ( |
61 | 111 | id integer NOT NULL |
|
0 commit comments