The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

use strict;
use warnings FATAL => 'all';
use lib qw( t/lib );

use Test::More 'no_plan';
use Storable;

# application loads
BEGIN { use_ok "Test::WWW::Mechanize::Catalyst::AJAX" => "TestApp" }
my $mech = Test::WWW::Mechanize::Catalyst::AJAX->new;

my $default_album_page = {
            'rows' => [
                        {
                          'cpac__id' => "id\0005",
                          'sleeve_notes' => undef,
                          'cpac__pk_for_sleeve_notes' => undef,
                          'tracks' => [
                                        'Hit Tune',
                                        'Hit Tune 3',
                                        'Hit Tune II'
                                      ],                          'deleted' => 0,
                          'artist_id' => 'Adam Smith',
                          'cpac__pk_for_artist_id' => [{ tag => 'input', type => 'hidden', name => 'cpac_filter.id', value => 3}],
                          'copyright' => [
                                              'Label B'
                                            ],                          'id' => 5,
                          'recorded' => '2002-05-21',
                          'title' => 'Greatest Hits',
                          'cpac__display_name' => 'Greatest Hits'
                        }
                      ],
            'total' => 1
};

my $testing_album_page = {
            'rows' => [
                        {
                          'cpac__id' => "id\0006",
                          'sleeve_notes' => undef,
                          'tracks' => [],
                          'cpac__pk_for_sleeve_notes' => undef,
                          'deleted' => 0,
                          'artist_id' => 'Mike Smith',
                          'cpac__pk_for_artist_id' => [{ tag => 'input', type => 'hidden', name => 'cpac_filter.id', value => 1}],
                          'copyright' => [],
                          'id' => 6,
                          'recorded' => '',
                          'title' => 'Testing Hits',
                          'cpac__display_name' => 'Testing Hits'
                        }
                      ],
            'total' => 1
};

my $new_album_page = {
            'rows' => [
                        {
                          'cpac__id' => "id\0007",
                          'sleeve_notes' => undef,
                          'cpac__pk_for_sleeve_notes' => undef,
                          'tracks' => [],
                          'deleted' => 0,
                          'artist_id' => 'Charlie Thornton',
                          'cpac__pk_for_artist_id' => [{ tag => 'input', type => 'hidden', name => 'cpac_filter.id', value => 5}],
                          'copyright' => [],
                          'id' => 7,
                          'recorded' => '',
                          'title' => 'Testing Hits 2',
                          'cpac__display_name' => 'Testing Hits 2'
                        }
                      ],
            'total' => 1
};

my $new_artist_page = {
            'rows' => [
                        {
                          'cpac__id' => "id\0004",
                          'forename' => 'Bob',
                          'born' => '',
                          'albums' => [
                                        'Greatest Hits 2'
                                      ],
                          'surname' => 'Thornton',
                          'pseudonym' => '',
                          'id' => 4,
                          'cpac__display_name' => 'Bob Thornton'
                        }
                      ],
            'total' => 1
};

my $second_artist_page = {
            'rows' => [
                        {
                          'cpac__id' => "id\0005",
                          'forename' => 'Charlie',
                          'born' => '',
                          'albums' => [
                                        'Testing Hits 2'
                                      ],
                          'surname' => 'Thornton',
                          'pseudonym' => '',
                          'id' => 5,
                          'cpac__display_name' => 'Charlie Thornton'
                        }
                      ],
            'total' => 1
};

$mech->ajax_ok('/site/default/schema/dbic/source/album/extjs2/create', {}, {success => '0'}, 'add row, no data');
$mech->ajax_ok('/site/default/schema/dbic/source/album/extjs2/update', {}, {success => '0'}, 'update row, no data');
$mech->ajax_ok('/site/default/schema/dbic/source/album/extjs2/list', {'cpac_filter.title' => 'Greatest Hits'}, $default_album_page, 'check data');

$mech->ajax_ok('/site/default/schema/dbic/source/album/extjs2/create', {
    'cpac__id' => "id\0005",
    id => 5,
    'combobox.artist_id' => 3,
    title     => 'Greatest Hits',
    recorded  => '2002-05-21',
}, {success => '0'}, 'add row, dupe data');
$mech->ajax_ok('/site/default/schema/dbic/source/album/extjs2/list', {'cpac_filter.title' => 'Greatest Hits'}, $default_album_page, 'check data');

$mech->ajax_ok('/site/default/schema/dbic/source/album/extjs2/create', {
    'combobox.artist_id' => "id\0001",
    recorded  => '2002-05-21',
}, {success => '0'}, 'add row, duff data');

$mech->ajax_ok('/site/default/schema/dbic/source/album/extjs2/create', {
    'combobox.artist_id' => "id\0001",
    title     => 'Testing Hits',
}, {success => '1'}, 'add minimal row');
$mech->ajax_ok('/site/default/schema/dbic/source/album/extjs2/list', {'cpac_filter.title' => 'Testing Hits'}, $testing_album_page, 'check data');

$mech->ajax_ok('/site/default/schema/dbic/source/album/extjs2/update', {
    cpac__id => "id\0005",
    id => "5",
    'combobox.artist_id' => "id\0003",
    foobar  => '2002-05-21',
}, {success => '1'}, 'edit row cols, extra data ignored');
$mech->ajax_ok('/site/default/schema/dbic/source/album/extjs2/list', {'cpac_filter.title' => 'Greatest Hits'}, $default_album_page, 'check data');

$mech->ajax_ok('/site/default/schema/dbic/source/album/extjs2/update', {
    cpac__id => "id\0005",
    id => "5",
    'combobox.artist_id' => "id\0003",
    title     => 'Greatest Hits 2',
    recorded  => '2002-05-21',
}, {success => '1'}, 'edit row cols');

$default_album_page->{rows}->[0]->{cpac__display_name} = 'Greatest Hits 2';
$default_album_page->{rows}->[0]->{title} = 'Greatest Hits 2';
$default_album_page->{rows}->[0]->{artist_id} = 'Adam Smith';
$default_album_page->{rows}->[0]->{recorded} = '2002-05-21';
$mech->ajax_ok('/site/default/schema/dbic/source/album/extjs2/list', {'cpac_filter.title' => 'Greatest Hits 2'}, $default_album_page, 'check data');

SKIP : {
    skip 'cannot test FK constraints with SQLite', 6;

$mech->ajax_ok('/site/default/schema/dbic/source/album/extjs2/update', {
    cpac__id => "id\0005",
    id => "5",
    'combobox.artist_id' => "id\0009",
    title     => 'Greatest Hits 2',
    recorded  => '2002-05-21',
}, {success => '0'}, 'edit row fks, duff data');

$mech->ajax_ok('/site/default/schema/dbic/source/album/extjs2/update', {
    'combobox.artist_id' => "id\0001",
    title     => 'Greatest Hits 2',
    recorded  => '2002-05-21',
}, {success => '1'}, 'edit row fks');

} # SKIP

$mech->ajax_ok('/site/default/schema/dbic/source/album/extjs2/update', {
    cpac__id => "id\0005",
    id => "5",
    'checkbox.artist_id' => 'on',
    'combobox.artist_id' => "id\0003",
    title     => 'Greatest Hits 2',
    recorded  => '2002-05-21',
}, {success => '0'}, 'edit row add fwd related, duff data');
$mech->ajax_ok('/site/default/schema/dbic/source/album/extjs2/list', {'cpac_filter.title' => 'Greatest Hits 2'}, $default_album_page, 'check data');

$mech->ajax_ok('/site/default/schema/dbic/source/album/extjs2/update', {
    cpac__id => "id\0005",
    id => "5",
    'checkbox.artist_id' => 'on',
    'artist_id.forename' => 'Bob',
    'artist_id.surname' => 'Thornton',
    'combobox.artist_id' => "id\0003",
    title     => 'Greatest Hits 2',
    recorded  => '2002-05-21',
}, {success => '1'}, 'edit row add fwd related');

$default_album_page->{rows}->[0]->{artist_id} = 'Bob Thornton';
$default_album_page->{rows}->[0]->{cpac__pk_for_artist_id} = [{ tag => 'input', type => 'hidden', name => 'cpac_filter.id', value => 4}];
$mech->ajax_ok('/site/default/schema/dbic/source/album/extjs2/list', {'cpac_filter.title' => 'Greatest Hits 2'}, $default_album_page, 'check data');
$mech->ajax_ok('/site/default/schema/dbic/source/artist/extjs2/list', {'cpac_filter.surname' => 'Thornton'}, $new_artist_page, 'check data');

$mech->ajax_ok('/site/default/schema/dbic/source/album/extjs2/create', {
    'artist.forename' => 'Charlie',
    'artist.surname' => 'Thornton',
    'checkbox.artist_id' => 'on',
    'combobox.artist_id' => "id\0003",
}, {success => '0'}, 'add row, duff data, with related');
$mech->ajax_ok('/site/default/schema/dbic/source/artist/extjs2/list', {'cpac_filter.forename' => 'Charlie'}, {total => 0, rows => []}, 'check data');

$mech->ajax_ok('/site/default/schema/dbic/source/album/extjs2/create', {
    'checkbox.artist_id' => 'on',
    'artist_id.surname' => 'Thornton',
    'combobox.artist_id' => "id\0001",
    title     => 'Testing Hits 2',
    recorded  => '2002-05-21',
}, {success => '0'}, 'add row, with related, duff data');
$mech->ajax_ok('/site/default/schema/dbic/source/album/extjs2/list', {'cpac_filter.title' => 'Testing Hits 2'}, {total => 0, rows => []}, 'check data');
$mech->ajax_ok('/site/default/schema/dbic/source/artist/extjs2/list', {'cpac_filter.surname' => 'Thornton'}, $new_artist_page, 'check data');

$mech->ajax_ok('/site/default/schema/dbic/source/album/extjs2/create', {
    'checkbox.artist_id' => 'on',
    'artist_id.forename' => 'Charlie',
    'artist_id.surname' => 'Thornton',
    'combobox.artist_id' => "id\0001",
    title     => 'Testing Hits 2',
}, {success => '1'}, 'add row, with related');
$mech->ajax_ok('/site/default/schema/dbic/source/album/extjs2/list', {'cpac_filter.title' => 'Testing Hits 2'}, $new_album_page, 'check data');
$mech->ajax_ok('/site/default/schema/dbic/source/artist/extjs2/list', {'cpac_filter.forename' => 'Charlie'}, $second_artist_page, 'check data');

$mech->ajax_ok('/site/default/schema/dbic/source/track/extjs2/create', {
    title => 'Track Title',
    'combobox.album_id' => '',
    'checkbox.album_id' => 'on',
    'album_id.recorded' => '1999-05-21',
    'combobox.copyright_id' => '',
    'checkbox.copyright_id' => 'on',
    'rights owner' => 'Label D',
}, {success => '0'}, 'add row, with 2x related, one duff');
$mech->ajax_ok('/site/default/schema/dbic/source/track/extjs2/list', {'cpac_filter.title' => 'Track Title'}, {total => 0, rows => []}, 'check data');
$mech->ajax_ok('/site/default/schema/dbic/source/copyright/extjs2/list', {'cpac_filter.rights owner' => 'Label D'}, {total => 0, rows => []}, 'check data');
$mech->ajax_ok('/site/default/schema/dbic/source/album/extjs2/list', {'cpac_filter.recorded' => '1999-05-21'}, {total => 0, rows => []}, 'check data');

$mech->ajax_ok('/site/default/schema/dbic/source/track/extjs2/create', {
    'parent_album.title' => 'Testing Hits 3',
    'checkbox.parent_album' => 'on',
    'checkbox.copyright_id' => 'on',
    'combobox.parent_album.artist_id' => "id\0003",
    'copyright_id.rights owner' => 'Label D',
    title => 'Track Title',
}, {success => '1'}, 'add row, with 2x related');

$mech->ajax_ok('/site/default/schema/dbic/source/track/extjs2/list', {'cpac_filter.title' => 'Track Title'}, {
            'rows' => [
                        {
                          'cpac__id' => "id\00014",
                          'length' => '',
                          'sales' => '',
                          'parent_album' => 'Testing Hits 3',
                          'cpac__pk_for_parent_album' => [{ tag => 'input', type => 'hidden', name => 'cpac_filter.id', value => 8}],
                          'id' => 14,
                          'title' => 'Track Title',
                          'copyright_id' => 'Label D',
                          'cpac__pk_for_copyright_id' => [{ tag => 'input', type => 'hidden', name => 'cpac_filter.id', value => 4}],
                          'cpac__display_name' => 'Track Title',
                          'releasedate' => ''
                        }
                      ],
            'total' => 1
}, 'check data');