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