use 5.006; use strict; use warnings; use Test::More; use Wiki::Toolkit; use Wiki::Toolkit::TestLib; use Wiki::Toolkit::Setup::Database; # XXX needs to be more exhaustive my $test_sql = { 8 => [ qq| INSERT INTO node VALUES (1, 'Test node 1', 1, 'Some content', 'now')|, qq| INSERT INTO node VALUES (2, 'Test node 2', 1, 'More content', 'now')|, qq| INSERT INTO content VALUES (1, 1, 'Some content', 'now', 'no comment')|, qq| INSERT INTO content VALUES (2, 1, 'More content', 'now', 'no comment')|, qq| INSERT INTO metadata VALUES (1, 1, 'foo', 'bar')|, qq| INSERT INTO metadata VALUES (2, 1, 'baz', 'quux')| ], 9 => [ qq| INSERT INTO node (id, name, version, text, modified) VALUES (1, 'Test node 1', 1, 'Some content', 'now')|, qq| INSERT INTO node (id, name, version, text, modified) VALUES (2, 'Test node 2', 1, 'More content', 'now')|, qq| INSERT INTO content (node_id, version, text, modified, comment) VALUES (1, 1, 'Some content', 'now', 'no comment')|, qq| INSERT INTO content (node_id, version, text, modified, comment) VALUES (2, 1, 'More content', 'now', 'no comment')|, qq| INSERT INTO metadata VALUES (1, 1, 'foo', 'bar')|, qq| INSERT INTO metadata VALUES (2, 1, 'baz', 'quux')| ], }; my $iterator = Wiki::Toolkit::TestLib->new_wiki_maker; my @configured_databases = $iterator->configured_databases; my @schemas_to_test; use Wiki::Toolkit::Setup::SQLite; my $num_mysql_only_tests = 0; my @mysql_databases; foreach my $db (@configured_databases) { my $setup_class = $db->{setup_class}; eval "require $setup_class"; my $current_schema; { no strict 'refs'; $current_schema = eval ${$setup_class . '::SCHEMA_VERSION'}; } foreach my $schema (@Wiki::Toolkit::Setup::Database::SUPPORTED_SCHEMAS) { push @schemas_to_test, $schema if $schema < $current_schema; } if ( $db->{dsn} =~ /mysql/i ) { $num_mysql_only_tests = 2; push @mysql_databases, $db; } } my $num_tests = (scalar @schemas_to_test * scalar @configured_databases * 2) + $num_mysql_only_tests; if ( $num_tests == 0 ) { plan skip_all => "no backends configured"; } else { plan tests => $num_tests; } foreach my $database (@configured_databases) { my $setup_class = $database->{setup_class}; my $current_schema; { no strict 'refs'; $current_schema = eval ${$setup_class . '::SCHEMA_VERSION'}; } foreach my $schema (@schemas_to_test) { # Set up database with old schema my $params = $database->{params}; $params->{wanted_schema} = $schema; { no strict 'refs'; eval &{$setup_class . '::cleardb'} ( $params ); eval &{$setup_class . '::setup'} ( $params ); } my $class = $database->{class}; eval "require $class"; my $dsn = $database->{dsn}; my $dbh = DBI->connect($dsn, $params->{dbuser}, $params->{dbpass}); foreach my $sql (@{$test_sql->{$schema}}) { $dbh->do($sql); } # Upgrade to current schema delete $params->{wanted_schema}; { no strict 'refs'; eval &{$setup_class . '::setup'} ( $params ); } # Test the data looks sane my $store = $class->new( %{$params} ); my %wiki_config = ( store => $store ); my $wiki = Wiki::Toolkit->new( %wiki_config ); is( $wiki->retrieve_node("Test node 1"), "Some content", "can retrieve first test node after $schema to $current_schema" ); is( $wiki->retrieve_node("Test node 2"), "More content", "can retrieve second test node after $schema to $current_schema" ); } } if ( $num_mysql_only_tests ) { foreach my $database ( @mysql_databases ) { my $setup_class = $database->{setup_class}; my $current_schema; { no strict 'refs'; $current_schema = eval ${$setup_class . '::SCHEMA_VERSION'}; } # Set up database with old schema my $params = $database->{params}; $params->{wanted_schema} = 9; { no strict 'refs'; eval &{$setup_class . '::cleardb'} ( $params ); eval &{$setup_class . '::setup'} ( $params ); } my $class = $database->{class}; eval "require $class"; my $dsn = $database->{dsn}; my $dbh = DBI->connect($dsn, $params->{dbuser}, $params->{dbpass}); # Manually create index that the upgrade also wants to create eval { $dbh->do('CREATE UNIQUE INDEX node_name ON node (name);') or die $dbh->errstr }; is( $@, '', "Manually creating confusing index didn't die" ); # Now upgrade delete $params->{wanted_schema}; { no strict 'refs'; eval &{$setup_class . '::setup'} ( $params ); is( $@, '', "Upgrade didn't die even though node_name index had been created manually" ); } } }