#-------------------------------------------------------------------
# WebGUI is Copyright 2001-2009 Plain Black Corporation.
#-------------------------------------------------------------------
# Please read the legal notices (docs/legal.txt) and the license
# (docs/license.txt) that came with this distribution before using
# this software.
#-------------------------------------------------------------------
# http://www.plainblack.com                     info@plainblack.com
#-------------------------------------------------------------------

use FindBin;
use strict;
use lib "$FindBin::Bin/../lib";

##The goal of this test is to look for orphaned assetIds across
##all assets in the Asset's main table, and the asset and assetData tables.

use WebGUI::Test;
use WebGUI::Session;
use WebGUI::Utility;
use Test::More; # increment this value for each test you create
use Test::Deep;

my $session = WebGUI::Test->session;

my @assets = grep { !isIn($_, qw/WebGUI::Asset::FilePile/) } (
    keys %{ $session->config->get('assets') }
);

my $numTests = scalar (2*@assets) + 2;
plan tests => $numTests;
	
my $assetIds     = $session->db->buildArrayRef("select distinct(assetId) from asset order by assetId");
my $assetDataIds = $session->db->buildArrayRef("select distinct(assetId) from assetData order by assetId");

##This is a quick test to see if details of mismatch are required
my $noDetails = is_deeply($assetIds, $assetDataIds, "Checking asset vs assetData");

SKIP: {
	skip("No need for details", 1) if $noDetails;
	##This test takes a very, very long time.
	cmp_bag($assetIds, $assetDataIds, "Checking asset vs assetData");
}

foreach my $asset ( @assets ) {
    eval "use $asset";
    my $def = $asset->definition($session);
    my $tableName = $def->[0]->{tableName};
    my $classIds 
        = $session->db->buildArrayRef(
            q{
                select distinct(assetId)
                from asset 
                where className = ? OR className LIKE ? 
                order by assetId
            }, 
            [$asset, $asset.'::%']
        );

    my $tableIds 
        = $session->db->buildArrayRef(
            sprintf("select distinct(assetId) from %s order by assetId", $tableName)
        );
    
    my $skipDetails = is_deeply($classIds, $tableIds,
                    sprintf("Comparing assetIds for %s",$asset)
                    );
    SKIP: {
            skip("No details needed for $asset", 1) if $skipDetails;
            cmp_bag($classIds, $tableIds, "Checking asset vs table for $asset");
    }
}
