Database-BI
view release on metacpan or search on metacpan
t/integration.t view on Meta::CPAN
use strict;
use warnings;
# ---------------------------------------------------------------------------
# Integration test suite for Database::BI
#
# Focus: cross-module, multi-step workflows where Database::BI (routing/config),
# Database::BI::Controller::Dashboard (HTTP actions), and
# Database::BI::Model::DataSource (data access) all interact.
#
# What is NOT here (covered by dedicated suites):
# - Individual filter operators -> t/filter.t
# - Single-endpoint status codes -> t/unit.t
# - Internal helpers (white-box) -> t/function.t
# - Security / hostile inputs -> t/cgi_security.t
# ---------------------------------------------------------------------------
use Test::Most;
use Test::Mojo;
use Test::Without::Module;
use Readonly;
use File::Spec ();
use File::Temp qw(tempdir tempfile);
use Mojo::File ();
use Mojo::Util qw(url_escape);
use Scalar::Util qw(reftype refaddr);
# ---------------------------------------------------------------------------
# Constants derived from known sample data (sales.csv, products.psv).
# Keep in sync with the data/ directory.
# ---------------------------------------------------------------------------
Readonly my $SALES_CSV => File::Spec->rel2abs('data/sales.csv');
Readonly my $PRODUCTS_PSV => File::Spec->rel2abs('data/products.psv');
Readonly my $CATALOG_XML => File::Spec->rel2abs('data/catalog.xml');
# Known row counts (as of the shipped sample data):
Readonly my $SALES_ROW_COUNT => 6;
Readonly my $PRODUCTS_ROW_COUNT => 4;
# Known column names present in sales.csv (integration assertions):
Readonly my @SALES_COLS => qw(id product region sales_rep amount sale_date);
# ---------------------------------------------------------------------------
# Bootstrap: Test::Mojo must be constructed BEFORE any direct use of
# DataSource so that Database::Abstraction modules are loaded at runtime
# (bypassing the Sub::Private CHECK-phase stash cleanup).
# ---------------------------------------------------------------------------
my $t = Test::Mojo->new('Database::BI');
# Guard: most integration subtests depend on the sample data files.
plan skip_all => 'data/sales.csv not found' unless -f $SALES_CSV;
plan skip_all => 'data/products.psv not found' unless -f $PRODUCTS_PSV;
require Database::BI::Model::DataSource; # already in %INC; stash intact
# ---------------------------------------------------------------------------
# Minimal i18n spy object used in Section 5.
# Implements maketext() so it is accepted by DataSource's i18n validation.
# ---------------------------------------------------------------------------
{
package MockI18n;
sub new { bless { log => [] }, shift }
sub maketext {
my ($self, $key, @args) = @_;
push @{ $self->{log} }, { key => $key, args => \@args };
# Delegate to the built-in message dict so error text is still human-readable.
my %msgs = %Database::BI::Model::DataSource::MESSAGES;
return sprintf($msgs{$key} // $key, @args);
}
}
# ===========================================================================
# SECTION 1: App config â DataSource â HTTP response pipeline
( run in 3.605 seconds using v1.01-cache-2.11-cpan-9789f410c06 )