github.com/hamba/avro/v2@v2.22.1-0.20240518180522-aff3955acf7d/cmd/avrogen/main_test.go (about) 1 package main 2 3 import ( 4 "bytes" 5 "flag" 6 "io" 7 "os" 8 "path/filepath" 9 "testing" 10 11 "github.com/stretchr/testify/assert" 12 "github.com/stretchr/testify/require" 13 ) 14 15 var update = flag.Bool("update", false, "Update golden files") 16 17 func TestAvroGen_RequiredFlags(t *testing.T) { 18 tests := []struct { 19 name string 20 args []string 21 wantExitCode int 22 }{ 23 { 24 name: "validates schema is set", 25 args: []string{"avrogen", "-pkg", "test", "-o", "some/file"}, 26 wantExitCode: 1, 27 }, 28 { 29 name: "validates schema exists", 30 args: []string{"avrogen", "-pkg", "test", "-o", "some/file", "some/schema"}, 31 wantExitCode: 2, 32 }, 33 { 34 name: "validates package is set", 35 args: []string{"avrogen", "-o", "some/file", "schema.avsc"}, 36 wantExitCode: 1, 37 }, 38 { 39 name: "validates tag format are valid", 40 args: []string{"avrogen", "-o", "some/file", "-pkg", "test", "-tags", "snake", "schema.avsc"}, 41 wantExitCode: 1, 42 }, 43 { 44 name: "validates tag key are valid", 45 args: []string{"avrogen", "-o", "some/file", "-pkg", "test", "-tags", ":snake", "schema.avsc"}, 46 wantExitCode: 1, 47 }, 48 { 49 name: "validates tag style are valid", 50 args: []string{"avrogen", "-o", "some/file", "-pkg", "test", "-tags", "json:something", "schema.avsc"}, 51 wantExitCode: 1, 52 }, 53 } 54 55 for _, test := range tests { 56 test := test 57 t.Run(test.name, func(t *testing.T) { 58 got := realMain(test.args, io.Discard, io.Discard) 59 60 assert.Equal(t, test.wantExitCode, got) 61 }) 62 } 63 } 64 65 func TestAvroGen_GeneratesSchemaStdout(t *testing.T) { 66 var buf bytes.Buffer 67 68 args := []string{"avrogen", "-pkg", "testpkg", "testdata/schema.avsc"} 69 gotCode := realMain(args, &buf, io.Discard) 70 require.Equal(t, 0, gotCode) 71 72 want, err := os.ReadFile("testdata/golden.go") 73 require.NoError(t, err) 74 assert.Equal(t, want, buf.Bytes()) 75 } 76 77 func TestAvroGen_GeneratesSchema(t *testing.T) { 78 path, err := os.MkdirTemp("./", "avrogen") 79 require.NoError(t, err) 80 t.Cleanup(func() { _ = os.RemoveAll(path) }) 81 82 file := filepath.Join(path, "test.go") 83 args := []string{"avrogen", "-pkg", "testpkg", "-o", file, "testdata/schema.avsc"} 84 gotCode := realMain(args, io.Discard, io.Discard) 85 require.Equal(t, 0, gotCode) 86 87 got, err := os.ReadFile(file) 88 require.NoError(t, err) 89 90 if *update { 91 err = os.WriteFile("testdata/golden.go", got, 0600) 92 require.NoError(t, err) 93 } 94 95 want, err := os.ReadFile("testdata/golden.go") 96 require.NoError(t, err) 97 assert.Equal(t, want, got) 98 } 99 100 func TestAvroGen_GeneratesSchemaWithFullname(t *testing.T) { 101 path, err := os.MkdirTemp("./", "avrogen") 102 require.NoError(t, err) 103 t.Cleanup(func() { _ = os.RemoveAll(path) }) 104 105 file := filepath.Join(path, "test.go") 106 args := []string{"avrogen", "-pkg", "testpkg", "-o", file, "-fullname", "testdata/schema.avsc"} 107 gotCode := realMain(args, io.Discard, io.Discard) 108 require.Equal(t, 0, gotCode) 109 110 got, err := os.ReadFile(file) 111 require.NoError(t, err) 112 113 if *update { 114 err = os.WriteFile("testdata/golden_fullname.go", got, 0600) 115 require.NoError(t, err) 116 } 117 118 want, err := os.ReadFile("testdata/golden_fullname.go") 119 require.NoError(t, err) 120 assert.Equal(t, want, got) 121 } 122 123 func TestAvroGen_GeneratesSchemaWithEncoders(t *testing.T) { 124 path, err := os.MkdirTemp("./", "avrogen") 125 require.NoError(t, err) 126 t.Cleanup(func() { _ = os.RemoveAll(path) }) 127 128 file := filepath.Join(path, "test.go") 129 args := []string{"avrogen", "-pkg", "testpkg", "-o", file, "-encoders", "testdata/schema.avsc"} 130 gotCode := realMain(args, io.Discard, io.Discard) 131 require.Equal(t, 0, gotCode) 132 133 got, err := os.ReadFile(file) 134 require.NoError(t, err) 135 136 if *update { 137 err = os.WriteFile("testdata/golden_encoders.go", got, 0600) 138 require.NoError(t, err) 139 } 140 141 want, err := os.ReadFile("testdata/golden_encoders.go") 142 require.NoError(t, err) 143 assert.Equal(t, want, got) 144 } 145 146 func TestAvroGen_GeneratesSchemaWithStrictTypes(t *testing.T) { 147 path, err := os.MkdirTemp("./", "avrogen") 148 require.NoError(t, err) 149 t.Cleanup(func() { _ = os.RemoveAll(path) }) 150 151 file := filepath.Join(path, "test.go") 152 args := []string{"avrogen", "-pkg", "testpkg", "-o", file, "-strict-types", "testdata/schema.avsc"} 153 gotCode := realMain(args, io.Discard, io.Discard) 154 require.Equal(t, 0, gotCode) 155 156 got, err := os.ReadFile(file) 157 require.NoError(t, err) 158 159 if *update { 160 err = os.WriteFile("testdata/golden_stricttypes.go", got, 0600) 161 require.NoError(t, err) 162 } 163 164 want, err := os.ReadFile("testdata/golden_stricttypes.go") 165 require.NoError(t, err) 166 assert.Equal(t, want, got) 167 } 168 169 func TestParseTags(t *testing.T) { 170 tests := []struct { 171 name string 172 tags string 173 }{ 174 { 175 name: "snake case", 176 tags: "json:snake", 177 }, 178 { 179 name: "camel case", 180 tags: "json:camel", 181 }, 182 { 183 name: "upper camel case", 184 tags: "json:upper-camel", 185 }, 186 { 187 name: "kebab case", 188 tags: "json:kebab", 189 }, 190 { 191 name: "original case", 192 tags: "json:original", 193 }, 194 } 195 196 for _, test := range tests { 197 test := test 198 t.Run(test.name, func(t *testing.T) { 199 _, err := parseTags(test.tags) 200 201 require.NoError(t, err) 202 }) 203 } 204 } 205 206 func TestParseInitialisms(t *testing.T) { 207 tests := []struct { 208 name string 209 initialisms string 210 errFunc assert.ErrorAssertionFunc 211 }{ 212 { 213 name: "single initialism", 214 initialisms: "ABC", 215 errFunc: assert.NoError, 216 }, 217 { 218 name: "multiple initialisms", 219 initialisms: "ABC,DEF", 220 errFunc: assert.NoError, 221 }, 222 { 223 name: "wrong initialism", 224 initialisms: "ABC,def,GHI", 225 errFunc: assert.Error, 226 }, 227 } 228 229 for _, test := range tests { 230 test := test 231 t.Run(test.name, func(t *testing.T) { 232 _, err := parseInitialisms(test.initialisms) 233 234 test.errFunc(t, err) 235 }) 236 } 237 }