Concierge-Sessions

 view release on metacpan or  search on metacpan

t/03-integration.t  view on Meta::CPAN

subtest 'Complete session lifecycle: create, modify, save, retrieve, delete' => sub {
    my $manager = Concierge::Sessions->new(
        backend     => 'database',
        storage_dir => $temp_dir,
    );

    # User logs in - create session
    my $create_result = $manager->new_session(
        user_id         => 'user_lifecycle',
        session_timeout => 3600,
        data            => { login_count => 1, last_page => '/home' },
    );

    ok($create_result->{success}, 'Session created');
    my $session = $create_result->{session};
    my $session_id = $session->session_id();

    # User browses - modify session data
    $session->set_data({ login_count => 1, last_page => '/dashboard', preferences => { theme => 'dark' } });
    is($session->is_dirty(), 1, 'Session marked dirty');

    # Save session
    my $save_result = $session->save();
    ok($save_result->{success}, 'Session saved');
    is($session->is_dirty(), 0, 'Session clean after save');

    # User navigates away and comes back - retrieve session
    my $get_result = $manager->get_session($session_id);
    ok($get_result->{success}, 'Session retrieved');
    my $retrieved = $get_result->{session};

    my $data_result = $retrieved->get_data();
    is($data_result->{value}{last_page}, '/dashboard', 'Data persisted via accessor');
    is($data_result->{value}{preferences}{theme}, 'dark', 'Nested data preserved via accessor');

    # User logs out - delete session
    my $delete_result = $manager->delete_session($session_id);
    ok($delete_result->{success}, 'Session deleted');

    # Verify deletion
    my $verify_result = $manager->get_session($session_id);
    is($verify_result->{success}, 0, 'Session no longer exists');
};

# ===================================================================
# Test 4-5: Single session per user enforcement
# ===================================================================

subtest 'New session replaces existing session for same user' => sub {
    my $manager = Concierge::Sessions->new(
        backend     => 'database',
        storage_dir => $temp_dir,
    );

    my $user_id = 'single_session_user';

    # Create first session
    my $session1 = $manager->new_session(
        user_id         => $user_id,
        session_timeout => 3600,
        data            => { device => 'desktop', ip => '192.168.1.100' },
    );

    ok($session1->{success}, 'First session created');
    my $session1_id = $session1->{session}->session_id();

    # Create second session for same user
    my $session2 = $manager->new_session(
        user_id         => $user_id,
        session_timeout => 3600,
        data            => { device => 'mobile', ip => '192.168.1.200' },
    );

    ok($session2->{success}, 'Second session created');

    # First session should be deleted
    my $check1 = $manager->get_session($session1_id);
    is($check1->{success}, 0, 'First session was deleted');

    # Second session should exist
    my $check2 = $manager->get_session($session2->{session}->session_id());
    is($check2->{success}, 1, 'Second session exists');

    my $data_result = $check2->{session}->get_data();
    is($data_result->{value}{device}, 'mobile', 'New session data correct via accessor');
};

subtest 'Each login gets fresh session, previous invalidated' => sub {
    my $manager = Concierge::Sessions->new(
        backend     => 'database',
        storage_dir => $temp_dir,
    );

    my $user_id = 'login_test_user';

    # First login
    my $login1 = $manager->new_session(user_id => $user_id);
    ok($login1->{success}, 'First login successful');
    my $login1_id = $login1->{session}->session_id();

    # Simulate user activity
    $login1->{session}->set_data({ page_views => 5 });

    # Second login (different device/browser)
    my $login2 = $manager->new_session(user_id => $user_id);
    ok($login2->{success}, 'Second login successful');

    # First session is invalidated
    my $check1 = $manager->get_session($login1_id);
    is($check1->{success}, 0, 'Old session invalidated');

    # Only new session exists
    my $data_result = $login2->{session}->get_data();
    is($data_result->{value}, {}, 'New session starts fresh');
};

# ===================================================================
# Test 6-8: Session data persistence and recovery
# ===================================================================

subtest 'Data persists across save/retrieve cycle' => sub {



( run in 1.942 second using v1.01-cache-2.11-cpan-cd2fffc590a )