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 JSON::XS;

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

# get metadata for the album table
$mech->get_ok( '/site/default/schema/dbic/source/album/dumpmeta', 'Get album autocrud metadata' );
is( $mech->ct, 'application/json', 'Metadata content type' );

my $response = JSON::XS::decode_json( $mech->content );

#use Data::Dumper;
#print STDERR Dumper $response;

my $expected_json = <<'END_JSON';
{
  "cpac":{
    "global":{
      "default_sort":"id",
      "frontend":"extjs2",
      "site":"default",
      "db":"dbic",
      "backend":"Model::AutoCRUD::StorageEngine::DBIC",
      "table":"album"
    },
    "conf":{
      "dbic":{
        "backend":"Model::AutoCRUD::StorageEngine::DBIC",
        "hidden":"no",
        "display_name":"Dbic",
        "t":{
          "album":{
            "headings":{
              "tracks":"Tracks",
              "sleeve_notes":"Sleeve Notes",
              "artist_id":"Artist",
              "copyright":"Copyrights",
              "title":"Custom Title",
              "recorded":"Recorded",
              "deleted":"Deleted",
              "id":"Id"
            },
            "display_name":"Album",
            "hidden_cols":{

            },
            "cols":[
              "id",
              "deleted",
              "recorded",
              "title",
              "artist_id",
              "sleeve_notes",
              "tracks",
              "copyright"
            ],
            "create_allowed":"yes",
            "delete_allowed":"yes",
            "update_allowed":"yes",
            "dumpmeta_allowed":"yes",
            "hidden":"no"
          },
          "artist":{
            "headings":{
              "pseudonym":"Pseudonym",
              "forename":"Forename",
              "born":"Born",
              "id":"Id",
              "albums":"Albums",
              "surname":"Surname"
            },
            "display_name":"Artist",
            "cols":[
              "id",
              "born",
              "forename",
              "pseudonym",
              "surname",
              "albums"
            ],
            "create_allowed":"yes",
            "delete_allowed":"yes",
            "update_allowed":"yes",
            "dumpmeta_allowed":"yes",
            "hidden":"no"
          },
          "sleeve_notes":{
            "headings":{
              "album_id":"Album",
              "text":"Custom Text",
              "id":"Id"
            },
            "display_name":"Sleeve Notes",
            "cols":[
              "id",
              "text",
              "album_id"
            ],
            "create_allowed":"yes",
            "delete_allowed":"yes",
            "update_allowed":"yes",
            "dumpmeta_allowed":"yes",
            "hidden":"no"
          },
          "track":{
            "headings":{
              "length":"Length",
              "parent_album":"Parent Album",
              "sales":"Sales",
              "copyright_id":"Copyright",
              "title":"Title",
              "id":"Id",
              "releasedate":"Releasedate"
            },
            "display_name":"Track",
            "cols":[
              "id",
              "length",
              "releasedate",
              "sales",
              "title",
              "copyright_id",
              "parent_album"
            ],
            "create_allowed":"yes",
            "delete_allowed":"yes",
            "update_allowed":"yes",
            "dumpmeta_allowed":"yes",
            "hidden":"no"
          },
          "copyright":{
            "headings":{
              "rights owner":"Rights Owner",
              "album":"Albums",
              "tracks":"Tracks",
              "copyright_year":"Copyright Year",
              "id":"Id"
            },
            "display_name":"Copyright",
            "cols":[
              "id",
              "copyright_year",
              "rights owner",
              "tracks",
              "album"
            ],
            "create_allowed":"yes",
            "delete_allowed":"yes",
            "update_allowed":"yes",
            "dumpmeta_allowed":"yes",
            "hidden":"no"
          }
        }
      }
    },
    "meta":{
      "display_name":"Test App Schema V 1 X",
      "t":{
        "artist":{
          "pks":[
            "id"
          ],
          "fields":[
            "id",
            "born",
            "forename",
            "pseudonym",
            "surname",
            "albums"
          ],
          "model":"AutoCRUD::DBIC::Artist",
          "f":{
            "pseudonym":{
              "extjs_xtype":"textarea",
              "display_name":"Pseudonym"
            },
            "forename":{
              "extjs_xtype":"textarea",
              "display_name":"Forename"
            },
            "id":{
              "extjs_xtype":"numberfield",
              "display_name":"Id"
            },
            "born":{
              "extjs_xtype":"datefield",
              "display_name":"Born"
            },
            "albums":{
              "ref_fields":[
                "artist_id"
              ],
              "fields":[
                "id"
              ],
              "extjs_xtype":"textfield",
              "is_reverse":"1",
              "display_name":"Albums",
              "ref_table":"album",
              "rel_type":"has_many"
            },
            "surname":{
              "extjs_xtype":"textarea",
              "display_name":"Surname"
            }
          },
          "display_name":"Artist"
        },
        "album":{
          "pks":[
            "id"
          ],
          "fields":[
            "id",
            "deleted",
            "recorded",
            "title",
            "artist_id",
            "sleeve_notes",
            "tracks",
            "copyright"
          ],
          "model":"AutoCRUD::DBIC::Album",
          "f":{
            "sleeve_notes":{
              "ref_fields":[
                "album_id"
              ],
              "fields":[
                "id"
              ],
              "extjs_xtype":"textfield",
              "is_reverse":"1",
              "display_name":"Sleeve Notes",
              "ref_table":"sleeve_notes",
              "rel_type":"might_have"
            },
            "tracks":{
              "ref_fields":[
                "album_id"
              ],
              "fields":[
                "id"
              ],
              "extjs_xtype":"textfield",
              "is_reverse":"1",
              "display_name":"Tracks",
              "ref_table":"track",
              "rel_type":"has_many"
            },
            "copyright":{
              "via":[
                "tracks",
                "copyright_id"
              ],
              "extjs_xtype":"textfield",
              "is_reverse":"1",
              "display_name":"Copyrights",
              "rel_type":"many_to_many"
            },
            "deleted":{
              "extjs_xtype":"checkbox",
              "display_name":"Deleted"
            },
            "artist_id":{
              "ref_fields":[
                "id"
              ],
              "fields":[
                "artist_id"
              ],
              "extjs_xtype":"numberfield",
              "rel_type":"belongs_to",
              "ref_table":"artist",
              "display_name":"Artist"
            },
            "recorded":{
              "extjs_xtype":"datefield",
              "display_name":"Recorded"
            },
            "title":{
              "extjs_xtype":"textarea",
              "display_name":"Custom Title"
            },
            "id":{
              "extjs_xtype":"numberfield",
              "display_name":"Id"
            }
          },
          "display_name":"Album"
        },
        "sleeve_notes":{
          "pks":[
            "id"
          ],
          "fields":[
            "id",
            "text",
            "album_id"
          ],
          "model":"AutoCRUD::DBIC::SleeveNotes",
          "f":{
            "album_id":{
              "ref_fields":[
                "id"
              ],
              "fields":[
                "album_id"
              ],
              "extjs_xtype":"numberfield",
              "rel_type":"belongs_to",
              "ref_table":"album",
              "display_name":"Album"
            },
            "text":{
              "extjs_xtype":"textarea",
              "display_name":"Custom Text"
            },
            "id":{
              "extjs_xtype":"numberfield",
              "display_name":"Id"
            }
          },
          "display_name":"Sleeve Notes"
        },
        "track":{
          "pks":[
            "id"
          ],
          "fields":[
            "id",
            "length",
            "releasedate",
            "sales",
            "title",
            "copyright_id",
            "parent_album"
          ],
          "model":"AutoCRUD::DBIC::Track",
          "f":{
            "length":{
              "extjs_xtype":"textarea",
              "display_name":"Length"
            },
            "album_id":{
              "masked_by":"parent_album",
              "extjs_xtype":"numberfield",
              "display_name":"Album Id"
            },
            "sales":{
              "extjs_xtype":"numberfield",
              "display_name":"Sales"
            },
            "parent_album":{
              "ref_fields":[
                "id"
              ],
              "fields":[
                "album_id"
              ],
              "extjs_xtype":"textfield",
              "display_name":"Parent Album",
              "ref_table":"album",
              "rel_type":"belongs_to"
            },
            "copyright_id":{
              "ref_fields":[
                "id"
              ],
              "fields":[
                "copyright_id"
              ],
              "extjs_xtype":"numberfield",
              "rel_type":"belongs_to",
              "ref_table":"copyright",
              "display_name":"Copyright"
            },
            "title":{
              "extjs_xtype":"textarea",
              "display_name":"Title"
            },
            "id":{
              "extjs_xtype":"numberfield",
              "display_name":"Id"
            },
            "releasedate":{
              "extjs_xtype":"datefield",
              "display_name":"Releasedate"
            }
          },
          "display_name":"Track"
        },
        "copyright":{
          "pks":[
            "id"
          ],
          "fields":[
            "id",
            "copyright_year",
            "rights owner",
            "tracks",
            "album"
          ],
          "model":"AutoCRUD::DBIC::Copyright",
          "f":{
            "rights owner":{
              "extjs_xtype":"textarea",
              "display_name":"Rights Owner"
            },
            "album":{
              "via":[
                "tracks",
                "parent_album"
              ],
              "extjs_xtype":"textfield",
              "is_reverse":"1",
              "display_name":"Albums",
              "rel_type":"many_to_many"
            },
            "tracks":{
              "ref_fields":[
                "copyright_id"
              ],
              "fields":[
                "id"
              ],
              "extjs_xtype":"textfield",
              "is_reverse":"1",
              "display_name":"Tracks",
              "ref_table":"track",
              "rel_type":"has_many"
            },
            "copyright_year":{
              "extjs_xtype":"numberfield",
              "display_name":"Copyright Year"
            },
            "id":{
              "extjs_xtype":"numberfield",
              "display_name":"Id"
            }
          },
          "display_name":"Copyright"
        }
      }
    }
  }
}
END_JSON

is_deeply( $response, JSON::XS::decode_json($expected_json), 'Metadata is as we expect' );
#use Data::Dumper;
#print STDERR Dumper [$response, $expected];
#warn $mech->content;
__END__