initial commit with working tests, docs, and conversion to dzil+podweaver
[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::Any;
17
18 my $mech = Test::WWW::Mechanize::Catalyst->new;
19 ok(my $schema = DBICTest->init_schema(), 'got schema');
20
21 my $track_list_url = "$base/api/rpc/track_exposed/list";
22 my $base_rs = $schema->resultset('Track')->search({}, { select => [qw/me.title me.position/], order_by => 'position' });
23
24 # test open request
25 {
26   my $req = GET( $track_list_url, {
27                 
28   }, 'Accept' => 'text/x-json' );
29   $mech->request($req);
30   cmp_ok( $mech->status, '==', 200, 'open attempt okay' );
31
32   my @expected_response = map { { $_->get_columns } } $base_rs->all;
33   my $response = JSON::Any->Load( $mech->content);
34   is_deeply( $response, { list => \@expected_response, success => 'true' }, 'correct message returned' );
35 }
36
37 {
38   my $uri = URI->new( $track_list_url );
39   $uri->query_form({ 'search.position' => 1 });
40   my $req = GET( $uri, {
41                 
42   }, 'Accept' => 'text/x-json' );
43   $mech->request($req);
44   cmp_ok( $mech->status, '==', 200, 'search on position okay' );
45   my @expected_response = map { { $_->get_columns } } $base_rs->search({ position => 1 })->all;
46   my $response = JSON::Any->Load( $mech->content);
47   is_deeply( $response, { list => \@expected_response, success => 'true' }, 'correct message returned' );
48 }
49
50 {
51   my $uri = URI->new( $track_list_url );
52   $uri->query_form({ 'search.title' => 'Stripy' });
53   my $req = GET( $uri, {
54                 
55   }, 'Accept' => 'text/x-json' );
56   $mech->request($req);
57   cmp_ok( $mech->status, '==', 400, 'search on title not okay' );
58
59   my @expected_response = map { { $_->get_columns } } $base_rs->search({ position => 1 })->all;
60   my $response = JSON::Any->Load( $mech->content);
61   is($response->{success}, 'false', 'correct message returned');
62   like($response->{messages}->[0], qr/is not an allowed search term/, 'correct message returned');
63 }
64
65 {
66   my $uri = URI->new( $track_list_url );
67   $uri->query_form({ 'search.title' => 'Stripy' });
68   my $req = GET( $uri, {
69                 
70   }, 'Accept' => 'text/x-json' );
71   $mech->request($req);
72   cmp_ok( $mech->status, '==', 400, 'search on title not okay' );
73
74   my $expected_response = map { { $_->get_columns } } $base_rs->search({ position => 1 })->all;
75   my $response = JSON::Any->Load( $mech->content);
76   is($response->{success}, 'false', 'correct message returned');
77   like($response->{messages}->[0], qr/is not an allowed search term/, 'correct message returned');
78 }
79
80 {
81   my $uri = URI->new( $track_list_url );
82   $uri->query_form({ 'search.cd.artist' => '1' });
83   my $req = GET( $uri, {
84                 
85   }, 'Accept' => 'text/x-json' );
86   $mech->request($req);
87   cmp_ok( $mech->status, '==', 400, 'search on various cd fields not okay' );
88   my $response = JSON::Any->Load( $mech->content);
89   is($response->{success}, 'false', 'correct message returned');
90   like($response->{messages}->[0], qr/is not an allowed search term/, 'correct message returned');
91 }
92
93 {
94   my $uri = URI->new( $track_list_url );
95   $uri->query_form({ 'search.cd.title' => 'Spoonful of bees', 'search.cd.year' => '1999' });
96   my $req = GET( $uri, {
97                 
98   }, 'Accept' => 'text/x-json' );
99   $mech->request($req);
100   cmp_ok( $mech->status, '==', 200, 'search on various cd fields okay' );
101   my @expected_response = map { { $_->get_columns } } $base_rs->search({ 'cd.year' => '1999', 'cd.title' => 'Spoonful of bees' }, { join => 'cd' })->all;
102   my $response = JSON::Any->Load( $mech->content);
103   is_deeply($response, { list => \@expected_response, success => 'true' }, 'correct message returned' );
104 }
105
106 {
107   my $uri = URI->new( $track_list_url );
108   $uri->query_form({ 'search.cd.title' => 'Spoonful of bees', 'search.cd.pretend' => '1999' });
109   my $req = GET( $uri, {
110                 
111   }, 'Accept' => 'text/x-json' );
112   $mech->request($req);
113   cmp_ok( $mech->status, '==', 200, 'search with custom col okay' );
114   my @expected_response = map { { $_->get_columns } } $base_rs->search({ 'cd.year' => '1999', 'cd.title' => 'Spoonful of bees' }, { join => 'cd' })->all;
115   my $response = JSON::Any->Load( $mech->content);
116   is_deeply($response, { list => \@expected_response, success => 'true' }, 'correct message returned' );
117 }
118
119 {
120   my $uri = URI->new( $track_list_url );
121   $uri->query_form({ 'search.cd.artist.name' => 'Random Boy Band' });
122   my $req = GET( $uri, {
123                 
124   }, 'Accept' => 'text/x-json' );
125   $mech->request($req);
126   cmp_ok( $mech->status, '==', 200, 'search on artist field okay due to wildcard' );
127   my @expected_response = map { { $_->get_columns } } $base_rs->search({ 'artist.name' => 'Random Boy Band' }, { join => { cd => 'artist' } })->all;
128   my $response = JSON::Any->Load( $mech->content);
129   is_deeply($response, { list => \@expected_response, success => 'true' }, 'correct message returned' );
130 }
131
132 done_testing();