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

use strict;
use base qw/Exporter/;
use Carp;
our @EXPORT = qw/
is_same_sql_bind
is_same_sql
is_same_bind
/;
our @EXPORT_OK = qw/
eq_sql
eq_bind
eq_sql_bind
/;
sub is_same_sql_bind {
# unroll possible as_query arrayrefrefs
my @args;
for (1,2) {
my $chunk = shift @_;
if ( ref $chunk eq 'REF' and ref $$chunk eq 'ARRAY' ) {
my ($sql, @bind) = @$$chunk;
push @args, ($sql, \@bind);
}
else {
push @args, $chunk, shift @_;
}
}
push @args, shift @_;
croak "Unexpected argument(s) supplied to is_same_sql_bind: " . join ('; ', @_)
if @_;
@_ = @args;
goto &SQL::Abstract::Test::is_same_sql_bind;
}
*is_same_sql = \&SQL::Abstract::Test::is_same_sql;
*is_same_bind = \&SQL::Abstract::Test::is_same_bind;
*eq_sql = \&SQL::Abstract::Test::eq_sql;
*eq_bind = \&SQL::Abstract::Test::eq_bind;
*eq_sql_bind = \&SQL::Abstract::Test::eq_sql_bind;
1;
__END__
=head1 NAME
DBIC::SqlMakerTest - Helper package for testing sql_maker component of DBIC
=head1 SYNOPSIS
use Test::More;
use DBIC::SqlMakerTest;
my ($sql, @bind) = $schema->storage->sql_maker->select(%args);
is_same_sql_bind(
$sql, \@bind,
$expected_sql, \@expected_bind,
'foo bar works'
);
=head1 DESCRIPTION
Exports functions that can be used to compare generated SQL and bind values.
This is a thin wrapper around L<SQL::Abstract::Test>, which makes it easier
to compare as_query sql/bind arrayrefrefs directly.
=head1 FUNCTIONS
=head2 is_same_sql_bind
is_same_sql_bind(
$given_sql, \@given_bind,
$expected_sql, \@expected_bind,
$test_msg
);
is_same_sql_bind(
$rs->as_query
$expected_sql, \@expected_bind,
$test_msg
);
is_same_sql_bind(
\[$given_sql, @given_bind],
$expected_sql, \@expected_bind,
$test_msg
);
Compares given and expected pairs of C<($sql, \@bind)>, and calls
L<Test::Builder/ok> on the result, with C<$test_msg> as message.
=head2 is_same_sql
is_same_sql(
$given_sql,
$expected_sql,
$test_msg
);
Compares given and expected SQL statement, and calls L<Test::Builder/ok> on the
result, with C<$test_msg> as message.
=head2 is_same_bind
is_same_bind(
\@given_bind,
\@expected_bind,
$test_msg
);
Compares given and expected bind value lists, and calls L<Test::Builder/ok> on
the result, with C<$test_msg> as message.
=head2 eq_sql
my $is_same = eq_sql($given_sql, $expected_sql);
Compares the two SQL statements. Returns true IFF they are equivalent.
=head2 eq_bind
my $is_same = eq_sql(\@given_bind, \@expected_bind);
Compares two lists of bind values. Returns true IFF their values are the same.
=head2 eq_sql_bind
my $is_same = eq_sql_bind(
$given_sql, \@given_bind,
$expected_sql, \@expected_bind
);
Compares the two SQL statements and the two lists of bind values. Returns true
IFF they are equivalent and the bind values are the same.
=head1 SEE ALSO
L<SQL::Abstract::Test>, L<Test::More>, L<Test::Builder>.
=head1 AUTHOR
Norbert Buchmuller, <norbi@nix.hu>
=head1 COPYRIGHT AND LICENSE
Copyright 2008 by Norbert Buchmuller.
This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.