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  }