summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2012-10-11 14:22:55 -0500
committerJesse Luehrs <doy@tozt.net>2012-10-11 14:23:09 -0500
commitcd59caeec925cf0bf8625d567a442e3c46ae7475 (patch)
tree9fc7ba28aca00fec5f6c53ee1b18249fcd4df006
parentc5ee7923bb6d38f138e58e7da5f9dfaa85bb9721 (diff)
downloadmoosex-validation-doctypes-cd59caeec925cf0bf8625d567a442e3c46ae7475.tar.gz
moosex-validation-doctypes-cd59caeec925cf0bf8625d567a442e3c46ae7475.zip
also provide stringification for the error object
-rw-r--r--lib/MooseX/Validation/Doctypes/Errors.pm46
-rw-r--r--t/complex.t25
-rw-r--r--t/stringify.t33
3 files changed, 91 insertions, 13 deletions
diff --git a/lib/MooseX/Validation/Doctypes/Errors.pm b/lib/MooseX/Validation/Doctypes/Errors.pm
index ca4d54d..7601855 100644
--- a/lib/MooseX/Validation/Doctypes/Errors.pm
+++ b/lib/MooseX/Validation/Doctypes/Errors.pm
@@ -2,6 +2,8 @@ package MooseX::Validation::Doctypes::Errors;
use Moose;
# ABSTRACT: error class for MooseX::Validation::Doctypes
+use overload '""' => 'stringify';
+
=head1 SYNOPSIS
use MooseX::Validation::Doctypes;
@@ -113,6 +115,50 @@ sub TO_JSON {
};
}
+sub stringify {
+ my $self = shift;
+
+ return join(
+ "\n",
+ (sort $self->_stringify_ref($self->errors)),
+ $self->_stringify_extra_data($self->extra_data),
+ );
+}
+
+sub _stringify_ref {
+ my $self = shift;
+ my ($data) = @_;
+
+ return
+ if !defined $data;
+
+ return $data
+ if !ref $data;
+
+ return map { $self->_stringify_ref($_) } values %$data
+ if ref($data) eq 'HASH';
+
+ return map { $self->_stringify_ref($_) } @$data
+ if ref($data) eq 'ARRAY';
+
+ return "unknown data: $data";
+}
+
+sub _stringify_extra_data {
+ my $self = shift;
+ my ($data) = @_;
+
+ return
+ unless defined $data;
+
+ require Data::Dumper;
+ local $Data::Dumper::Terse = 1;
+ my $string = Data::Dumper::Dumper($data);
+ chomp($string);
+
+ return ("extra data found:", $string);
+}
+
__PACKAGE__->meta->make_immutable;
no Moose;
diff --git a/t/complex.t b/t/complex.t
index b617cab..04dbe60 100644
--- a/t/complex.t
+++ b/t/complex.t
@@ -166,25 +166,24 @@ doctype 'Location' => {
}
});
is_deeply(
- $errors,
+ $errors->errors,
{
- errors => {
- contact => {
- email => "invalid value \"anelson at cpan.org\" for 'contact.email'"
- },
- i18n => {
- available_currencies => "invalid value [ \"dolla dolla bill\", \"CAD\", \"EUR\" ] for 'i18n.available_currencies'",
- default_currency => "invalid value undef for 'i18n.default_currency'"
- },
- location => {
- coordinates => {
- lon => "invalid value \"38q\" for 'location.coordinates.lon'"
- }
+ contact => {
+ email => "invalid value \"anelson at cpan.org\" for 'contact.email'"
+ },
+ i18n => {
+ available_currencies => "invalid value [ \"dolla dolla bill\", \"CAD\", \"EUR\" ] for 'i18n.available_currencies'",
+ default_currency => "invalid value undef for 'i18n.default_currency'"
+ },
+ location => {
+ coordinates => {
+ lon => "invalid value \"38q\" for 'location.coordinates.lon'"
}
}
},
"got the right errors"
);
+ ok(!$errors->has_extra_data, "no extra data");
}
}
diff --git a/t/stringify.t b/t/stringify.t
new file mode 100644
index 0000000..c8db5a4
--- /dev/null
+++ b/t/stringify.t
@@ -0,0 +1,33 @@
+#!/usr/bin/env perl
+use strict;
+use warnings;
+use Test::More;
+
+use Moose::Util::TypeConstraints 'find_type_constraint';
+
+use MooseX::Validation::Doctypes;
+
+doctype 'Person' => {
+ id => 'Str',
+ name => 'Str',
+ title => 'Str',
+};
+
+{
+ my $person = find_type_constraint('Person');
+ my $errors = $person->validate({ foo => "bar" });
+
+ is(
+ "$errors",
+ "invalid value undef for 'id'\n"
+ . "invalid value undef for 'name'\n"
+ . "invalid value undef for 'title'\n"
+ . "extra data found:\n"
+ . "{\n"
+ . " 'foo' => 'bar'\n"
+ . "}",
+ "stringified properly"
+ );
+}
+
+done_testing;