AmberDB
view release on metacpan or search on metacpan
t/amberdb_simple_mode.t view on Meta::CPAN
use strict;
use warnings;
use utf8;
use open ':std', ':utf8';
use Test::More;
binmode Test::More->builder->output, ':utf8';
binmode Test::More->builder->failure_output, ':utf8';
binmode Test::More->builder->todo_output, ':utf8';
use File::Temp qw(tempdir);
use FindBin qw($Bin);
use lib "$Bin/../lib", 'lib';
use AmberDB;
use AmberDB::Tools;
my $tmp_dir = tempdir( CLEANUP => 1 );
my $tools = AmberDB::Tools->new();
# ============================================================
# 1. Initialization and ID Flexibility in Simple Mode
# ============================================================
subtest '1. Simple Mode ID Flexibility (No 8-byte or Numeric Limit)' => sub {
my $db_dir = "$tmp_dir/simple_db1";
mkdir($db_dir);
my $adb = $tools->db_simple($db_dir);
isa_ok( $adb, 'AmberDB' );
is( $adb->config('simple'), 1, 'Simple mode is active in config' );
# Arbitrary ID formats that would exceed 8-bytes or contain non-digits
my @test_ids = (
'user@example.com', # Email format (special chars @ and .)
'sess_99999_abcdef_1234567890_extra_long_token', # Long ASCII token (> 8 bytes)
'TR-2026-08-23-INVOICE-001', # Hyphenated uppercase string (> 8 bytes)
'100500', # Standard numeric ID
'prod_özellik_kırmızı_xl', # Turkish chars in key
);
foreach my $id (@test_ids) {
my $inserted = $adb->insert_id( 'sessions', $id, 'Active', 'Chrome', time() );
is( $inserted, $id, "insert_id succeeded with arbitrary ID: $id" );
my @read = $adb->read_id( 'sessions', $id );
is( $read[0], $id, "read_id returned exact ID: $id" );
is( $read[1], 'Active', "read_id field 1 matches for $id" );
my $exists = $adb->exist_id( 'sessions', $id );
is( $exists, 1, "exist_id confirms key exists: $id" );
}
# Verify that ONLY sessions.db was created, NO index files (.inx, .fld, .src, .srt, .fac, .slg)
my @created_files = glob("$db_dir/*");
my @index_files = grep { /\.(inx|fld|src|srt|fac|slg)$/ } @created_files;
is_deeply( \@index_files, [], 'No index files (.inx, .fld, .src, .srt, .fac, .slg) generated' );
};
# ============================================================
# 2. CRUD Operations with Arbitrary IDs
# ============================================================
subtest '2. CRUD Lifecycle & Bulk Operations in Simple Mode' => sub {
my $db_dir = "$tmp_dir/simple_db2";
mkdir($db_dir);
my $adb = $tools->db_simple($db_dir);
# Single Modify
my $id1 = 'custom_order_uuid_123456789';
$adb->insert_id( 'orders', $id1, 'Pending', '150.00' );
my $mod_res = $adb->modify_id( 'orders', $id1, 'Completed', '175.50' );
ok( $mod_res, "modify_id succeeded on string ID: $id1" );
my @read = $adb->read_id( 'orders', $id1 );
is( $read[1], 'Completed', 'Status updated to Completed' );
is( $read[2], '175.50', 'Amount updated to 175.50' );
# Single Delete
my $del_res = $adb->delete_id( 'orders', $id1 );
ok( $del_res, "delete_id succeeded on string ID: $id1" );
my @read_del = $adb->read_id( 'orders', $id1 );
ok( !@read_del, 'Deleted record not returned by read_id' );
# Bulk Insert (insert_list)
my @bulk_data = (
[ 'bulk_id_alpha_01', 'Item Alpha', 'Cat A', '50.00' ],
[ 'bulk_id_beta_02', 'Item Beta', 'Cat B', '75.00' ],
[ 'bulk_id_gamma_03', 'Item Gamma', 'Cat A', '120.00' ],
);
my $bulk_status = $adb->insert_list( 'orders', @bulk_data );
is( scalar( keys %$bulk_status ), 3, 'insert_list inserted 3 arbitrary string ID records' );
# Bulk Modify (modify_list)
my @bulk_mod = (
[ 'bulk_id_alpha_01', 'Item Alpha Updated', 'Cat A', '55.00' ],
[ 'bulk_id_beta_02', 'Item Beta Updated', 'Cat B', '80.00' ],
);
my $mod_status = $adb->modify_list( 'orders', @bulk_mod );
is( scalar( keys %$mod_status ), 2, 'modify_list updated 2 records' );
my @read_alpha = $adb->read_id( 'orders', 'bulk_id_alpha_01' );
is( $read_alpha[1], 'Item Alpha Updated', 'Bulk modified value persisted' );
# Bulk Delete (delete_list)
my $del_status = $adb->delete_list( 'orders', 'bulk_id_alpha_01', 'bulk_id_beta_02' );
is( scalar( keys %$del_status ), 2, 'delete_list deleted 2 records' );
my $left_count = $adb->table_count('orders');
is( $left_count, 1, 'Only 1 record remaining in table' );
};
# ============================================================
# 3. read_all in Simple Mode (Full Table Scan & Options)
# ============================================================
subtest '3. read_all in Simple Mode' => sub {
my $db_dir = "$tmp_dir/simple_db3";
mkdir($db_dir);
( run in 2.135 seconds using v1.01-cache-2.11-cpan-4716db65a44 )