Skip to content

Commit

Permalink
added support for advanced binary WebSocket message tests to Test::Mojo
Browse files Browse the repository at this point in the history
  • Loading branch information
kraih committed Jan 11, 2013
1 parent 4b0e127 commit 1d98aeb
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 14 deletions.
1 change: 1 addition & 0 deletions Changes
@@ -1,5 +1,6 @@

3.77 2013-01-11
- Added support for advanced binary WebSocket message tests to Test::Mojo.
- Added binary and text events to Mojo::Transaction::WebSocket.
- Added j function to Mojo::JSON.
- Improved tests.
Expand Down
3 changes: 2 additions & 1 deletion lib/Mojo/Transaction/WebSocket.pm
Expand Up @@ -375,7 +375,8 @@ Emitted when a WebSocket frame has been received.
...
});
Emitted when a complete WebSocket message has been received.
Emitted when a complete WebSocket message has been received, text messages
will be automatically decoded.
$ws->on(message => sub {
my ($ws, $msg) = @_;
Expand Down
41 changes: 32 additions & 9 deletions lib/Test/Mojo.pm
Expand Up @@ -164,26 +164,22 @@ sub json_hasnt {

sub message_is {
my ($self, $value, $desc) = @_;
$desc ||= 'exact match for message';
return $self->_test('is', $self->_message, $value, $desc);
return $self->_message('is', $value, $desc || 'exact match for message');
}

sub message_isnt {
my ($self, $value, $desc) = @_;
$desc ||= 'no match for message';
return $self->_test('isnt', $self->_message, $value, $desc);
return $self->_message('isnt', $value, $desc || 'no match for message');
}

sub message_like {
my ($self, $regex, $desc) = @_;
$desc ||= 'message is similar';
return $self->_test('like', $self->_message, $regex, $desc);
return $self->_message('like', $regex, $desc || 'message is similar');
}

sub message_unlike {
my ($self, $regex, $desc) = @_;
$desc ||= 'message is not similar';
return $self->_test('unlike', $self->_message, $regex, $desc);
return $self->_message('unlike', $regex, $desc || 'message is not similar');
}

sub options_ok { shift->_request_ok(options => @_) }
Expand Down Expand Up @@ -278,7 +274,8 @@ sub websocket_ok {
my $tx = pop;
$self->tx($tx);
$tx->on(finish => sub { $self->{finished} = 1 });
$tx->on(message => sub { push @{$self->{messages}}, pop });
$tx->on(binary => sub { push @{$self->{messages}}, [binary => pop] });
$tx->on(text => sub { push @{$self->{messages}}, [text => pop] });
Mojo::IOLoop->stop;
}
);
Expand All @@ -296,6 +293,24 @@ sub _get_content {
}

sub _message {
my ($self, $name, $value, $desc) = @_;
local $Test::Builder::Level = $Test::Builder::Level + 1;
my ($type, $msg) = @{$self->_next || ['']};

# Type check
if (ref $value eq 'HASH') {
my $expect = exists $value->{text} ? 'text' : 'binary';
$value = $value->{$expect};
$msg = '' unless $type eq $expect;
}

# Decode text frame if there is no type check
else { $msg = decode 'UTF-8', $msg if $type eq 'text' }

return $self->_test($name, $msg // '', $value, $desc);
}

sub _next {
my $self = shift;
Mojo::IOLoop->one_tick while !$self->{finished} && !@{$self->{messages}};
return shift @{$self->{messages}};
Expand Down Expand Up @@ -601,27 +616,35 @@ Opposite of C<json_has>.
=head2 message_is
$t = $t->message_is({binary => $bytes});
$t = $t->message_is({text => $bytes});
$t = $t->message_is('working!');
$t = $t->message_is('working!', 'right message');
Check WebSocket message for exact match.
=head2 message_isnt
$t = $t->message_isnt({binary => $bytes});
$t = $t->message_isnt({text => $bytes});
$t = $t->message_isnt('working!');
$t = $t->message_isnt('working!', 'different message');
Opposite of C<message_is>.
=head2 message_like
$t = $t->message_like({binary => qr/$bytes/});
$t = $t->message_like({text => qr/$bytes/});
$t = $t->message_like(qr/working!/);
$t = $t->message_like(qr/working!/, 'right message');
Check WebSocket message for similar match.
=head2 message_unlike
$t = $t->message_unlike({binary => qr/$bytes/});
$t = $t->message_unlike({text => qr/$bytes/});
$t = $t->message_unlike(qr/working!/);
$t = $t->message_unlike(qr/working!/, 'different message');
Expand Down
10 changes: 6 additions & 4 deletions t/mojolicious/websocket_lite_app.t
Expand Up @@ -114,11 +114,13 @@ $t->websocket_ok('/echo', {'Sec-WebSocket-Protocol' => 'foo, bar, baz'})
->message_is('echo: hello')->finish_ok;

# WebSocket /echo (bytes)
$t->websocket_ok('/echo')->send_ok({binary => 'bytes!'})->message_is('bytes!')
->finish_ok;
$t->websocket_ok('/echo')->send_ok({binary => 'bytes!'})
->message_is({binary => 'bytes!'})->send_ok({binary => 'bytes!'})
->message_isnt({text => 'bytes!'})->finish_ok;

# WebSocket /echo (zero)
$t->websocket_ok('/echo')->send_ok(0)->message_is('echo: 0')->finish_ok;
$t->websocket_ok('/echo')->send_ok(0)->message_is('echo: 0')->send_ok(0)
->message_like({text => qr/0/})->finish_ok;

# GET /echo (plain alternative)
$t->get_ok('/echo')->status_is(200)->content_is('plain echo!');
Expand All @@ -132,7 +134,7 @@ $t->websocket_ok('/push')->message_is('push')->message_is('push')

# WebSocket /push (again)
$t->websocket_ok('/push')->message_unlike(qr/shift/)->message_isnt('shift')
->message_like(qr/us/)->finish_ok;
->message_like(qr/us/)->message_unlike({binary => qr/push/})->finish_ok;

# GET /plain (again)
$t->get_ok('/plain')->status_is(200)->content_is('Nothing to see here!');
Expand Down

0 comments on commit 1d98aeb

Please sign in to comment.