123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219 |
- package httpexpect
- import (
- "errors"
- "fmt"
- )
- func validateAssertion(failure *AssertionFailure) error {
- if len(failure.Errors) == 0 {
- return errors.New("AssertionFailure should have non-empty Errors list")
- }
- for _, err := range failure.Errors {
- if err == nil {
- return errors.New("AssertionFailure should not have nil in Errors")
- } else if refIsNil(err) {
- return errors.New("AssertionFailure should not have typed-nil in Errors")
- }
- }
- if err := validateType(failure); err != nil {
- return err
- }
- return nil
- }
- func validateType(failure *AssertionFailure) error {
- switch failure.Type {
- case AssertUsage, AssertOperation:
- return validateTraits(failure, fieldTraits{
- Actual: fieldDenied,
- Expected: fieldDenied,
- })
- case AssertType, AssertNotType,
- AssertValid, AssertNotValid,
- AssertNil, AssertNotNil,
- AssertEmpty, AssertNotEmpty:
- return validateTraits(failure, fieldTraits{
- Actual: fieldRequired,
- Expected: fieldDenied,
- })
- case AssertEqual, AssertNotEqual,
- AssertLt, AssertLe, AssertGt, AssertGe:
- return validateTraits(failure, fieldTraits{
- Actual: fieldRequired,
- Expected: fieldRequired,
- })
- case AssertInRange, AssertNotInRange:
- return validateTraits(failure, fieldTraits{
- Actual: fieldRequired,
- Expected: fieldRequired,
- Range: fieldRequired,
- })
- case AssertMatchSchema, AssertNotMatchSchema,
- AssertMatchPath, AssertNotMatchPath,
- AssertMatchRegexp, AssertNotMatchRegexp,
- AssertMatchFormat, AssertNotMatchFormat:
- return validateTraits(failure, fieldTraits{
- Actual: fieldRequired,
- Expected: fieldRequired,
- })
- case AssertContainsKey, AssertNotContainsKey,
- AssertContainsElement, AssertNotContainsElement,
- AssertContainsSubset, AssertNotContainsSubset:
- return validateTraits(failure, fieldTraits{
- Actual: fieldRequired,
- Expected: fieldOptional,
- })
- case AssertBelongs, AssertNotBelongs:
- return validateTraits(failure, fieldTraits{
- Actual: fieldRequired,
- Expected: fieldRequired,
- List: fieldRequired,
- })
- }
- return fmt.Errorf("unknown assertion type %s", failure.Type)
- }
- type fieldRequirement uint
- const (
- fieldOptional fieldRequirement = iota
- fieldRequired
- fieldDenied
- )
- type fieldTraits struct {
- Actual fieldRequirement
- Expected fieldRequirement
- Range fieldRequirement
- List fieldRequirement
- }
- func validateTraits(failure *AssertionFailure, traits fieldTraits) error {
- switch traits.Actual {
- case fieldRequired:
- if failure.Actual == nil {
- return fmt.Errorf(
- "AssertionFailure of type %s should have Actual field",
- failure.Type)
- }
- case fieldDenied:
- if failure.Actual != nil {
- return fmt.Errorf(
- "AssertionFailure of type %s can't have Actual field",
- failure.Type)
- }
- case fieldOptional:
- break
- }
- switch traits.Expected {
- case fieldRequired:
- if failure.Expected == nil {
- return fmt.Errorf(
- "AssertionFailure of type %s should have Expected field",
- failure.Type)
- }
- case fieldDenied:
- if failure.Expected != nil {
- return fmt.Errorf(
- "AssertionFailure of type %s can't have Expected field",
- failure.Type)
- }
- case fieldOptional:
- break
- }
- if traits.Range == fieldRequired || traits.Range == fieldOptional {
- if failure.Expected != nil {
- if _, ok := failure.Expected.Value.(*AssertionRange); ok {
- return errors.New(
- "AssertionValue should contain AssertionRange, not *AssertionRange")
- }
- if rng, ok := failure.Expected.Value.(AssertionRange); ok {
- if rng.Min == nil {
- return errors.New("AssertionRange value should have non-nil Min field")
- }
- if rng.Max == nil {
- return errors.New("AssertionRange value should have non-nil Max field")
- }
- }
- }
- }
- switch traits.Range {
- case fieldRequired:
- if failure.Expected == nil {
- return fmt.Errorf(
- "AssertionFailure of type %s should have Expected field",
- failure.Type)
- }
- if _, ok := failure.Expected.Value.(AssertionRange); !ok {
- return fmt.Errorf(
- "AssertionFailure of type %s"+
- " should have Expected field with AssertionRange value",
- failure.Type)
- }
- case fieldDenied:
- panic("unsupported")
- case fieldOptional:
- break
- }
- if traits.List == fieldRequired || traits.List == fieldOptional {
- if failure.Expected != nil {
- if _, ok := failure.Expected.Value.(*AssertionList); ok {
- return errors.New(
- "AssertionValue should contain AssertionList, not *AssertionList")
- }
- if lst, ok := failure.Expected.Value.(AssertionList); ok {
- if len(lst) == 0 {
- return errors.New("AssertionList should be non-empty")
- }
- }
- }
- }
- switch traits.List {
- case fieldRequired:
- if failure.Expected == nil {
- return fmt.Errorf(
- "AssertionFailure of type %s should have Expected field",
- failure.Type)
- }
- if _, ok := failure.Expected.Value.(AssertionList); !ok {
- return fmt.Errorf(
- "AssertionFailure of type %s"+
- " should have Expected field with AssertionList value",
- failure.Type)
- }
- case fieldDenied:
- panic("unsupported")
- case fieldOptional:
- break
- }
- return nil
- }
|