The Perl Toolchain Summit 2025 Needs You: You can help 🙏 Learn more

use strict;
use lib qw(lib t);
use MyDatabase qw(build_mysql_db populate_test_db);
use DBI;
use File::Path qw(rmtree);
rmtree 't/db_fixtures';
rmtree 't/DB';
unlink 't/rose_test_db';
my $mysqld_check = system("which mysqld > /dev/null 2>&1");
my $mysql_config_check = system("which mysql_config > /dev/null 2>&1");
if ($mysqld_check != 0 || $mysql_config_check != 0) {
plan skip_all =>
"mysqld is not installed or not in PATH. Please run 'sudo apt-get install -y mysql-server, mysql-client, and libmysqlclient-dev'";
}
my $override = Sub::Override->new();
my $db = DB->new(
domain => 'mysql_test',
type => 'mysql_test'
);
my $loader = Rose::DB::Object::Loader->new(
db => $db,
class_prefix => 'DB'
) or die "Failed to create loader: $@";
build_mysql_db($db->dbh);
populate_test_db($db->dbh);
$loader->make_modules(module_dir => 't') or die 'Failed to make classes:';
my $expected_rows = [{
'license_id' => 1,
'id' => 1,
'allows_commercial' => 1,
'location' => '/data/images/anne_fronk_stamp.jpg',
'license_name' => 'Public Domain',
'media_type' => 'image',
'attribution' => 'Deutsche Post',
'media_type_id' => 3
},
{
'location' => '/data/music/claire_de_lune.ogg',
'id' => 2,
'allows_commercial' => 1,
'license_id' => 1,
'attribution' => 'Schwarzer Stern',
'media_type_id' => 2,
'media_type' => 'audio',
'license_name' => 'Public Domain'
},
];
subtest 'mock data from a real dbh to collect data' => sub {
my $mock_dumper = DBD::Mock::Session::GenerateFixtures->new({dbh => $db->dbh()});
my $num_rows_updated = DB::Media::Manager->update_media(
set => {
location => '/data/music/claire_de_lune.ogg',
},
where => [
id => 2,
],
);
is($num_rows_updated, 1, 'update media table is ok');
note 'Mock an select using an Rose::DB::Object::Manager get method and a real dbh';
my $media = DB::Media::Manager->get_media(
with_objects => ['media_type', 'license'],
query => [
't1.id' => [1, 2, 3, 1000],
],
sort_by => 't1.id ASC',
);
my $got_rows = [];
foreach my $media (@$media) {
my $got = {};
$got->{id} = $media->id();
$got->{media_type_id} = $media->media_type()->id();
$got->{media_type} = $media->media_type()->media_type();
$got->{license_id} = $media->license()->id();
$got->{location} = $media->location();
$got->{attribution} = $media->attribution();
$got->{license_name} = $media->license()->name();
$got->{allows_commercial} = $media->license()->allows_commercial();
push @{$got_rows}, $got;
}
is($got_rows, $expected_rows, 'DB::Media::Manager->get_media works ok');
is(scalar @{$got_rows}, 2, 'DB::Media::Manager->get_media method fetched two rows is ok');
note 'Mock an select using an Rose::DB::Object::Manager iterator method and a real dbh';
my $iterator = DB::Media::Manager->get_media_iterator(
with_objects => ['media_type', 'license'],
query => [
't1.id' => [1, 2, 3, 1000],
],
sort_by => 't1.id ASC',
);
my $iterator_rows = [];
while (my $media_row = $iterator->next) {
my $got = {};
$got->{id} = $media_row->id();
$got->{media_type_id} = $media_row->media_type()->id();
$got->{media_type} = $media_row->media_type()->media_type();
$got->{license_id} = $media_row->license()->id();
$got->{location} = $media_row->location();
$got->{attribution} = $media_row->attribution();
$got->{license_name} = $media_row->license()->name();
$got->{allows_commercial} = $media_row->license()->allows_commercial();
push @{$iterator_rows}, $got;
}
is($got_rows, $expected_rows, 'DB::Media::Manager->get_media_iterator works ok');
is($iterator->total(), 2, 'count with total is ok');
note 'Mock an count using an Rose::DB::Object::Manager count method and a real dbh';
my $count = DB::Media::Manager->get_media_count(
with_objects => ['media_type', 'license'],
query => [
't1.id' => [1, 2, 3, 1000],
],
sort_by => 't1.id ASC'
);
is($count, 2, 'count wiht select count(*) is ok');
my $media_obj = DB::Media->new(
name => 'test',
location => 'test',
source => 'test',
attribution => 'test',
media_type_id => 2,
license_id => 2,
);
$media_obj->save();
is($media_obj->id, 3, 'last inserted id is ok');
my $media_obj_2 = DB::Media->new(
name => 'test',
location => 'test',
source => 'test',
attribution => 'test',
media_type_id => 3,
license_id => 3,
);
$media_obj_2->save();
is($media_obj_2->id, 4, 'last inserted id incremented with one');
my $num_rows_deleted = DB::Media::Manager->delete_media(
where => [
name => 'test',
]
);
is($num_rows_deleted, 2, 'DB::Media::Manager->delete_media works ok');
$db->dbh->disconnect();
};
subtest 'use a mocked dbh to test rose db support' => sub {
my $mock_dumper = DBD::Mock::Session::GenerateFixtures->new();
my $dbh = $mock_dumper->get_dbh();
my $override = Sub::Override->new();
$dbh->{mock_start_insert_id} = 3;
my $last_insert_id = 4;
my $update_or_deleted = 1;
$override->replace('Rose::DB::dbh' => sub {return $dbh});
$override->replace('Rose::DB::MySQL::last_insertid_from_sth' => sub {$last_insert_id++; return $last_insert_id});
$override->replace('DBD::Mock::st::rows' => sub {return 1});
my $num_rows_updated = DB::Media::Manager->update_media(
set => {
location => '/data/music/claire_de_lune.ogg',
},
where => [
id => 2,
],
);
is($num_rows_updated, 1, 'update media table is ok');
note 'Mock an select using an Rose::DB::Object::Manager get method and a mocked dbh';
my $media = DB::Media::Manager->get_media(
with_objects => ['media_type', 'license'],
query => [
't1.id' => [1, 2, 3, 1000],
],
sort_by => 't1.id ASC',
);
my $got_rows = [];
foreach my $media (@$media) {
my $got = {};
$got->{id} = $media->id();
$got->{media_type_id} = $media->media_type()->id();
$got->{media_type} = $media->media_type()->media_type();
$got->{license_id} = $media->license()->id();
$got->{location} = $media->location();
$got->{attribution} = $media->attribution();
$got->{license_name} = $media->license()->name();
$got->{allows_commercial} = $media->license()->allows_commercial();
push @{$got_rows}, $got;
}
is($got_rows, $expected_rows, 'DB::Media::Manager->get_media works ok');
is(scalar @{$got_rows}, 2, 'DB::Media::Manager->get_media method fetched two rows is ok');
note 'Mock an select using an Rose::DB::Object::Manager iterator method and a mocked dbh';
my $iterator = DB::Media::Manager->get_media_iterator(
with_objects => ['media_type', 'license'],
query => [
't1.id' => [1, 2, 3, 1000],
],
sort_by => 't1.id ASC'
);
my $iterator_rows = [];
while (my $media_row = $iterator->next) {
my $got = {};
$got->{id} = $media_row->id();
$got->{media_type_id} = $media_row->media_type()->id();
$got->{media_type} = $media_row->media_type()->media_type();
$got->{license_id} = $media_row->license()->id();
$got->{location} = $media_row->location();
$got->{attribution} = $media_row->attribution();
$got->{license_name} = $media_row->license()->name();
$got->{allows_commercial} = $media_row->license()->allows_commercial();
push @{$iterator_rows}, $got;
}
is($got_rows, $expected_rows, 'DB::Media::Manager->get_media_iterator works ok');
is($iterator->total(), 2, 'count with total is ok');
note 'Mock an count using an Rose::DB::Object::Manager count method and a mocked dbh';
$override->replace('DBD::Mock::st::rows' => sub {return 2});
my $count = DB::Media::Manager->get_media_count(
with_objects => ['media_type', 'license'],
query => [
't1.id' => [1, 2, 3, 1000],
],
sort_by => 't1.id ASC'
);
is($count, 2, 'count wiht select count(*) is ok');
my $media_obj = DB::Media->new(
name => 'test',
location => 'test',
source => 'test',
attribution => 'test',
media_type_id => 2,
license_id => 2,
);
$media_obj->save();
is($media_obj->id, 5, 'last inserted id is ok');
my $media_obj_2 = DB::Media->new(
name => 'test',
location => 'test',
source => 'test',
attribution => 'test',
media_type_id => 3,
license_id => 3,
);
$media_obj_2->save();
is($media_obj_2->id, 6, 'last inserted id incremented with one');
my $num_rows_deleted = DB::Media::Manager->delete_media(
where => [
name => 'test',
]
);
is($num_rows_deleted, 2, 'DB::Media::Manager->delete_media works ok');
};
rmtree 't/db_fixtures';
rmtree 't/DB';
done_testing();