Aniki
view release on metacpan or search on metacpan
t/11_relay.t view on Meta::CPAN
use strict;
use warnings;
use utf8;
use Test::More;
use File::Spec;
use lib File::Spec->catfile('t', 'lib');
use t::Util;
run_on_database {
my $moznion_id = db->insert_and_fetch_id(author => { name => 'MOZNION' });
my @moznion_module_ids = (
db->insert_and_fetch_id(module => { name => 'Perl::Lint', author_id => $moznion_id }),
db->insert_and_fetch_id(module => { name => 'Regexp::Lexer', author_id => $moznion_id }),
db->insert_and_fetch_id(module => { name => 'Test::JsonAPI::Autodoc', author_id => $moznion_id }),
);
my $karupa_id = db->insert_and_fetch_id(author => { name => 'KARUPA' });
my @karupa_module_ids = (
db->insert_and_fetch_id(module => { name => 'TOML::Parser', author_id => $karupa_id }),
db->insert_and_fetch_id(module => { name => 'Plack::App::Vhost', author_id => $karupa_id }),
db->insert_and_fetch_id(module => { name => 'Test::SharedObject', author_id => $karupa_id }),
);
my $mamimu_id = db->insert_and_fetch_id(author => { name => 'MAMIMU' });
db->insert_multi(version => [map {
+{ name => '0.01', module_id => $_ },
} @moznion_module_ids, @karupa_module_ids]);
subtest 'shallow' => sub {
subtest 'prefetch' => sub {
my $queries = query_count {
my $rows = db->select(author => {}, { prefetch => [qw/modules/] });
isa_ok $rows, 'Aniki::Result::Collection';
is $rows->count, 3;
ok $_->is_prefetched('modules') for $rows->all;
my %modules = map { $_->name => [sort map { $_->name } $_->modules] } $rows->all;
is_deeply \%modules, {
MOZNION => [qw/Perl::Lint Regexp::Lexer Test::JsonAPI::Autodoc/],
KARUPA => [qw/Plack::App::Vhost TOML::Parser Test::SharedObject/],
MAMIMU => [],
};
};
is $queries, 2;
};
subtest 'lazy' => sub {
my $queries = query_count {
my $rows = db->select(author => {});
isa_ok $rows, 'Aniki::Result::Collection';
is $rows->count, 3;
ok !$_->is_prefetched('modules') for $rows->all;
my %modules = map { $_->name => [sort map { $_->name } $_->modules] } $rows->all;
is_deeply \%modules, {
MOZNION => [qw/Perl::Lint Regexp::Lexer Test::JsonAPI::Autodoc/],
KARUPA => [qw/Plack::App::Vhost TOML::Parser Test::SharedObject/],
MAMIMU => [],
};
};
is $queries, 4;
};
};
subtest 'deep' => sub {
subtest 'prefetch' => sub {
my $queries = query_count {
my $rows = db->select(author => {}, { prefetch => { modules => [qw/versions/] } });
isa_ok $rows, 'Aniki::Result::Collection';
is $rows->count, 3;
for my $row ($rows->all) {
ok $row->is_prefetched('modules');
ok $_->is_prefetched('versions') for $row->modules;
}
my %modules = map {
$_->name => +{
map {
$_->name => [map { $_->name } $_->versions],
} $_->modules
}
} $rows->all;
is_deeply \%modules, {
MOZNION => +{
'Perl::Lint' => ['0.01'],
'Regexp::Lexer' => ['0.01'],
'Test::JsonAPI::Autodoc' => ['0.01'],
},
KARUPA => +{
'Plack::App::Vhost' => ['0.01'],
'TOML::Parser' => ['0.01'],
'Test::SharedObject' => ['0.01'],
},
MAMIMU => +{
},
};
};
is $queries, 3;
};
subtest 'lazy' => sub {
my $queries = query_count {
my $rows = db->select(author => {});
isa_ok $rows, 'Aniki::Result::Collection';
is $rows->count, 3;
for my $row ($rows->all) {
ok !$row->is_prefetched('modules');
ok !$_->is_prefetched('versions') for $row->modules;
}
my %modules = map {
$_->name => +{
map {
$_->name => [map { $_->name } $_->versions],
} $_->modules
}
} $rows->all;
is_deeply \%modules, {
MOZNION => +{
'Perl::Lint' => ['0.01'],
'Regexp::Lexer' => ['0.01'],
'Test::JsonAPI::Autodoc' => ['0.01'],
},
KARUPA => +{
'Plack::App::Vhost' => ['0.01'],
'TOML::Parser' => ['0.01'],
'Test::SharedObject' => ['0.01'],
},
MAMIMU => +{
},
};
};
is $queries, 10;
};
};
subtest 'inverse' => sub {
subtest 'prefetch' => sub {
my $queries = query_count {
my $rows = db->select(author => {}, { prefetch => { modules => [qw/versions/] } });
isa_ok $rows, 'Aniki::Result::Collection';
is $rows->count, 3;
for my $row ($rows->all) {
ok $row->is_prefetched('modules');
ok $_->is_prefetched('versions') for $row->modules;
}
my %modules = map { $_->versions->[0]->module->name => [$_->author->name, map { $_->name } @{ $_->versions }] } map { $_->modules } $rows->all;
is_deeply \%modules, {
'Perl::Lint' => ['MOZNION', '0.01'],
'Regexp::Lexer' => ['MOZNION', '0.01'],
'Test::JsonAPI::Autodoc' => ['MOZNION', '0.01'],
'Plack::App::Vhost' => ['KARUPA', '0.01'],
'TOML::Parser' => ['KARUPA', '0.01'],
'Test::SharedObject' => ['KARUPA', '0.01'],
} or diag explain \%modules;
};
is $queries, 3;
};
subtest 'lazy' => sub {
my $queries = query_count {
my $rows = db->select(author => {});
isa_ok $rows, 'Aniki::Result::Collection';
is $rows->count, 3;
for my $row ($rows->all) {
ok !$row->is_prefetched('modules');
ok !$_->is_prefetched('versions') for $row->modules;
}
my %modules = map { $_->versions->[0]->module->name => [$_->author->name, map { $_->name } @{ $_->versions }] } map { $_->modules } $rows->all;
is_deeply \%modules, {
'Perl::Lint' => ['MOZNION', '0.01'],
'Regexp::Lexer' => ['MOZNION', '0.01'],
'Test::JsonAPI::Autodoc' => ['MOZNION', '0.01'],
'Plack::App::Vhost' => ['KARUPA', '0.01'],
'TOML::Parser' => ['KARUPA', '0.01'],
'Test::SharedObject' => ['KARUPA', '0.01'],
} or diag explain \%modules;
};
is $queries, 10;
};
};
db->insert_multi(version => [map {
+{ name => '0.02', module_id => $_ },
} @moznion_module_ids, @karupa_module_ids]);
subtest 'extra where conditions' => sub {
my $queries = query_count {
my $rows = db->select(author => {}, { prefetch => { modules => { versions => { '.name' => '0.02' } } } });
isa_ok $rows, 'Aniki::Result::Collection';
is $rows->count, 3;
for my $row ($rows->all) {
ok $row->is_prefetched('modules');
ok $_->is_prefetched('versions') for $row->modules;
}
my %modules = map {
$_->name => +{
map {
$_->name => [map { $_->name } $_->versions],
} $_->modules
}
} $rows->all;
is_deeply \%modules, {
MOZNION => +{
'Perl::Lint' => ['0.02'],
'Regexp::Lexer' => ['0.02'],
'Test::JsonAPI::Autodoc' => ['0.02'],
},
KARUPA => +{
'Plack::App::Vhost' => ['0.02'],
'TOML::Parser' => ['0.02'],
'Test::SharedObject' => ['0.02'],
},
MAMIMU => +{
},
} or diag explain \%modules;
};
is $queries, 3;
};
};
done_testing();
( run in 1.265 second using v1.01-cache-2.11-cpan-8f98c5d2c55 )