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 }