DBD-libsql

 view release on metacpan or  search on metacpan

xt/03_turso_live.t  view on Meta::CPAN

#!/usr/bin/env perl
use strict;
use warnings;
use Test::More;
use DBI;
use lib '../lib';

# Skip tests if environment variables are not set
my $turso_url = $ENV{TURSO_DATABASE_URL};
my $turso_token = $ENV{TURSO_DATABASE_TOKEN};

if (!$turso_url || !$turso_token) {
    plan skip_all => 
        "Turso Cloud live tests require environment variables to be set:\n" .
        "  TURSO_DATABASE_URL - The libsql database URL (e.g., libsql://your-db.turso.io)\n" .
        "  TURSO_DATABASE_TOKEN - Your authentication token from Turso dashboard\n" .
        "\n" .
        "To run these tests, export the variables and run:\n" .
        "  export TURSO_DATABASE_URL='libsql://...'\n" .
        "  export TURSO_DATABASE_TOKEN='...'\n" .
        "  prove -Ilib xt/03_turso_live.t\n";
}

# Extract hostname from Turso URL
# Expected format: libsql://database-name-author.region.turso.io
my $hostname;
if ($turso_url =~ m|^libsql://([^/]+)|) {
    $hostname = $1;
} else {
    plan skip_all => 
        "Invalid TURSO_DATABASE_URL format: '$turso_url'\n" .
        "Expected format: libsql://database-name-author.region.turso.io\n" .
        "Get the correct URL from your Turso dashboard at https://app.turso.io\n";
}

plan tests => 8;

# Test 1: Connection with Turso credentials (using DBI standard password parameter)
my $dsn = "dbi:libsql:$hostname";
my $dbh = DBI->connect($dsn, '', $turso_token, {
    RaiseError => 1,
    AutoCommit => 1,
});

ok($dbh, 'Successfully connected to Turso database');
isa_ok($dbh, 'DBI::db', 'Database handle');

# Test 2: Create test table
my $table_name = 'dbd_libsql_test_' . time();  # Unique table name
eval {
    $dbh->do("DROP TABLE IF EXISTS $table_name");
    $dbh->do("CREATE TABLE $table_name (
        id INTEGER PRIMARY KEY,
        name TEXT NOT NULL,
        email TEXT UNIQUE,
        created_at DATETIME DEFAULT CURRENT_TIMESTAMP
    )");
};
ok(!$@, "Created test table '$table_name'") or diag("Error: $@");

# Test 3: Insert test data
my @test_data = (
    [1, 'Alice Johnson', 'alice@example.com'],
    [2, 'Bob Smith', 'bob@example.com'],
    [3, 'Carol Brown', 'carol@example.com'],
);

my $insert_count = 0;
for my $row (@test_data) {
    my $result = eval {
        $dbh->do("INSERT INTO $table_name (id, name, email) VALUES (?, ?, ?)", 
                undef, @$row);
    };
    if (!$@ && $result) {
        $insert_count++;
    }
}
is($insert_count, 3, 'Inserted all test records');

# Test 4: Query and verify data
my $count_result = eval {
    my $sth = $dbh->prepare("SELECT COUNT(*) FROM $table_name");
    $sth->execute();
    my ($count) = $sth->fetchrow_array();
    $sth->finish();
    return $count;
};
if ($@) {
    diag("COUNT query failed: $@");
    fail('Count query execution');
} else {
    is($count_result, 3, 'Correct number of records in table');
}

# Test 5: Test SELECT with WHERE clause
my ($name, $email) = eval {
    my $sth = $dbh->prepare("SELECT name, email FROM $table_name WHERE id = ?");
    $sth->execute(2);



( run in 0.576 second using v1.01-cache-2.11-cpan-e1769b4cff6 )