code.gitea.io/gitea@v1.22.3/services/gitdiff/csv_test.go (about) 1 // Copyright 2021 The Gitea Authors. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 package gitdiff 5 6 import ( 7 "encoding/csv" 8 "strings" 9 "testing" 10 11 "code.gitea.io/gitea/models/db" 12 csv_module "code.gitea.io/gitea/modules/csv" 13 "code.gitea.io/gitea/modules/setting" 14 15 "github.com/stretchr/testify/assert" 16 ) 17 18 func TestCSVDiff(t *testing.T) { 19 cases := []struct { 20 diff string 21 base string 22 head string 23 cells [][]TableDiffCellType 24 }{ 25 // case 0 - initial commit of a csv 26 { 27 diff: `diff --git a/unittest.csv b/unittest.csv 28 --- a/unittest.csv 29 +++ b/unittest.csv 30 @@ -0,0 +1,2 @@ 31 +col1,col2 32 +a,a`, 33 base: "", 34 head: `col1,col2 35 a,a`, 36 cells: [][]TableDiffCellType{ 37 {TableDiffCellAdd, TableDiffCellAdd}, 38 {TableDiffCellAdd, TableDiffCellAdd}, 39 }, 40 }, 41 // case 1 - adding 1 row at end 42 { 43 diff: `diff --git a/unittest.csv b/unittest.csv 44 --- a/unittest.csv 45 +++ b/unittest.csv 46 @@ -1,2 +1,3 @@ 47 col1,col2 48 -a,a 49 +a,a 50 +b,b`, 51 base: `col1,col2 52 a,a`, 53 head: `col1,col2 54 a,a 55 b,b`, 56 cells: [][]TableDiffCellType{ 57 {TableDiffCellUnchanged, TableDiffCellUnchanged}, 58 {TableDiffCellUnchanged, TableDiffCellUnchanged}, 59 {TableDiffCellAdd, TableDiffCellAdd}, 60 }, 61 }, 62 // case 2 - row deleted 63 { 64 diff: `diff --git a/unittest.csv b/unittest.csv 65 --- a/unittest.csv 66 +++ b/unittest.csv 67 @@ -1,3 +1,2 @@ 68 col1,col2 69 -a,a 70 b,b`, 71 base: `col1,col2 72 a,a 73 b,b`, 74 head: `col1,col2 75 b,b`, 76 cells: [][]TableDiffCellType{ 77 {TableDiffCellUnchanged, TableDiffCellUnchanged}, 78 {TableDiffCellDel, TableDiffCellDel}, 79 {TableDiffCellUnchanged, TableDiffCellUnchanged}, 80 }, 81 }, 82 // case 3 - row changed 83 { 84 diff: `diff --git a/unittest.csv b/unittest.csv 85 --- a/unittest.csv 86 +++ b/unittest.csv 87 @@ -1,2 +1,2 @@ 88 col1,col2 89 -b,b 90 +b,c`, 91 base: `col1,col2 92 b,b`, 93 head: `col1,col2 94 b,c`, 95 cells: [][]TableDiffCellType{ 96 {TableDiffCellUnchanged, TableDiffCellUnchanged}, 97 {TableDiffCellUnchanged, TableDiffCellChanged}, 98 }, 99 }, 100 // case 4 - all deleted 101 { 102 diff: `diff --git a/unittest.csv b/unittest.csv 103 --- a/unittest.csv 104 +++ b/unittest.csv 105 @@ -1,2 +0,0 @@ 106 -col1,col2 107 -b,c`, 108 base: `col1,col2 109 b,c`, 110 head: "", 111 cells: [][]TableDiffCellType{ 112 {TableDiffCellDel, TableDiffCellDel}, 113 {TableDiffCellDel, TableDiffCellDel}, 114 }, 115 }, 116 // case 5 - renames first column 117 { 118 diff: `diff --git a/unittest.csv b/unittest.csv 119 --- a/unittest.csv 120 +++ b/unittest.csv 121 @@ -1,3 +1,3 @@ 122 -col1,col2,col3 123 +cola,col2,col3 124 a,b,c`, 125 base: `col1,col2,col3 126 a,b,c`, 127 head: `cola,col2,col3 128 a,b,c`, 129 cells: [][]TableDiffCellType{ 130 {TableDiffCellDel, TableDiffCellAdd, TableDiffCellUnchanged, TableDiffCellUnchanged}, 131 {TableDiffCellDel, TableDiffCellAdd, TableDiffCellUnchanged, TableDiffCellUnchanged}, 132 }, 133 }, 134 // case 6 - inserts a column after first, deletes last column 135 { 136 diff: `diff --git a/unittest.csv b/unittest.csv 137 --- a/unittest.csv 138 +++ b/unittest.csv 139 @@ -1,2 +1,2 @@ 140 -col1,col2,col3 141 -a,b,c 142 +col1,col1a,col2 143 +a,d,b`, 144 base: `col1,col2,col3 145 a,b,c`, 146 head: `col1,col1a,col2 147 a,d,b`, 148 cells: [][]TableDiffCellType{ 149 {TableDiffCellUnchanged, TableDiffCellAdd, TableDiffCellDel, TableDiffCellMovedUnchanged}, 150 {TableDiffCellUnchanged, TableDiffCellAdd, TableDiffCellDel, TableDiffCellMovedUnchanged}, 151 }, 152 }, 153 // case 7 - deletes first column, inserts column after last 154 { 155 diff: `diff --git a/unittest.csv b/unittest.csv 156 --- a/unittest.csv 157 +++ b/unittest.csv 158 @@ -1,2 +1,2 @@ 159 -col1,col2,col3 160 -a,b,c 161 +col2,col3,col4 162 +b,c,d`, 163 base: `col1,col2,col3 164 a,b,c`, 165 head: `col2,col3,col4 166 b,c,d`, 167 cells: [][]TableDiffCellType{ 168 {TableDiffCellDel, TableDiffCellUnchanged, TableDiffCellUnchanged, TableDiffCellAdd}, 169 {TableDiffCellDel, TableDiffCellUnchanged, TableDiffCellUnchanged, TableDiffCellAdd}, 170 }, 171 }, 172 // case 8 - two columns deleted, 2 added 173 { 174 diff: `diff --git a/unittest.csv b/unittest.csv 175 --- a/unittest.csv 176 +++ b/unittest.csv 177 @@ -1,2 +1,2 @@ 178 -col1,col2,col 179 -a,b,c 180 +col3,col4,col5 181 +c,d,e`, 182 base: `col1,col2,col3 183 a,b,c`, 184 head: `col3,col4,col5 185 c,d,e`, 186 cells: [][]TableDiffCellType{ 187 {TableDiffCellDel, TableDiffCellMovedUnchanged, TableDiffCellDel, TableDiffCellAdd, TableDiffCellAdd}, 188 {TableDiffCellDel, TableDiffCellMovedUnchanged, TableDiffCellDel, TableDiffCellAdd, TableDiffCellAdd}, 189 }, 190 }, 191 } 192 193 for n, c := range cases { 194 diff, err := ParsePatch(db.DefaultContext, setting.Git.MaxGitDiffLines, setting.Git.MaxGitDiffLineCharacters, setting.Git.MaxGitDiffFiles, strings.NewReader(c.diff), "") 195 if err != nil { 196 t.Errorf("ParsePatch failed: %s", err) 197 } 198 199 var baseReader *csv.Reader 200 if len(c.base) > 0 { 201 baseReader, err = csv_module.CreateReaderAndDetermineDelimiter(nil, strings.NewReader(c.base)) 202 if err != nil { 203 t.Errorf("CreateReaderAndDetermineDelimiter failed: %s", err) 204 } 205 } 206 var headReader *csv.Reader 207 if len(c.head) > 0 { 208 headReader, err = csv_module.CreateReaderAndDetermineDelimiter(nil, strings.NewReader(c.head)) 209 if err != nil { 210 t.Errorf("CreateReaderAndDetermineDelimiter failed: %s", err) 211 } 212 } 213 214 result, err := CreateCsvDiff(diff.Files[0], baseReader, headReader) 215 assert.NoError(t, err) 216 assert.Len(t, result, 1, "case %d: should be one section", n) 217 218 section := result[0] 219 assert.Len(t, section.Rows, len(c.cells), "case %d: should be %d rows", n, len(c.cells)) 220 221 for i, row := range section.Rows { 222 assert.Len(t, row.Cells, len(c.cells[i]), "case %d: row %d should have %d cells", n, i, len(c.cells[i])) 223 for j, cell := range row.Cells { 224 assert.Equal(t, c.cells[i][j], cell.Type, "case %d: row %d cell %d should be equal", n, i, j) 225 } 226 } 227 } 228 }