use JSON instead of JSON::Any to get rid of the CPAN Testers failures when only JSON...
[catagits/Catalyst-Controller-DBIC-API.git] / t / rpc / list_search_allows.t
1 use 5.6.0;
2
3 use strict;
4 use warnings;
5
6 use lib 't/lib';
7
8 my $base = 'http://localhost';
9
10 use RestTest;
11 use DBICTest;
12 use URI;
13 use Test::More;
14 use Test::WWW::Mechanize::Catalyst 'RestTest';
15 use HTTP::Request::Common;
16 use JSON;
17
18 my $json = JSON->new->utf8;
19
20 my $mech = Test::WWW::Mechanize::Catalyst->new;
21 ok( my $schema = DBICTest->init_schema(), 'got schema' );
22
23 my $track_list_url = "$base/api/rpc/track_exposed/list";
24 my $base_rs =
25     $schema->resultset('Track')
26     ->search( {},
27     { select => [qw/me.title me.position/], order_by => 'position' } );
28
29 # test open request
30 {
31     my $req = GET(
32         $track_list_url,
33         {
34
35         },
36         'Accept' => 'text/x-json'
37     );
38     $mech->request($req);
39     cmp_ok( $mech->status, '==', 200, 'open attempt okay' );
40
41     my @expected_response = map {
42         { $_->get_columns }
43     } $base_rs->all;
44     my $response = $json->decode( $mech->content );
45     is_deeply(
46         $response,
47         { list => \@expected_response, success => 'true' },
48         'correct message returned'
49     );
50 }
51
52 {
53     my $uri = URI->new($track_list_url);
54     $uri->query_form( { 'search.position' => 1 } );
55     my $req = GET(
56         $uri,
57         {
58
59         },
60         'Accept' => 'text/x-json'
61     );
62     $mech->request($req);
63     cmp_ok( $mech->status, '==', 200, 'search on position okay' );
64     my @expected_response = map {
65         { $_->get_columns }
66     } $base_rs->search( { position => 1 } )->all;
67     my $response = $json->decode( $mech->content );
68     is_deeply(
69         $response,
70         { list => \@expected_response, success => 'true' },
71         'correct message returned'
72     );
73 }
74
75 {
76     my $uri = URI->new($track_list_url);
77     $uri->query_form( { 'search.title' => 'Stripy' } );
78     my $req = GET(
79         $uri,
80         {
81
82         },
83         'Accept' => 'text/x-json'
84     );
85     $mech->request($req);
86     cmp_ok( $mech->status, '==', 400, 'search on title not okay' );
87
88     my @expected_response = map {
89         { $_->get_columns }
90     } $base_rs->search( { position => 1 } )->all;
91     my $response = $json->decode( $mech->content );
92     is( $response->{success}, 'false', 'correct message returned' );
93     like(
94         $response->{messages}->[0],
95         qr/is not an allowed search term/,
96         'correct message returned'
97     );
98 }
99
100 {
101     my $uri = URI->new($track_list_url);
102     $uri->query_form( { 'search.title' => 'Stripy' } );
103     my $req = GET(
104         $uri,
105         {
106
107         },
108         'Accept' => 'text/x-json'
109     );
110     $mech->request($req);
111     cmp_ok( $mech->status, '==', 400, 'search on title not okay' );
112
113     my $expected_response = map {
114         { $_->get_columns }
115     } $base_rs->search( { position => 1 } )->all;
116     my $response = $json->decode( $mech->content );
117     is( $response->{success}, 'false', 'correct message returned' );
118     like(
119         $response->{messages}->[0],
120         qr/is not an allowed search term/,
121         'correct message returned'
122     );
123 }
124
125 {
126     my $uri = URI->new($track_list_url);
127     $uri->query_form( { 'search.cd.artist' => '1' } );
128     my $req = GET(
129         $uri,
130         {
131
132         },
133         'Accept' => 'text/x-json'
134     );
135     $mech->request($req);
136     cmp_ok( $mech->status, '==', 400,
137         'search on various cd fields not okay' );
138     my $response = $json->decode( $mech->content );
139     is( $response->{success}, 'false', 'correct message returned' );
140     like(
141         $response->{messages}->[0],
142         qr/is not an allowed search term/,
143         'correct message returned'
144     );
145 }
146
147 {
148     my $uri = URI->new($track_list_url);
149     $uri->query_form(
150         {   'search.cd.title' => 'Spoonful of bees',
151             'search.cd.year'  => '1999'
152         }
153     );
154     my $req = GET(
155         $uri,
156         {
157
158         },
159         'Accept' => 'text/x-json'
160     );
161     $mech->request($req);
162     cmp_ok( $mech->status, '==', 200, 'search on various cd fields okay' );
163     my @expected_response = map {
164         { $_->get_columns }
165         } $base_rs->search(
166         { 'cd.year' => '1999', 'cd.title' => 'Spoonful of bees' },
167         { join      => 'cd' } )->all;
168     my $response = $json->decode( $mech->content );
169     is_deeply(
170         $response,
171         { list => \@expected_response, success => 'true' },
172         'correct message returned'
173     );
174 }
175
176 {
177     my $uri = URI->new($track_list_url);
178     $uri->query_form(
179         {   'search.cd.title'   => 'Spoonful of bees',
180             'search.cd.pretend' => '1999'
181         }
182     );
183     my $req = GET(
184         $uri,
185         {
186
187         },
188         'Accept' => 'text/x-json'
189     );
190     $mech->request($req);
191     cmp_ok( $mech->status, '==', 200, 'search with custom col okay' );
192     my @expected_response = map {
193         { $_->get_columns }
194         } $base_rs->search(
195         { 'cd.year' => '1999', 'cd.title' => 'Spoonful of bees' },
196         { join      => 'cd' } )->all;
197     my $response = $json->decode( $mech->content );
198     is_deeply(
199         $response,
200         { list => \@expected_response, success => 'true' },
201         'correct message returned'
202     );
203 }
204
205 {
206     my $uri = URI->new($track_list_url);
207     $uri->query_form( { 'search.cd.artist.name' => 'Random Boy Band' } );
208     my $req = GET(
209         $uri,
210         {
211
212         },
213         'Accept' => 'text/x-json'
214     );
215     $mech->request($req);
216     cmp_ok( $mech->status, '==', 200,
217         'search on artist field okay due to wildcard' );
218     my @expected_response = map {
219         { $_->get_columns }
220         } $base_rs->search(
221         { 'artist.name' => 'Random Boy Band' },
222         { join          => { cd => 'artist' } }
223         )->all;
224     my $response = $json->decode( $mech->content );
225     is_deeply(
226         $response,
227         { list => \@expected_response, success => 'true' },
228         'correct message returned'
229     );
230 }
231
232 done_testing();