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  }