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 }