Files
zonemaster.es/zonemaster-backend/t/db_ddl.t
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

151 lines
5.1 KiB
Perl

use strict;
use warnings;
use Test::More tests => 2;
use Test::Exception;
use Test::NoWarnings qw(warnings clear_warnings);
use File::ShareDir qw[dist_file];
use File::Temp qw[tempdir];
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;
use Zonemaster::Engine;
use Zonemaster::Backend::Config;
my $db_backend = TestUtil::db_backend();
my $tempdir = tempdir( CLEANUP => 1 );
my $config = Zonemaster::Backend::Config->parse( <<EOF );
[DB]
engine = $db_backend
[MYSQL]
host = localhost
user = zonemaster_test
password = zonemaster
database = zonemaster_test
[POSTGRESQL]
host = localhost
user = zonemaster_test
password = zonemaster
database = zonemaster_test
[SQLITE]
database_file = $tempdir/zonemaster.sqlite
[ZONEMASTER]
age_reuse_previous_test = 10
EOF
my $dbclass = Zonemaster::Backend::DB->get_db_class( $db_backend );
my $db = $dbclass->from_config( $config );
subtest 'Everything but Test::NoWarnings' => sub {
subtest 'drop and create' => sub {
subtest 'first drop (cleanup) ... ' => sub {
$db->drop_tables();
dies_ok {
$db->dbh->do( 'SELECT 1 FROM test_results' )
}
'table "test_results" sould not exist';
};
subtest '... then drop after create ...' => sub {
$db->create_schema();
my ( $res ) = $db->dbh->selectrow_array( 'SELECT count(*) FROM test_results' );
is $res, 0, 'a. after create, table "test_results" should exist and be empty';
$db->drop_tables();
dies_ok {
$db->dbh->do( 'SELECT 1 FROM test_results' )
}
'b. after drop, table "test_results" sould be removed';
};
};
subtest 'constraints' => sub {
$db->create_schema();
subtest 'constraint unique' => sub {
my $time = $db->format_time( time() );
my @constraints = (
{
table => 'test_results',
key => 'hash_id',
sql => "INSERT INTO test_results (hash_id,domain,created_at,params)
VALUES ('0123456789abcdef', 'domain.test', '$time', '{}')"
},
{
table => 'log_level',
key => 'level',
sql => "INSERT INTO log_level (level, value) VALUES ('OTHER', 10)"
},
{
table => 'users',
key => 'username',
sql => "INSERT INTO users (username) VALUES ('user1')"
},
);
for my $c (@constraints) {
$db->dbh->do( $c->{sql} );
throws_ok {
$db->dbh->do( $c->{sql} );
}
qr/(unique constraint|duplicate entry)/i, "$c->{table}($c->{key}) key should be unique";
}
};
subtest 'constraint on foreign key' => sub {
subtest 'result_entries - hash_id should exist in test_results(hash_id)' => sub {
my $hash_id_ok = "0123456789abcdef";
# INFO is 1
my $sql = "INSERT INTO result_entries (hash_id, level, module, testcase, tag, timestamp, args)
VALUES ('$hash_id_ok', 1, 'MODULE', 'TESTCASE', 'TAG', 42, '{}')";
my $inserted_rows = $db->dbh->do( $sql );
is $inserted_rows, 1, 'can insert an entry with an existing hash_id';
throws_ok {
my $hash_id_ko = "aaaaaaaaaaaaaaaa";
my $sql = "INSERT INTO result_entries (hash_id, level, module, testcase, tag, timestamp, args)
VALUES ('$hash_id_ko', 1, 'MODULE', 'TESTCASE', 'TAG', 42, '{}')";
$db->dbh->do( $sql );
}
qr/foreign key/i, 'cannot insert an entry with an non-existing hash_id';
};
subtest 'result_entries - level should exist in log_level(level)' => sub {
my $level = 1; # INFO
my $sql = "INSERT INTO result_entries (hash_id, level, module, testcase, tag, timestamp, args)
VALUES ('0123456789abcdef', '$level', 'MODULE', 'TESTCASE', 'TAG', 42, '{}')";
my $inserted_rows = $db->dbh->do( $sql );
is $inserted_rows, 1, 'can insert an entry with an existing level';
throws_ok {
my $level = 42; # does not exist
my $sql = "INSERT INTO result_entries (hash_id, level, module, testcase, tag, timestamp, args)
VALUES ('0123456789abcdef', '$level', 'MODULE', 'TESTCASE', 'TAG', 42, '{}')";
$db->dbh->do( $sql );
}
qr/foreign key/i, 'cannot insert an entry with an non-existing level';
};
};
};
};
# FIXME: hack to avoid getting warnings from Test::NoWarnings
my @warn = warnings();
if ( @warn == 7 ) {
clear_warnings();
}