Added a new set of tests for checking the integrity of the WebGUI database.

The first tests, Asset_diagnose.t checks that assetIds match in tables
asset, assetData and each Asset's default table.

Asset/Wobject/DataForm_diagnose.t adds tests for verifying DataForm
collateral tables, DataForm_field and DataForm_tab.  With a few
small changes, the test could also cover the DataForm data tables,
DataForm_entry and DataForm_entryData.

The tests are optimized to do a quick preliminary test, and if this
test fails, then an in-depth test is run.  This second test will
run a VERY VERY VERY long time, but will tell you exactly what's
missing from your tables.

The new tests require the module Test::Deep, for comparing data structures.
This commit is contained in:
Colin Kuskie 2006-02-26 04:03:10 +00:00
parent dd2a923022
commit 4e9eb32635
4 changed files with 127 additions and 0 deletions

View file

@ -39,6 +39,7 @@
SiteMap feature.
- [ 1433525 ] 6.9: Compilation errors
- base36 removed from Utility.t because it no longer exists in WebGUI::Utility.pm
- Add tests that verify the integrity of the WebGUI Database.
6.8.8
- fix [ 1437186 ] 6.8.7 deploy DataForm package does not copy fields

View file

@ -47,6 +47,7 @@ checkModule("HTTP::Request",1.40);
checkModule("HTTP::Headers",1.61);
checkModule("Test::More",0.61,1);
checkModule("Test::MockObject",1.02,1);
checkModule("Test::Deep",0.093,1);
checkModule("Pod::Coverage",0.17,2);
checkModule("Text::Balanced",1.95,1);
checkModule("Digest::MD5",2.20);

72
t/Asset/Asset_diagnose.t Normal file
View file

@ -0,0 +1,72 @@
#-------------------------------------------------------------------
# WebGUI is Copyright 2001-2006 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/) } (
@{ $session->config->get('assets') },
@{ $session->config->get('utilityAssets') },
@{ $session->config->get('assetContainers') },
);
my $numTests = scalar (2*@assets) + 2;
diag("Testing $numTests assets");
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 = ok(compare_arrays($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 ) {
diag("Checking $asset");
my $assetObj = WebGUI::Asset->newByPropertyHashRef($session, { className=>$asset });
my $def = $asset->definition($session);
my $tableName = $def->[0]->{tableName};
my $classIds = $session->db->buildArrayRef("select distinct(assetId) from asset where className=? order by assetId", [$asset]);
my $tableIds = $session->db->buildArrayRef(sprintf("select distinct(assetId) from %s order by assetId", $tableName));
my $skipDetails = ok(compare_arrays($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");
}
}
sub compare_arrays {
my ($first, $second) = @_;
no warnings;
return 0 unless @$first == @$second;
for (my $i=0; $i <=@$first; $i++) {
return 0 if $first->[$i] ne $second->[$i];
}
return 1;
}

View file

@ -0,0 +1,53 @@
#-------------------------------------------------------------------
# WebGUI is Copyright 2001-2006 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 diagnose problems in DataForms.
## Orphaned DataForms with no Asset table entries
##
use WebGUI::Test;
use WebGUI::Session;
use Test::More tests => 4; # increment this value for each test you create
use Test::Deep;
my $one = [1, 2, 3, 4];
my @two = ();
my $session = WebGUI::Test->session;
my $dataFormIds = $session->db->buildArrayRef("select asset.assetId, assetData.revisionDate from DataForm left join asset on asset.assetId=DataForm.assetId left join assetData on assetData.revisionDate=DataForm.revisionDate and assetData.assetId=DataForm.assetId where asset.state='published' and assetData.revisionDate=(SELECT max(revisionDate) from assetData where assetData.assetId=asset.assetId and (assetData.status='approved' or assetData.tagId=?)) order by assetData.title");
diag("Checking DataForm tables for orphaned assetIds");
foreach my $table (qw/DataForm DataForm_field/) {
my $tableIds = $session->db->buildArrayRef(sprintf ("select distinct(assetId) from %s", $table));
cmp_bag($dataFormIds, $tableIds,
sprintf("Orphaned assetIds in %s", $table));
}
diag("Checking DataForm_tab tables for orphaned assetIds");
##DataForm_tab will have a subset of assetIds since not all DataForms have tabs.
foreach my $table (qw/DataForm_tab/) {
my $tableIds = $session->db->buildArrayRef(sprintf ("select distinct(assetId) from %s", $table));
cmp_deeply($tableIds, subsetof(@{ $dataFormIds }),
sprintf("Orphaned assetIds in %s", $table));
}
diag("Checking DataForm tables for orphaned fieldIds");
my $dataForm_fieldIds = $session->db->buildArrayRef("select distinct(DataForm_fieldId) from DataForm_field");
foreach my $table (qw/DataForm_tab/) {
my $tableIds = $session->db->buildArrayRef(sprintf ("select distinct(assetId) from %s", $table));
cmp_deeply($tableIds, subsetof(@{ $dataForm_fieldIds}),
sprintf("Orphaned fieldId in %s", $table));
}