Skip to content

Commit c176cbb

Browse files
committed
ACP2E-3509: Admin Actions Log User Report doesnt show details for adminhtml_user_delete
1 parent 2d62730 commit c176cbb

File tree

5 files changed

+142
-8
lines changed

5 files changed

+142
-8
lines changed

app/code/Magento/User/Controller/Adminhtml/User/Delete.php

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,21 @@
11
<?php
22
/**
3-
*
4-
* Copyright © Magento, Inc. All rights reserved.
5-
* See COPYING.txt for license details.
3+
* Copyright 2014 Adobe
4+
* All Rights Reserved.
65
*/
76

87
namespace Magento\User\Controller\Adminhtml\User;
98

9+
use Magento\Framework\App\Action\HttpPostActionInterface;
1010
use Magento\User\Block\User\Edit\Tab\Main as UserEdit;
1111
use Magento\Framework\Exception\AuthenticationException;
12+
use Magento\User\Controller\Adminhtml\User;
1213

13-
class Delete extends \Magento\User\Controller\Adminhtml\User
14+
class Delete extends User implements HttpPostActionInterface
1415
{
1516
/**
17+
* Execute
18+
*
1619
* @return void
1720
*/
1821
public function execute()
@@ -38,7 +41,12 @@ public function execute()
3841
/** @var \Magento\User\Model\User $model */
3942
$model = $this->_userFactory->create();
4043
$model->setId($userId);
44+
$deletedUser = $this->_userFactory->create()->load($userId);
4145
$model->delete();
46+
$this->_eventManager->dispatch('log_user_after_delete', [
47+
'deletedUser' => $deletedUser,
48+
'model' => $model,
49+
]);
4250
$this->messageManager->addSuccess(__('You deleted the user.'));
4351
$this->_redirect('adminhtml/*/');
4452
return;
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
<?php
2+
/**
3+
* Copyright 2025 Adobe
4+
* All Rights Reserved.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\User\Observer;
9+
10+
use Magento\Framework\Event\ManagerInterface;
11+
use Magento\Framework\Event\Observer;
12+
use Magento\Framework\Event\ObserverInterface;
13+
use Magento\User\Model\User;
14+
15+
/**
16+
* Class used to log details of user deletions in action reports.
17+
*/
18+
class ValidateModelDeleteAfter implements ObserverInterface
19+
{
20+
/**
21+
* @var ManagerInterface
22+
*/
23+
private $_eventManager;
24+
25+
/**
26+
* Constructor
27+
*
28+
* @param ManagerInterface $eventManager
29+
*/
30+
public function __construct(
31+
ManagerInterface $eventManager
32+
) {
33+
$this->_eventManager = $eventManager;
34+
}
35+
36+
/**
37+
* Execute observer
38+
*
39+
* @param Observer $observer
40+
* @return void
41+
*/
42+
public function execute(Observer $observer): void
43+
{
44+
/** @var User $deletedUser */
45+
$deletedUser = $observer->getEvent()->getData('deletedUser');
46+
/** @var User $model */
47+
$model = $observer->getEvent()->getData('model');
48+
if ($deletedUser && $model) {
49+
$model->setData($deletedUser->getData());
50+
if ($model->getOrigData() === null) {
51+
foreach ($model->getData() as $key => $val) {
52+
$model->setOrigData($key, $val);
53+
}
54+
}
55+
$this->_eventManager->dispatch('model_delete_after', ['object' => $model]);
56+
}
57+
}
58+
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
<?php
2+
/**
3+
* Copyright 2025 Adobe
4+
* All Rights Reserved.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\User\Test\Unit\Observer;
9+
10+
use Magento\Framework\Event;
11+
use PHPUnit\Framework\TestCase;
12+
use Magento\Framework\Event\ManagerInterface;
13+
use Magento\Framework\Event\Observer;
14+
use Magento\User\Observer\ValidateModelDeleteAfter;
15+
use Magento\User\Model\User;
16+
use PHPUnit\Framework\MockObject\MockObject;
17+
18+
class ValidateModelDeleteAfterTest extends TestCase
19+
{
20+
/** @var ValidateModelDeleteAfter */
21+
private $observer;
22+
23+
/** @var ManagerInterface|MockObject */
24+
private $eventManagerMock;
25+
26+
protected function setUp(): void
27+
{
28+
$this->eventManagerMock = $this->createMock(ManagerInterface::class);
29+
$this->observer = new ValidateModelDeleteAfter($this->eventManagerMock);
30+
}
31+
32+
public function testExecute()
33+
{
34+
$deletedUser = $this->createMock(User::class);
35+
$userModel = $this->createMock(User::class);
36+
$deletedUser->method('getData')->willReturn(['key' => 'value']);
37+
$observerData = [
38+
'deletedUser' => $deletedUser,
39+
'model' => $userModel,
40+
];
41+
$eventMock = $this->createMock(Event::class);
42+
$eventMock->method('getData')->willReturnCallback(function ($key) use ($observerData) {
43+
return $observerData[$key] ?? null;
44+
});
45+
$observer = $this->createMock(Observer::class);
46+
$observer->method('getEvent')->willReturn($eventMock);
47+
$userModel->expects($this->once())
48+
->method('setData')
49+
->with(['key' => 'value'])
50+
->willReturnSelf();
51+
$userModel->method('getData')->willReturn(['key' => 'value']);
52+
$userModel->expects($this->once())
53+
->method('getOrigData')
54+
->willReturn(null);
55+
$userModel->expects($this->once())
56+
->method('setOrigData')
57+
->with('key', 'value')
58+
->willReturnSelf();
59+
$this->eventManagerMock->expects($this->once())
60+
->method('dispatch')
61+
->with('model_delete_after', ['object' => $userModel]);
62+
$this->observer->execute($observer);
63+
}
64+
}

app/code/Magento/User/etc/adminhtml/events.xml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
<?xml version="1.0"?>
22
<!--
33
/**
4-
* Copyright © Magento, Inc. All rights reserved.
5-
* See COPYING.txt for license details.
4+
* Copyright 2015 Adobe
5+
* All Rights Reserved.
66
*/
77
-->
88
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
@@ -15,4 +15,7 @@
1515
<event name="admin_user_save_after">
1616
<observer name="magento_user" instance="Magento\User\Observer\Backend\TrackAdminNewPasswordObserver" />
1717
</event>
18+
<event name="log_user_after_delete">
19+
<observer name="magento_user" instance="Magento\User\Observer\ValidateModelDeleteAfter" />
20+
</event>
1821
</config>

dev/tests/integration/testsuite/Magento/User/Controller/Adminhtml/User/DeleteTest.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<?php
22
/**
3-
* Copyright © Magento, Inc. All rights reserved.
4-
* See COPYING.txt for license details.
3+
* Copyright 2016 Adobe
4+
* All Rights Reserved.
55
*/
66
namespace Magento\User\Controller\Adminhtml\User;
77

@@ -22,6 +22,7 @@ public function testDeleteActionWithError()
2222
$messageManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
2323
->get(\Magento\Framework\Message\ManagerInterface::class);
2424
$user->load(1);
25+
$this->getRequest()->setMethod('POST');
2526
$this->getRequest()->setPostValue('user_id', $user->getId() . '_suffix_ignored_in_mysql_casting_to_int');
2627

2728
$this->dispatch('backend/admin/user/delete');

0 commit comments

Comments
 (0)