github.com/Redstoneguy129/cli@v0.0.0-20230211220159-15dca4e91917/internal/utils/parser/state_test.go (about)

     1  package parser
     2  
     3  import (
     4  	"strings"
     5  	"testing"
     6  
     7  	"github.com/stretchr/testify/assert"
     8  	"github.com/stretchr/testify/require"
     9  )
    10  
    11  func TestLineComment(t *testing.T) {
    12  	t.Run("after separator", func(t *testing.T) {
    13  		sql := "END;-- comment"
    14  		stats, err := Split(strings.NewReader(sql))
    15  		require.NoError(t, err)
    16  		assert.ElementsMatch(t, []string{"END;", "-- comment"}, stats)
    17  	})
    18  
    19  	t.Run("before separator", func(t *testing.T) {
    20  		sql := "SELECT --; 1"
    21  		stats, err := Split(strings.NewReader(sql))
    22  		require.NoError(t, err)
    23  		assert.ElementsMatch(t, []string{sql}, stats)
    24  	})
    25  
    26  	t.Run("not started", func(t *testing.T) {
    27  		sql := "- ;END"
    28  		stats, err := Split(strings.NewReader(sql))
    29  		require.NoError(t, err)
    30  		assert.ElementsMatch(t, []string{"- ;", "END"}, stats)
    31  	})
    32  
    33  	t.Run("between lines", func(t *testing.T) {
    34  		sql := "-- /* \n; */ END"
    35  		stats, err := Split(strings.NewReader(sql))
    36  		require.NoError(t, err)
    37  		assert.ElementsMatch(t, []string{"-- /* \n;", " */ END"}, stats)
    38  	})
    39  }
    40  
    41  func TestBlockComment(t *testing.T) {
    42  	t.Run("contains separator", func(t *testing.T) {
    43  		sql := "SELECT /* ; */ 1;"
    44  		stats, err := Split(strings.NewReader(sql))
    45  		require.NoError(t, err)
    46  		assert.ElementsMatch(t, []string{sql}, stats)
    47  	})
    48  
    49  	t.Run("nested block", func(t *testing.T) {
    50  		sql := "SELECT /*; /*;*/ ;*/ 1"
    51  		stats, err := Split(strings.NewReader(sql))
    52  		require.NoError(t, err)
    53  		assert.ElementsMatch(t, []string{sql}, stats)
    54  	})
    55  
    56  	t.Run("not started", func(t *testing.T) {
    57  		sql := "/ * ; */ END"
    58  		stats, err := Split(strings.NewReader(sql))
    59  		require.NoError(t, err)
    60  		assert.ElementsMatch(t, []string{"/ * ;", " */ END"}, stats)
    61  	})
    62  }
    63  
    64  func TestSeparator(t *testing.T) {
    65  	t.Run("no spaces", func(t *testing.T) {
    66  		sql := ";END;;"
    67  		stats, err := Split(strings.NewReader(sql))
    68  		require.NoError(t, err)
    69  		assert.ElementsMatch(t, []string{";", "END;", ";"}, stats)
    70  	})
    71  
    72  	t.Run("between spaces", func(t *testing.T) {
    73  		sql := "BEGIN   ;  END"
    74  		stats, err := Split(strings.NewReader(sql))
    75  		require.NoError(t, err)
    76  		assert.ElementsMatch(t, []string{"BEGIN   ;", "  END"}, stats)
    77  	})
    78  
    79  	t.Run("backslash escaped", func(t *testing.T) {
    80  		sql := "\\;;\\;"
    81  		stats, err := Split(strings.NewReader(sql))
    82  		require.NoError(t, err)
    83  		assert.ElementsMatch(t, []string{"\\;;", "\\;"}, stats)
    84  	})
    85  }
    86  
    87  func TestDollarQuote(t *testing.T) {
    88  	t.Run("named tag", func(t *testing.T) {
    89  		sql := "$tag$ any ; string$tag$"
    90  		stats, err := Split(strings.NewReader(sql))
    91  		require.NoError(t, err)
    92  		assert.ElementsMatch(t, []string{sql}, stats)
    93  	})
    94  
    95  	t.Run("anonymous tag", func(t *testing.T) {
    96  		sql := "$$\"Dane's horse\"$$"
    97  		stats, err := Split(strings.NewReader(sql))
    98  		require.NoError(t, err)
    99  		assert.ElementsMatch(t, []string{sql}, stats)
   100  	})
   101  
   102  	t.Run("not started", func(t *testing.T) {
   103  		sql := "SELECT \"$\"; $$"
   104  		stats, err := Split(strings.NewReader(sql))
   105  		require.NoError(t, err)
   106  		assert.ElementsMatch(t, []string{"SELECT \"$\";", " $$"}, stats)
   107  	})
   108  }
   109  
   110  func TestSingleQuote(t *testing.T) {
   111  	t.Run("escapes separator", func(t *testing.T) {
   112  		sql := "SELECT ';' 1"
   113  		stats, err := Split(strings.NewReader(sql))
   114  		require.NoError(t, err)
   115  		assert.ElementsMatch(t, []string{sql}, stats)
   116  	})
   117  
   118  	t.Run("preserves single quote", func(t *testing.T) {
   119  		sql := "SELECT ';'';' 1"
   120  		stats, err := Split(strings.NewReader(sql))
   121  		require.NoError(t, err)
   122  		assert.ElementsMatch(t, []string{sql}, stats)
   123  	})
   124  
   125  	t.Run("literal backslash", func(t *testing.T) {
   126  		sql := "SELECT '\\'; 1'"
   127  		stats, err := Split(strings.NewReader(sql))
   128  		require.NoError(t, err)
   129  		assert.ElementsMatch(t, []string{"SELECT '\\';", " 1'"}, stats)
   130  	})
   131  }
   132  
   133  func TestDoubleQuote(t *testing.T) {
   134  	t.Run("escapes separator", func(t *testing.T) {
   135  		sql := `CREATE POLICY "cats;dogs" on cats_dogs; END`
   136  		stats, err := Split(strings.NewReader(sql))
   137  		require.NoError(t, err)
   138  		assert.ElementsMatch(t, []string{`CREATE POLICY "cats;dogs" on cats_dogs;`, " END"}, stats)
   139  	})
   140  
   141  	t.Run("preserves single quote", func(t *testing.T) {
   142  		sql := `CREATE POLICY "cat's and dog's" on cats_dogs; END`
   143  		stats, err := Split(strings.NewReader(sql))
   144  		require.NoError(t, err)
   145  		assert.ElementsMatch(t, []string{`CREATE POLICY "cat's and dog's" on cats_dogs;`, " END"}, stats)
   146  	})
   147  
   148  	t.Run("preserves double quote", func(t *testing.T) {
   149  		sql := `CREATE POLICY "pet""name" on pets; END`
   150  		stats, err := Split(strings.NewReader(sql))
   151  		require.NoError(t, err)
   152  		assert.ElementsMatch(t, []string{`CREATE POLICY "pet""name" on pets;`, " END"}, stats)
   153  	})
   154  }