diff options
Diffstat (limited to 't/lib/RTest/UI/Window.pm')
-rw-r--r-- | t/lib/RTest/UI/Window.pm | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/t/lib/RTest/UI/Window.pm b/t/lib/RTest/UI/Window.pm new file mode 100644 index 0000000..2528f03 --- /dev/null +++ b/t/lib/RTest/UI/Window.pm @@ -0,0 +1,110 @@ +package RTest::UI::Window; + +use aliased 'Reaction::UI::ViewPort'; + +use base qw/Reaction::Test/; +use Reaction::Class; + +BEGIN { + + package RTest::UI::Window::_::view; + + use base qw/Reaction::UI::Renderer::XHTML/; + + sub render { + return $_[0]->{render}->(@_); + } + + package RTest::UI::Window::_::TestViewPort; + + use Reaction::Class; + + extends 'Reaction::UI::ViewPort'; + + register_inc_entry; + + sub handle_events { + $_[0]->{handle_events}->(@_); + } + +}; + +use Test::More (); +use Reaction::UI::Window; +use aliased 'RTest::UI::Window::_::TestViewPort'; + +has 'window' => ( + isa => 'Reaction::UI::Window', is => 'rw', + set_or_lazy_build('window') +); + +sub build_window { + my $self = shift; + return Reaction::UI::Window->new( + ctx => bless({}, 'Reaction::Test::Mock::Context'), + view_name => 'Test', + content_type => 'text/html', + ); +} + +sub test_window :Tests { + my $self = shift; + my $window = $self->build_window; + my $view = bless({}, 'RTest::UI::Window::_::view'); + $window->ctx->{view} = sub { + Test::More::is($_[1], 'Test', 'View name ok'); + return $view; + }; + Test::More::is($window->view, $view, 'View retrieved from context'); + my %param; + $window->ctx->{req} = sub { + return bless({ + query_parameters => sub { \%param }, + body_parameters => sub { {} }, + }, 'Reaction::Test::Mock::Request'); + }; + $window->ctx->{res} = sub { + return bless({ + status => sub { 200 }, + body => sub { '' }, + }, 'Reaction::Test::Mock::Response'); + }; + eval { $window->flush }; + Test::More::like($@, qr/empty focus stack/, 'Error thrown without viewports'); + my @vp; + push(@vp, $window->focus_stack + ->push_viewport(ViewPort, ctx => $window->ctx)); + push(@vp, $window->focus_stack + ->push_viewport(ViewPort, ctx => $window->ctx)); + my $i; + $view->{render} = sub { + my $expect_vp = $vp[$i++]; + Test::More::is($_[1], $window->ctx, 'Context ok'); + Test::More::is($_[2], 'component', 'Component template'); + Test::More::is($_[3]->{self}, $expect_vp, 'Viewport'); + $_[3]->{window}->render_viewport($expect_vp->inner); + return "foo"; + }; + my $body; + $window->ctx->{res} = sub { + return bless({ + body => sub { shift; return '' unless @_; $body = shift; }, + content_type => sub { }, + status => sub { 200 }, + }, 'Reaction::Test::Mock::Response'); + }; + $window->flush; + Test::More::is($body, 'foo', 'body set ok'); + my $test_vp = $vp[1]->create_tangent('foo') + ->push_viewport(TestViewPort, + ctx => bless({}, 'Catalyst')); + my $param_name = '1.foo.0:name'; + Test::More::is($test_vp->event_id_for('name'), $param_name, 'Event id ok'); + $param{$param_name} = 'blah'; + $test_vp->{handle_events} = sub { + Test::More::is($_[1]->{name}, 'blah', 'Event delivered ok'); + }; + $window->flush_events; +} + +1; |