introducing regex check analogous to text match check
authorJens Rehsack <sno@NetBSD.org>
Tue, 7 Aug 2012 14:44:23 +0000 (7 16:44 +0200)
committerJens Rehsack <sno@NetBSD.org>
Tue, 7 Aug 2012 14:44:23 +0000 (7 16:44 +0200)
lib/WWW/Mechanize/Script/Plugin/RegexMatchTest.pm [new file with mode: 0644]

diff --git a/lib/WWW/Mechanize/Script/Plugin/RegexMatchTest.pm b/lib/WWW/Mechanize/Script/Plugin/RegexMatchTest.pm
new file mode 100644 (file)
index 0000000..98b25d1
--- /dev/null
@@ -0,0 +1,76 @@
+package WWW::Mechanize::Script::Plugin::RegexMatchTest;
+
+use strict;
+use warnings;
+
+use parent qw(WWW::Mechanize::Script::Plugin);
+
+use Params::Util qw(_ARRAY0);
+
+our $VERSION = '0.001_002';
+
+use 5.014;
+
+sub check_value_names
+{
+    return qw(regex_forbid regex_require);
+}
+
+sub check_response
+{
+    my ( $self, $check, $mech ) = @_;
+
+    my $regex_require = $self->get_check_value( $check, "regex_require" );
+    my $regex_forbid  = $self->get_check_value( $check, "regex_forbid" );
+    my $ignore_case = $self->get_check_value_as_bool( $check, "ignore_case" );
+    my $content = $mech->is_html() ? $mech->text() : $mech->content();
+
+    defined($regex_require) and ref($regex_require) ne "ARRAY" and $regex_require = [$regex_require];
+    defined($regex_forbid) and ref($regex_forbid) ne "ARRAY" and $regex_forbid = [$regex_forbid];
+
+    my @match_fails;
+    my $code = 0;
+    my $case_ign = $ignore_case ? "(?i)" : "";
+    my @msg;
+    foreach my $regex_line ( @{$regex_require} )
+    {
+        if ( $content !~ m/$case_ign$regex_line/ )
+        {
+            my $err_code = $self->get_check_value( $check, "regex_require_code" ) // 1;
+            $code = &{ $check->{compute_code} }( $code, $err_code );
+            push( @match_fails, $regex_line );
+        }
+    }
+    @match_fails
+      and push( @msg,
+                    "required regex "
+                  . join( ", ", map { "'" . $_ . "'" } @match_fails )
+                  . " not found in received content" );
+
+    @match_fails = ();
+    foreach my $regex_line ( @{$regex_forbid} )
+    {
+        if ( $content =~ m/$case_ign$regex_line/ )
+        {
+            my $err_code = $self->get_check_value( $check, "regex_forbid_code" ) // 1;
+            $code = &{ $check->{compute_code} }( $code, $err_code );
+            push( @match_fails, $regex_line );
+        }
+    }
+    @match_fails
+      and push( @msg,
+                    "forbidden regex "
+                  . join( ", ", map { "'" . $_ . "'" } @match_fails )
+                  . " found in received content" );
+
+    if ( $code or @msg )
+    {
+        return ( $code, @msg );
+    }
+
+    return (0);
+    return (0);
+}
+
+1;
+