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 )