App-DrivePlayer
view release on metacpan or search on metacpan
t/unit/Test/DrivePlayer/Player.pm view on Meta::CPAN
package Test::DrivePlayer::Player;
use strict;
use warnings;
use Module::Load qw( load );
use POSIX qw( :sys_wait_h );
use Test::Most;
use Test::DrivePlayer::TestBase;
use Test::DrivePlayer::Utils qw( :all );
use Time::HiRes qw( time );
use parent 'Test::DrivePlayer::TestBase';
sub setup : Tests(setup) {
my ($self) = @_;
$self->SUPER::setup();
load('App::DrivePlayer::Player');
return;
}
# Most Player tests mock the mpv process and IPC socket so we can test
# state management and protocol logic without spawning a real mpv.
# ---- Constructor ----
sub constructor : Tests(3) {
my ($self) = @_;
my $p = fake_player();
isa_ok $p, 'App::DrivePlayer::Player', 'constructor returns Player';
is $p->state, 'stop', 'initial state is stop';
is $p->current_track, undef, 'no current track initially';
}
sub constructor_requires_auth : Tests(1) {
my ($self) = @_;
throws_ok { App::DrivePlayer::Player->new() }
qr/required/i,
'constructor requires auth';
}
sub constructor_callbacks_optional : Tests(1) {
my ($self) = @_;
lives_ok {
App::DrivePlayer::Player->new(auth => fake_auth())
} 'constructor without callbacks lives';
}
# ---- Token management ----
sub bearer_token_initial_fetch : Tests(2) {
my ($self) = @_;
my $p = fake_player(token => 'Bearer mytoken123');
my $tok = $p->_bearer_token();
is $tok, 'Bearer mytoken123', 'bearer token fetched from auth';
ok $p->_token_time > 0, 'token_time set after fetch';
}
sub bearer_token_cached : Tests(2) {
my ($self) = @_;
my $call_count = 0;
my $auth = fake_auth(token => 'Bearer cached_token');
$self->_mock('auth_headers', 'Test::DrivePlayer::MockAuth', 'headers', sub {
$call_count++;
return ['Authorization', 'Bearer cached_token'];
});
my $p = App::DrivePlayer::Player->new(auth => $auth);
$p->_bearer_token();
$p->_bearer_token();
( run in 0.769 second using v1.01-cache-2.11-cpan-8f98c5d2c55 )