Files
monolog-gdpr-filter/tests/TestConstants.php
Ismo Vuorinen 8866daaf33 feat: add advanced architecture, documentation, and coverage improvements (#65)
* fix(style): resolve PHPCS line-length warnings in source files

* fix(style): resolve PHPCS line-length warnings in test files

* feat(audit): add structured audit logging with ErrorContext and AuditContext

- ErrorContext: standardized error information with sensitive data sanitization
- AuditContext: structured context for audit entries with operation types
- StructuredAuditLogger: enhanced audit logger wrapper with timing support

* feat(recovery): add recovery mechanism for failed masking operations

- FailureMode enum: FAIL_OPEN, FAIL_CLOSED, FAIL_SAFE modes
- RecoveryStrategy interface and RecoveryResult value object
- RetryStrategy: exponential backoff with configurable attempts
- FallbackMaskStrategy: type-aware fallback values

* feat(strategies): add CallbackMaskingStrategy for custom masking logic

- Wraps custom callbacks as MaskingStrategy implementations
- Factory methods: constant(), hash(), partial() for common use cases
- Supports exact match and prefix match for field paths

* docs: add framework integration guides and examples

- symfony-integration.md: Symfony service configuration and Monolog setup
- psr3-decorator.md: PSR-3 logger decorator pattern implementation
- framework-examples.md: CakePHP, CodeIgniter 4, Laminas, Yii2, PSR-15
- docker-development.md: Docker development environment guide

* chore(docker): add Docker development environment

- Dockerfile: PHP 8.2-cli-alpine with Xdebug for coverage
- docker-compose.yml: development services with volume mounts

* feat(demo): add interactive GDPR pattern tester playground

- PatternTester.php: pattern testing utility with strategy support
- index.php: web API endpoint with JSON response handling
- playground.html: interactive web interface for testing patterns

* docs(todo): update with completed medium priority items

- Mark all PHPCS warnings as fixed (81 → 0)
- Document new Audit and Recovery features
- Update test count to 1,068 tests with 2,953 assertions
- Move remaining items to low priority

* feat: add advanced architecture, documentation, and coverage improvements

- Add architecture improvements:
  - ArrayAccessorInterface and DotArrayAccessor for decoupled array access
  - MaskingOrchestrator for single-responsibility masking coordination
  - GdprProcessorBuilder for fluent configuration
  - MaskingPluginInterface and AbstractMaskingPlugin for plugin architecture
  - PluginAwareProcessor for plugin hook execution
  - AuditLoggerFactory for instance-based audit logger creation

- Add advanced features:
  - SerializedDataProcessor for handling print_r/var_export/serialize output
  - KAnonymizer with GeneralizationStrategy for GDPR k-anonymity
  - RetentionPolicy for configurable data retention periods
  - StreamingProcessor for memory-efficient large log processing

- Add comprehensive documentation:
  - docs/performance-tuning.md - benchmarking, optimization, caching
  - docs/troubleshooting.md - common issues and solutions
  - docs/logging-integrations.md - ELK, Graylog, Datadog, etc.
  - docs/plugin-development.md - complete plugin development guide

- Improve test coverage (84.41% → 85.07%):
  - ConditionalRuleFactoryInstanceTest (100% coverage)
  - GdprProcessorBuilderEdgeCasesTest (100% coverage)
  - StrategyEdgeCasesTest for ReDoS detection and type parsing
  - 78 new tests, 119 new assertions

- Update TODO.md with current statistics:
  - 141 PHP files, 1,346 tests, 85.07% line coverage

* chore: tests, update actions, sonarcloud issues

* chore: rector

* fix: more sonarcloud fixes

* chore: more fixes

* refactor: copilot review fix

* chore: rector
2025-12-22 13:38:18 +02:00

195 lines
6.9 KiB
PHP

<?php
declare(strict_types=1);
namespace Tests;
/**
* Constants for test data values.
*
* This class provides standardized test data to avoid duplication
* and ensure consistency across test files.
*/
final class TestConstants
{
// Email addresses
public const EMAIL_JOHN_DOE = 'john.doe@example.com';
public const EMAIL_USER = 'user@example.com';
public const EMAIL_TEST = 'test@example.com';
public const EMAIL_ADMIN = 'admin@example.com';
public const EMAIL_JANE_DOE = 'jane.doe@example.com';
// Social Security Numbers
public const SSN_US = '123-45-6789';
public const SSN_US_ALT = '987-65-4321';
// Credit Card Numbers
public const CC_VISA = '4532-1234-5678-9012';
public const CC_VISA_FORMATTED = '4532 1234 5678 9012';
public const CC_MASTERCARD = '5425-2334-3010-9903';
public const CC_AMEX = '3782-822463-10005';
// Phone Numbers
public const PHONE_US = '+1-555-123-4567';
public const PHONE_US_ALT = '+1-555-987-6543';
public const PHONE_GENERIC = '+1234567890';
// IP Addresses
public const IP_ADDRESS = '192.168.1.100';
public const IP_ADDRESS_ALT = '192.168.1.1';
public const IP_ADDRESS_PUBLIC = '8.8.8.8';
// Names
public const NAME_FIRST = 'John';
public const NAME_LAST = 'Doe';
public const NAME_FULL = 'John Doe';
// Finnish Personal Identity Code (HETU)
public const HETU = '010190-123A';
public const HETU_ALT = '311299-999J';
// IBAN Numbers
public const IBAN_FI = 'FI21 1234 5600 0007 85';
public const IBAN_DE = 'DE89 3704 0044 0532 0130 00';
// MAC Addresses
public const MAC_ADDRESS = '00:1B:44:11:3A:B7';
public const MAC_ADDRESS_ALT = 'A1:B2:C3:D4:E5:F6';
// URLs and Domains
public const DOMAIN = 'example.com';
public const URL_HTTP = 'http://example.com';
public const URL_HTTPS = 'https://example.com';
// User IDs and Numbers
public const USER_ID = 12345;
public const USER_ID_ALT = 67890;
public const SESSION_ID = 'sess_abc123def456';
// Passwords and Secrets (for testing masking)
public const PASSWORD = 'secret_password_123';
public const PASSWORD_ALT = 'p@ssw0rd!';
public const API_KEY = 'sk_live_1234567890abcdef';
public const SECRET_TOKEN = 'bearer_secret_token';
// Amounts and Numbers
public const AMOUNT_CURRENCY = 99.99;
public const AMOUNT_LARGE = 1234.56;
public const CVV = 123;
// Messages
public const MESSAGE_DEFAULT = 'Test message';
public const MESSAGE_SENSITIVE = 'Sensitive data detected';
public const MESSAGE_ERROR = 'Error occurred';
public const MESSAGE_BASE = 'Base message';
public const MESSAGE_WITH_EMAIL = 'Message with test@example.com';
public const MESSAGE_WITH_EMAIL_PREFIX = 'Message with ';
public const MESSAGE_INFO_EMAIL = 'Info with test@example.com';
public const MESSAGE_USER_ACTION_EMAIL = 'User action with test@example.com';
public const MESSAGE_SECURITY_ERROR_EMAIL = 'Security error with test@example.com';
// Message Templates
public const TEMPLATE_USER_EMAIL = 'user%d@example.com';
public const TEMPLATE_MESSAGE_EMAIL = 'Message %d with test@example.com';
// Error Messages
public const ERROR_REPLACE_TYPE_EMPTY = 'Cannot be null or empty for REPLACE type';
public const ERROR_EXCEPTION_NOT_THROWN = 'Expected exception was not thrown';
public const ERROR_RATE_LIMIT_KEY_EMPTY = 'Rate limiting key cannot be empty';
public const ERROR_TRUNCATED_SECURITY = '(truncated for security)';
// Test Messages and Data
public const MESSAGE_TEST_LOWERCASE = 'test message';
public const MESSAGE_USER_ID = 'User ID: 12345';
public const MESSAGE_TEST_WITH_DIGITS = 'Test with 123';
public const MESSAGE_SECRET_DATA = 'secret data';
public const MESSAGE_TEST_STRING = 'test string';
public const DATA_PUBLIC = 'public data';
public const DATA_NUMBER_STRING = '12345';
public const JSON_KEY_VALUE = '{"key":"value"}';
public const PATH_TEST = '/test';
public const CONTENT_TYPE_JSON = 'application/json';
public const STRATEGY_TEST = 'Test Strategy';
// Template Messages
public const TEMPLATE_ENV_VALUE_RESULT = "Environment value '%s' should result in ";
public const TEMPLATE_ENV_VALUE_RESULT_FULL = "Environment value '%s' should result in %s";
// Channels
public const CHANNEL_TEST = 'test';
public const CHANNEL_APPLICATION = 'application';
public const CHANNEL_SECURITY = 'security';
public const CHANNEL_AUDIT = 'audit';
// Context Keys
public const CONTEXT_USER_ID = 'user_id';
public const CONTEXT_EMAIL = 'email';
public const CONTEXT_PASSWORD = 'password';
public const CONTEXT_SENSITIVE_DATA = 'sensitive_data';
// Regex Patterns
public const PATTERN_EMAIL_TEST = '/test@example\.com/';
public const PATTERN_INVALID_UNCLOSED_BRACKET = '/invalid[/';
public const PATTERN_TEST = '/test/';
public const PATTERN_DIGITS = '/\d+/';
public const PATTERN_SECRET = '/secret/';
public const PATTERN_EMAIL_FULL = '/\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b/';
public const PATTERN_RECURSIVE = '/(?R)/';
public const PATTERN_NAMED_RECURSION = '/(?P>name)/';
public const PATTERN_SSN_FORMAT = '/\d{3}-\d{2}-\d{4}/';
// Field Paths
public const FIELD_MESSAGE = 'message';
public const FIELD_GENERIC = 'field';
public const FIELD_USER_EMAIL = 'user.email';
public const FIELD_USER_NAME = 'user.name';
public const FIELD_USER_PUBLIC = 'user.public';
public const FIELD_USER_PASSWORD = 'user.password';
public const FIELD_SYSTEM_LOG = 'system.log';
// Path Patterns
public const PATH_USER_WILDCARD = 'user.*';
// Test Data
public const DATA_TEST = 'test';
public const DATA_TEST_DATA = 'test data';
public const DATA_MASKED = 'masked';
// Replacement Values
public const REPLACEMENT_TEST = '[TEST]';
// Age range values
public const AGE_RANGE_20_29 = '20-29';
// Additional email variations
public const EMAIL_NEW = 'new@example.com';
public const EMAIL_JOHN = 'john@example.com';
// Mask placeholders used in tests (bracketed format)
public const MASK_REDACTED_BRACKETS = '[REDACTED]';
public const MASK_MASKED_BRACKETS = '[MASKED]';
public const MASK_EMAIL_BRACKETS = '[EMAIL]';
public const MASK_DIGITS_BRACKETS = '[DIGITS]';
public const MASK_INT_BRACKETS = '[INT]';
public const MASK_ALWAYS_THIS = '[ALWAYS_THIS]';
// Test values
public const VALUE_TEST = 'test value';
public const VALUE_SUFFIX = ' value';
// Additional pattern constants
public const PATTERN_VALID_SIMPLE = '/^test$/';
public const PATTERN_INVALID_UNCLOSED = '/unclosed';
public const PATTERN_REDOS_VULNERABLE = '/^(a+)+$/';
public const PATTERN_SAFE = '/[a-z]+/';
/**
* Prevent instantiation.
*
* @psalm-suppress UnusedConstructor
*/
private function __construct()
{
}
}