Skip to content

Commit

Permalink
Ensure required message fields are validated.
Browse files Browse the repository at this point in the history
Fixes #21
  • Loading branch information
thesamet committed Sep 25, 2020
1 parent 03e74e2 commit 5deda0a
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -213,7 +213,16 @@ class MessagePrinter(
else Seq.empty

val messageRules = if (fd.isMessage) {
val maybeRequired: Option[SingularResult] = None
val maybeRequired: Option[SingularResult] = Rule.ifSet(
!fd.supportsPresence && !fd.isRepeated && !fd.isInOneof && !rulesProto.getMessage.getSkip &&
!fd.getMessageType.getFullName.startsWith("google.protobuf")
)(
SingularResult(
fd,
accessor,
Rule.messageValidate(validatorName(fd.getMessageType).fullName)
)
)

val maybeNested = Rule.ifSet(
(fd.supportsPresence || fd.isInOneof) && !rulesProto.getMessage.getSkip &&
Expand Down Expand Up @@ -250,13 +259,13 @@ class MessagePrinter(
case OptionalResult(fd, accessor, lines0) =>
val lines = lines0.map(_.render(fd, "_value"))
Seq(s"scalapb.validate.Result.optional($accessor) { _value =>") ++
lines.dropRight(1).map(l => l + " &&") ++
Seq(lines.last, "}")
lines.dropRight(1).map(l => " " + l + " &&") ++
Seq(" " + lines.last, "}")
case RepeatedResult(fd, accessor, lines0) =>
val lines = lines0.map(_.render(fd, "_value"))
Seq(s"scalapb.validate.Result.repeated($accessor) { _value =>") ++
lines.dropRight(1).map(l => l + " &&") ++
Seq(lines.last, "}")
lines.dropRight(1).map(l => " " + l + " &&") ++
Seq(" " + lines.last, "}")
}

def formattedRulesForOneofs(oneof: OneofDescriptor): Seq[Seq[String]] = {
Expand Down
16 changes: 16 additions & 0 deletions e2e/src/main/protobuf/required.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
syntax = "proto2";

package examplepb2;

import "validate/validate.proto";

message Person {
message Location {
required double lat = 1 [(validate.rules).double = { gte: -90, lte: 90 }];
required double lng = 2 [(validate.rules).double = { gte: -180, lte: 180 }];
}

required string email = 1 [(validate.rules).string.email = true];
required Location home = 2;
optional Location second_home = 3;
}
13 changes: 13 additions & 0 deletions e2e/src/test/scala/scalapb/validate/ValidatorSpec.scala
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package scalapb.validate

import examplepb.example.Person
import examplepb2.required.{Person => Person2}

class ValidatorSpec extends munit.FunSuite {

Expand Down Expand Up @@ -51,4 +52,16 @@ class ValidatorSpec extends munit.FunSuite {
("Person.Location.lat", Double.box(100)) :: Nil
)
}

// See issue #21
test("Required message is validated") {
assertFailure(
Validator[Person2]
.validate(
Person2(email = "foo@foo.com", home = Person2.Location(91, 0))
),
("Person.Location.lat", Double.box(91.0)) :: Nil
)

}
}

0 comments on commit 5deda0a

Please sign in to comment.