1
0

AppSettingsControllerTest.php 3.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Tests\Integration\Admin;
  4. use App\Domain\Auth\Role;
  5. use App\Domain\Auth\TokenKind;
  6. use App\Domain\Settings\AppSettings;
  7. use App\Tests\Integration\Support\AppTestCase;
  8. final class AppSettingsControllerTest extends AppTestCase
  9. {
  10. public function testGetReturnsCurrentSnapshotAsBooleans(): void
  11. {
  12. $token = $this->createToken(TokenKind::Admin, role: Role::Admin);
  13. $resp = $this->request('GET', '/api/v1/admin/app-settings', [
  14. 'Authorization' => 'Bearer ' . $token,
  15. ]);
  16. self::assertSame(200, $resp->getStatusCode());
  17. $body = $this->decode($resp);
  18. self::assertTrue($body['audit_report_received_enabled']);
  19. self::assertTrue($body['audit_blocklist_request_enabled']);
  20. }
  21. public function testNonAdminRoleIsRejected(): void
  22. {
  23. $token = $this->createToken(TokenKind::Admin, role: Role::Operator);
  24. $resp = $this->request('GET', '/api/v1/admin/app-settings', [
  25. 'Authorization' => 'Bearer ' . $token,
  26. ]);
  27. self::assertSame(403, $resp->getStatusCode());
  28. }
  29. public function testPatchPersistsToggleAndEmitsAudit(): void
  30. {
  31. $token = $this->createToken(TokenKind::Admin, role: Role::Admin);
  32. $resp = $this->request(
  33. 'PATCH',
  34. '/api/v1/admin/app-settings',
  35. ['Authorization' => 'Bearer ' . $token, 'Content-Type' => 'application/json'],
  36. (string) json_encode(['audit_report_received_enabled' => false]),
  37. );
  38. self::assertSame(200, $resp->getStatusCode());
  39. $body = $this->decode($resp);
  40. self::assertFalse($body['audit_report_received_enabled']);
  41. self::assertTrue($body['audit_blocklist_request_enabled']);
  42. /** @var AppSettings $settings */
  43. $settings = $this->container->get(AppSettings::class);
  44. self::assertFalse($settings->getBool(AppSettings::KEY_AUDIT_REPORT_RECEIVED_ENABLED, true));
  45. $row = $this->db->fetchAssociative(
  46. "SELECT details_json FROM audit_log WHERE action = 'app_settings.updated' ORDER BY id DESC LIMIT 1"
  47. );
  48. self::assertIsArray($row);
  49. $details = json_decode((string) $row['details_json'], true);
  50. self::assertIsArray($details);
  51. self::assertArrayHasKey('audit_report_received_enabled', $details['changes']);
  52. self::assertSame(true, $details['changes']['audit_report_received_enabled']['from']);
  53. self::assertSame(false, $details['changes']['audit_report_received_enabled']['to']);
  54. }
  55. public function testPatchWithNoChangesDoesNotEmitAudit(): void
  56. {
  57. $token = $this->createToken(TokenKind::Admin, role: Role::Admin);
  58. $resp = $this->request(
  59. 'PATCH',
  60. '/api/v1/admin/app-settings',
  61. ['Authorization' => 'Bearer ' . $token, 'Content-Type' => 'application/json'],
  62. (string) json_encode(['audit_report_received_enabled' => true]),
  63. );
  64. self::assertSame(200, $resp->getStatusCode());
  65. $count = (int) $this->db->fetchOne(
  66. "SELECT COUNT(*) FROM audit_log WHERE action = 'app_settings.updated'"
  67. );
  68. self::assertSame(0, $count);
  69. }
  70. public function testPatchValidatesBooleanShape(): void
  71. {
  72. $token = $this->createToken(TokenKind::Admin, role: Role::Admin);
  73. $resp = $this->request(
  74. 'PATCH',
  75. '/api/v1/admin/app-settings',
  76. ['Authorization' => 'Bearer ' . $token, 'Content-Type' => 'application/json'],
  77. (string) json_encode(['audit_report_received_enabled' => 'maybe']),
  78. );
  79. self::assertSame(400, $resp->getStatusCode());
  80. }
  81. }