github.com/grafana/synthetic-monitoring-agent@v0.64.2/pkg/pb/synthetic_monitoring/multihttp_string_test.go (about)

     1  package synthetic_monitoring
     2  
     3  import (
     4  	"cmp"
     5  	fmt "fmt"
     6  	"slices"
     7  	"testing"
     8  
     9  	"github.com/stretchr/testify/require"
    10  	"golang.org/x/exp/constraints"
    11  )
    12  
    13  type enum interface {
    14  	constraints.Integer
    15  	fmt.Stringer
    16  }
    17  
    18  // The following tests make sure everything is kept in sync, in particular that
    19  // modifying the protobuf definition doesn't invalidate the string generated code.
    20  
    21  // TestEnumToString makes sure that the strings generated from the proto file
    22  // match the strings generated using enumer.
    23  func TestEnumToString(t *testing.T) {
    24  	testEnumToString[MultiHttpEntryAssertionType](t, MultiHttpEntryAssertionType_name)
    25  	testEnumToString[MultiHttpEntryAssertionSubjectVariant](t, MultiHttpEntryAssertionSubjectVariant_name)
    26  	testEnumToString[MultiHttpEntryAssertionConditionVariant](t, MultiHttpEntryAssertionConditionVariant_name)
    27  	testEnumToString[MultiHttpEntryVariableType](t, MultiHttpEntryVariableType_name)
    28  }
    29  
    30  func TestStringToEnum(t *testing.T) {
    31  	testStringToEnum(t, MultiHttpEntryAssertionTypeString, MultiHttpEntryAssertionType_name)
    32  	testStringToEnum(t, MultiHttpEntryAssertionSubjectVariantString, MultiHttpEntryAssertionSubjectVariant_name)
    33  	testStringToEnum(t, MultiHttpEntryAssertionConditionVariantString, MultiHttpEntryAssertionConditionVariant_name)
    34  	testStringToEnum(t, MultiHttpEntryVariableTypeString, MultiHttpEntryVariableType_name)
    35  }
    36  
    37  func TestAllValuesIncluded(t *testing.T) {
    38  	testAllValuesIncluded(t, MultiHttpEntryAssertionTypeValues(), MultiHttpEntryAssertionType_name)
    39  	testAllValuesIncluded(t, MultiHttpEntryAssertionSubjectVariantValues(), MultiHttpEntryAssertionSubjectVariant_name)
    40  	testAllValuesIncluded(t, MultiHttpEntryAssertionConditionVariantValues(), MultiHttpEntryAssertionConditionVariant_name)
    41  	testAllValuesIncluded(t, MultiHttpEntryVariableTypeValues(), MultiHttpEntryVariableType_name)
    42  }
    43  
    44  func TestMultiHttpEntryAssertionType_IsAMultiHttpEntryAssertionType(t *testing.T) {
    45  	testAllValuesAreValid(t, func(v MultiHttpEntryAssertionType) bool {
    46  		return v.IsAMultiHttpEntryAssertionType()
    47  	}, MultiHttpEntryAssertionType_name)
    48  
    49  	testAllValuesAreValid(t, func(v MultiHttpEntryAssertionSubjectVariant) bool {
    50  		return v.IsAMultiHttpEntryAssertionSubjectVariant()
    51  	}, MultiHttpEntryAssertionSubjectVariant_name)
    52  
    53  	testAllValuesAreValid(t, func(v MultiHttpEntryAssertionConditionVariant) bool {
    54  		return v.IsAMultiHttpEntryAssertionConditionVariant()
    55  	}, MultiHttpEntryAssertionConditionVariant_name)
    56  
    57  	testAllValuesAreValid(t, func(v MultiHttpEntryVariableType) bool {
    58  		return v.IsAMultiHttpEntryVariableType()
    59  	}, MultiHttpEntryVariableType_name)
    60  }
    61  
    62  func testEnumToString[E enum](t *testing.T, m map[int32]string) {
    63  	t.Helper()
    64  
    65  	for v, str := range m {
    66  		v := E(v)
    67  		require.Equal(t, str, v.String())
    68  	}
    69  }
    70  
    71  func testStringToEnum[E enum](t *testing.T, f func(string) (E, error), m map[int32]string) {
    72  	t.Helper()
    73  
    74  	for v, str := range m {
    75  		expected := E(v)
    76  		actual, err := f(str)
    77  		require.NoError(t, err)
    78  		require.Equal(t, expected, actual)
    79  	}
    80  }
    81  
    82  func getValues[E cmp.Ordered](m map[int32]string) []E {
    83  	values := make([]E, 0, len(m))
    84  	for v := range m {
    85  		values = append(values, E(v))
    86  	}
    87  
    88  	slices.Sort(values)
    89  
    90  	return values
    91  }
    92  
    93  func testAllValuesIncluded[E enum](t *testing.T, values []E, m map[int32]string) {
    94  	t.Helper()
    95  	require.Equal(t, getValues[E](m), values)
    96  }
    97  
    98  func testAllValuesAreValid[E enum](t *testing.T, f func(E) bool, m map[int32]string) {
    99  	t.Helper()
   100  
   101  	values := getValues[E](m)
   102  
   103  	for _, v := range values {
   104  		require.True(t, f(v))
   105  	}
   106  
   107  	require.False(t, f(values[0]-1))
   108  	require.False(t, f(values[len(values)-1]+1))
   109  }