github.com/quickfeed/quickfeed@v0.0.0-20240507093252-ed8ca812a09c/web/interceptor/validation_test.go (about)

     1  package interceptor
     2  
     3  import (
     4  	"strings"
     5  	"testing"
     6  
     7  	"google.golang.org/protobuf/reflect/protoreflect"
     8  	"google.golang.org/protobuf/reflect/protoregistry"
     9  )
    10  
    11  func TestImplementsValidation(t *testing.T) {
    12  	const (
    13  		T = true
    14  		F = false
    15  	)
    16  	tests := map[protoreflect.FullName]*struct {
    17  		cleaner   bool
    18  		validator bool
    19  		found     bool
    20  	}{
    21  		"qf.Void":                     {cleaner: F, validator: T},
    22  		"qf.User":                     {cleaner: T, validator: T},
    23  		"qf.Users":                    {cleaner: T, validator: F},
    24  		"qf.Submission":               {cleaner: F, validator: F},
    25  		"qf.Submissions":              {cleaner: F, validator: F},
    26  		"qf.Enrollment":               {cleaner: T, validator: T},
    27  		"qf.Enrollments":              {cleaner: T, validator: T},
    28  		"qf.Assignment":               {cleaner: F, validator: F},
    29  		"qf.Course":                   {cleaner: T, validator: T},
    30  		"qf.Courses":                  {cleaner: T, validator: F},
    31  		"qf.Group":                    {cleaner: T, validator: T},
    32  		"qf.Groups":                   {cleaner: T, validator: F},
    33  		"qf.Repository":               {cleaner: F, validator: F},
    34  		"qf.UpdateSubmissionsRequest": {cleaner: F, validator: F},
    35  		"qf.RebuildRequest":           {cleaner: F, validator: T},
    36  		"qf.CourseRequest":            {cleaner: F, validator: T},
    37  		"qf.PullRequest":              {cleaner: F, validator: F},
    38  		"qf.Assignments":              {cleaner: F, validator: F},
    39  		"qf.GradingBenchmark":         {cleaner: F, validator: T},
    40  		"qf.Review":                   {cleaner: F, validator: T},
    41  		"qf.Benchmarks":               {cleaner: F, validator: F},
    42  		"qf.Issue":                    {cleaner: F, validator: F},
    43  		"qf.UpdateSubmissionRequest":  {cleaner: F, validator: T},
    44  		"qf.UsedSlipDays":             {cleaner: F, validator: F},
    45  		"qf.Task":                     {cleaner: F, validator: F},
    46  		"qf.GradingCriterion":         {cleaner: F, validator: T},
    47  		"qf.Repositories":             {cleaner: F, validator: F},
    48  		"qf.CourseSubmissions":        {cleaner: F, validator: F},
    49  		"qf.Organization":             {cleaner: F, validator: T},
    50  		"qf.SubmissionRequest":        {cleaner: F, validator: T},
    51  		"qf.ReviewRequest":            {cleaner: F, validator: T},
    52  		"qf.RepositoryRequest":        {cleaner: F, validator: T},
    53  		"qf.GroupRequest":             {cleaner: F, validator: T},
    54  		"qf.EnrollmentRequest":        {cleaner: F, validator: T},
    55  		"score.Score":                 {cleaner: F, validator: F},
    56  		"score.BuildInfo":             {cleaner: F, validator: F},
    57  	}
    58  
    59  	protoregistry.GlobalTypes.RangeMessages(func(desc protoreflect.MessageType) bool {
    60  		name := desc.Descriptor().FullName()
    61  		qfMessage := strings.HasPrefix(string(name), "qf.")
    62  		scoreMessage := strings.HasPrefix(string(name), "score.")
    63  
    64  		// GlobalTypes includes all registered messages.
    65  		// We only want to test messages from the qf and score packages.
    66  		if !(qfMessage || scoreMessage) {
    67  			return true
    68  		}
    69  		test, ok := tests[name]
    70  		if !ok {
    71  			t.Errorf("Message %s has not been added to the test struct", name)
    72  			return true
    73  		}
    74  		test.found = true
    75  		msg := desc.Zero().Interface()
    76  
    77  		if _, ok = msg.(idCleaner); test.cleaner && !ok {
    78  			t.Errorf("Message %s does not implement idCleaner", name)
    79  		} else if !test.cleaner && ok {
    80  			t.Errorf("Message %s implements idCleaner, but should not", name)
    81  		}
    82  
    83  		if _, ok = msg.(validator); test.validator && !ok {
    84  			t.Errorf("Message %s does not implement validator", name)
    85  		} else if !test.validator && ok {
    86  			t.Errorf("Message %s implements validator, but should not", name)
    87  		}
    88  		return true
    89  	})
    90  
    91  	for name, test := range tests {
    92  		if !test.found {
    93  			t.Errorf("Message %s is tested, but no longer exists", name)
    94  		}
    95  	}
    96  }