Sfoglia il codice sorgente

Work on #4: Playwright::Base tested save for the async bits

George S. Baugh 5 anni fa
parent
commit
cd46af53fb
1 ha cambiato i file con 96 aggiunte e 0 eliminazioni
  1. 96 0
      t/Playwright-Base.t

+ 96 - 0
t/Playwright-Base.t

@@ -0,0 +1,96 @@
+use Test2::V0 -target => 'Playwright::Base';
+use Test2::Tools::Explain;
+use Playwright::Base;
+use JSON;
+use Test::MockModule qw{strict};
+
+local $Playwright::spec = {
+    Fake => {
+        members => {
+            tickle => {
+                args => {
+                    chase => { type => { name => 'boolean' }, order => 1 },
+                    tickleOptions => {
+                        order => 0,
+                        type => {
+                            name => 'Object',
+                            properties => {
+                                intense  => { name => 'intense',  type => { name => 'boolean' }  },
+                                tickler  => { name => 'tickler',  type => { name => 'string'  }  },
+                                optional => { name => 'optional', type => { name => 'boolean' }  }, # Optional, shouldn't show up in output
+                            },
+                        },
+                    },
+                    who => { type => { name => 'string' },  order => 2 },
+                    hug => { type => { name => 'boolean' }, order => 3 }, # Optional bool arg, make sure we dont choke
+                },
+            },
+        }
+    },
+};
+
+local %Playwright::mapper = (
+    Fake => sub {
+        my ($self, $res) = @_;
+        my $class = "Playwright::Fake";
+        return $class->new( handle => $self, id => $res->{_guid}, type => 'Fake', spec => $Playwright::spec->{Fake} );
+    },
+);
+
+no warnings qw{redefine once};
+local *Playwright::Fake::new = sub {
+    my ($class,%options) = @_;
+    return bless( {
+        spec => $Playwright::spec->{$options{type}}{members},
+        type => $options{type},
+        guid => $options{id},
+        ua   => $options{handle}{ua},
+        port => $options{handle}{port}, 
+    }, $class);
+};
+use warnings;
+
+my $obj = CLASS()->new(
+    type => 'Fake',
+    id   => 666,
+    handle => { ua => 'bogus', port => 420 },
+);
+
+is($obj->{spec}, $Playwright::spec->{Fake}{members}, "Spec correctly filed by constructor");
+
+my %in = (
+    command => 'tickle',
+    type    => 'Fake',
+    args    => [{ intense => 1, tickler => 'bigtime' },0, 'boom'],
+);
+
+my %expected = (
+    command => 'tickle',
+    type    => 'Fake',
+    args    => [{ intense => JSON::true, tickler => 'bigtime' }, JSON::false, 'boom'],
+);
+
+my %out = Playwright::Base::_coerce($obj->{spec}, %in);
+
+is(\%out, \%expected, "_coerce correctly transforms bools and leaves everything else alone");
+
+my $result = { error => JSON::true, message => "U suck" };
+
+my $utilmock = Test::MockModule->new('Playwright::Util');
+$utilmock->redefine('request', sub {
+    return $result;
+});
+
+is( $obj->_request(%in), $result, "Data directly returned when no _type or _guid");
+$result = { _guid => 666, _type => 'Fake' };
+my $exp_obj = Playwright::Fake->new(
+    id     => 666,
+    type   => 'Fake',
+    spec   => $Playwright::spec->{Fake}{members},
+    handle => $obj
+);
+my $oot = $obj->_request(%in);
+
+is( $oot, $exp_obj, "Object returned when _type or _guid returned");
+
+done_testing();