Files
zonemaster.es/zonemaster-backend/t/TestUtil.pm
Malin 8d4eaa1489 feat: add full Zonemaster stack with Docker and Spanish UI
- Clone all 5 Zonemaster component repos (LDNS, Engine, CLI, Backend, GUI)
- Dockerfile.backend: 8-stage multi-stage build LDNS→Engine→CLI→Backend
- Dockerfile.gui: Astro static build served via nginx
- docker-compose.yml: backend (internal) + frontend (port 5353)
- nginx.conf: root redirects to /es/, /api/ proxied to backend
- zonemaster-gui/config.ts: defaultLanguage set to 'es' (Spanish)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-21 08:19:24 +02:00

198 lines
4.1 KiB
Perl

package TestUtil;
use strict;
use warnings;
use Test::More;
use Zonemaster::Engine;
use Zonemaster::Backend::Config;
=head1 NAME
TestUtil - a set of methods to ease Zonemaster::Backend unit testing
=head1 SYNOPSIS
Because this package lies in the testing folder C<t/> and that folder is
unknown to the include path @INC, it can be including using the following code:
my $t_path;
BEGIN {
use File::Spec::Functions qw( rel2abs );
use File::Basename qw( dirname );
$t_path = dirname( rel2abs( $0 ) );
}
use lib $t_path;
use TestUtil;
Explicitely load any dependencies to Zonemaster::Backend::RPCAPI or
Zonemaster::Backend::TestAgent modules with
use TestUtil qw( RPCAPI TestAgent );
=head1 ENVIRONMENT
=head2 TARGET
Set the database to use.
Can be C<SQLite>, C<MySQL> or C<PostgreSQL>.
Default to C<SQLite>.
=head2 ZONEMASTER_RECORD
If set, the data from the test is recorded to a file. Otherwise the data is
loaded from a file.
=cut
# Use the TARGET environment variable to set the database to use
# default to SQLite
my $db_backend = Zonemaster::Backend::Config->check_db( $ENV{TARGET} || 'SQLite' );
note "database: $db_backend";
sub import {
my ( $class, @args ) = @_;
if ( grep { $_ eq 'RPCAPI' } @args ) {
require Zonemaster::Backend::RPCAPI;
Zonemaster::Backend::RPCAPI->import();
}
if ( grep { $_ eq 'TestAgent' } @args ) {
require Zonemaster::Backend::TestAgent;
Zonemaster::Backend::TestAgent->import();
}
}
sub db_backend {
return $db_backend;
}
sub restore_datafile {
my ( $datafile ) = @_;
if ( not $ENV{ZONEMASTER_RECORD} ) {
die q{Stored data file missing} if not -r $datafile;
Zonemaster::Engine->preload_cache( $datafile );
Zonemaster::Engine->profile->set( q{no_network}, 1 );
} else {
diag "recording";
}
}
sub save_datafile {
my ( $datafile ) = @_;
if ( $ENV{ZONEMASTER_RECORD} ) {
Zonemaster::Engine->save_cache( $datafile );
}
}
sub prepare_db {
my ( $db ) = @_;
$db->drop_tables();
$db->create_schema();
}
sub init_db {
my ( $config ) = @_;
my $dbclass = Zonemaster::Backend::DB->get_db_class( $db_backend );
my $db = $dbclass->from_config( $config );
prepare_db( $db );
return $db;
}
sub create_rpcapi {
my ( $config ) = @_;
my $rpcapi;
eval {
$rpcapi = Zonemaster::Backend::RPCAPI->new(
{
dbtype => $db_backend,
config => $config,
}
);
};
if ( $@ ) {
diag explain( $@ );
BAIL_OUT( 'Could not connect to database' );
}
if ( not $rpcapi->isa('Zonemaster::Backend::RPCAPI' ) ) {
BAIL_OUT( 'Not a Zonemaster::Backend::RPCAPI object' );
}
prepare_db( $rpcapi->{db} );
return $rpcapi;
}
sub create_testagent {
my ( $config ) = @_;
my $agent = Zonemaster::Backend::TestAgent->new(
{
dbtype => "$db_backend",
config => $config
}
);
if ( not $agent->isa('Zonemaster::Backend::TestAgent' ) ) {
BAIL_OUT( 'Not a Zonemaster::Backend::TestAgent object' );
}
return $agent;
}
=head1 METHODS
=over
=item db_backend()
Returns the name of the currently used database engine. This value is set via
the TARGET environment variable.
=item restore_datafile($datafile)
If the ZONEMASTER_RECORD environment variable is unset, the data from
C<$datafile> is used for all the current tests.
=item save_datafile($datafile)
If the ZONEMASTER_RECORD environment variable is set, the data from the current
tests are stored to C<$datafile>.
=item prepare_db($db)
Recreate all tables anew for the associated C<$db>.
=item init_db($config)
Returns a new Zonemaster::Backend::DB object using the provided C<$config>
file.
Database tables are dropped and created anew.
=item create_rpcapi($config)
Returns a new Zonemaster::Backend::RPCAPI object using the provided C<$config>
file.
Database tables are dropped and created anew.
=item create_testagent($config)
Returns a new Zonemaster::Backend::TestAgent object using the provided
C<$config> file.
=back
=cut
1;