File Coverage

blib/lib/Test/Mojo/More.pm
Criterion Covered Total %
statement 24 81 29.6
branch 0 16 0.0
condition 0 35 0.0
subroutine 8 27 29.6
pod 12 12 100.0
total 44 171 25.7


line stmt bran cond sub pod time code
1             package Test::Mojo::More;
2              
3 1     1   16858 use Mojo::Base 'Test::Mojo';
  1         8315  
  1         5  
4 1     1   193643 use Test::More;
  1         2  
  1         7  
5 1     1   262 use Mojo::JSON::Pointer;
  1         6  
  1         6  
6 1     1   25 use Mojo::Message::Request;
  1         1  
  1         7  
7 1     1   558 use Mojolicious;
  1         82646  
  1         9  
8 1     1   35 use Mojolicious::Controller;
  1         2  
  1         5  
9 1     1   19 use Mojo::Transaction::HTTP;
  1         2  
  1         11  
10              
11 1     1   23 no warnings 'utf8';
  1         2  
  1         1084  
12              
13             =head1 NAME
14              
15             Test::Mojo::More - Test::Mojo and more.
16              
17             =head1 VERSION
18              
19             Version 0.061
20              
21             =cut
22              
23             our $VERSION = 0.061_000;
24              
25              
26             =head1 SYNOPSIS
27              
28             use Test::More;
29             use Test::Mojo::More;
30            
31             my $t = new Test::Mojo::More 'MyApp';
32            
33             $t->post_ok('/account/login/', form => {
34             login => 'false',
35             pass => 123,
36             })
37             ->status_is(302)
38             ->flash_is( '/error/login' => 'Error login.' )
39             ->cookie_hasnt( 'user_id' );
40            
41             $t->post_ok('account/login/', form => {
42             login => 'true',
43             pass => 123,
44             })
45             ->status_is(302)
46             ->flash_hasnt( '/errror' )
47             ->cookie_has( 'user_id' );
48            
49             done_testing;
50              
51              
52             =head1 DESCRIPTION
53              
54             L is an extension for the L which allows
55             you to test L and L applications.
56              
57              
58             =head1 ATTRIBUTES
59              
60             L inherits all attributed from L and inplements
61             the following new ones.
62              
63             =head2 C
64              
65             @a = $t->dom->find('.menu li a');
66              
67             Currect DOM from transaction.
68              
69              
70             =head2 C
71              
72             $cookie = $t->cookie_hashref;
73              
74             Current cookies from transaction.
75              
76              
77             =head2 C
78              
79             $flases = $t->flash_hashref;
80              
81             Current flashes from transaction.
82              
83              
84             =cut
85              
86 0     0 1   sub dom { return shift->tx->res->dom }
87 0     0 1   sub cookie_hashref { return { map { $_->name => $_->value } @{ $_[0]->_controller->req->cookies } } }
  0            
  0            
88 0   0 0 1   sub flash_hashref { return $_[0]->_session->{flash} || {} }
89              
90              
91             =head1 METHODS
92              
93             L inherits all method from L and inplements
94             the following new ones.
95              
96             =head2 C
97              
98             $t = $t->flash_is( '/error', { message => 'error message' } );
99             $t = $t->flash_is( '/error/message', 'error message' );
100              
101             Check flash the given JSON Pointer with Mojo::JSON::Pointer.
102              
103             =cut
104              
105             sub flash_is {
106 0     0 1   my ($self, $key, $value, $desc) = @_;
107 0           my ( $flash, $path ) = $self->_prepare_key($key);
108 0           $flash = $self->_flash($flash);
109              
110 0 0 0       return $self->__test(
111             'is_deeply',
112             _pointer( $flash, $path ? "/$path" : "" ),
113             $value,
114             $desc || "flash exact match for JSON Pointer \"$key\"",
115             );
116             }
117              
118              
119             =head2 C
120              
121             $t = $t->flash_has( '/error' );
122             $t = $t->flash_has( '/error/message' );
123              
124             Check if flash contains a value that can be identified using
125             the given JSON Pointer with Mojo::JSON::Pointer.
126              
127             =cut
128              
129             sub flash_has {
130 0     0 1   my ($self, $key, $value, $desc) = @_;
131 0           my ( $flash, $path ) = $self->_prepare_key($key);
132              
133 0           $flash = $self->_flash($flash);
134              
135 0 0 0       return $self->__test(
136             'ok',
137             !!_pointer($flash, $path ? "/$path" : "" ),
138             $desc || "flash has value for JSON Pointer \"$key\"",
139             );
140             }
141              
142              
143             =head2 C
144              
145             $t = $t->flash_hasnt( '/error' );
146             $t = $t->flash_hasnt( '/error/message' );
147              
148             Check if flash no contains a value that can be identified using
149             the given JSON Pointer with Mojo::JSON::Pointer
150              
151             =cut
152              
153             sub flash_hasnt {
154 0     0 1   my ($self, $key, $value, $desc) = @_;
155 0           my ( $flash, $path ) = $self->_prepare_key($key);
156 0           $flash = $self->_flash($flash);
157 0 0 0       return $self->__test(
158             'ok',
159             !_pointer( $flash, $path ? "/$path" : "" ),
160             $desc || "flash has no value for JSON Pointer \"$key\""
161             );
162             }
163              
164              
165              
166             =head2 C
167              
168             $t = $t->cookie_has( 'error' );
169              
170             Check if cookie contains a cracker.
171              
172             =cut
173              
174             sub cookie_has {
175 0     0 1   my ($self, $cookie, $desc) = @_;
176 0   0       return $self->__test(
177             'ok',
178             !!$self->_cookie( $cookie ),
179             $desc || "has cookie \"$cookie\"",
180             );
181             }
182              
183              
184             =head2 C
185              
186             $t = $t->cookie_hasnt( 'error' );
187              
188             Check if cookie no contains a cookie.
189              
190             =cut
191              
192             # Polly wants a cracker
193             sub cookie_hasnt {
194 0     0 1   my ($self, $cookie, $desc) = @_;
195 0   0       return $self->__test(
196             'ok',
197             !$self->_cookie( $cookie ),
198             $desc || "has no cookie \"$cookie\"",
199             );
200             }
201              
202              
203             =head2 C
204              
205             $t = $t->cookie_is( $name => $value );
206              
207             Check cookie for exact match.
208              
209             =cut
210              
211             sub cookie_is {
212 0     0 1   my ($self, $cookie, $value, $desc) = @_;
213 0   0       return $self->__test(
214             'is',
215             $self->_cookie( $cookie ),
216             $value,
217             $desc || "cookie \"$cookie\": ".($value ? "\"$value\"" : '""'),
218             );
219             }
220              
221              
222              
223             =head2 C
224              
225             $t = $t->cookie_isnt( $name => $value );
226              
227             Opposite of L
228              
229             =cut
230              
231             sub cookie_isnt {
232 0     0 1   my ($self, $cookie, $value, $desc) = @_;
233 0   0       return $self->__test(
234             'isnt',
235             $self->_cookie( $cookie ),
236             $value,
237             $desc || "not cookie \"$cookie\": ".($value ? "\"$value\"" : '""'),
238             );
239             }
240              
241              
242             =head2 C
243              
244             $t = $t->cookie_like( 'error', 'fatal error' );
245              
246             Check if cookie for similar match.
247              
248             =cut
249              
250             sub cookie_like {
251 0     0 1   my ($self, $cookie, $regex, $desc) = @_;
252 0   0       return $self->__test(
253             'like',
254             $self->_cookie( $cookie ),
255             $regex,
256             $desc || "cookie \"$cookie\" is similar",
257             );
258             }
259              
260             =head2 C
261              
262             $t = $t->cookie_unlike( 'error', 'unfatal error' );
263              
264             Opposite of L.
265              
266             =cut
267              
268             sub cookie_unlike {
269 0     0 1   my ($self, $cookie, $regex, $desc) = @_;
270 0   0       return $self->__test(
271             'unlike',
272             $self->_cookie( $cookie ),
273             $regex,
274             $desc || "cookie \"$cookie\" is not similar",
275             );
276             }
277              
278             sub _prepare_key {
279 0     0     shift;
280 0 0         return ( '', '' ) unless @_;
281 0           my ( undef, $flash, $path ) = split '\/', +shift, 3;
282 0           ( $flash, $path )
283             }
284              
285             sub _session {
286             shift->_controller->session
287 0     0     }
288              
289             sub _flash {
290 0 0   0     return $_[0]->_controller->flash( $_[1] ) if @_ == 2;
291             {}
292 0           }
293              
294             sub _cookie {
295 0     0     return $_[0]->_controller->cookie( $_[1] );
296             }
297              
298             sub _controller {
299 0     0     my $self = shift;
300              
301             # Build res cookies
302 0           my $req = Mojo::Message::Request->new;
303 0           $req->cookies( join "; ", map{ $_->name ."=". $_->value } @{$self->tx->res->cookies} );
  0            
  0            
304              
305             # Make app && controller
306 0           my $c = Mojolicious::Controller->new(
307             tx => Mojo::Transaction::HTTP->new( req => $req ),
308             app => Mojolicious->new(),
309             );
310              
311             # XXX copy secret
312 0   0       my $secret = $c->app->can('secrets') || $c->app->can('secret');
313 0   0       $secret->( $c->app, ( $self->app->can('secrets') || $self->app->can('secret') )->( $self->app ) );
314              
315             # Init
316 0           $c->app->handler( $c );
317 0           $c->app->sessions->load( $c );
318 0           $c;
319             }
320              
321             sub _pointer {
322 0     0     my ($data, $path) = @_;
323 0 0         return Mojo::JSON::Pointer->new($data)->get($path)
324             if Mojo::JSON::Pointer->can('data');
325 0           return Mojo::JSON::Pointer->new->get($data, $path);
326 0           return 0;
327             }
328              
329             sub __test {
330 0     0     my $self = shift;
331 0 0         return $self->_test(@_) if $self->can('_test');
332 0           my $method = shift;
333 0 0         Test::More->can($method)->(@_) if Test::More->can($method);
334 0           $self;
335             }
336              
337              
338             =head1 SEE ALSO
339              
340             L, L
341              
342             =head1 AUTHOR
343              
344             coolmen, C<< >>
345              
346             =head1 LICENSE AND COPYRIGHT
347              
348             Copyright 2013 coolmen.
349              
350             This program is distributed under the MIT (X11) License:
351             L
352              
353             Permission is hereby granted, free of charge, to any person
354             obtaining a copy of this software and associated documentation
355             files (the "Software"), to deal in the Software without
356             restriction, including without limitation the rights to use,
357             copy, modify, merge, publish, distribute, sublicense, and/or sell
358             copies of the Software, and to permit persons to whom the
359             Software is furnished to do so, subject to the following
360             conditions:
361              
362             The above copyright notice and this permission notice shall be
363             included in all copies or substantial portions of the Software.
364              
365             THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
366             EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
367             OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
368             NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
369             HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
370             WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
371             FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
372             OTHER DEALINGS IN THE SOFTWARE.
373              
374              
375             =cut
376              
377             1; # End of Test::Mojo::More
378