[ticket/17010] Move get subscription map to separate function and extend tests

Unit tests will also now ensure there are no special surprises with more than
one subscription for users.

PHPBB3-17010
This commit is contained in:
Marc Alexander 2023-06-26 08:53:26 +02:00
parent b779ce5910
commit 79ff21fdf5
No known key found for this signature in database
GPG key ID: 50E0D2423696F995
2 changed files with 36 additions and 12 deletions

View file

@ -169,15 +169,7 @@ class webpush extends messenger_base
$this->user_loader->load_users($notify_users, array(USER_IGNORE));
// Get subscriptions for users
$user_subscription_map = [];
$sql = 'SELECT subscription_id, user_id, endpoint, p256dh, auth
FROM ' . $this->push_subscriptions_table . '
WHERE ' . $this->db->sql_in_set('user_id', $notify_users);
$result = $this->db->sql_query($sql);
while ($row = $this->db->sql_fetchrow($result))
{
$user_subscription_map[$row['user_id']][] = $row;
}
$user_subscription_map = $this->get_user_subscription_map($notify_users);
$auth = [
'VAPID' => [
@ -316,4 +308,29 @@ class webpush extends messenger_base
return array_intersect_key($data, $row);
}
/**
* Get subscriptions for notify users
*
* @param array $notify_users Users to notify
*
* @return array Subscription map
*/
protected function get_user_subscription_map(array $notify_users): array
{
// Get subscriptions for users
$user_subscription_map = [];
$sql = 'SELECT subscription_id, user_id, endpoint, p256dh, auth
FROM ' . $this->push_subscriptions_table . '
WHERE ' . $this->db->sql_in_set('user_id', $notify_users);
$result = $this->db->sql_query($sql);
while ($row = $this->db->sql_fetchrow($result))
{
$user_subscription_map[$row['user_id']][] = $row;
}
$this->db->sql_freeresult($result);
return $user_subscription_map;
}
}

View file

@ -338,7 +338,14 @@ class notification_method_webpush_test extends phpbb_tests_notification_base
$subscription_info = [];
foreach ($expected_users as $user_id => $user_data)
{
$subscription_info[$user_id] = $this->create_subscription_for_user($user_id);
$subscription_info[$user_id][] = $this->create_subscription_for_user($user_id);
}
// Create second subscription for first user ID passed
if (count($expected_users))
{
$first_user_id = array_key_first($expected_users);
$subscription_info[$first_user_id][] = $this->create_subscription_for_user($first_user_id);
}
$post_data = array_merge([
@ -361,7 +368,7 @@ class notification_method_webpush_test extends phpbb_tests_notification_base
foreach ($expected_users as $user_id => $data)
{
$messages = $this->get_messages_for_subscription($subscription_info[$user_id]['clientHash']);
$messages = $this->get_messages_for_subscription($subscription_info[$user_id][0]['clientHash']);
$this->assertEmpty($messages);
}
@ -372,7 +379,7 @@ class notification_method_webpush_test extends phpbb_tests_notification_base
foreach ($expected_users as $user_id => $data)
{
$messages = $this->get_messages_for_subscription($subscription_info[$user_id]['clientHash']);
$messages = $this->get_messages_for_subscription($subscription_info[$user_id][0]['clientHash']);
$this->assertNotEmpty($messages);
}
}