diff --git a/lib/BeastBB/DAO/UserManager.pm b/lib/BeastBB/DAO/UserManager.pm index 4012055..e8e6e4e 100644 --- a/lib/BeastBB/DAO/UserManager.pm +++ b/lib/BeastBB/DAO/UserManager.pm @@ -8,16 +8,19 @@ use warnings; use Carp; use Params::ValidationCompiler 'validation_for'; -use Types::Standard qw/Bool Str/; +use Types::Standard qw/Bool Str Int/; use Crypt::Bcrypt::Easy; use Const::Fast; use DateTime; +use DateTime::Format::ISO8601; use BeastBB::Types ( '$MATRIX_ADDRESS_REGEX', 'IsClassTypeGenerator', '$MATRIX_ADDRESS_TYPE' ); +use BeastBB::DAO::GroupManager; +use BeastBB::Model::User; use BeastBB::Response; const my $MINIMUM_PASSWORD_LENGHT => 8; @@ -71,14 +74,14 @@ const my $MINIMUM_PASSWORD_LENGHT => 8; ) ); return $maybe_user_hash if $maybe_user_hash->IsError; - $user_hash = $maybe_user_hash->Content; + my $user_hash = $maybe_user_hash->Content; my $id_group = delete $user_hash->{id_group}; my $user = BeastBB::Model::User->new(%$user_hash); if ($recover_group) { my $maybe_recovered_group = $self->_RecoverUserGroup( id_group => $id_group, user => $user ); - return $maybe_recovered_group if $maybe_recovered_group->IsError; + return $maybe_recovered_group if $maybe_recovered_group->IsError; } return BeastBB::Response->new( content => $user ); } @@ -161,7 +164,7 @@ const my $MINIMUM_PASSWORD_LENGHT => 8; DateTime::Format::ISO8601->parse_datetime( $user_hash->{last_connection} ); - return BeastBB::Response( content => $user_hash ); + return BeastBB::Response->new( content => $user_hash ); } } diff --git a/lib/BeastBB/Model/User.pm b/lib/BeastBB/Model/User.pm index d7d1210..90824d7 100644 --- a/lib/BeastBB/Model/User.pm +++ b/lib/BeastBB/Model/User.pm @@ -51,7 +51,7 @@ sub Hash { ), ( ( !$self->Group->IsError ) - ? ( group => $self->Group->Content->hash ) + ? ( group => $self->Group->Content->Hash ) : () ), username => $self->Username, @@ -87,7 +87,7 @@ sub Hash { error_message => 'No group recovered for this user.', ); } - return BeastBB::Model::Group->new( + return BeastBB::Response->new( content => $self->{group}, ); } diff --git a/t/DAO/00-group-manager.t b/t/DAO/00-group-manager.t index 73b53c3..0fcf2fb 100644 --- a/t/DAO/00-group-manager.t +++ b/t/DAO/00-group-manager.t @@ -8,17 +8,14 @@ use warnings; use Const::Fast; use BeastBB::Mock::Controller; -use BeastBB::DAO::GroupManager; - -use Data::Dumper; - -const my $APP => BeastBB::Mock::Controller->new; -const my $GROUP_MANAGER => BeastBB::DAO::GroupManager->new( app => $APP ); { use_ok 'BeastBB::DAO::GroupManager'; } +const my $APP => BeastBB::Mock::Controller->new; +const my $GROUP_MANAGER => BeastBB::DAO::GroupManager->new( app => $APP ); + { $APP->db->Mock( sql => diff --git a/t/DAO/01-user-manager.t b/t/DAO/01-user-manager.t new file mode 100644 index 0000000..85906b5 --- /dev/null +++ b/t/DAO/01-user-manager.t @@ -0,0 +1,83 @@ +use 5.32.1; + +use Test::Most tests => 5; +use Test::MockModule; + +use strict; +use warnings; + +use Data::Dumper; + +use Const::Fast; +use Crypt::Bcrypt::Easy; + +use BeastBB::Mock::Controller; +use BeastBB::Model::Group; + +{ + use_ok 'BeastBB::DAO::UserManager'; +} + +const my $APP => BeastBB::Mock::Controller->new; +const my $USER_MANAGER => BeastBB::DAO::UserManager->new( app => $APP ); + +const my %USER_PARAMS => ( + id_user => 1, + username => 'example_username', + matrix_address => '@example_username:example.com', + password_bcrypt => bcrypt->crypt('example_password'), + is_confirmed => 1, + creation_date => DateTime->new( year => 2021, month => 06, day => 3 ), + last_connection => DateTime->now, +); + +{ + my @results; + my @user_keys = keys %USER_PARAMS; + push @results, [@user_keys]; + push @results, [ map { $USER_PARAMS{$_} } @user_keys ]; + $APP->db->Mock( + sql => + 'SELECT "id_user", "username", "matrix_address", "password_bcrypt", "is_confirmed", "creation_date", "id_group", "last_connection" FROM "user" WHERE "username" = ?', + results => \@results, + ); + my $maybe_user = $USER_MANAGER->Get( username => 'example_user' ); + die $maybe_user->ErrorMessage if $maybe_user->IsError; + my $user = $maybe_user->Content; + ok $user->isa('BeastBB::Model::User'), + 'User is made of BeastBB::Model::User'; + is_deeply $user->Hash, \%USER_PARAMS, 'User to hash conversion works ok.'; +} + +{ + my $test_mock_module_group_manager = + Test::MockModule->new('BeastBB::DAO::GroupManager'); + my $group = + BeastBB::Model::Group->new( id_group => 1, groupname => 'example_group' ); + $test_mock_module_group_manager->mock( + Get => sub { + my $self = shift; + return BeastBB::Response->new( content => $group ); + } + ); + my @results; + my %user_params = %USER_PARAMS; + my %user_hash_expected = ( %user_params, group => $group->Hash ); + $user_params{id_group} = 1; + my @user_keys = keys %user_params; + push @results, [@user_keys]; + push @results, [ map { $user_params{$_} } @user_keys ]; + $APP->db->Mock( + sql => + 'SELECT "id_user", "username", "matrix_address", "password_bcrypt", "is_confirmed", "creation_date", "id_group", "last_connection" FROM "user" WHERE "username" = ?', + results => \@results, + ); + my $maybe_user = + $USER_MANAGER->Get( username => 'example_user', recover_group => 1 ); + die $maybe_user->ErrorMessage if $maybe_user->IsError; + my $user = $maybe_user->Content; + ok $user->isa('BeastBB::Model::User'), + 'User is made of BeastBB::Model::User when trying to recover also a group.'; + is_deeply $user->Hash, \%user_hash_expected, + 'User to hash conversion works ok.'; +}