|
Lines 25-38
use Test::Exception;
Link Here
|
| 25 |
use Test::Warn; |
25 |
use Test::Warn; |
| 26 |
use Time::Fake; |
26 |
use Time::Fake; |
| 27 |
|
27 |
|
|
|
28 |
use Koha::ArticleRequests; |
| 29 |
use Koha::AuthUtils; |
| 28 |
use Koha::CirculationRules; |
30 |
use Koha::CirculationRules; |
| 29 |
use Koha::Database; |
31 |
use Koha::Database; |
| 30 |
use Koha::DateUtils qw(dt_from_string); |
32 |
use Koha::DateUtils qw(dt_from_string); |
| 31 |
use Koha::ArticleRequests; |
33 |
use Koha::List::Patron qw(AddPatronList AddPatronsToList); |
| 32 |
use Koha::Patrons; |
34 |
use Koha::Notice::Templates; |
| 33 |
use Koha::List::Patron qw(AddPatronList AddPatronsToList); |
|
|
| 34 |
use Koha::Patron::Debarments qw(AddDebarment); |
35 |
use Koha::Patron::Debarments qw(AddDebarment); |
| 35 |
use Koha::Patron::Relationships; |
36 |
use Koha::Patron::Relationships; |
|
|
37 |
use Koha::Patrons; |
| 38 |
|
| 39 |
use C4::Auth; |
| 36 |
use C4::Circulation qw( AddIssue AddReturn ); |
40 |
use C4::Circulation qw( AddIssue AddReturn ); |
| 37 |
|
41 |
|
| 38 |
use t::lib::TestBuilder; |
42 |
use t::lib::TestBuilder; |
|
Lines 1533-1541
subtest 'password expiration tests' => sub {
Link Here
|
| 1533 |
$schema->storage->txn_rollback; |
1537 |
$schema->storage->txn_rollback; |
| 1534 |
}; |
1538 |
}; |
| 1535 |
|
1539 |
|
| 1536 |
subtest 'set_password' => sub { |
1540 |
subtest 'set_password() tests' => sub { |
| 1537 |
|
1541 |
|
| 1538 |
plan tests => 4; |
1542 |
plan tests => 7; |
| 1539 |
|
1543 |
|
| 1540 |
$schema->storage->txn_begin; |
1544 |
$schema->storage->txn_begin; |
| 1541 |
|
1545 |
|
|
Lines 1568-1573
subtest 'password expiration tests' => sub {
Link Here
|
| 1568 |
"Password expiration date is unset if category does not have expiry days" |
1572 |
"Password expiration date is unset if category does not have expiry days" |
| 1569 |
); |
1573 |
); |
| 1570 |
|
1574 |
|
|
|
1575 |
# Test password change notification - missing letter template should not prevent password change |
| 1576 |
subtest 'Password change works even when PASSWORD_CHANGE letter is missing' => sub { |
| 1577 |
|
| 1578 |
plan tests => 4; |
| 1579 |
|
| 1580 |
# Enable NotifyPasswordChange preference |
| 1581 |
t::lib::Mocks::mock_preference( 'NotifyPasswordChange', 1 ); |
| 1582 |
|
| 1583 |
# Create a patron with a valid email address |
| 1584 |
my $patron = $builder->build_object( |
| 1585 |
{ |
| 1586 |
class => 'Koha::Patrons', |
| 1587 |
value => { |
| 1588 |
email => 'patron@example.com', |
| 1589 |
password => Koha::AuthUtils::hash_password('OldPassword123!') |
| 1590 |
} |
| 1591 |
} |
| 1592 |
); |
| 1593 |
|
| 1594 |
# Store the original password hash for comparison |
| 1595 |
my $original_password_hash = $patron->password; |
| 1596 |
|
| 1597 |
# Ensure there is NO PASSWORD_CHANGE letter template |
| 1598 |
# (This was the bug condition - should not prevent password change) |
| 1599 |
Koha::Notice::Templates->search( |
| 1600 |
{ |
| 1601 |
code => 'PASSWORD_CHANGE', |
| 1602 |
module => 'members' |
| 1603 |
} |
| 1604 |
)->delete; |
| 1605 |
|
| 1606 |
# Attempt to set a new password |
| 1607 |
my $result; |
| 1608 |
|
| 1609 |
warning_like { $result = $patron->set_password( { password => 'NewPassword123!', skip_validation => 1 } ); } |
| 1610 |
qr/No members PASSWORD_CHANGE letter transported by email/, |
| 1611 |
'No letter warning correctly printed'; |
| 1612 |
|
| 1613 |
# FIXED: The method should return the patron object even when letter is missing |
| 1614 |
isa_ok( |
| 1615 |
$result, 'Koha::Patron', |
| 1616 |
'set_password returns patron object even when PASSWORD_CHANGE letter is missing' |
| 1617 |
); |
| 1618 |
|
| 1619 |
# Reload patron from database to check if password was actually changed |
| 1620 |
$patron->discard_changes; |
| 1621 |
|
| 1622 |
# FIXED: Password should be changed even when letter template is missing |
| 1623 |
isnt( |
| 1624 |
$patron->password, $original_password_hash, |
| 1625 |
'Password was changed even though letter template is missing' |
| 1626 |
); |
| 1627 |
|
| 1628 |
# Verify the new password works |
| 1629 |
my $new_auth_result = C4::Auth::checkpw_hash( 'NewPassword123!', $patron->password ); |
| 1630 |
is( $new_auth_result, 1, 'New password authenticates correctly' ); |
| 1631 |
}; |
| 1632 |
|
| 1633 |
subtest 'Password change works when NotifyPasswordChange is disabled' => sub { |
| 1634 |
|
| 1635 |
plan tests => 3; |
| 1636 |
|
| 1637 |
# Disable NotifyPasswordChange preference |
| 1638 |
t::lib::Mocks::mock_preference( 'NotifyPasswordChange', 0 ); |
| 1639 |
|
| 1640 |
# Create a patron with a valid email address |
| 1641 |
my $patron = $builder->build_object( |
| 1642 |
{ |
| 1643 |
class => 'Koha::Patrons', |
| 1644 |
value => { |
| 1645 |
email => 'patron@example.com', |
| 1646 |
password => Koha::AuthUtils::hash_password('OldPassword123!') |
| 1647 |
} |
| 1648 |
} |
| 1649 |
); |
| 1650 |
|
| 1651 |
# Store the original password hash for comparison |
| 1652 |
my $original_password_hash = $patron->password; |
| 1653 |
|
| 1654 |
# Ensure there is NO PASSWORD_CHANGE letter template |
| 1655 |
Koha::Notice::Templates->search( |
| 1656 |
{ |
| 1657 |
code => 'PASSWORD_CHANGE', |
| 1658 |
module => 'members' |
| 1659 |
} |
| 1660 |
)->delete; |
| 1661 |
|
| 1662 |
# Attempt to set a new password |
| 1663 |
my $result = $patron->set_password( { password => 'NewPassword123!', skip_validation => 1 } ); |
| 1664 |
|
| 1665 |
# Should work fine when NotifyPasswordChange is disabled |
| 1666 |
isa_ok( $result, 'Koha::Patron', 'set_password returns patron object when notification disabled' ); |
| 1667 |
|
| 1668 |
# Reload patron from database to check if password was actually changed |
| 1669 |
$patron->discard_changes; |
| 1670 |
|
| 1671 |
# Password should be changed |
| 1672 |
isnt( $patron->password, $original_password_hash, 'Password was changed when notification disabled' ); |
| 1673 |
|
| 1674 |
# Verify the new password works |
| 1675 |
my $auth_result = C4::Auth::checkpw_hash( 'NewPassword123!', $patron->password ); |
| 1676 |
is( $auth_result, 1, 'New password authenticates correctly' ); |
| 1677 |
}; |
| 1678 |
|
| 1679 |
subtest 'Password change works when PASSWORD_CHANGE letter exists' => sub { |
| 1680 |
|
| 1681 |
plan tests => 3; |
| 1682 |
|
| 1683 |
# Enable NotifyPasswordChange preference |
| 1684 |
t::lib::Mocks::mock_preference( 'NotifyPasswordChange', 1 ); |
| 1685 |
|
| 1686 |
# Create a patron with a valid email address |
| 1687 |
my $patron = $builder->build_object( |
| 1688 |
{ |
| 1689 |
class => 'Koha::Patrons', |
| 1690 |
value => { |
| 1691 |
email => 'patron@example.com', |
| 1692 |
password => Koha::AuthUtils::hash_password('OldPassword123!') |
| 1693 |
} |
| 1694 |
} |
| 1695 |
); |
| 1696 |
|
| 1697 |
# Store the original password hash for comparison |
| 1698 |
my $original_password_hash = $patron->password; |
| 1699 |
|
| 1700 |
# Delete any existing PASSWORD_CHANGE letters to avoid constraint violations |
| 1701 |
Koha::Notice::Templates->search( |
| 1702 |
{ |
| 1703 |
code => 'PASSWORD_CHANGE', |
| 1704 |
module => 'members' |
| 1705 |
} |
| 1706 |
)->delete; |
| 1707 |
|
| 1708 |
# Create a PASSWORD_CHANGE letter template |
| 1709 |
$builder->build_object( |
| 1710 |
{ |
| 1711 |
class => 'Koha::Notice::Templates', |
| 1712 |
value => { |
| 1713 |
module => 'members', |
| 1714 |
code => 'PASSWORD_CHANGE', |
| 1715 |
branchcode => '', |
| 1716 |
name => 'Password Change Notification', |
| 1717 |
is_html => 0, |
| 1718 |
title => 'Your password has been changed', |
| 1719 |
content => 'Dear [% borrower.firstname %], your password has been changed.', |
| 1720 |
message_transport_type => 'email', |
| 1721 |
lang => 'default' |
| 1722 |
} |
| 1723 |
} |
| 1724 |
); |
| 1725 |
|
| 1726 |
# Attempt to set a new password |
| 1727 |
my $result = $patron->set_password( { password => 'NewPassword123!', skip_validation => 1 } ); |
| 1728 |
|
| 1729 |
# Should work fine when PASSWORD_CHANGE letter exists |
| 1730 |
isa_ok( $result, 'Koha::Patron', 'set_password returns patron object when letter template exists' ); |
| 1731 |
|
| 1732 |
# Reload patron from database to check if password was actually changed |
| 1733 |
$patron->discard_changes; |
| 1734 |
|
| 1735 |
# Password should be changed |
| 1736 |
isnt( $patron->password, $original_password_hash, 'Password was changed when letter template exists' ); |
| 1737 |
|
| 1738 |
# Verify the new password works |
| 1739 |
my $auth_result = C4::Auth::checkpw_hash( 'NewPassword123!', $patron->password ); |
| 1740 |
is( $auth_result, 1, 'New password authenticates correctly' ); |
| 1741 |
}; |
| 1742 |
|
| 1571 |
$schema->storage->txn_rollback; |
1743 |
$schema->storage->txn_rollback; |
| 1572 |
}; |
1744 |
}; |
| 1573 |
|
1745 |
|
| 1574 |
- |
|
|