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 )