PHP Warning: The use statement with non-compound name 'Mockery' has no effect in /home/wbeltran/Documentos/projects/SuiteX/tests/Unit/App/Observers/FlowCompletedObserverTest.php on line 12 PHP Warning: The use statement with non-compound name 'Mockery' has no effect in /home/wbeltran/Documentos/projects/SuiteX/tests/Unit/Domain/iPaas/Notifications/Services/FlowNotificationServiceTest.php on line 14 PHP Warning: The use statement with non-compound name 'Mockery' has no effect in /home/wbeltran/Documentos/projects/SuiteX/tests/Unit/Jobs/ImportJobs/BuildNetSuiteQueryTest.php on line 8 PHP Warning: The use statement with non-compound name 'Mockery' has no effect in /home/wbeltran/Documentos/projects/SuiteX/tests/Unit/Jobs/ImportJobs/ImportNetSuiteRecordsBatchQueryTest.php on line 7 PHP Warning: The use statement with non-compound name 'Mockery' has no effect in /home/wbeltran/Documentos/projects/SuiteX/tests/Unit/Jobs/ReindexTenantModelSearchTest.php on line 6 PHP Warning: The use statement with non-compound name 'Mockery' has no effect in /home/wbeltran/Documentos/projects/SuiteX/tests/Unit/Services/BatchUpsertSchemaValidationTest.php on line 10 PHP Warning: The use statement with non-compound name 'Mockery' has no effect in /home/wbeltran/Documentos/projects/SuiteX/tests/Unit/Services/BulkUpsertFixVerificationTest.php on line 9 PHP Warning: The use statement with non-compound name 'Mockery' has no effect in /home/wbeltran/Documentos/projects/SuiteX/tests/Unit/Services/InvoiceBatchUpsertServiceTest.php on line 9 PHP Warning: The use statement with non-compound name 'Mockery' has no effect in /home/wbeltran/Documentos/projects/SuiteX/tests/Unit/Services/Ipaas/Pagination/Handlers/GraphQLCursorHandlerTest.php on line 6 PHP Warning: The use statement with non-compound name 'Mockery' has no effect in /home/wbeltran/Documentos/projects/SuiteX/tests/Unit/Services/Ipaas/Pagination/Handlers/PartitionBasedHandlerTest.php on line 7 PHP Warning: The use statement with non-compound name 'Mockery' has no effect in /home/wbeltran/Documentos/projects/SuiteX/tests/Unit/Services/Ipaas/ThrottleManagerTest.php on line 6 PHP Warning: The use statement with non-compound name 'Exception' has no effect in /home/wbeltran/Documentos/projects/SuiteX/tests/Unit/Services/RecordUpsertChunkingTest.php on line 9 PHP Warning: The use statement with non-compound name 'Mockery' has no effect in /home/wbeltran/Documentos/projects/SuiteX/tests/Unit/Services/RecordUpsertChunkingTest.php on line 10 PHP Warning: The use statement with non-compound name 'Mockery' has no effect in /home/wbeltran/Documentos/projects/SuiteX/tests/Feature/Search/SearchFieldConfigControllerTest.php on line 8 WARN Tests\Unit\App\Livewire\FormBuilder\Fields\RecordRefTest ✓ getSelectColumnsForModel → it includes external_id when column exis… 0.14s ✓ getSelectColumnsForModel → it excludes external_id when column does… 0.02s ✓ getSelectColumnsForModel → it logs warning and returns basic column… 0.02s ✓ resolveReferences → it resolves CurrentRecord to pageModel 0.02s ✓ resolveReferences → it returns original reference when not CurrentR… 0.02s ✓ resolveReferences → it falls back to recordId when reference is nul… 0.02s ✓ updatePaginationProperties → it updates pagination properties corre… 0.02s ✓ updatePaginationProperties → it updates pagination properties corre… 0.02s ✓ updatePaginationProperties → it handles null paginator gracefully 0.02s - render method → it extracts field properties when field is present… 0.02s - render method → it handles missing recordType gracefully → Requires… 0.03s - error handling → it logs error and continues when getSelectOptions… 0.02s - error handling → it initializes empty paginator when query fails →… 0.02s ✓ external_id column handling → it works with models that have extern… 0.02s ✓ external_id column handling → it works with models that do not have… 0.02s - setSelectedRecord → it does not fail when external_id column is mis… 0.02s - setSelectedRecord → it casts external_id to int when column exists… 0.02s ✓ RecordRef Edge Cases → it handles empty value in setSelectedRecord 0.02s ✓ RecordRef Edge Cases → it handles database connection issues gracef… 0.02s PASS Tests\Unit\App\Livewire\NotificationDrawerSimpleTest ✓ buildModelUrl converts projects table name to correct route 0.25s ✓ buildModelUrl converts projecttasks table name to correct route 0.02s ✓ buildModelUrl converts subtasks table name to correct route 0.02s ✓ buildModelUrl adds comment anchor when provided 0.02s ✓ buildModelUrl returns null for non-existent route 0.02s ✓ Str::singular correctly handles plural table names 0.03s ✓ required routes exist for projects, projecttasks and subtasks 0.02s PASS Tests\Unit\App\Mail\FlowNotificationMailTest ✓ FlowNotificationMail - Critical Failure Detection → it generates cr… 0.11s ✓ FlowNotificationMail - Critical Failure Detection → it generates no… 0.02s ✓ FlowNotificationMail - Critical Failure Detection → it sets isCriti… 0.03s ✓ FlowNotificationMail - Critical Failure Detection → it does not set… 0.02s ✓ FlowNotificationMail - Queue Configuration → it uses mail queue ins… 0.02s ✓ FlowNotificationMail - Queue Configuration → it maintains queue con… 0.02s ✓ FlowNotificationMail - Content Generation → it passes all event dat… 0.02s ✓ FlowNotificationMail - Content Generation → it detects test notific… 0.03s ✓ FlowNotificationMail - Content Generation → it generates correct UR… 0.02s ✓ FlowNotificationMail - Content Generation → it handles test notific… 0.02s ✓ FlowNotificationMail - Data Serialization → it stores flow data as… 0.02s ✓ FlowNotificationMail - Data Serialization → it handles null descrip… 0.03s PASS Tests\Unit\App\Observers\FlowCompletedObserverTest ✓ FlowCompletedObserver - Metrics Finalization → it ensures metrics a… 1.69s ✓ FlowCompletedObserver - Metrics Finalization → it handles incomplet… 1.54s ✓ FlowCompletedObserver - Metrics Finalization → it handles missing f… 1.53s ✓ FlowCompletedObserver - Metrics Finalization → it validates metrics… 0.03s ✓ FlowCompletedObserver - Metrics Finalization → it handles database… 1.53s PASS Tests\Unit\Broadcasting\ProjectChannelAuthorizationTest ✓ Project Broadcast Channel Authorization → it denies unauthenticated… 0.10s ✓ Project Broadcast Channel Authorization → it denies when tenant dat… 0.03s PASS Tests\Unit\Console\Commands\MaintenanceNodeDataCleanUpTest ✓ Command Registration → it has correct signature and description 0.21s ✓ Command Registration → it has all required options 0.02s ✓ Cache Lock Mechanism → it prevents overlapping executions 0.05s ✓ Cache Lock Mechanism → it releases lock after successful execution 0.02s ✓ Command Success Criteria → it returns success code on successful ex… 0.04s ✓ Command Success Criteria → it returns failure code when lock cannot… 0.02s ✓ Telemetry and Logging → it logs structured summary on completion 0.03s PASS Tests\Unit\Console\Commands\MaintenanceTempCleanUpTest ✓ Command Registration → it has correct signature and description 0.03s ✓ Command Registration → it has all required options 0.02s ✓ Cache Lock Mechanism → it prevents overlapping executions 0.02s ✓ Cache Lock Mechanism → it releases lock after successful execution 0.03s ✓ Command Success Criteria → it returns success code on successful ex… 0.02s ✓ Command Success Criteria → it returns failure code when lock cannot… 0.03s ✓ Dry-Run Mode → it does not delete files in dry-run mode 0.02s ✓ File Deletion → it deletes old files based on retention policy 0.03s ✓ File Deletion → it respects custom retention period via --older-tha… 0.02s ✓ Safety and Exclusions → it respects safety window 0.03s ✓ Safety and Exclusions → it excludes lock files 0.02s ✓ Telemetry and Logging → it logs structured summary on completion 0.03s ✓ Error Handling → it handles non-existent path gracefully 0.02s ✓ Error Handling → it handles empty directory 0.03s ✓ Edge Cases → it cleans empty directories when configured 0.02s ✓ Edge Cases → it processes multiple files in batch 0.23s ✓ Edge Cases → it respects max runtime 0.03s PASS Tests\Unit\Console\Commands\TokenUpdateSimpleTest ✓ command can be instantiated 0.03s ✓ command has correct signature 0.02s ✓ command has correct description 0.03s ✓ OAuth error type detection works correctly 0.02s ✓ parseExpirationTime handles valid timestamps 0.03s ✓ parseExpirationTime handles invalid dates 0.03s ✓ parseExpirationTime handles string dates 0.03s PASS Tests\Unit\Controllers\LinkControllerDefensiveTest ✓ LinkController - Defensive Programming (Unit) → it validates type f… 0.02s ✓ LinkController - Defensive Programming (Unit) → it validates source… 0.03s ✓ LinkController - Defensive Programming (Unit) → it validates target… 0.02s ✓ LinkController - Defensive Programming (Unit) → it validates ID for… 0.02s ✓ LinkController - Defensive Programming (Unit) → it validates ID for… 0.03s ✓ LinkController - Defensive Programming (Unit) → it logs warnings wh… 0.02s PASS Tests\Unit\Controllers\RecordControllerBreadcrumbTest ✓ RecordController Breadcrumb Handling → filters out breadcrumbs with… 0.03s ✓ RecordController Breadcrumb Handling → keeps breadcrumbs with valid… 0.02s ✓ RecordController Breadcrumb Handling → handles mixed valid and inva… 0.02s ✓ RecordController Breadcrumb Handling → empty URL string is preserve… 0.02s ✓ RecordController Breadcrumb Handling → logs warning for missing rou… 0.03s PASS Tests\Unit\Controllers\TaskControllerDefensiveTest ✓ TaskController - Defensive Programming (Unit) → it validates type f… 0.02s ✓ TaskController - Defensive Programming (Unit) → it validates type m… 0.03s ✓ TaskController - Defensive Programming (Unit) → it validates text f… 0.02s ✓ TaskController - Defensive Programming (Unit) → it validates start_… 0.02s ✓ TaskController - Defensive Programming (Unit) → it validates ID for… 0.03s ✓ TaskController - Defensive Programming (Unit) → it validates type i… 0.02s ✓ TaskController - Defensive Programming (Unit) → it prevents divisio… 0.03s ✓ TaskController - Defensive Programming (Unit) → it logs warnings wh… 0.02s PASS Tests\Unit\Domain\ChargeTypes\Services\ChargeTypeBatchUpsertServiceTest ✓ Basic Functionality → it handles empty NetSuite records 0.03s ✓ Basic Functionality → it service instantiates correctly and has req… 0.03s PASS Tests\Unit\Domain\Charges\Services\ChargeBatchUpsertServiceTest ✓ Basic Functionality → it handles empty NetSuite records 0.05s ✓ Basic Functionality → it service instantiates correctly and has req… 0.03s PASS Tests\Unit\Domain\DatabaseColumns\Actions\DatabaseColumnActionsEdgeCaseTest ✓ create action handles extremely long column names 0.05s ✓ create action rejects column names exceeding maximum length 0.03s ✓ create action handles special characters in default values 0.04s ✓ create action handles unicode characters in column names 0.03s ✓ update action handles complex type conversions with data preservati… 0.06s ✓ update action handles updating non-existent column 0.03s ✓ update action handles renaming to existing column name 0.05s ✓ delete action handles deleting non-existent column gracefully 0.03s ✓ delete action handles deleting column with foreign key constraints 0.04s ✓ update action rolls back on validation failure 0.05s ✓ create action handles multiple rapid column creations 0.07s ✓ create action handles minimum and maximum constraint values 0.05s ✓ create action handles zero and negative constraint values 0.03s PASS Tests\Unit\Domain\DatabaseColumns\Actions\DatabaseColumnActionsTest ✓ create action adds column to table 0.05s ✓ update action modifies column in table 0.06s ✓ delete action removes column from table 0.05s ✓ actions handle errors gracefully 0.03s PASS Tests\Unit\Domain\DatabaseColumns\DataTransferObjects\ColumnDefinitionTest ✓ it creates text column definition 0.03s ✓ it creates integer column definition 0.02s ✓ it creates decimal column definition 0.03s ✓ it creates boolean column definition 0.02s ✓ it creates foreign key column definition 0.03s ✓ it defaults to text for unknown content type 0.02s PASS Tests\Unit\Domain\DatabaseColumns\Exceptions\ColumnValidationExceptionTest ✓ invalid column name exception 0.03s ✓ invalid default value exception 0.02s ✓ column already exists exception 0.02s ✓ column not found exception 0.03s ✓ incompatible type conversion exception 0.02s ✓ exception with custom message and code 0.03s ✓ exception with previous exception 0.02s ✓ exception inheritance chain 0.03s ✓ exception with special characters in column name 0.02s ✓ exception with unicode characters in column name 0.02s ✓ exception with very long column name 0.03s ✓ exception with empty column name 0.02s ✓ exception with null default value 0.03s ✓ exception with complex default value 0.02s ✓ exception with table name containing spaces 0.03s ✓ exception with complex type conversion 0.02s ✓ exception stack trace preservation 0.02s ✓ exception with zero code 0.03s ✓ exception with negative code 0.02s ✓ exception with large code 0.02s ✓ exception message formatting consistency 0.02s PASS Tests\Unit\Domain\DatabaseColumns\Rules\ColumnNameRuleTest ✓ it passes for valid column name 0.04s ✓ it fails for reserved word 0.02s ✓ it fails for existing column 0.03s ✓ it fails for invalid characters 0.02s PASS Tests\Unit\Domain\DatabaseColumns\Services\ColumnUpdateStrategyServiceTest ✓ determine strategy for same type no changes 0.03s ✓ determine strategy for type change 0.02s ✓ determine strategy for incompatible conversion 0.03s ✓ determine strategy for default value change 0.02s ✓ determine strategy for name change 0.03s ✓ sqlite recreate strategy execution 0.03s ✓ sqlite recreate preserves other columns 0.03s ✓ drop and recreate strategy execution 0.04s ✓ native update strategy for rename 0.03s ✓ native update strategy for type change 0.03s ✓ default only strategy execution 0.03s ✓ default only strategy removes default 0.04s ✓ unknown strategy throws exception 0.02s ✓ strategy determination with nonexistent column 0.02s ✓ strategy with empty table 0.05s ✓ strategy with table without timestamps 0.03s ✓ strategy with table without id 0.04s PASS Tests\Unit\Domain\DatabaseColumns\Services\ColumnValidationServiceTest ✓ validate datetime with valid format 0.02s ✓ validate datetime with invalid format 0.03s ✓ validate datetime with null value 0.02s ✓ validate datetime with empty string 0.03s ✓ validate datetime with null string 0.02s ✓ validate date with valid format 0.03s ✓ validate date with invalid format 0.02s ✓ validate decimal with valid number 0.02s ✓ validate decimal with integer 0.03s ✓ validate decimal with invalid value 0.02s ✓ validate integer with valid integer 0.02s ✓ validate integer with decimal 0.02s ✓ validate integer with string number 0.02s ✓ validate bigint with large number 0.02s ✓ validate boolean with true 0.02s ✓ validate boolean with false 0.03s ✓ validate boolean with string true 0.02s ✓ validate boolean with string false 0.03s ✓ validate boolean with zero 0.02s ✓ validate boolean with one 0.02s ✓ validate boolean with invalid value 0.02s ✓ validate text with any string 0.02s ✓ validate varchar with special characters 0.03s ✓ validate longtext with empty string 0.02s ✓ validate unknown type 0.03s ✓ normalize datetime valid value 0.02s ✓ normalize datetime invalid value 0.03s ✓ normalize date valid value 0.02s ✓ normalize decimal valid value 0.02s ✓ normalize decimal invalid value 0.03s ✓ normalize integer valid value 0.02s ✓ normalize integer decimal value 0.03s ✓ normalize boolean valid values 0.02s ✓ normalize boolean invalid value 0.03s ✓ normalize text preserves value 0.02s ✓ validate default value comprehensive 0.02s ✓ validate default value with invalid type 0.03s ✓ validate with case insensitive types 0.02s ✓ validate with case insensitive boolean values 0.03s ✓ validate with whitespace values 0.02s ✓ validate with scientific notation 0.03s ✓ validate with negative numbers 0.02s ✓ validate with zero values 0.02s WARN Tests\Unit\Domain\Integrations\Actions\CreateIntegrationTest ✓ Integration Creation with Credential Validation → creates integrati… 0.10s ✓ Integration Creation with Credential Validation → fails to create i… 0.07s ✓ Integration Creation with Credential Validation → can skip credenti… 0.07s ✓ Integration Creation with Credential Validation → handles missing r… 0.07s ✓ Integration Creation with Credential Validation → logs validation a… 0.06s ✓ Integration Creation with Credential Validation → handles NetSuite… 0.07s ✓ Integration Creation without Credential Validation → creates non-ne… 0.07s ! Integration Creation without Credential Validation → handles databa… 0.07s ✓ Edge Cases and Error Handling → handles empty credential validation… 0.07s ✓ Edge Cases and Error Handling → handles malformed JSON response fro… 0.07s ✓ Edge Cases and Error Handling → preserves user association on creat… 0.07s PASS Tests\Unit\Domain\Integrations\Actions\UpdateIntegrationTest ✓ Integration Update with Credential Validation → updates integration… 0.07s ✓ Integration Update with Credential Validation → fails when sensitiv… 0.07s ✓ Integration Update with Credential Validation → fails with invalid… 0.07s ✓ Integration Update with Credential Validation → skips validation wh… 0.07s ✓ Integration Update with Credential Validation → can skip credential… 0.06s ✓ Integration Update with Credential Validation → validates only when… 0.07s ✓ Integration Update Sensitive Fields Logic → preserves existing sens… 0.07s ✓ Integration Update Sensitive Fields Logic → updates only provided s… 0.07s ✓ Integration Update Sensitive Fields Logic → logs sensitive field up… 0.08s ✓ Edge Cases and Error Handling → handles non-existent integration gr… 0.08s ✓ Edge Cases and Error Handling → handles validation exception for in… 0.07s ✓ Edge Cases and Error Handling → handles NetSuite connection timeout… 0.06s ✓ Edge Cases and Error Handling → updates non-netsuite integration wi… 0.08s PASS Tests\Unit\Domain\OtherCharges\Services\OtherChargeBatchUpsertServiceTest ✓ Basic Functionality → it handles empty NetSuite records 0.04s ✓ Basic Functionality → it service instantiates correctly and has req… 0.02s PASS Tests\Unit\Domain\Projects\Services\ProjectBatchUpsertServiceTest ✓ Production Bug Prevention → it service instantiates correctly and h… 0.03s PASS Tests\Unit\Domain\TransactionLines\Services\TransactionLineQuantityValidationTest ✓ TransactionLine Quantity Field Validation → it handles positive int… 0.03s ✓ TransactionLine Quantity Field Validation → it handles negative int… 0.03s ✓ TransactionLine Quantity Field Validation → it handles positive dec… 0.04s ✓ TransactionLine Quantity Field Validation → it handles negative dec… 0.03s ✓ TransactionLine Quantity Field Validation → it handles null and emp… 0.03s ✓ TransactionLine Quantity Field Validation → it handles high precisi… 0.03s ✓ TransactionLine Quantity Field Validation → it handles string repre… 0.04s ✓ TransactionLine Quantity Field Validation → it handles large quanti… 0.03s PASS Tests\Unit\Domain\Vendors\Services\VendorBatchUpsertServiceTest ✓ Core Functionality → it service instantiates correctly and has requ… 0.03s PASS Tests\Unit\Domain\iPaas\Connectors\Strategy\AuthContextTest ✓ Service Instantiation → it instantiates correctly 0.02s ✓ Strategy Management → it sets strategy correctly 0.03s ✓ Strategy Management → it throws LogicException when no strategy is… 0.02s ✓ Strategy Management → it throws LogicException when no strategy is… 0.03s ✓ Strategy Management → it throws LogicException when no strategy is… 0.02s ✓ Authentication → it delegates authentication to strategy 0.03s ✓ Authentication → it passes connector to strategy authenticate metho… 0.02s ✓ Token Refresh → it delegates token refresh to strategy 0.03s ✓ Token Refresh → it passes relogin and isPreview parameters correctl… 0.02s ✓ Make Request → it validates required parameters before delegating 0.02s ✓ Make Request → it validates connector parameter is present 0.03s ✓ Make Request → it validates httpMethod parameter is present 0.02s ✓ Make Request → it validates relativeURL parameter is present 0.03s ✓ Make Request → it delegates request to strategy when all parameters… 0.02s ✓ Make Request → it propagates exceptions from strategy 0.03s ✓ Strategy Pattern Implementation → it allows switching between diffe… 0.02s ✓ Strategy Pattern Implementation → it maintains strategy after succe… 0.02s ✓ Error Handling → it provides clear error message when strategy is n… 0.03s ✓ Error Handling → it does not catch or suppress strategy exceptions 0.02s PASS Tests\Unit\Domain\iPaas\Connectors\Strategy\ConnectorBasicRequestBodyTest ✓ ConnectorBasic - RequestBody Priority Logic Documentation → it docu… 0.03s ✓ ConnectorBasic - RequestBody Priority Logic Documentation → it docu… 0.02s ✓ ConnectorBasic - RequestBody Priority Logic Documentation → it docu… 0.03s FAIL Tests\Unit\Domain\iPaas\Connectors\Strategy\ConnectorOAuth1Test ✓ Service Instantiation → it instantiates correctly 0.02s ✓ Authentication → it authenticates successfully with valid OAuth 1.0… 0.03s ✓ Authentication → it handles authentication with minimal required fi… 0.02s ✓ Token Refresh → it refreshes token by re-authenticating 0.03s ✓ Token Refresh → it handles token refresh by re-authenticating 0.02s ⨯ Make Request → it calls NetsuiteService for netsuite_oauth1 connect… 0.02s ✓ Make Request → it has makeRequest method with proper signature 0.03s ✓ Application-Based Routing → it routes NetSuite requests to NetSuite… 0.02s ✓ Application-Based Routing → it handles connectors without applicati… 0.03s ✓ Error Handling → it returns basic response without validation error… 0.02s ✓ Error Handling → it logs errors only when exceptions occur 0.03s ⨯ Integration with NetSuiteService → it verifies NetSuiteService has… 0.02s PASS Tests\Unit\Domain\iPaas\Connectors\Strategy\ConnectorOAuth2Test ✓ Service Instantiation → it instantiates correctly with required met… 0.04s ✓ Token Expiration Detection → it correctly identifies expired tokens 0.02s ✓ Token Expiration Detection → it correctly identifies valid tokens 0.02s ✓ Authorization URL Building → it builds authorization URL with corre… 0.04s ✓ Token Refresh Error Handling → it throws TokenRefreshException when… 0.03s ✓ Token Refresh Error Handling → it handles network errors during tok… 0.03s PASS Tests\Unit\Domain\iPaas\FlowSchedule\FlowScheduleTest ✓ frequency relationship → it correctly loads frequency type 0.03s ✓ timezone handling → it stores timezone as JSON string 0.04s ✓ schedule execution timing (slot-based) → it calculates 30-minute sl… 0.03s ✓ schedule execution timing (slot-based) → it calculates slot correct… 0.04s ✓ schedule execution timing (slot-based) → it uses start time for fir… 0.03s ✓ schedule execution timing (slot-based) → it does not schedule beyon… 0.04s ✓ active days filtering → it respects active days configuration 0.04s ✓ time range validation → it validates time ranges correctly 0.03s ✓ different frequencies (slot-based) → it calculates hourly slots cor… 0.04s ✓ different frequencies (slot-based) → it calculates daily slots corr… 0.03s ✓ timezone edge cases → it handles different timezone formats 0.05s ✓ timezone edge cases → it handles invalid timezones gracefully 0.03s ✓ error handling → it handles missing frequency gracefully 0.04s ✓ error handling → it handles malformed timezone data 0.03s ✓ minute precision handling → it treats executions at minute precisio… 0.03s PASS Tests\Unit\Domain\iPaas\Nodes\Actions\UpdateApiNodeTest ✓ cleanRequestConfig → it removes SFTP credentials from request confi… 0.03s ✓ cleanRequestConfig → it removes previewResult and initialResponse f… 0.02s ✓ cleanRequestConfig → it preserves flowExecution fields when enabled 0.03s ✓ cleanRequestConfig → it removes compressedFile for request/download… 0.02s ✓ cleanRequestConfig → it removes flowExecution fields when disabled 0.03s PASS Tests\Unit\Domain\iPaas\Nodes\ApiNodeSftpTest ✓ getDecryptedSftpCredentials → it returns credentials from dedicated… 0.02s ✓ getDecryptedSftpCredentials → it includes storagePath for SFTP root… 0.03s ✓ getDecryptedSftpCredentials → it handles missing storagePath gracef… 0.02s ✓ SFTP credentials separation → it moves credentials from request_con… 0.03s ✓ ApiNode Redis cleanup → it ensures Redis key is deleted before retu… 0.02s PASS Tests\Unit\Domain\iPaas\Nodes\MigrationInitialResponseTest ✓ migrateExistingData logic → it migrates initialResponse to column w… 0.03s ✓ migrateExistingData logic → it preserves existing column value when… 0.02s ✓ migrateExistingData logic → it removes previewResult from config wi… 0.03s ✓ migrateExistingData logic → it migrates SFTP credentials to dedicat… 0.02s PASS Tests\Unit\Domain\iPaas\Notifications\Services\FlowNotificationServiceTest ✓ FlowNotificationService - Default Behavior → it ensures no mail whe… 0.05s ✓ FlowNotificationService - Default Behavior → it defaults to enabled… 0.04s ✓ FlowNotificationService - Default Behavior → it defaults to enabled… 0.05s ✓ FlowNotificationService - Failure Detection → it ensures no mail wh… 0.05s ✓ FlowNotificationService - Failure Detection → it ensures no mail wh… 0.05s ✓ FlowNotificationService - Mail Queue Behavior → it ensures mail is… 0.04s ✓ FlowNotificationService - Mail Queue Behavior → it handles external… 0.05s ✓ FlowNotificationService - Mail Queue Behavior → it uses fallback re… 0.04s ✓ FlowNotificationService - Mail Queue Behavior → it ensures no recip… 0.05s ✓ FlowNotificationService - Mail Queue Behavior → it handles multiple… 0.04s ✓ FlowNotificationService - Critical Failure Semantics → it handles c… 0.05s ✓ FlowNotificationService - Event Payload Invariants → it passes even… 0.04s ✓ FlowNotificationService - Flow Not Found Resilience → it handles fl… 0.05s ✓ FlowNotificationService - Tenant Isolation (Security) → it prevents… 0.04s ✓ FlowNotificationService - Tenant Isolation (Security) → it handles… 0.05s ✓ FlowNotificationService - Data Corruption Resilience → it handles c… 0.05s ✓ FlowNotificationService - Data Corruption Resilience → it handles e… 0.06s ✓ FlowNotificationService - Data Corruption Resilience → it handles m… 0.04s ✓ FlowNotificationService - Email Content Edge Cases → it handles ext… 0.06s ✓ FlowNotificationService - Email Content Edge Cases → it handles spe… 0.04s ✓ FlowNotificationService - Email Content Edge Cases → it handles rec… 0.06s ✓ FlowNotificationService - Concurrent Operations → it handles multip… 0.05s ✓ FlowNotificationService - Concurrent Operations → it handles high v… 0.12s PASS Tests\Unit\ExampleTest ✓ that true is true 0.01s PASS Tests\Unit\Helpers\DecodeArrayHelperTest ✓ decodeArray Helper Function → it decodes valid JSON without replace… 0.03s ✓ decodeArray Helper Function → it handles complex JSON with special… 0.02s ✓ decodeArray Helper Function → it returns empty array for null input 0.02s ✓ decodeArray Helper Function → it returns empty array for "null" str… 0.03s ✓ decodeArray Helper Function → it returns empty array for empty arra… 0.02s ✓ decodeArray Helper Function → it handles already decoded arrays 0.03s ✓ decodeArray Helper Function → it handles simple valid JSON objects 0.02s FAIL Tests\Unit\Helpers\RecordTypeFieldsTest ⨯ modelCriteriaWithDependencies loads single level dependencies correctly ⨯ modelCriteriaWithDependencies preserves dependency structure ⨯ modelCriteriaWithDependencies detects circular dependencies ⨯ modelCriteriaWithDependencies handles missing criteria files gracefully ⨯ modelCriteriaWithDependencies handles invalid JSON in criteria files ⨯ getMappedFieldsWithValues handles missing content_type gracefully ⨯ getMappedFieldsWithValues skips non-array field data PASS Tests\Unit\Helpers\RecordTypeRouteTest ✓ recordTypeRoute Helper → normalizes uppercase record type to lowerc… 0.03s ✓ recordTypeRoute Helper → handles already lowercase record type 0.02s ✓ recordTypeRoute Helper → generates route with parameters 0.03s ✓ recordTypeRoute Helper → handles mixed case record types 0.02s ✓ recordTypeRoute Helper → generates correct route for different acti… 0.03s ✓ recordTypeRoute Helper → returns null when route does not exist 0.02s ✓ recordTypeRoute Helper → logs warning when route does not exist 0.03s ✓ recordTypeRoute Helper → does not spam logs for same missing route 0.02s ✓ recordTypeRoute Helper → handles route with multiple parameters 0.02s PASS Tests\Unit\Http\Controllers\Api\BaseApiControllerTest ✓ success response returns correct json structure 0.03s ✓ success response includes timestamp 0.02s ✓ error response returns correct json structure 0.03s ✓ error response includes timestamp 0.02s ✓ validation error response returns 422 status 0.03s ✓ paginated response includes pagination meta 0.02s ✓ paginated response uses transformer when provided 0.03s ✓ not found response returns 404 0.02s ✓ forbidden response returns 403 0.02s ✓ forbidden response accepts custom message 0.03s ✓ pagination params helper parses correctly 0.02s ✓ pagination params helper enforces max limit 0.03s ✓ pagination params helper provides defaults 0.02s ✓ sorting params helper parses correctly 0.03s ✓ sorting params helper validates allowed sorts 0.02s ✓ sorting params helper validates direction 0.02s ✓ filter params helper parses correctly 0.03s ✓ filter params helper ignores non-allowed filters 0.02s ✓ filter params helper removes empty values 0.03s ✓ getCurrentTenantId returns tenant ID in testing environment 0.02s ✓ getCurrentTenantId method exists and is callable 0.03s ✓ handleApiException logs error and returns 500 response 0.02s ✓ checkPermission returns false when user not authenticated 0.02s ✓ checkPermission method signature is correct 0.03s FAIL Tests\Unit\Jobs\ImportJobs\BatchJobRetryTest ✓ BatchJobRetry → it calculates exponential backoff correctly 0.04s ⨯ BatchJobRetry → it retries failed API calls with proper backoff 0.03s ⨯ BatchJobRetry → it tracks progress correctly during retries 0.03s ✓ BatchJobRetry → it handles database connection issues 0.04s PASS Tests\Unit\Jobs\ImportJobs\BatchUpsertStrategyTest ✓ Batch Upsert Strategy Pattern → it identifies customers as batch-pr… 0.03s ✓ Batch Upsert Strategy Pattern → it identifies sales orders as batch… 0.04s ✓ Batch Upsert Strategy Pattern → it identifies subsidiaries as batch… 0.03s ✓ Batch Upsert Strategy Pattern → it identifies locations as batch-pr… 0.04s ✓ Batch Upsert Strategy Pattern → it identifies opportunities as batc… 0.03s ✓ Batch Upsert Strategy Pattern → it identifies transaction lines as… 0.04s ✓ Batch Upsert Strategy Pattern → it falls back to individual process… 0.03s ✓ Batch Upsert Strategy Pattern → it correctly prioritizes record typ… 0.03s FAIL Tests\Unit\Jobs\ImportJobs\BuildNetSuiteQueryTest ⨯ buildNetSuiteQuery alias prepend → it prepends aliases and keeps se… 0.02s PASS Tests\Unit\Jobs\ImportJobs\ImportJobCoordinatorBatchMetadataTest ✓ collectAllBatchMetadata method → it includes both dependencies and… 0.05s ✓ collectAllBatchMetadata method → it handles main-record-only import… 0.03s ✓ collectAllBatchMetadata method → it handles empty dependency graph… 0.06s ✓ collectAllBatchMetadata method → it logs appropriate messages durin… 0.03s PASS Tests\Unit\Jobs\ImportJobs\ImportJobCoordinatorDay2Test ✓ ImportJobCoordinator Day 2 Integration → it collects batch metadata… 0.03s ✓ ImportJobCoordinator Day 2 Integration → it integrates wave coordin… 0.02s ✓ ImportJobCoordinator Day 2 Integration → it validates wave coordina… 0.03s ✓ ImportJobCoordinator Day 2 Integration → it validates wave monitori… 0.02s ✓ ImportJobCoordinator Day 2 Integration → it validates monitoring st… 0.02s FAIL Tests\Unit\Jobs\ImportJobs\ImportJobCoordinatorTest - ImportJobCoordinator → it returns correct count from NetSuite → Int… 0.04s ✓ ImportJobCoordinator → it handles missing record type 0.03s ⨯ ImportJobCoordinator → it handles missing mapping criteria 0.04s - ImportJobCoordinator → it handles NetSuite API errors → Intentional… 0.03s ⨯ ImportJobCoordinator → it handles invalid API response format 0.04s ⨯ ImportJobCoordinator → it dispatches lifecycle events correctly 0.03s - ImportJobCoordinator → it dispatches failure event on error → Inten… 0.04s - ImportJobCoordinator → it handles database connection issues → Inte… 0.03s - ImportJobCoordinator → it handles dependency resolution failures →… 0.02s - ImportJobCoordinator → it handles memory exhaustion → Intentionally… 0.03s PASS Tests\Unit\Jobs\ImportJobs\ImportJobCoordinatorWaveTest ✓ Wave Coordination Feature → it always enables wave coordination for… 0.03s ✓ Wave Coordination Feature → it has WaveCoordinator property defined 0.03s ✓ Feature Flag Integration → it uses simplified wave coordination log… 0.02s ✓ Configuration Integration → it imports WaveCoordinator class correc… 0.03s ✓ Configuration Integration → it validates wave configuration structu… 0.02s FAIL Tests\Unit\Jobs\ImportJobs\ImportNetSuiteRecordsBatchApiLimitTest ✓ Slow Empty Response Detection → it detects slow empty responses as… 0.03s ⨯ Slow Empty Response Detection → it does not trigger on fast empty r… 0.02s ⨯ Batch Cancellation Logic → it cancels remaining batches when API li… 0.03s ⨯ Batch Cancellation Logic → it does not affect batches for different… 0.02s ⨯ Skip Logic for Cancelled Batches → it skips processing when batch n… 0.03s ⨯ Skip Logic for Cancelled Batches → it processes normally when batch… 0.02s ⨯ One-Time API Limit Processing → it only processes API limit detecti… 0.03s ⨯ RecordTypeFields Caching → it caches modelFields results to prevent… 0.02s PASS Tests\Unit\Jobs\ImportJobs\ImportNetSuiteRecordsBatchBooleanTest ✓ ImportNetSuiteRecordsBatch Boolean Value Processing → it normalizes… 0.03s ✓ ImportNetSuiteRecordsBatch Boolean Value Processing → it normalizes… 0.02s ✓ ImportNetSuiteRecordsBatch Boolean Value Processing → it handles un… 0.03s ✓ ImportNetSuiteRecordsBatch Boolean Value Processing → it handles un… 0.02s ✓ ImportNetSuiteRecordsBatch Boolean Value Processing → it handles mi… 0.03s ✓ ImportNetSuiteRecordsBatch Boolean Value Processing → it handles nu… 0.02s PASS Tests\Unit\Jobs\ImportJobs\ImportNetSuiteRecordsBatchProgressiveBackoffTest ✓ Concurrency Error Detection → it identifies all concurrency error m… 0.03s ✓ Concurrency Error Detection → it handles case-insensitive concurren… 0.02s ✓ Concurrency Error Detection → it detects concurrency errors within… 0.02s ✓ Connection Error Detection → it identifies all connection error mes… 0.03s ✓ Connection Error Detection → it handles case-insensitive connection… 0.02s ✓ Connection Error Detection → it detects connection errors within lo… 0.03s ✓ Error Classification Accuracy → it does not confuse connection erro… 0.02s ✓ Error Classification Accuracy → it correctly identifies non-retryab… 0.03s ✓ Progressive Backoff Calculation Logic → it calculates base delay pr… 0.02s ✓ Progressive Backoff Calculation Logic → it generates jitter within… 0.02s ✓ Progressive Backoff Calculation Logic → it validates maximum delay… 0.03s ✓ Configuration Constants Validation → it validates queue release del… 0.02s ✓ Configuration Constants Validation → it validates progressive retry… 0.03s ✓ Configuration Constants Validation → it validates fixed delay for c… 0.02s FAIL Tests\Unit\Jobs\ImportJobs\ImportNetSuiteRecordsBatchQueryTest ⨯ it builds TransactionLine IN() query when in_parent_ids provided PASS Tests\Unit\Jobs\ProcessApiPreviewJobTest ✓ Job Instantiation → it can be instantiated with all required parame… 0.02s ✓ Handle Method - Success Cases → it saves processing status immediat… 0.03s ✓ SaveResult Method → it stores preview status in Redis with correct… 0.02s ✓ Failed Method → it has failed method for handling job failures 0.03s ✓ Queue Configuration → it dispatches to preview queue 0.02s ✓ Error Handling → it handles exception with proper structure 0.03s ✓ Integration with ApiNode → it creates ApiNode instance from object… 0.02s ✓ Preview ID Format → it handles preview IDs with correct format 0.02s ✓ Job Serialization → it can be serialized for queue storage 0.03s PASS Tests\Unit\Jobs\ProcessFlowPagePaginationTest ✓ ProcessFlowPage Token Type Detection → it identifies full URL token… 0.02s ✓ ProcessFlowPage Token Type Detection → it identifies relative URL t… 0.03s ✓ ProcessFlowPage Token Type Detection → it identifies simple tokens… 0.02s ✓ ProcessFlowPage URL Building → it builds URLs correctly for relativ… 0.03s ✓ ProcessFlowPage URL Building → it handles relative URL token constr… 0.02s ✓ ProcessFlowPage URL Building → it handles simple tokens correctly 0.03s ✓ ProcessFlowPage Pagination Configuration → it processes pagination… 0.02s ✓ ProcessFlowPage Pagination Configuration → it validates required pa… 0.02s ✓ ProcessFlowPage Error Handling → it extracts HTTP status codes from… 0.03s ✓ ProcessFlowPage Token Extraction → it extracts values from nested p… 0.02s ✓ ProcessFlowPage Walmart Integration Scenarios → it handles the exac… 0.03s ✓ ProcessFlowPage Query Parameter Deduplication → it deduplicates que… 0.02s ✓ ProcessFlowPage Query Parameter Deduplication → it handles URL with… 0.03s ✓ ProcessFlowPage Query Parameter Deduplication → it preserves URL wh… 0.02s PASS Tests\Unit\Jobs\ReindexTenantModelSearchTest ✓ ReindexTenantModelSearch → it ensures schema before indexing 0.03s PASS Tests\Unit\Jobs\TenantAwareMakeSearchableTest ✓ TenantAwareMakeSearchable → it sets tenant context before processin… 0.08s ✓ TenantAwareMakeSearchable → it extends MakeSearchable job correctly 0.08s ✓ TenantAwareMakeSearchable → it handles null tenant ID gracefully 0.08s FAIL Tests\Unit\Listeners\DerivedLinesGatingTest ✓ it does not create derived line waves before parent completion thre… 0.05s ⨯ it creates derived line waves once at 100% and is idempotent 0.06s WARN Tests\Unit\Listeners\ImportJobs\BatchJobCompletedListenerDerivedLinesTest - it enqueues derived TransactionLine batches with in_parent_ids afte… 0.03s FAIL Tests\Unit\Listeners\ImportJobs\BatchJobCompletedListenerTest ✓ it tracks batch completion in cache 0.07s ⨯ it handles multiple batches correctly PASS Tests\Unit\Livewire\RecordsIndexTest ✓ sublist query qualifies isparent and parent columns for projecttask… 0.02s ✓ main query qualifies isparent and parent columns for projecttask ne… 0.03s ✓ query with self-join does not produce ambiguous column error 0.02s ✓ applyRecordFieldJoins skips fields without content_type 0.03s PASS Tests\Unit\Logging\TenantContextProcessorTest ✓ TenantContextProcessor → it detects tenant context from database co… 0.02s ✓ TenantContextProcessor → it detects another tenant from database co… 0.03s ✓ TenantContextProcessor → it does not detect tenant when database is… 0.02s ✓ TenantContextProcessor → it does not detect tenant when database do… 0.03s ✓ TenantContextProcessor → it adds tenant_db to extra fields for tena… 0.02s ✓ TenantContextProcessor → it caches context detection across multipl… 0.02s PASS Tests\Unit\Logging\TenantLoggerTest ✓ TenantLogger → it creates logger instance with custom configuration 0.03s ✓ TenantLogger → it logger instance has DynamicTenantHandler attached 0.02s ✓ TenantLogger → it passes file permissions to handler from config 0.03s ✓ TenantLogger → it passes directory permissions to handler from conf… 0.02s ✓ DynamicTenantHandler → it determines correct log path for admin con… 0.03s ✓ DynamicTenantHandler → it determines correct log path for suitex co… 0.02s ✓ DynamicTenantHandler → it determines correct log path for tenant co… 0.03s ✓ DynamicTenantHandler → it returns system log path when no context 0.02s ✓ DynamicTenantHandler → it creates directories with specified permis… 0.02s ✓ DynamicTenantHandler → it creates log files with specified permissi… 0.03s FAIL Tests\Unit\Models\ProjectTaskBroadcastTest ⨯ ProjectTask Broadcast Suppression → it does not broadcast when impo… 0.03s ⨯ ProjectTask Broadcast Suppression → it does not broadcast when task… 0.04s ⨯ ProjectTask Broadcast Error Handling → it continues task update eve… 0.03s ✓ ProjectTask Import Flag Behavior → it getImportFlag returns false b… 0.05s ✓ ProjectTask Import Flag Behavior → it getImportFlag returns true wh… 0.03s ⨯ ProjectTask Import Flag Behavior → it import flag persists through… 0.04s FAIL Tests\Unit\Models\ProjectTaskPredecessorBroadcastTest ⨯ ProjectTaskPredecessor Broadcast Suppression → it does not broadcas… 0.03s ⨯ ProjectTaskPredecessor Broadcast Suppression → it does not broadcas… 0.04s ⨯ ProjectTaskPredecessor Broadcast Suppression → it does not broadcas… 0.03s ✓ ProjectTaskPredecessor Broadcast Error Handling → it continues oper… 0.03s FAIL Tests\Unit\Models\SubtaskBroadcastTest ⨯ Subtask Broadcast Suppression → it does not broadcast when subtask… 0.04s ✓ Subtask Broadcast Suppression → it does not broadcast when subtask… 0.03s ✓ Subtask Broadcast Error Handling → it continues subtask update even… 0.04s PASS Tests\Unit\Observers\FlowCompletedObserverOptimizationTest ✓ Throttled Cleanup Decision Logic → it enables throttled mode when t… 0.02s ✓ Throttled Cleanup Decision Logic → it enables throttled mode when R… 0.03s ✓ Throttled Cleanup Decision Logic → it enables throttled mode during… 0.02s ✓ Throttled Cleanup Decision Logic → it does not enable throttled mod… 0.03s ✓ Throttled Cleanup Decision Logic → it uses conservative approach wh… 0.02s ✓ Throttled Cleanup Decision Logic → it logs correct reason for throt… 0.03s ✓ Peak Hour Detection → it correctly identifies peak hours 0.02s ✓ Peak Hour Detection → it correctly identifies off-peak hours 0.03s ✓ Load Threshold Testing → it does not trigger at exactly 10 completi… 0.02s ✓ Load Threshold Testing → it triggers at 11 completions during off-p… 0.03s ✓ Load Threshold Testing → it does not trigger at exactly 500k Redis… 0.02s ✓ Load Threshold Testing → it triggers at 500k+1 Redis keys 0.03s ✓ Edge Cases → it handles empty completion lock array 0.02s ✓ Edge Cases → it handles Redis dbsize returning non-integer values 0.03s FAIL Tests\Unit\Providers\TenantBootstrapProviderTest ⨯ constructor → it initializes with tenant service ⨯ register → it registers services without errors ⨯ boot → it boots without errors in console mode ⨯ boot → it registers paramResource route macro ⨯ boot → it handles exceptions gracefully during boot ⨯ configureRequests → it does nothing when running in console ⨯ configureRequests → it configures tenant for valid subdomain ⨯ configureRequests → it skips configuration for admin subdomain ⨯ configureRequests → it skips configuration for app subdomain ⨯ configureRequests → it handles ModelNotFoundException gracefully ⨯ configureRequests → it skips configuration when no subdomain ⨯ configureQueue → it does not throw errors PASS Tests\Unit\Search\ModelSearchConfigurationTest ✓ Project model search configuration → it has required searchable fie… 0.07s ✓ Project model search configuration → it has required embedding fiel… 0.07s ✓ Project model search configuration → it has proper schema fields co… 0.07s ✓ Project model search configuration → it returns proper data types i… 0.06s ✓ Project model search configuration → it handles null values in toSe… 0.07s ✓ ProjectTask model search configuration → it has required searchable… 0.07s ✓ ProjectTask model search configuration → it has required embedding… 0.07s ✓ ProjectTask model search configuration → it has proper schema field… 0.08s ✓ ProjectTask model search configuration → it returns proper data typ… 0.07s ✓ ProjectTask model search configuration → it handles null values in… 0.06s PASS Tests\Unit\Search\ScoutConfigurationTest ✓ model settings configuration → it has configuration for all searcha… 0.08s ✓ model settings configuration → it validates Project model configura… 0.07s ✓ model settings configuration → it validates ProjectTask model confi… 0.06s ✓ model settings configuration → it ensures consistent embedding mode… 0.07s ✓ model settings configuration → it validates search parameters inclu… 0.07s ✓ client settings configuration → it has required client settings 0.07s ✓ client settings configuration → it validates node configuration 0.06s PASS Tests\Unit\Search\TenantSearchFieldRegistryTest ✓ it returns only enabled existing columns and preserves metadata 0.08s PASS Tests\Unit\Search\TenantSearchReindexSchedulerTest ✓ it debounces multiple schedules into a single job per tenant/model 0.03s FAIL Tests\Unit\Services\BatchUpsertSchemaValidationTest ⨯ Pre-validation Field Structure Checks → it detects inconsistent fie… 0.02s ⨯ Pre-validation Field Structure Checks → it handles valid batch with… 0.03s ⨯ ItemsBatchUpsertService Error Handling → it provides detailed error… 0.02s ✓ ItemsBatchUpsertService Error Handling → it ensures required NOT NU… 0.03s ✓ Large Batch Chunking → it handles large batches with automatic chun… 0.08s ⨯ Large Batch Chunking → it processes small batches without chunking 0.02s ✓ Enhanced Error Logging → it logs detailed field structure analysis… 0.03s "Fix 1 - Synced Field Handling Result:" // tests/Unit/Services/BulkUpsertFixVerificationTest.php:147 array:7 [ "success" => 1 "errors" => [] "strategy_used" => "single_chunk_success" "constraint_violations" => [] "chunks_processed" => 1 "chunks_failed" => 0 "total_records" => 1 ] // tests/Unit/Services/BulkUpsertFixVerificationTest.php:147 "Fix 2 - Salesrep Integer Field Handling Result:" // tests/Unit/Services/BulkUpsertFixVerificationTest.php:207 array:4 [ "success" => 3 "errors" => [] "strategy_used" => "individual_fallback" "batch_error" => "Received Mockery_23_App_Services_NetSuite_DataTransformationService::normalizeBatchFieldStructure(), but no expectations were specified" ] // tests/Unit/Services/BulkUpsertFixVerificationTest.php:207 "Fix 3 - Mixed Record Types Result:" // tests/Unit/Services/BulkUpsertFixVerificationTest.php:262 array:4 [ "success" => 2 "errors" => [] "strategy_used" => "individual_fallback" "batch_error" => "Received Mockery_23_App_Services_NetSuite_DataTransformationService::normalizeBatchFieldStructure(), but no expectations were specified" ] // tests/Unit/Services/BulkUpsertFixVerificationTest.php:262 "Total customers created:" // tests/Unit/Services/BulkUpsertFixVerificationTest.php:269 2 // tests/Unit/Services/BulkUpsertFixVerificationTest.php:269 "Customer refids:" // tests/Unit/Services/BulkUpsertFixVerificationTest.php:270 array:2 [ 0 => 77777 1 => 88888 ] // tests/Unit/Services/BulkUpsertFixVerificationTest.php:270 "Fix 4 - Unique Constraint Adjustment Result:" // tests/Unit/Services/BulkUpsertFixVerificationTest.php:351 array:7 [ "success" => 1 "errors" => [] "strategy_used" => "single_chunk_success" "constraint_violations" => [] "chunks_processed" => 1 "chunks_failed" => 0 "total_records" => 1 ] // tests/Unit/Services/BulkUpsertFixVerificationTest.php:351 "All customers with refid 99999:" // tests/Unit/Services/BulkUpsertFixVerificationTest.php:361 array:2 [ 0 => array:29 [ "id" => 1 "refid" => 99999 "synced" => false "external_id" => null "fields" => null "title" => null "companyname" => null "firstname" => "Manual" "lastname" => "Customer" "middlename" => null "isinactive" => false "emailtransactions" => false "giveaccess" => false "groupinvoices" => false "isbudgetapproved" => false "isperson" => false "salesrep" => 0 "subsidiary" => null "probability" => null "phone" => null "customerstatus" => null "email" => null "mobilephone" => null "altphone" => null "homephone" => null "tag" => null "created_by" => -1 "created_at" => "2025-12-16T16:02:17.000000Z" "updated_at" => "2025-12-16T16:02:17.000000Z" ] 1 => array:29 [ "id" => 2 "refid" => 99999 "synced" => true "external_id" => null "fields" => null "title" => null "companyname" => null "firstname" => "Imported" "lastname" => "Customer" "middlename" => null "isinactive" => false "emailtransactions" => false "giveaccess" => false "groupinvoices" => false "isbudgetapproved" => false "isperson" => false "salesrep" => 0 "subsidiary" => null "probability" => null "phone" => null "customerstatus" => null "email" => "imported@example.com" "mobilephone" => null "altphone" => null "homephone" => null "tag" => null "created_by" => -1 "created_at" => "2025-12-16T16:02:17.000000Z" "updated_at" => "2025-12-16T16:02:17.000000Z" ] ] // tests/Unit/Services/BulkUpsertFixVerificationTest.php:361 PASS Tests\Unit\Services\BulkUpsertFixVerificationTest ✓ Bulk Upsert Fix Verification → it verifies fix 1: correct synced fi… 0.03s ✓ Bulk Upsert Fix Verification → it verifies fix 2: salesrep integer… 0.04s ✓ Bulk Upsert Fix Verification → it verifies fix 3: comprehensive upd… 0.03s ✓ Bulk Upsert Fix Verification → it verifies fix 4: unique constraint… 0.04s FAIL Tests\Unit\Services\ChunkingIntegrationTest ⨯ Chunking Integration with Existing Services → it integrates chunkin… 0.44s ⨯ Chunking Integration with Existing Services → it handles chunking w… 0.10s ⨯ Chunking Integration with Existing Services → it maintains backward… 0.03s ⨯ Chunking Integration with Existing Services → it verifies chunking… 0.23s PASS Tests\Unit\Services\CleanupFlowDataServiceOptimizationTest ✓ Pattern-Based Configuration → it uses fast settings for commonly em… 0.02s ✓ Pattern-Based Configuration → it uses optimized settings for high-v… 0.03s ✓ Pattern-Based Configuration → it uses standard settings for regular… 0.02s ✓ Pattern-Based Configuration → it correctly identifies commonly empt… 0.03s ✓ Redis Health Assessment → it returns false when Redis memory usage… 0.02s ✓ Redis Health Assessment → it returns false when Redis key count is… 0.03s ✓ Redis Health Assessment → it returns true when Redis is healthy 0.02s ✓ Redis Health Assessment → it returns false when Redis connection fa… 0.02s ✓ Redis Health Assessment → it handles missing memory info gracefully 0.03s ✓ Performance Metrics Tracking → it tracks and logs performance metri… 0.02s ✓ Performance Metrics Tracking → it logs warning when SCAN success ra… 0.03s ✓ Performance Metrics Tracking → it logs warning when cleanup takes t… 0.02s ✓ Performance Metrics Tracking → it handles missing metrics gracefull… 0.03s ✓ Throttled Cleanup Mode → it calls cleanup with throttled mode param… 0.02s ✓ Throttled Cleanup Mode → it logs throttled mode activation 9.02s ✓ Edge Cases and Error Handling → it handles division by zero in metr… 0.03s ✓ Edge Cases and Error Handling → it handles negative elapsed time gr… 0.02s ✓ Edge Cases and Error Handling → it validates pattern matching with… 0.03s PASS Tests\Unit\Services\CleanupFlowDataServiceTest ✓ it cleans up Redis keys when Redis is available 0.02s ✓ it handles Redis unavailability gracefully 0.03s ✓ it handles Redis keys operations correctly 0.02s FAIL Tests\Unit\Services\CustomerBatchUpsertLogicCoverageTest ⨯ batch service covers create customer logic ⨯ batch service covers update customer logic ⨯ performance metrics are comprehensive ⨯ caching reduces repeated operations ⨯ exception handling is comprehensive PASS Tests\Unit\Services\DataTransformationBatchNormalizationTest ✓ DataTransformationService - Batch Field Normalization → it handles… 0.02s ✓ DataTransformationService - Batch Field Normalization → it handles… 0.03s ✓ DataTransformationService - Batch Field Normalization → it normaliz… 0.02s ✓ DataTransformationService - Batch Field Normalization → it applies… 0.03s ✓ DataTransformationService - Batch Field Normalization → it handles… 0.02s ✓ DataTransformationService - Batch Field Normalization → it handles… 0.02s ✓ DataTransformationService - Batch Field Normalization → it handles… 0.03s ✓ DataTransformationService - Batch Field Normalization → it handles… 0.02s ✓ DataTransformationService - Batch Field Normalization → it handles… 0.03s ✓ DataTransformationService - Batch Field Normalization → it skips no… 0.02s ✓ DataTransformationService - Batch Field Normalization → it logs app… 0.03s ✓ DataTransformationService - Batch Field Normalization → it handles… 0.02s "Field Mapping Preservation Test Result:" // tests/Unit/Services/FieldMappingCorruptionFixTest.php:110 array:4 [ "success" => 0 "errors" => array:1 [ 0 => array:3 [ "record_index" => 0 "error" => "Validation failed: The title field is required. [company customer]" "record_id" => "99999" ] ] "strategy_used" => "validation_failed" "performance_metrics" => array:6 [ "job_id" => "test-field-mapping" "batch_number" => 1 "record_count" => 1 "start_time" => 1765900948.2827 "phases" => array:2 [ "cache_initialization" => array:2 [ "duration_ms" => 0.19 "timestamp" => "16:02:28.282935" ] "bulk_preprocessing" => array:2 [ "duration_ms" => 0.77 "timestamp" => "16:02:28.283724" ] ] "field_mapping_issues" => array:1 [ 0 => array:2 [ "record_index" => 0 "issues" => array:1 [ 0 => "refid mapped to non-numeric value: string" ] ] ] ] ] // tests/Unit/Services/FieldMappingCorruptionFixTest.php:110 "Mixed Records Field Mapping Result:" // tests/Unit/Services/FieldMappingCorruptionFixTest.php:220 array:4 [ "success" => 0 "errors" => array:2 [ 0 => array:3 [ "record_index" => 0 "error" => "Validation failed: The title field is required. [person customer]" "record_id" => "111111" ] 1 => array:3 [ "record_index" => 1 "error" => "Validation failed: The title field is required. [company customer]" "record_id" => "222222" ] ] "strategy_used" => "validation_failed" "performance_metrics" => array:6 [ "job_id" => "test-mixed-records" "batch_number" => 1 "record_count" => 2 "start_time" => 1765900948.344 "phases" => array:2 [ "cache_initialization" => array:2 [ "duration_ms" => 0.18 "timestamp" => "16:02:28.344201" ] "bulk_preprocessing" => array:2 [ "duration_ms" => 1.2 "timestamp" => "16:02:28.345415" ] ] "field_mapping_issues" => array:2 [ 0 => array:2 [ "record_index" => 0 "issues" => array:1 [ 0 => "refid mapped to non-numeric value: string" ] ] 1 => array:2 [ "record_index" => 1 "issues" => array:1 [ 0 => "refid mapped to non-numeric value: string" ] ] ] ] ] // tests/Unit/Services/FieldMappingCorruptionFixTest.php:220 FAIL Tests\Unit\Services\FieldMappingCorruptionFixTest ⨯ Field Mapping Corruption Fix Verification → it verifies fix for fie… 0.04s ⨯ Field Mapping Corruption Fix Verification → it detects and logs fie… 0.03s ⨯ Field Mapping Corruption Fix Verification → it verifies field mappi… 0.03s ⨯ Field Mapping Corruption Fix Verification → it tests edge case fiel… 0.04s ⨯ Field Mapping Corruption Fix Verification → it verifies transformat… 0.03s PASS Tests\Unit\Services\ImportJobs\DependencyResolverTest ✓ it builds dependency graph correctly 0.06s ✓ it skips TransactionLine as dependency for transaction parents (par… 0.04s ✓ it throws exception on circular dependencies 0.05s ✓ it builds correct execution order 0.04s ✓ it identifies main record types correctly 0.06s ✓ it validates dependencies are completed 0.06s ✓ it handles missing record types gracefully 0.07s ✓ it handles custom integration mappings 0.05s ✓ it validates graph for disconnected components 0.06s ✓ it creates job dependencies correctly 0.05s ✓ it updates dependency progress correctly 0.07s ✓ it checks job dependencies completion correctly 0.05s ✓ it handles dependency failures correctly 0.06s ✓ it gets ready record types correctly 0.06s ✓ it gets overall job status correctly 0.07s PASS Tests\Unit\Services\ImportJobs\JobCancellationServiceTest ✓ JobCancellationService → it requests cancellation correctly 0.03s ✓ JobCancellationService → it detects cancelled jobs correctly 0.04s ✓ JobCancellationService → it handles grace period correctly 0.03s ✓ JobCancellationService → it updates batch status correctly 0.04s ✓ JobCancellationService → it completes cancellation correctly 0.03s ✓ JobCancellationService → it gets cancellation status correctly 0.04s ✓ JobCancellationService → it clears cancellation info correctly 0.03s ✓ JobCancellationService → it preserves completed and failed jobs dur… 0.04s PASS Tests\Unit\Services\ImportJobs\JobHealthMonitoringServiceTest ✓ JobHealthMonitoringService → it detects high error rate correctly 0.03s ✓ JobHealthMonitoringService → it detects slow batches correctly 0.04s ✓ JobHealthMonitoringService → it detects stalled jobs correctly 0.03s ✓ JobHealthMonitoringService → it detects high memory usage correctly 0.04s ✓ JobHealthMonitoringService → it detects connection issues correctly 0.03s ✓ JobHealthMonitoringService → it detects retry limit exceeded correc… 0.04s ✓ JobHealthMonitoringService → it throttles alerts correctly 0.03s ✓ JobHealthMonitoringService → it maintains memory reading history co… 0.04s ✓ JobHealthMonitoringService → it reports healthy status when no issu… 0.03s PASS Tests\Unit\Services\ImportJobs\JobStatusTrackingServiceTest ✓ JobStatusTrackingService → it initializes job status correctly 0.04s ✓ JobStatusTrackingService → it updates record type progress correctl… 0.02s ✓ JobStatusTrackingService → it handles errors in progress updates 0.04s ✓ JobStatusTrackingService → it gets job progress correctly 0.03s ✓ JobStatusTrackingService → it marks record type as completed correc… 0.04s ✓ JobStatusTrackingService → it marks record type as failed correctly 0.03s ✓ JobStatusTrackingService → it determines job stage correctly 0.04s ✓ JobStatusTrackingService → it clears job status correctly 0.02s ✓ JobStatusTrackingService → it handles missing job status gracefully 0.02s PASS Tests\Unit\Services\ImportJobs\SingleActiveWaveGuardTest ✓ it prevents dispatch when another wave is processing 0.04s PASS Tests\Unit\Services\ImportJobs\WaveCoordinatorDerivedTest ✓ WaveCoordinator Derived Wave Handling → it does not complete job wh… 0.05s ✓ WaveCoordinator Derived Wave Handling → it dispatches derived wave… 0.05s ✓ WaveCoordinator Derived Wave Handling → it completes job only after… 0.03s ✓ WaveCoordinator Derived Wave Handling → it checks and dispatches de… 0.04s ✓ WaveCoordinator Derived Wave Handling → it returns no_derived_waves… 0.03s ✓ WaveCoordinator Derived Wave Handling → it returns derived_not_read… 0.04s ✓ WaveCoordinator Derived Wave Handling → it handles derived wave com… 0.02s PASS Tests\Unit\Services\ImportJobs\WaveCoordinatorFailureTest ✓ WaveCoordinator Failure Handling → it categorizes errors correctly 0.04s ✓ WaveCoordinator Failure Handling → it determines retry logic correc… 0.03s ✓ WaveCoordinator Failure Handling → it calculates retry delays corre… 0.03s ✓ WaveCoordinator Failure Handling → it gets failure summary correctl… 0.05s PASS Tests\Unit\Services\ImportJobs\WaveCoordinatorSimpleTest ✓ Configuration Loading → it loads wave size from configuration 0.02s ✓ Configuration Loading → it loads completion threshold from configur… 0.03s ✓ Configuration Loading → it uses default values when configuration i… 0.02s ✓ Wave Progress Calculation → it calculates progress correctly for va… 0.03s ✓ Wave Progress Calculation → it handles edge cases in progress calcu… 0.03s ✓ Wave Structure Logic → it validates batch data structure 0.06s ✓ Wave Structure Logic → it validates wave coordination structure 0.03s ✓ Dependency Level Logic → it validates dependency level processing 0.03s ✓ Dependency Level Logic → it validates wave size constraint logic 0.04s ✓ Error Handling Logic → it validates error response structure 0.03s ✓ Integration with Configuration → it respects wave configuration cha… 0.04s PASS Tests\Unit\Services\ImportJobs\WaveCoordinatorTest ✓ Wave Status Tracking → it verifies database tables are created corr… 0.03s ✓ Wave Status Tracking → it can dispatch a wave and update database c… 0.03s ✓ Wave Status Tracking → it can check if next wave is available 0.04s ✓ Wave Status Tracking → it calculates wave completion progress corre… 0.02s ✓ Wave Status Tracking → it detects wave completion at 90% threshold 0.04s ✓ Wave Status Tracking → it handles missing wave gracefully 0.02s ✓ Wave Status Tracking → it can create basic wave structure 0.02s ✓ Configuration → it respects configured wave size 0.02s ✓ Configuration → it respects configured completion threshold 0.04s FAIL Tests\Unit\Services\ImportJobs\WaveCoordinatorTransactionLineInjectionTest ⨯ it injects in_parent_ids into TransactionLine job payloads from cac… 0.03s PASS Tests\Unit\Services\ImportJobs\WaveFailureHandlerTest ✓ Enhanced Error Analysis → it categorizes API rate limit errors corr… 0.03s ✓ Enhanced Error Analysis → it categorizes database constraint errors… 0.02s ✓ Enhanced Error Analysis → it handles permanent errors correctly 0.03s ✓ Retry Strategy Selection → it selects exponential backoff for rate… 0.02s ✓ Retry Strategy Selection → it selects linear increase for timeout e… 0.03s ✓ Retry Exhaustion Handling → it marks batch as failed when retries a… 0.02s ✓ Fallback Handling → it handles missing batch gracefully 0.02s ✓ Fallback Handling → it logs error handling activities 0.03s ✓ Configuration Loading → it initializes with default error patterns 0.02s PASS Tests\Unit\Services\ImportJobs\WaveMonitoringServiceTest ✓ Health Metrics Collection → it collects basic wave statistics 0.03s ✓ Health Metrics Collection → it calculates batch success rates corre… 0.02s ✓ Health Metrics Collection → it analyzes error breakdown by category 0.03s ✓ Alert Condition Detection → it detects high failure rate alerts 0.02s ✓ Alert Condition Detection → it detects stuck waves condition 0.03s ✓ Dependency Health Analysis → it calculates dependency level health… 0.02s ✓ Overall Health Calculation → it returns healthy status for good met… 0.02s ✓ Overall Health Calculation → it returns critical status for poor me… 0.04s ✓ Cache Integration → it updates monitoring cache with health data 0.02s ✓ Cache Integration → it retrieves cached monitoring data 0.04s ✓ Health Report Generation → it generates comprehensive health report 0.02s ✓ Health Report Generation → it provides recommendations based on hea… 0.04s ✓ Error Handling → it handles monitoring errors gracefully 0.02s WARN Tests\Unit\Services\InvoiceBatchUpsertServiceTest ✓ Basic Functionality → it can be instantiated 0.04s ✓ Basic Functionality → it has correct table configuration 0.02s ✓ Field Mapping → it maps NetSuite fields to local database fields co… 0.04s ✓ Field Mapping → it handles case-insensitive field mapping 0.02s ✓ Validation and Normalization → it normalizes reference fields corre… 0.03s ✓ Validation and Normalization → it normalizes date fields correctly 0.02s ✓ Record Processing → it processes bulk validation correctly 0.02s ✓ Record Processing → it normalizes invoice record correctly 0.03s ✓ Record Processing → it generates title when tranid is missing 0.02s ! Error Handling → it logs appropriate messages during processing → T… 0.03s PASS Tests\Unit\Services\Ipaas\Connectors\SnowflakeServiceTest ✓ synchronous responses are returned as-is without polling 0.04s ✓ async response without statementStatusUrl returns error 0.02s ✓ async response triggers polling and returns result on HTTP 200 0.03s ✓ polling waits for HTTP 202 then returns result on HTTP 200 10.02s ✓ polling returns structured error on HTTP 422 0.02s ✓ polling retries on HTTP 5xx errors up to max retries 14.04s ✓ polling handles HTTP 429 rate limiting gracefully 10.03s ✓ isAsyncResponse correctly identifies async responses 0.03s ✓ ensureAcceptJson adds Accept header when missing 0.02s ✓ formatResponse transforms Snowflake data correctly 0.03s ✓ polling extracts statementHandle correctly from URL with query para… 0.02s PASS Tests\Unit\Services\Ipaas\Pagination\AbstractPaginationHandlerTest ✓ AbstractPaginationHandler → it supports configured types 0.03s ✓ AbstractPaginationHandler → it returns supported types 0.02s ✓ AbstractPaginationHandler → it calls implementation when getting ne… 0.03s ✓ AbstractPaginationHandler → it returns null when config invalid 0.02s ✓ AbstractPaginationHandler → it handles exceptions gracefully 0.03s ✓ AbstractPaginationHandler → it extracts value from path 0.02s ✓ AbstractPaginationHandler → it returns default when path not found 0.03s ✓ AbstractPaginationHandler → it updates node config 0.02s ✓ AbstractPaginationHandler → it updates node config when empty 0.02s ✓ AbstractPaginationHandler → it validates config successfully 0.03s ✓ AbstractPaginationHandler → it fails validation for empty paginatio… 0.02s ✓ AbstractPaginationHandler → it fails validation for missing paginat… 0.03s ✓ AbstractPaginationHandler → it can be extended with custom validati… 0.02s PASS Tests\Unit\Services\Ipaas\Pagination\Handlers\GenericOffsetHandlerTest ✓ GenericOffsetHandler → it supports generic pagination type 0.03s ✓ GenericOffsetHandler → it returns correct supported types 0.02s ✓ GenericOffsetHandler → it returns null when current count is invali… 0.03s ✓ GenericOffsetHandler → it returns null when current offset is inval… 0.02s ✓ GenericOffsetHandler → it returns null when total count is reached 0.03s ✓ GenericOffsetHandler → it validates configuration correctly 0.02s ✓ GenericOffsetHandler → it extracts nested field values correctly 0.02s ✓ GenericOffsetHandler → it handles missing nested fields gracefully 0.04s ✓ GenericOffsetHandler → it returns null when count is zero 0.02s PASS Tests\Unit\Services\Ipaas\Pagination\Handlers\GraphQLCursorHandlerTest ✓ GraphQLCursorHandler → it supports graphql pagination type 0.03s ✓ GraphQLCursorHandler → it returns correct supported types 0.02s ✓ GraphQLCursorHandler → it returns null when hasNextPage is false 0.03s ✓ GraphQLCursorHandler → it returns null when cursor is empty 0.02s ✓ GraphQLCursorHandler → it returns null when GraphQL query is empty 0.03s ✓ GraphQLCursorHandler → it validates configuration requires hasNextP… 0.02s ✓ GraphQLCursorHandler → it validates configuration requires nextPage… 0.02s ✓ GraphQLCursorHandler → it accepts valid configuration 0.03s ✓ GraphQLCursorHandler → it extracts hasNextPage boolean correctly 0.02s ✓ GraphQLCursorHandler → it extracts cursor from nested path correctl… 0.03s ✓ GraphQLCursorHandler → it handles missing hasNextPage path 0.02s ✓ GraphQLCursorHandler → it can detect pagination parameter in query 0.03s ✓ GraphQLCursorHandler → it returns null when no pagination parameter… 0.02s ✓ GraphQLCursorHandler → it can update pagination parameter in query… 0.02s ✓ GraphQLCursorHandler → it can add pagination parameter to empty par… 0.03s ✓ GraphQLCursorHandler → it can add pagination parameter to existing… 0.02s ✓ GraphQLCursorHandler Query Updates → it can be instantiated without… 0.03s ✓ GraphQLCursorHandler Query Updates → it handles queries when pagina… 0.03s ✓ GraphQLCursorHandler Query Updates → it updates GraphQL query with… 0.03s PASS Tests\Unit\Services\Ipaas\Pagination\Handlers\KeysetPaginationHandlerTest ✓ KeysetPaginationHandler → it supports keyset pagination types 0.03s ✓ KeysetPaginationHandler → it returns correct supported types 0.02s ✓ KeysetPaginationHandler → it returns null when no records in payloa… 0.02s ✓ KeysetPaginationHandler → it returns null when key field value cann… 0.03s ✓ KeysetPaginationHandler → it validates configuration requires keyFi… 0.02s ✓ KeysetPaginationHandler → it validates configuration requires limit 0.03s ✓ KeysetPaginationHandler → it validates configuration requires posit… 0.02s ✓ KeysetPaginationHandler → it validates orderDirection must be ASC o… 0.03s ✓ KeysetPaginationHandler → it accepts valid configuration 0.02s ✓ KeysetPaginationHandler → it accepts DESC order direction 0.03s ✓ KeysetPaginationHandler → it accepts configuration without order di… 0.02s ✓ KeysetPaginationHandler → it can extract nested key field values 0.02s ✓ KeysetPaginationHandler orderDirection Configuration → it uses ASC… 0.03s ✓ KeysetPaginationHandler orderDirection Configuration → it uses DESC… 0.02s ✓ KeysetPaginationHandler orderDirection Configuration → it defaults… 0.03s ✓ KeysetPaginationHandler orderDirection Configuration → it handles l… 0.02s PASS Tests\Unit\Services\Ipaas\Pagination\Handlers\NextPageTokenHandlerTest ✓ NextPageTokenHandler → it supports next_page_token pagination type 0.03s ✓ NextPageTokenHandler → it returns correct supported types 0.02s ✓ NextPageTokenHandler → it returns null when token is empty 0.03s ✓ NextPageTokenHandler → it returns null when token is null 0.02s ✓ NextPageTokenHandler → it returns null when token path does not exi… 0.03s ✓ NextPageTokenHandler → it validates configuration correctly 0.02s ✓ NextPageTokenHandler → it extracts token from nested paths correctl… 0.02s ✓ NextPageTokenHandler → it handles simple token path 0.03s ✓ NextPageTokenHandler → it returns null for missing nested token pat… 0.02s PASS Tests\Unit\Services\Ipaas\Pagination\Handlers\PartitionBasedHandlerTest ✓ PartitionBasedHandler → it supports snowflake_partition pagination… 0.03s ✓ PartitionBasedHandler → it returns correct supported types 0.02s ✓ PartitionBasedHandler → it returns null when statement handle is mi… 0.04s ✓ PartitionBasedHandler → it returns null when partition info is miss… 0.02s ✓ PartitionBasedHandler → it returns null when partition info is empt… 0.03s ✓ PartitionBasedHandler → it validates configuration requires stateme… 0.02s ✓ PartitionBasedHandler → it validates configuration requires partiti… 0.02s ✓ PartitionBasedHandler → it accepts valid configuration 0.03s ✓ PartitionBasedHandler → it extracts statement handle from nested pa… 0.02s ✓ PartitionBasedHandler → it extracts partition info array correctly 0.03s ✓ PartitionBasedHandler → it returns empty array for missing partitio… 0.02s ✓ PartitionBasedHandler → it tracks current partition index per flow/… 0.03s ✓ PartitionBasedHandler → it can reset partition index per flow/node/… 0.02s ✓ PartitionBasedHandler State Isolation → it maintains separate parti… 0.02s ✓ PartitionBasedHandler State Isolation → it maintains separate parti… 0.03s ✓ PartitionBasedHandler State Isolation → it maintains separate parti… 0.02s ✓ PartitionBasedHandler State Isolation → it resets partition state c… 0.03s ✓ PartitionBasedHandler State Isolation → it handles null runId by us… 0.02s ✓ PartitionBasedHandler State Isolation → it processes pagination wit… 0.03s ✓ PartitionBasedHandler State Isolation → it clears state when pagina… 0.02s ✓ PartitionBasedHandler State Isolation → it clears state when no par… 0.03s ✓ PartitionBasedHandler Concurrency → it handles concurrent flow exec… 0.02s WARN Tests\Unit\Services\Ipaas\Pagination\PaginationHandlerRegistryTest ✓ PaginationHandlerRegistry → it registers a handler 0.03s ✓ PaginationHandlerRegistry → it registers handler for multiple types 0.02s ✓ PaginationHandlerRegistry → it resolves registered handler 0.03s ✓ PaginationHandlerRegistry → it boots registry automatically when re… 0.02s ✓ PaginationHandlerRegistry → it only boots once 0.03s - PaginationHandlerRegistry → it throws exception when no handler fou… 0.02s ✓ PaginationHandlerRegistry → it falls back to generic handler when s… 0.02s ✓ PaginationHandlerRegistry → it checks if handler exists 0.03s ✓ PaginationHandlerRegistry → it gets registered types 0.02s ✓ PaginationHandlerRegistry → it gets all handlers 0.03s ✓ PaginationHandlerRegistry → it clears all handlers 0.02s ✓ PaginationHandlerRegistry → it resets registry 0.03s ✓ PaginationHandlerRegistry → it overwrites handler when same type re… 0.02s PASS Tests\Unit\Services\Ipaas\Pagination\Traits\ExtractsNestedValuesTest ✓ it extracts simple value with (Closure) 0.03s ✓ it extracts nested value with (Closure) 0.02s ✓ it extracts array element by index with (Closure) 0.03s ✓ it returns default for non existent path with (Closure) 0.02s ✓ it extracts multiple values with (Closure) 0.02s ✓ it checks if path exists with (Closure) 0.03s ✓ it extracts typed string value 0.02s ✓ it extracts typed int value 0.03s ✓ it extracts typed float value 0.02s ✓ it extracts typed bool value 0.03s ✓ it extracts typed array value 0.02s ✓ it returns default for wrong type 0.02s ✓ it sets value in nested structure 0.03s ✓ it creates nested structure when setting value 0.02s ✓ it extracts array with (Closure) 0.03s ✓ it returns empty array for non array value 0.02s ✓ it counts items in nested array with (Closure) 0.03s ✓ it checks if nested array is empty 0.02s ✓ it handles object notation 0.02s ✓ it handles mixed array and object 0.03s ✓ it extracts deeply nested value 0.02s ✓ it handles null values in path 0.03s PASS Tests\Unit\Services\Ipaas\Pagination\Traits\ManipulatesSqlQueriesTest ✓ it adds where clause to query without existing where 0.02s ✓ it adds where clause to query with existing where 0.03s ✓ it sets limit clause 0.02s ✓ it replaces existing limit clause 0.03s ✓ it sets offset clause 0.02s ✓ it replaces existing offset clause 0.03s ✓ it sets order by clause 0.02s ✓ it replaces existing order by clause 0.02s ✓ it escapes string values 0.03s ✓ it escapes numeric values 0.02s ✓ it escapes null values 0.03s ✓ it escapes boolean values 0.02s ✓ it removes pagination clauses 0.03s ✓ it builds keyset where clause single field ascending 0.02s ✓ it builds keyset where clause single field descending 0.02s ✓ it builds keyset where clause multiple fields 0.03s ✓ it handles query with trailing semicolon 0.02s ✓ it builds complex paginated query 0.03s PASS Tests\Unit\Services\Ipaas\Pagination\Traits\ManipulatesUrlParametersTest ✓ it updates request params 0.02s ✓ it adds new params to empty array 0.03s ✓ it deduplicates params 0.02s ✓ it builds query string 0.03s ✓ it builds query string with special characters 0.02s ✓ it parses query string 0.03s ✓ it parses empty query string 0.02s ✓ it gets param value 0.02s ✓ it removes param 0.03s ✓ it merges params 0.02s ✓ it converts params to key value array 0.03s ✓ it handles params without value 0.02s ✓ it builds empty query string for empty params 0.03s ✓ it handles numeric param values 0.02s FAIL Tests\Unit\Services\Ipaas\ThrottleManagerTest ✓ ThrottleManager - Retry Logic → it executes successful request with… 0.03s ✓ ThrottleManager - Retry Logic → it retries on 429 error with expone… 2.66s ✓ ThrottleManager - Retry Logic → it retries on 5xx errors 2.94s ✓ ThrottleManager - Retry Logic → it retries on network timeout excep… 2.63s ✓ ThrottleManager - Retry Logic → it retries on cURL errors 1.02s ✓ ThrottleManager - Retry Logic → it exhausts retries and returns las… 6.61s ✓ ThrottleManager - Retry Logic → it exhausts retries and throws exce… 8.24s ✓ ThrottleManager - Retry Logic → it does not retry on 4xx client err… 0.03s ✓ ThrottleManager - Retry Logic → it does not retry on non-network ex… 0.02s ✓ ThrottleManager - Throttling with Retry → it enforces throttle limi… 3.31s ✓ ThrottleManager - Throttling with Retry → it waits for throttle slo… 0.54s ✓ ThrottleManager - Throttling with Retry → it times out after 60 se… 60.12s ✓ ThrottleManager - Throttling with Retry → it skips throttle checks… 0.03s ✓ ThrottleManager - Edge Cases → it handles string responses as non-s… 0.02s ✓ ThrottleManager - Edge Cases → it handles null responses gracefully 0.03s ✓ ThrottleManager - Edge Cases → it handles responses without httpSta… 0.02s ✓ ThrottleManager - Edge Cases → it logs all retry attempts with conn… 2.87s ⨯ ThrottleManager - Edge Cases → it handles Redis exceptions graceful… 0.02s WARN Tests\Unit\Services\ItemFulfillmentBatchUpsertServiceTest ✓ Basic Functionality → it can be instantiated 0.03s ✓ Basic Functionality → it has correct table configuration 0.02s ✓ Field Mapping → it maps NetSuite fields to local database fields co… 0.03s ✓ Field Mapping → it handles case-insensitive field mapping 0.02s ✓ Validation and Normalization → it normalizes reference fields corre… 0.03s ✓ Validation and Normalization → it normalizes boolean fields correct… 0.03s ✓ Validation and Normalization → it normalizes date fields correctly 0.02s ✓ Validation and Normalization → it normalizes fulfillment status cor… 0.03s ✓ Validation and Normalization → it normalizes ship status correctly 0.02s ✓ Record Processing → it processes bulk validation correctly 0.03s ✓ Record Processing → it normalizes item fulfillment record correctly 0.02s ✓ Record Processing → it generates title when tranid is missing 0.02s ✓ Integration Tests → it handles complete item fulfillment batch proc… 0.03s ✓ Integration Tests → it handles batch upsert with duplicate external… 0.02s ✓ Error Handling → it handles individual processing fallback when bat… 0.03s ! Error Handling → it logs appropriate messages during processing → T… 0.02s PASS Tests\Unit\Services\LocalStorageServiceTest ✓ scanDirectory → it scans directory and returns file metadata 0.03s ✓ scanDirectory → it filters files older than specified hours 0.02s ✓ scanDirectory → it respects safety window 0.03s ✓ scanDirectory → it skips symlinks by default 0.02s ✓ scanDirectory → it skips locked files 0.03s ✓ scanDirectory → it scans recursively when enabled 0.02s ✓ scanDirectory → it respects max_files limit 0.04s ✓ scanDirectory → it handles empty directory 0.02s ✓ scanDirectory → it handles non-existent directory 0.03s ✓ deleteFiles → it deletes files and returns statistics 0.03s ✓ deleteFiles → it respects dry-run mode 0.02s ✓ deleteFiles → it handles deletion errors gracefully 0.03s ✓ deleteFiles → it processes files in batches 0.22s ✓ getDirectorySize → it calculates directory size recursively 0.03s ✓ getDirectorySize → it returns 0 for empty directory 0.02s ✓ getDirectorySize → it returns 0 for non-existent directory 0.02s ✓ countFiles → it counts files recursively 0.03s ✓ countFiles → it returns 0 for empty directory 0.02s ✓ countFiles → it returns 0 for non-existent directory 0.03s ✓ cleanEmptyDirectories → it removes empty subdirectories 0.02s ✓ cleanEmptyDirectories → it preserves directories with files 0.03s ✓ cleanEmptyDirectories → it does not remove root directory 0.02s ✓ cleanEmptyDirectories → it returns 0 for non-existent directory 0.02s ✓ formatBytes → it formats bytes correctly 0.03s ✓ formatBytes → it handles negative values 0.02s ✓ getPathStatistics → it returns comprehensive statistics 0.03s ✓ getPathStatistics → it handles empty directory 0.02s ✓ ensureDirectoryExists → it creates directory if it does not exist 0.03s ✓ ensureDirectoryExists → it does not fail if directory already exist… 0.02s ✓ ensureDirectoryExists → it creates nested directories 0.02s FAIL Tests\Unit\Services\NetSuite\CanonicalIdExtractorTest ✓ CanonicalIdExtractor - TransactionLine → it prefers line_uniquekey… 0.04s ⨯ CanonicalIdExtractor - TransactionLine → it falls back to line_id w… 0.02s ⨯ CanonicalIdExtractor - TransactionLine → it falls back to id_* suff… 0.03s ⨯ CanonicalIdExtractor - Item/ServiceItem → it prefers item_external_… 0.02s ✓ CanonicalIdExtractor - Item/ServiceItem → it falls back to string(i… 0.03s FAIL Tests\Unit\Services\NetSuite\UnifiedQueryBuilderTest ✓ UnifiedQueryBuilder Core Functionality → it instantiates correctly… 0.04s ⨯ UnifiedQueryBuilder Field Probing → it succeeds when all fields are… 0.02s ⨯ UnifiedQueryBuilder Field Probing → it falls back to required field… 0.02s ⨯ UnifiedQueryBuilder Field Probing → it probes fields individually w… 0.03s ⨯ UnifiedQueryBuilder Field Probing → it falls back to SELECT * when… 0.02s ⨯ UnifiedQueryBuilder Caching → it caches probing results in Redis 0.03s ⨯ UnifiedQueryBuilder Caching → it clears cache when requested 0.02s ⨯ UnifiedQueryBuilder Options → it skips probing when skipProbing opt… 0.03s ⨯ UnifiedQueryBuilder Options → it builds TransactionLine parent-firs… 0.02s FAIL Tests\Unit\Services\QueryProcessingServiceTest ⨯ processes basic date formats ⨯ processes iso8601 formats ⨯ processes add date operations ⨯ processes last run date placeholders ⨯ handles edge cases and errors ⨯ handles mixed formats in single query ⨯ preserves quoted strings and other content ⨯ handles various date formats comprehensive ⨯ handles individual date format components ⨯ handles iso8601 with different timezones ⨯ handles complex date arithmetic ⨯ handles empty and null inputs gracefully ⨯ handles iso8601z format with Z timezone ⨯ handles negative intervals for subtracting days with LASTRUNDATE ⨯ handles negative intervals for subtracting days with TIMESTAMP ⨯ handles negative intervals for subtracting hours with TIMESTAMP_UTC ⨯ handles mixed positive and negative intervals in same query FAIL Tests\Unit\Services\QueryProcessingServiceTimestampTest ⨯ TIMESTAMP Variable Support in QueryProcessingService → it processes basic TIMESTAMP formatDate operations ⨯ TIMESTAMP Variable Support in QueryProcessingService → it processes TIMESTAMP ISO8601 formats ⨯ TIMESTAMP Variable Support in QueryProcessingService → it processes TIMESTAMP addDate operations ⨯ TIMESTAMP Variable Support in QueryProcessingService → it processes standalone TIMESTAMP placeholders ⨯ TIMESTAMP_UTC Variable Support in QueryProcessingService → it processes basic TIMESTAMP_UTC formatDate operations ⨯ TIMESTAMP_UTC Variable Support in QueryProcessingService → it processes TIMESTAMP_UTC addDate operations ⨯ TIMESTAMP_UTC Variable Support in QueryProcessingService → it processes standalone TIMESTAMP_UTC placeholders ⨯ Mixed Variable Support Tests → it handles mixed LASTRUNDATE, TIMESTAMP, and TIMESTAMP_UTC in single query ⨯ Mixed Variable Support Tests → it handles error cases gracefully PASS Tests\Unit\Services\RecordUpsertBatchNormalizationIntegrationTest ✓ RecordUpsertService - Batch Normalization Integration → it successf… 0.02s ✓ RecordUpsertService - Batch Normalization Integration → it logs app… 0.03s ✓ RecordUpsertService - Batch Normalization Integration → it falls ba… 0.02s ✓ RecordUpsertService - Batch Normalization Integration → it handles… 0.03s ✓ RecordUpsertService - Batch Normalization Integration → it bypasses… 0.02s PASS Tests\Unit\Services\RecordUpsertChunkingTest ✓ Chunk Size Handling → it processes small batches (≤250 records) as… 0.04s ✓ Chunk Size Handling → it processes large batches (>250 records) in… 0.05s ✓ Chunk Size Handling → it handles custom chunk sizes correctly 0.03s ✓ Chunk Failure Handling → it falls back to individual processing whe… 0.04s ✓ Chunk Failure Handling → it handles mixed chunk success and failure 0.03s ✓ Chunk Failure Handling → it properly handles actual chunk failures… 0.04s ✓ Wide Table Testing → it handles records with many columns without M… 0.03s ✓ Error Logging Validation → it logs detailed information for success… 0.04s ✓ Error Logging Validation → it logs detailed error information for c… 0.02s ✓ Performance Validation → it maintains performance with chunked proc… 0.06s FAIL Tests\Unit\Services\SalesOrderBatchUpsertTest ⨯ SalesOrderBatchUpsertService → it successfully processes a batch of… 0.03s ✓ SalesOrderBatchUpsertService → it handles empty records gracefully 0.04s ⨯ SalesOrderBatchUpsertService → it normalizes boolean fields correct… 0.03s ✓ SalesOrderBatchUpsertService → it logs appropriate messages during… 0.04s ⨯ SalesOrderBatchUpsertService → it handles field mapping with case s… 0.03s PASS Tests\Unit\Services\SemanticSearchServiceTest ✓ semantic search functionality → it performs semantic search with pr… 0.08s ✓ semantic search functionality → it handles empty model classes by u… 0.08s ✓ semantic search functionality → it respects the limit parameter 0.07s ✓ hybrid search functionality → it performs hybrid search with config… 0.06s ✓ hybrid search functionality → it handles alpha values at boundaries 0.08s ✓ debug functionality → it provides debug information for semantic se… 0.11s ✓ error handling → it handles search errors gracefully 0.07s ✓ error handling → it handles empty search results 0.08s "Result details:" // tests/Unit/Services/TransactionLineBatchUpsertTest.php:123 array:7 [ "success" => 0 "errors" => array:2 [ 0 => array:6 [ "chunk_number" => 1 "record_id" => "index_0" "record_index" => 0 "error" => "Cannot perform upsert: none of the unique keys [refid] found in record data" "error_type" => "Exception" "model" => "Domain\TransactionLines\Models\TransactionLine" ] 1 => array:6 [ "chunk_number" => 1 "record_id" => "index_1" "record_index" => 1 "error" => "Cannot perform upsert: none of the unique keys [refid] found in record data" "error_type" => "Exception" "model" => "Domain\TransactionLines\Models\TransactionLine" ] ] "strategy_used" => "single_chunk_fallback" "constraint_violations" => [] "chunks_processed" => 1 "chunks_failed" => 1 "total_records" => 2 ] // tests/Unit/Services/TransactionLineBatchUpsertTest.php:123 FAIL Tests\Unit\Services\TransactionLineBatchUpsertTest ⨯ TransactionLineBatchUpsertService → it successfully processes a bat… 0.04s ✓ TransactionLineBatchUpsertService → it handles empty records gracef… 0.03s ⨯ TransactionLineBatchUpsertService → it normalizes boolean fields co… 0.04s ⨯ TransactionLineBatchUpsertService → it handles numeric field normal… 0.03s ✓ TransactionLineBatchUpsertService → it logs appropriate messages du… 0.03s ⨯ TransactionLineBatchUpsertService → it handles field mapping with c… 0.04s ⨯ TransactionLineBatchUpsertService → it handles complex transaction… 0.03s FAIL Tests\Unit\Traits\HasEncryptedFieldsTest ✓ ConnectorConfig Encryption → it encrypts sensitive fields automatic… 0.03s ✓ ConnectorConfig Encryption → it provides internal decryption method… 0.02s ✓ ConnectorConfig Encryption → it handles null and empty values corre… 0.03s ✓ Integration Encryption → it encrypts NetSuite credentials automatic… 0.02s ⨯ Invitation Token Encryption → it encrypts invitation tokens automat… 0.03s ✓ ApiNode SFTP Encryption → it moves SFTP credentials from request_co… 0.02s ✓ ApiNode SFTP Encryption → it provides SFTP credential decryption me… 0.02s ✓ Frontend Masking (NEW BEHAVIOR) → it masks sensitive fields when ac… 0.03s ✓ Frontend Masking (NEW BEHAVIOR) → it shows BLANK (empty) sensitive… 0.02s ✓ Frontend Masking (NEW BEHAVIOR) → it provides explicit decryption m… 0.03s ✓ Value Preservation on Edit → it preserves existing encrypted value… 0.02s ✓ Value Preservation on Edit → it overwrites existing value when new… 0.03s ✓ Value Preservation on Edit → it preserves value when null is passed… 0.02s ✓ Value Preservation on Edit → it encrypts value on creation even if… 0.02s ✓ Error Handling → it logs encryption errors without exposing sensiti… 0.03s ✓ Error Handling → it handles decryption failures gracefully 0.02s PASS Tests\Unit\Traits\HorizonTaggableTest ✓ HorizonTaggable Trait - Basic Functionality → it generates basic jo… 0.08s ✓ HorizonTaggable Trait - Basic Functionality → it handles non existe… 0.08s ✓ HorizonTaggable Trait - Tenant Database Format → it generates tags… 0.07s ✓ HorizonTaggable Trait - Tenant Database Format → it generates tags… 0.06s ✓ HorizonTaggable Trait - Tenant Database Format → it generates tags… 0.08s ✓ HorizonTaggable Trait - Tenant Database Format → it generates tags… 0.07s ✓ HorizonTaggable Trait - Instance Name Handling → it does not includ… 0.06s ✓ HorizonTaggable Trait - Instance Name Handling → it includes instan… 0.08s ✓ HorizonTaggable Trait - Account ID Handling → it includes account t… 0.07s ✓ HorizonTaggable Trait - Account ID Handling → it does not include a… 0.07s ✓ HorizonTaggable Trait - Caching & Performance → it caches tenant in… 0.06s ✓ HorizonTaggable Trait - Caching & Performance → it uses mysql conne… 0.08s ✓ HorizonTaggable Trait - Additional Tags → it merges additional tags… 0.07s ✓ HorizonTaggable Trait - Priority Rules → it prioritizes tenant data… 0.06s ✓ HorizonTaggable Trait - Domain Cleanup → it cleans domain tags prop… 0.08s PASS Tests\Unit\Traits\OAuthErrorHandlerTest ✓ OAuthErrorHandler Trait → it provides required methods 0.03s ✓ OAuthErrorHandler Trait → it correctly identifies OAuth error types 0.02s ✓ OAuthErrorHandler Trait → it correctly identifies expected vs unexp… 0.02s PASS Tests\Unit\Traits\UsesBufferedQueriesTest ✓ UsesBufferedQueries Trait → it executes queries successfully with b… 0.08s ✓ UsesBufferedQueries Trait → it handles nested queries without confl… 0.08s ✓ UsesBufferedQueries Trait → it handles queries in loop without conf… 0.10s ✓ UsesBufferedQueries Trait → it returns values from callback correct… 0.07s ✓ UsesBufferedQueries Trait → it detects SQLite driver correctly 0.08s ✓ UsesBufferedQueries Trait → it handles empty result sets 0.08s ✓ UsesBufferedQueries Trait → it handles exceptions inside buffered q… 0.07s ✓ UsesBufferedQueries Trait → it works with multiple consecutive call… 0.08s PASS Tests\Unit\Traits\ValidatesCredentialsTest ✓ NetSuite OAuth 1.0 Validation → validates NetSuite OAuth1 credentia… 0.04s ✓ NetSuite OAuth 1.0 Validation → validates NetSuite OAuth1 credentia… 0.03s ✓ NetSuite OAuth 1.0 Validation → validates NetSuite OAuth1 credentia… 0.03s ✓ NetSuite OAuth 1.0 Validation → validates NetSuite OAuth1 credentia… 0.02s ✓ NetSuite OAuth 1.0 Validation → handles NetSuite API authentication… 0.02s ✓ NetSuite OAuth 1.0 Validation → handles NetSuite connection failure 0.03s ✓ NetSuite OAuth 1.0 Validation → handles NetSuite cURL error 0.02s ✓ NetSuite OAuth 1.0 Validation → handles NetSuite 502 Bad Gateway er… 0.03s ✓ OAuth 2.0 Validation → validates OAuth2 format with missing client_… 0.02s ✓ OAuth 2.0 Validation → validates OAuth2 format with missing client_… 0.03s ✓ OAuth 2.0 Validation → validates OAuth2 authorization code format s… 0.02s ✓ Basic Auth Validation → validates basic auth with missing username 0.02s ✓ Basic Auth Validation → validates basic auth with missing password 0.03s ✓ Token Auth Validation → validates token with missing access_token 0.02s ✓ Connector Credentials Validation Router → routes to basic auth vali… 0.03s ✓ Connector Credentials Validation Router → routes to OAuth2 validati… 0.02s ✓ Connector Credentials Validation Router → routes to token validatio… 0.03s ✓ Connector Credentials Validation Router → routes to password valida… 0.02s ✓ Connector Credentials Validation Router → routes to JWT validation… 0.02s ✓ Connector Credentials Validation Router → routes to OAuth1 validati… 0.03s ✓ Connector Credentials Validation Router → handles unknown auth_type… 0.02s ✓ Connector Credentials Validation Router → validates OAuth1 missing… 0.03s PASS Tests\Unit\iPaas\Jobs\ProcessFlowErrorHandlingTest ✓ ProcessFlow - Error Duplication Prevention → it prevents duplicate… 0.09s ✓ ProcessFlow - Error Duplication Prevention → it errorAlreadyCapture… 0.07s ✓ ProcessFlow - Error Duplication Prevention → it errorAlreadyCapture… 0.09s ✓ ProcessFlow - Zero Records Handling → it handleWithoutPagination co… 0.08s ✓ ProcessFlow - Zero Records Handling → it flow metrics are completed… 0.09s ✓ ProcessFlow - Zero Records Handling → it completeFlowMetric accepts… 0.08s ✓ ProcessFlow - Zero Records Handling → it flow completion event is d… 0.09s ✓ ProcessFlow - Error and Zero Records Integration → it flow with 0 r… 0.09s ✓ ProcessFlow - Error and Zero Records Integration → it errorFlowMetr… 0.08s PASS Tests\Unit\iPaas\Jobs\Traits\CapturesJobErrorsTest ✓ CapturesJobErrors Trait → it ensureMetricsAndCaptureError creates F… 0.09s ✓ CapturesJobErrors Trait → it ensureMetricsAndCaptureError attempts… 0.10s ✓ CapturesJobErrors Trait → it ensureMetricsAndCaptureResponseError a… 0.08s ✓ CapturesJobErrors Trait → it safeStartNodeMetric returns false when… 0.07s ✓ CapturesJobErrors Trait → it safeStartNodeMetric creates node metri… 0.09s ✓ CapturesJobErrors Trait → it safeUpdateNodeMetric returns false whe… 0.08s ✓ CapturesJobErrors Trait → it getInputDataForError extracts data fro… 0.07s ✓ CapturesJobErrors Trait → it ensureMetricsAndCaptureError handles t… 0.09s ✓ CapturesJobErrors Trait → it ensureMetricsAndCaptureError does not… 0.08s PASS Tests\Unit\iPaas\Metrics\Actions\CreateFlowMetricTest ✓ CreateFlowMetric Action → it can create flow metric successfully 0.03s ✓ CreateFlowMetric Action → it can create flow metric with defaults 0.04s ✓ CreateFlowMetric Action → it fails validation with invalid flow id 0.02s ✓ CreateFlowMetric Action → it fails validation with missing required… 0.04s ✓ CreateFlowMetric Action → it fails validation with invalid flow sta… 0.03s ✓ CreateFlowMetric Action → it fails validation with negative records 0.04s ✓ CreateFlowMetric Action → it fails validation with empty tenant dat… 0.03s PASS Tests\Unit\iPaas\Metrics\Actions\CreateNodeMetricTest ✓ CreateNodeMetric Action → it can create node metric successfully 0.04s ✓ CreateNodeMetric Action → it can create node metric with defaults 0.03s ✓ CreateNodeMetric Action → it fails validation with invalid flow met… 0.03s ✓ CreateNodeMetric Action → it fails validation with missing required… 0.04s ✓ CreateNodeMetric Action → it fails validation with invalid node sta… 0.03s ✓ CreateNodeMetric Action → it fails validation with negative values 0.04s ✓ CreateNodeMetric Action → it fails validation with empty node name 0.03s ✓ CreateNodeMetric Action → it fails validation with invalid node typ… 0.04s PASS Tests\Unit\iPaas\Metrics\Actions\CreateRecordProcessingErrorTest ✓ CreateRecordProcessingError Action → it can create record processin… 0.04s ✓ CreateRecordProcessingError Action → it can create record processin… 0.05s ✓ CreateRecordProcessingError Action → it fails validation with inval… 0.03s ✓ CreateRecordProcessingError Action → it fails validation with missi… 0.03s ✓ CreateRecordProcessingError Action → it fails validation with negat… 0.05s ✓ CreateRecordProcessingError Action → it fails validation with empty… 0.03s ✓ CreateRecordProcessingError Action → it fails validation with inval… 0.04s PASS Tests\Unit\iPaas\Metrics\FlowMetricTest ✓ FlowMetric → it can create flow metric 0.03s ✓ FlowMetric → it can calculate success rate 0.04s ✓ FlowMetric → it returns zero success rate when no records 0.03s ✓ FlowMetric → it can calculate total duration 0.04s ✓ FlowMetric → it returns null duration when not completed 0.03s ✓ FlowMetric → it can check flow status 0.04s ✓ FlowMetric → it has validation rules defined 0.02s PASS Tests\Unit\iPaas\Metrics\IntegrationTest ✓ Metrics Integration → it handles complete flow metrics workflow 0.05s ✓ Metrics Integration → it handles flow with multiple nodes and error… 0.04s ✓ Metrics Integration → it handles error workflow correctly 0.04s PASS Tests\Unit\iPaas\Metrics\NodeMetricTest ✓ NodeMetric → it can create node metric 0.03s ✓ NodeMetric → it can calculate success rate 0.03s ✓ NodeMetric → it returns zero success rate when no records 0.04s ✓ NodeMetric → it can calculate average runtime 0.03s ✓ NodeMetric → it returns zero average runtime when no records 0.04s ✓ NodeMetric → it can calculate total duration 0.03s ✓ NodeMetric → it returns null duration when not completed 0.04s ✓ NodeMetric → it can check node status 0.03s ✓ NodeMetric → it has validation rules defined 0.02s PASS Tests\Unit\iPaas\Metrics\RecordProcessingErrorTest ✓ RecordProcessingError → it can create record processing error 0.05s ✓ RecordProcessingError → it can create record processing error witho… 0.03s ✓ RecordProcessingError → it can check if has payload snapshot 0.05s ✓ RecordProcessingError → it can get formatted error message 0.04s ✓ RecordProcessingError → it has validation rules defined 0.04s PASS Tests\Unit\iPaas\Metrics\Services\FlowMetricsServiceErrorHandlingTest ✓ FlowMetricsService - Error Handling → it errorFlowMetric increments… 0.09s ✓ FlowMetricsService - Error Handling → it errorFlowMetric can be cal… 0.08s ✓ FlowMetricsService - Error Handling → it errorFlowMetric does nothi… 0.08s ✓ FlowMetricsService - Error Handling → it errorNodeMetric marks node… 0.09s ✓ FlowMetricsService - Error Handling → it errorNodeMetric does nothi… 0.08s ✓ FlowMetricsService - Error Handling → it errorFlowMetric and errorN… 0.08s ✓ FlowMetricsService - Error Handling → it errorFlowMetric preserves… 0.10s PASS Tests\Unit\iPaas\Metrics\Support\RedactorTest ✓ Redactor → it redacts simple array with default keys 0.02s ✓ Redactor → it redacts with context models 0.03s ✓ Redactor → it redacts recursive structure 0.02s ✓ Redactor → it preserves boolean values 0.03s ✓ Redactor → it handles authorization header 0.02s ✓ Redactor → it handles basic auth 0.03s ✓ Redactor → it handles short values 0.02s ✓ Redactor → it handles empty values 0.02s ✓ Redactor → it collects sensitive keys from context models 0.03s ✓ Redactor → it handles mixed case keys 0.02s ✓ Redactor → it preserves numeric types 0.03s PASS Tests\Feature\CloudStorage\CloudStorageControllerTest ✓ CloudStorageController - Configuration Management → it instantiates… 0.04s ✓ CloudStorageController - Configuration Management → it lists cloud… 0.05s ✓ CloudStorageController - Configuration Management → it shows config… 0.03s ✓ CloudStorageController - Configuration Management → it shows existi… 0.04s ✓ CloudStorageController - Document Management → it creates document… 0.03s ✓ CloudStorageController - Document Management → it shows document de… 0.04s ✓ CloudStorageController - Document Management → it shows document de… 0.03s ✓ CloudStorageController - Document Management → it verifies document… 0.04s ✓ CloudStorageController - Document Management → it handles document… 0.03s ✓ CloudStorageController - File Upload Validation → it validates requ… 0.04s ✓ CloudStorageController - File Upload Validation → it validates file… 0.05s ✓ CloudStorageController - File Upload Validation → it validates prov… 0.03s ✓ CloudStorageController - Folder Operations Validation → it validate… 0.04s ✓ CloudStorageController - Folder Operations Validation → it handles… 0.03s ✓ CloudStorageController - Share File Validation → it handles missing… 0.04s ✓ CloudStorageController - Share File Validation → it handles invalid… 0.03s ✓ CloudStorageController - Error Handling → it handles missing config… 0.03s ✓ CloudStorageController - Error Handling → it handles invalid docume… 0.04s ✓ CloudStorageController - Error Handling → it handles non-existent d… 0.03s ✓ CloudStorageController - Database Integration → it retrieves config… 0.04s ✓ CloudStorageController - Database Integration → it creates document… 0.03s ✓ CloudStorageController - Database Integration → it handles document… 0.05s PASS Tests\Feature\Domain\DatabaseColumns\Services\DatabaseColumnServiceTest ✓ it adds column to table 0.07s ✓ it updates column in table 0.08s ✓ it removes column from table 0.06s ✓ it handles foreign key constraints 0.07s ✓ it validates column names 0.05s FAIL Tests\Feature\Http\Controllers\Api\ApiV1TenantContextTest ✓ API v1 Tenant Context - Validación del Patrón → API v1 example endp… 0.07s ✓ API v1 Tenant Context - Validación del Patrón → API v1 link index f… 0.06s ⨯ API v1 Tenant Context - Validación del Patrón → API v1 task creatio… 0.05s ⨯ API v1 Tenant Context - Validación del Patrón → API v1 requiere aut… 0.05s WARN Tests\Feature\Http\Controllers\Api\ApiV2CompleteTest - API v2 Complete Test Suite - PLACEHOLDER → API v2 placeholder - ent… 0.03s PASS Tests\Feature\Http\Controllers\Api\ExampleEndpointTest ✓ Example API Endpoints → GET /api/v1/example returns success respons… 0.02s ✓ Example API Endpoints → GET /api/v1/example requires authentication 0.04s ✓ Example API Endpoints → POST /api/v1/example creates resource succe… 0.03s ✓ Example API Endpoints → POST /api/v1/example validates required fie… 0.02s ✓ Example API Endpoints → POST /api/v1/example validates email format 0.04s ✓ Example API Endpoints → POST /api/v1/example validates field length… 0.02s ✓ Example API Endpoints → POST /api/v1/example handles optional descr… 0.04s ✓ Example API Endpoints → POST /api/v1/example requires authenticatio… 0.02s ✓ Example API Endpoints → API responses include consistent timestamp… 0.04s ✓ Example API Endpoints → API responses follow consistent structure 0.02s ✓ Example API Endpoints → validation error responses follow consisten… 0.03s PASS Tests\Feature\Http\Controllers\Api\LinkControllerTest ✓ Link API Endpoints → GET /api/link returns paginated links 0.06s ✓ Link API Endpoints → GET /api/v1/link supports pagination parameter… 0.06s ✓ Link API Endpoints → GET /api/v1/link supports filtering 0.06s ✓ Link API Endpoints → GET /api/v1/link supports sorting 0.05s ✓ Link API Endpoints → GET /api/v1/link/{id} returns single link 0.05s ✓ Link API Endpoints → GET /api/v1/link/{id} returns 404 for non-exis… 0.05s ✓ Link API Endpoints → POST /api/v1/link creates new link successfull… 0.04s ✓ Link API Endpoints → POST /api/v1/link validates required fields 0.05s ✓ Link API Endpoints → POST /api/v1/link validates field types and le… 0.04s ✓ Link API Endpoints → PUT /api/v1/link/{id} updates link successfull… 0.05s ✓ Link API Endpoints → PUT /api/v1/link/{id} allows partial updates 0.04s ✓ Link API Endpoints → PUT /api/v1/link/{id} returns 404 for non-exis… 0.05s ✓ Link API Endpoints → DELETE /api/v1/link/{id} deletes link successf… 0.04s ✓ Link API Endpoints → DELETE /api/v1/link/{id} returns 404 for non-e… 0.05s ✓ Link API Endpoints → API responses include consistent timestamp for… 0.04s ✓ Link API Endpoints → API maintains backward compatibility with orig… 0.05s PASS Tests\Feature\Http\Controllers\TestHelloControllerTest ✓ Multi-Tenancy Account Creation Lifecycle → Step 1: can create accou… 0.04s ✓ Multi-Tenancy Account Creation Lifecycle → Step 2: can create insta… 0.03s ✓ Multi-Tenancy Account Creation Lifecycle → Step 3: can configure an… 0.04s ✓ Multi-Tenancy Account Creation Lifecycle → Step 4: can create tenan… 0.03s ✓ Multi-Tenancy Account Creation Lifecycle → Step 5: can authenticate… 0.13s FAIL Tests\Feature\Http\Controllers\ipaas\ApiNodeControllerTest ✓ ApiNodeController - Index → can list api nodes as empty array 0.09s ✓ ApiNodeController - Index → can list api nodes with data 0.09s ⨯ ApiNodeController - Store → can create an api node with valid data 0.10s ✓ ApiNodeController - Store → fails to create api node without requir… 0.08s ✓ ApiNodeController - Store → fails to create api node with invalid f… 0.09s ✓ ApiNodeController - Store → fails to create api node with invalid r… 0.08s ✓ ApiNodeController - Store → rejects XSS attempts in name field 0.09s ⨯ ApiNodeController - Store → rejects excessively large array config 0.10s ✓ ApiNodeController - Show → can show a specific api node 0.08s ✓ ApiNodeController - Show → returns 404 when api node does not exist 0.10s - ApiNodeController - Edit → can load api node for editing → Skipped:… 0.08s - ApiNodeController - Edit → handles editing of non-existent api node… 0.09s ✓ ApiNodeController - Update → can send update request with valid dat… 0.08s ✓ ApiNodeController - Update → returns error when updating non-existe… 0.09s ✓ ApiNodeController - Destroy → can delete an api node 0.08s ✓ ApiNodeController - Destroy → handles deletion of non-existent api… 0.10s WARN Tests\Feature\Http\Controllers\ipaas\BranchNodeControllerTest ✓ BranchNodeController - Index → can list branch nodes as empty array 0.09s ✓ BranchNodeController - Index → can list branch nodes with data 0.09s ✓ BranchNodeController - Store → can create a branch node with valid… 0.08s ✓ BranchNodeController - Store → fails to create branch node without… 0.09s ✓ BranchNodeController - Store → fails to create branch node with inv… 0.08s ✓ BranchNodeController - Store → fails to create branch node without… 0.09s ✓ BranchNodeController - Store → rejects invalid condition types 0.08s ✓ BranchNodeController - Store → rejects XSS in branch names 0.09s ✓ BranchNodeController - Show → can show a specific branch node 0.08s ✓ BranchNodeController - Show → returns 404 when branch node does not… 0.09s - BranchNodeController - Edit → can load branch node for editing → Sk… 0.10s - BranchNodeController - Edit → handles editing of non-existent branc… 0.07s ✓ BranchNodeController - Update → can send update request with valid… 0.09s ✓ BranchNodeController - Update → returns error when updating non-exi… 0.09s ✓ BranchNodeController - Destroy → can delete a branch node 0.08s ✓ BranchNodeController - Destroy → deletes associated branch child no… 0.10s ✓ BranchNodeController - Destroy → returns 404 when deleting non-exis… 0.08s FAIL Tests\Feature\Http\Controllers\ipaas\ConnectorControllerTest ⨯ ConnectorController::store() - JSON API Response → returns JSON res… 0.08s ✓ ConnectorController::store() - JSON API Response → returns 500 stat… 0.07s ⨯ ConnectorController::store() - JSON API Response → includes OAuth r… 0.07s ✓ ConnectorController::store() - JSON API Response → validates requir… 0.08s ⨯ ConnectorController::update() - JSON API Response → returns JSON re… 0.07s ✓ ConnectorController::update() - JSON API Response → returns 404 whe… 0.07s ✓ ConnectorController::update() - JSON API Response → requires sensit… 0.08s ✓ ConnectorController::destroy() - Delete Connector → successfully de… 0.07s ✓ ConnectorController::destroy() - Delete Connector → deletes connect… 0.08s ✓ ConnectorController::destroy() - Delete Connector → deletes private… 0.06s ✓ ConnectorController::destroy() - Delete Connector → returns 404 whe… 0.08s ⨯ ConnectorController - Security & Logging → logs all successful oper… 0.07s ! ConnectorController - Security & Logging → logs failures without ex… 0.08s ⨯ ConnectorController - Security & Logging → includes oauth redirect… 0.07s ✓ ConnectorController - Security & Logging → rejects XSS attempts in… 0.08s ✓ ConnectorController - Security & Logging → rejects non-HTTPS base U… 0.07s ✓ ConnectorController - Security & Logging → enforces throttle limits 0.08s ⨯ ConnectorController - Compatibility with Livewire → returns format… 0.07s ⨯ ConnectorController - Compatibility with Livewire → includes redire… 0.08s PASS Tests\Feature\Http\Controllers\ipaas\FlowsControllerTest ✓ FlowsController - Store → can create a flow with valid data and ini… 0.08s ✓ FlowsController - Store → can create flow with minimal data (defaul… 0.06s ✓ FlowsController - Store → rejects flow with invalid name (XSS attem… 0.07s ✓ FlowsController - Store → rejects flow with excessively large mappi… 0.08s ✓ FlowsController - Update → can update flow with valid data 0.07s ✓ FlowsController - Update → returns 404 when updating non-existent f… 0.05s ✓ FlowsController - Update → rejects update with invalid name (XSS) 0.07s ✓ FlowsController - Update → can update only specific fields (partial… 0.06s ✓ FlowsController - Destroy → can delete a flow successfully 0.07s ✓ FlowsController - Destroy → returns 404 when deleting non-existent… 0.06s ✓ FlowsController - Create Node → can create a new node in a flow 0.07s ✓ FlowsController - Create Node → returns 422 validation error when c… 0.06s ✓ FlowsController - Create Node → rejects node creation without requi… 0.07s ✓ FlowsController - Create Node → rejects unauthorized user creating… 0.06s ✓ FlowsController - Create Node → creates bidirectional links when ad… 0.08s ✓ FlowsController - Create Node → creates bidirectional links when in… 0.07s ✓ FlowsController - Delete Node → can delete a node and reconnect flo… 0.08s ✓ FlowsController - Delete Node → can delete last node (clears previo… 0.07s ✓ FlowsController - Delete Node → returns 404 when deleting non-exist… 0.08s ✓ FlowsController - Delete Node → rejects malformed node ID format 0.06s ✓ FlowsController - Delete Node → rejects unauthorized user deleting… 0.07s ✓ FlowsController - Authorization → rejects unauthenticated users on… 0.05s ✓ FlowsController - Authorization → rejects users without can_manage_… 0.07s ✓ FlowsController - Authorization → rejects users without permission… 0.06s ✓ FlowsController - Security & Logging → logs all successful operatio… 0.09s ✓ FlowsController - Security & Logging → enforces maximum mapping siz… 0.14s WARN Tests\Feature\Http\Controllers\ipaas\MapNodeControllerTest ✓ MapNodeController - Index → can list all map nodes 0.07s ✓ MapNodeController - Index → returns empty array when no map nodes e… 0.07s ✓ MapNodeController - Create → can show create form with required nod… 0.08s ✓ MapNodeController - Create → fails to show create form without node… 0.06s ✓ MapNodeController - Store → can create a map node with valid data 0.07s ✓ MapNodeController - Store → fails to create map node without flow_i… 0.06s ✓ MapNodeController - Store → fails to create map node without rules 0.07s ✓ MapNodeController - Store → fails to create map node without last_i… 0.07s ✓ MapNodeController - Store → fails to create map node with non-exist… 0.06s ✓ MapNodeController - Store → accepts valid array in rules field 0.07s ✓ MapNodeController - Show → can show a specific map node 0.06s ✓ MapNodeController - Show → returns 404 when map node does not exist 0.07s - MapNodeController - Edit → can load map node for editing → Skipped:… 0.05s ✓ MapNodeController - Update → can send update request with valid dat… 0.07s ✓ MapNodeController - Update → returns error when updating non-existe… 0.06s ✓ MapNodeController - Destroy → can delete a map node 0.08s ✓ MapNodeController - Destroy → returns 404 when deleting non-existen… 0.07s WARN Tests\Feature\Http\Controllers\ipaas\TransformNodeControllerTest ✓ TransformNodeController - Index → can list script files via JSON 0.08s ✓ TransformNodeController - Store → can create a transform node with… 0.07s ✓ TransformNodeController - Store → fails to create transform node wi… 0.06s ✓ TransformNodeController - Store → fails to create transform node wi… 0.07s ✓ TransformNodeController - Store → fails to create transform node wi… 0.06s ✓ TransformNodeController - Store → rejects XSS attempts in name fiel… 0.07s ✓ TransformNodeController - Store → rejects XSS attempts in applicati… 0.06s ✓ TransformNodeController - Store → rejects excessively large script 0.07s ✓ TransformNodeController - Show → can show a specific transform node 0.07s ✓ TransformNodeController - Show → returns 404 when transform node do… 0.05s - TransformNodeController - Edit → can load transform node for editin… 0.07s ✓ TransformNodeController - Update → can send update request with val… 0.06s ✓ TransformNodeController - Update → returns error when updating non-… 0.07s ✓ TransformNodeController - Destroy → can delete a transform node 0.06s ✓ TransformNodeController - Destroy → handles deletion of non-existen… 0.06s PASS Tests\Feature\Http\Middleware\SubdomainMiddlewareTest ✓ subdomain extraction → it extracts subdomain and sets request attri… 0.02s ✓ subdomain extraction → it passes through admin subdomain without se… 0.03s ✓ subdomain extraction → it handles request without subdomain 0.02s ✓ subdomain extraction → it handles app subdomain like regular subdom… 0.03s ✓ middleware chain → it calls next middleware in chain 0.02s ✓ middleware chain → it passes request to next middleware 0.03s ✓ edge cases → it handles malformed host headers 0.02s ✓ edge cases → it handles very long subdomains 0.02s ✓ edge cases → it handles special characters in subdomains 0.03s ✓ different HTTP methods → it handles GET requests 0.02s ✓ different HTTP methods → it handles POST requests 0.03s ✓ different HTTP methods → it handles PUT requests 0.02s ✓ different HTTP methods → it handles DELETE requests 0.03s PASS Tests\Feature\Instances\ManageUserConnectionTest ✓ ManageUser Connection Pattern (After Refactor) → it uses tenant_con… 0.09s ✓ ManageUser Connection Pattern (After Refactor) → it switches betwee… 0.09s ✓ ManageUser Connection Pattern (After Refactor) → tenant context pro… 0.09s ✓ ManageUser Connection Pattern (After Refactor) → tenant logs route… 0.09s ✓ ManageUser Isolation → connection changes do not leak between opera… 0.07s ✓ ManageUser Isolation → log context cache resets automatically on co… 0.09s PASS Tests\Feature\Livewire\ApiNodeFormPreviewTest ✓ Component Initialization → it can mount ApiNodeForm component with… 0.17s ✓ Preview Method → it has preview method that dispatches job 0.02s ✓ Preview Method → it sets previewProcessing and currentPreviewId on… 0.02s ✓ CheckPreviewStatus Method → it has checkPreviewStatus method for po… 0.03s ✓ Preview ID Generation → it generates unique preview IDs with correc… 1.02s ✓ Timeout Handling → it has 10-minute timeout constant for preview op… 0.03s ✓ Timeout Handling → it can calculate elapsed time from start time 0.02s ✓ Redis Key Format → it uses correct Redis key format for preview sta… 0.02s ✓ Preview Status States → it handles processing status correctly 0.03s ✓ Preview Status States → it handles completed status correctly 0.02s ✓ Preview Status States → it handles error status correctly 0.03s ✓ Job Dispatching → it dispatches ProcessApiPreviewJob when preview i… 0.02s ✓ Data Transformation → it converts ApiNode to array for job serializ… 0.03s ✓ Error Message Formatting → it formats timeout error message correct… 0.02s ✓ Error Message Formatting → it formats job error message correctly 0.02s PASS Tests\Feature\Livewire\Documents\TableTest ✓ Documents Table Component - Basic Logic → it initializes modal stat… 0.04s ✓ Document Model - Type Handling → it creates document with explicit… 0.03s ✓ Document Model - Type Handling → it creates document with sheet typ… 0.02s ✓ Cloud Service Configuration Model → it creates cloud service config… 0.02s ✓ Cloud Service Configuration Model → it allows multiple cloud config… 0.03s ✓ Document Model - Relationships → it creates document with user rela… 0.02s ✓ Document Model - Relationships → it creates document with polymorph… 0.03s ✓ Document Model - Relationships → it handles multiple documents for… 0.02s ✓ Document Model - Relationships → it queries documents by type 0.03s PASS Tests\Feature\Livewire\Ipaas\ConnectorFormTest ✓ ConnectorForm Component - Unit Tests (getAdditionalFormData) → comp… 0.06s ✓ ConnectorForm Component - Unit Tests (getAdditionalFormData) → getA… 0.07s ✓ ConnectorForm Component - Unit Tests (getAdditionalFormData) → getA… 0.06s PASS Tests\Feature\Livewire\RecordRefComponentTest ✓ Production Bug: entities table without external_id → it detects tha… 0.03s ✓ Production Bug: entities table without external_id → it successfull… 0.02s ✓ Table with external_id column → it detects that test_customers tabl… 0.03s ✓ Table with external_id column → it successfully queries test_custom… 0.02s ✓ Basic database operations → it filters results by title on test_ent… 0.02s ✓ Basic database operations → it paginates results correctly on test_… 0.04s PASS Tests\Feature\Livewire\Records\IndexTest ✓ component handles empty foreign key gracefully 0.11s ✓ component skips filters with empty column names 0.07s ✓ foreign key validation prevents empty column names 0.07s PASS Tests\Feature\Livewire\RecordsIndexProjectTaskTest ✓ project sublist renders project tasks with self-join without ambigu… 0.02s ✓ project sublist orders tasks by eventid correctly 0.03s ✓ project sublist with filters does not produce ambiguous column erro… 0.02s ✓ child tasks with parent reference are correctly filtered out when n… 0.03s PASS Tests\Feature\Logging\TenantLoggingIntegrationTest ✓ Tenant Logging Integration → it logs to tenant file when tenant is… 0.02s ✓ Tenant Logging Integration → it logs to system file when no tenant… 0.03s ✓ Tenant Logging Integration → it logs to different tenant files when… 0.02s ✓ Tenant Logging Integration → it logs different levels to correct fi… 0.03s ✓ Tenant Logging Integration → it creates tenant directory automatica… 0.02s PASS Tests\Feature\Migrations\BranchConditionsMigrationTest ✓ Branch Conditions Migration → migration converts all condition vari… 0.11s ✓ Branch Conditions Migration → migration handles all condition varia… 0.09s PASS Tests\Feature\Search\SearchFieldConfigControllerTest ✓ SearchFieldConfigController (direct) → it upserts config and schedu… 0.02s ✓ SearchFieldConfigController (direct) → it does not schedule reindex… 0.02s ✓ SearchFieldConfigController (direct) → it deletes config and schedu… 0.03s ✓ SearchFieldConfigController (direct) → it fails validation when tab… 0.02s ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Domain\iPaas\Connectors\Strategy\ConnectorOAuth1Test >… Failed asserting that false is true. at tests/Unit/Domain/iPaas/Connectors/Strategy/ConnectorOAuth1Test.php:185 181▕ // Verify method exists 182▕ expect(method_exists($strategy, 'makeRequest'))->toBeTrue(); 183▕ 184▕ // Verify NetsuiteService has the required method ➜ 185▕ expect(method_exists(NetsuiteService::class, 'getOAuth1Header'))->toBeTrue(); 186▕ }); 187▕ 188▕ it('has makeRequest method with proper signature', function () { 189▕ $strategy = new ConnectorOAuth1(); 1 tests/Unit/Domain/iPaas/Connectors/Strategy/ConnectorOAuth1Test.php:185 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Domain\iPaas\Connectors\Strategy\ConnectorOAuth1Test >… Failed asserting that false is true. at tests/Unit/Domain/iPaas/Connectors/Strategy/ConnectorOAuth1Test.php:298 294▕ $connector->config = $config; 295▕ $connector->app = (object)['code' => 'netsuite_oauth1']; 296▕ 297▕ // Verify NetSuiteService exists and has required method ➜ 298▕ expect(class_exists(NetsuiteService::class))->toBeTrue(); 299▕ 300▕ // Check if method exists using reflection (handles static methods correctly) 301▕ $reflection = new \ReflectionClass(NetsuiteService::class); 302▕ expect($reflection->hasMethod('getOAuth1Header'))->toBeTrue(); 1 tests/Unit/Domain/iPaas/Connectors/Strategy/ConnectorOAuth1Test.php:298 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Helpers\RecordTypeFieldsTest > mo… ReflectionException Property App\Helpers\RecordTypeFields::$criteriaCache does not exist at tests/Unit/Helpers/RecordTypeFieldsTest.php:16 12▕ 13▕ // Clear RecordTypeFields static cache before each test 14▕ // The helper uses static cache which can persist between tests 15▕ $reflection = new ReflectionClass(RecordTypeFields::class); ➜ 16▕ $cacheProperty = $reflection->getProperty('criteriaCache'); 17▕ $cacheProperty->setAccessible(true); 18▕ $cacheProperty->setValue(null, []); 19▕ 20▕ // Clean up any existing test data 1 tests/Unit/Helpers/RecordTypeFieldsTest.php:16 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Helpers\RecordTypeFieldsTest > mo… ReflectionException Property App\Helpers\RecordTypeFields::$criteriaCache does not exist at tests/Unit/Helpers/RecordTypeFieldsTest.php:16 12▕ 13▕ // Clear RecordTypeFields static cache before each test 14▕ // The helper uses static cache which can persist between tests 15▕ $reflection = new ReflectionClass(RecordTypeFields::class); ➜ 16▕ $cacheProperty = $reflection->getProperty('criteriaCache'); 17▕ $cacheProperty->setAccessible(true); 18▕ $cacheProperty->setValue(null, []); 19▕ 20▕ // Clean up any existing test data 1 tests/Unit/Helpers/RecordTypeFieldsTest.php:16 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Helpers\RecordTypeFieldsTest > mo… ReflectionException Property App\Helpers\RecordTypeFields::$criteriaCache does not exist at tests/Unit/Helpers/RecordTypeFieldsTest.php:16 12▕ 13▕ // Clear RecordTypeFields static cache before each test 14▕ // The helper uses static cache which can persist between tests 15▕ $reflection = new ReflectionClass(RecordTypeFields::class); ➜ 16▕ $cacheProperty = $reflection->getProperty('criteriaCache'); 17▕ $cacheProperty->setAccessible(true); 18▕ $cacheProperty->setValue(null, []); 19▕ 20▕ // Clean up any existing test data 1 tests/Unit/Helpers/RecordTypeFieldsTest.php:16 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Helpers\RecordTypeFieldsTest > mo… ReflectionException Property App\Helpers\RecordTypeFields::$criteriaCache does not exist at tests/Unit/Helpers/RecordTypeFieldsTest.php:16 12▕ 13▕ // Clear RecordTypeFields static cache before each test 14▕ // The helper uses static cache which can persist between tests 15▕ $reflection = new ReflectionClass(RecordTypeFields::class); ➜ 16▕ $cacheProperty = $reflection->getProperty('criteriaCache'); 17▕ $cacheProperty->setAccessible(true); 18▕ $cacheProperty->setValue(null, []); 19▕ 20▕ // Clean up any existing test data 1 tests/Unit/Helpers/RecordTypeFieldsTest.php:16 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Helpers\RecordTypeFieldsTest > mo… ReflectionException Property App\Helpers\RecordTypeFields::$criteriaCache does not exist at tests/Unit/Helpers/RecordTypeFieldsTest.php:16 12▕ 13▕ // Clear RecordTypeFields static cache before each test 14▕ // The helper uses static cache which can persist between tests 15▕ $reflection = new ReflectionClass(RecordTypeFields::class); ➜ 16▕ $cacheProperty = $reflection->getProperty('criteriaCache'); 17▕ $cacheProperty->setAccessible(true); 18▕ $cacheProperty->setValue(null, []); 19▕ 20▕ // Clean up any existing test data 1 tests/Unit/Helpers/RecordTypeFieldsTest.php:16 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Helpers\RecordTypeFieldsTest > ge… ReflectionException Property App\Helpers\RecordTypeFields::$criteriaCache does not exist at tests/Unit/Helpers/RecordTypeFieldsTest.php:16 12▕ 13▕ // Clear RecordTypeFields static cache before each test 14▕ // The helper uses static cache which can persist between tests 15▕ $reflection = new ReflectionClass(RecordTypeFields::class); ➜ 16▕ $cacheProperty = $reflection->getProperty('criteriaCache'); 17▕ $cacheProperty->setAccessible(true); 18▕ $cacheProperty->setValue(null, []); 19▕ 20▕ // Clean up any existing test data 1 tests/Unit/Helpers/RecordTypeFieldsTest.php:16 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Helpers\RecordTypeFieldsTest > ge… ReflectionException Property App\Helpers\RecordTypeFields::$criteriaCache does not exist at tests/Unit/Helpers/RecordTypeFieldsTest.php:16 12▕ 13▕ // Clear RecordTypeFields static cache before each test 14▕ // The helper uses static cache which can persist between tests 15▕ $reflection = new ReflectionClass(RecordTypeFields::class); ➜ 16▕ $cacheProperty = $reflection->getProperty('criteriaCache'); 17▕ $cacheProperty->setAccessible(true); 18▕ $cacheProperty->setValue(null, []); 19▕ 20▕ // Clean up any existing test data 1 tests/Unit/Helpers/RecordTypeFieldsTest.php:16 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Jobs\ImportJobs\BatchJobRetryTest >… RuntimeException Could not load mock App\Helpers\RecordTypeFields, class already exists at tests/Unit/Jobs/ImportJobs/BatchJobRetryTest.php:149 145▕ $mappingCriteria = [ 146▕ 'criteria' => 'customer', 147▕ 'where' => 'WHERE isinactive = false' 148▕ ]; ➜ 149▕ $recordTypeFieldsMock = Mockery::mock('overload:' . RecordTypeFields::class); 150▕ $recordTypeFieldsMock->shouldReceive('modelCriteria') 151▕ ->with('Customer') 152▕ ->andReturn($mappingCriteria); 153▕ $recordTypeFieldsMock->shouldReceive('get') ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Jobs\ImportJobs\BatchJobRetryTest >… RuntimeException Could not load mock App\Helpers\RecordTypeFields, class already exists at tests/Unit/Jobs/ImportJobs/BatchJobRetryTest.php:239 235▕ $mappingCriteria = [ 236▕ 'criteria' => 'customer', 237▕ 'where' => 'WHERE isinactive = false' 238▕ ]; ➜ 239▕ $recordTypeFieldsMock = Mockery::mock('overload:' . RecordTypeFields::class); 240▕ $recordTypeFieldsMock->shouldReceive('modelCriteria') 241▕ ->with('Customer') 242▕ ->andReturn($mappingCriteria); 243▕ $recordTypeFieldsMock->shouldReceive('get') ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Jobs\ImportJobs\BuildNetSuiteQueryTe… RuntimeException Could not load mock App\Services\NetSuite\NetSuiteRestletService, class already exists at tests/Unit/Jobs/ImportJobs/BuildNetSuiteQueryTest.php:13 9▕ 10▕ describe('buildNetSuiteQuery alias prepend', function () { 11▕ it('prepends aliases and keeps select star for TransactionLine', function () { 12▕ // Mock NetSuiteRestletService to avoid real HTTP calls ➜ 13▕ $mockRestletService = Mockery::mock('overload:' . NetSuiteRestletService::class); 14▕ $mockRestletService->shouldReceive('setScript')->andReturnSelf(); 15▕ $mockRestletService->shouldReceive('setDeploy')->andReturnSelf(); 16▕ $mockRestletService->shouldReceive('executeRestlet')->andReturn([ 17▕ 'success' => true, ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Jobs\ImportJobs\ImportJobCoordinator… RuntimeException Could not load mock App\Helpers\RecordTypeFields, class already exists at tests/Unit/Jobs/ImportJobs/ImportJobCoordinatorTest.php:358 354▕ 'complete' => false 355▕ ]); 356▕ 357▕ // Mock RecordTypeFields to return null criteria ➜ 358▕ $recordTypeFieldsMock = Mockery::mock('overload:' . RecordTypeFields::class); 359▕ $recordTypeFieldsMock->shouldReceive('modelCriteria') 360▕ ->with('Customer') 361▕ ->andReturnNull(); 362▕ ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Jobs\ImportJobs\ImportJobCoordinator… RuntimeException Could not load mock App\Helpers\RecordTypeFields, class already exists at tests/Unit/Jobs/ImportJobs/ImportJobCoordinatorTest.php:544 540▕ $mappingCriteria = [ 541▕ 'criteria' => 'customer', 542▕ 'where' => 'WHERE isinactive = false' 543▕ ]; ➜ 544▕ $recordTypeFieldsMock = Mockery::mock('overload:' . RecordTypeFields::class); 545▕ $recordTypeFieldsMock->shouldReceive('modelCriteria') 546▕ ->with('Customer') 547▕ ->andReturn($mappingCriteria); 548▕ ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Jobs\ImportJobs\ImportJobCoordinator… RuntimeException Could not load mock App\Helpers\RecordTypeFields, class already exists at tests/Unit/Jobs/ImportJobs/ImportJobCoordinatorTest.php:636 632▕ $mappingCriteria = [ 633▕ 'criteria' => 'customer', 634▕ 'where' => 'WHERE isinactive = false' 635▕ ]; ➜ 636▕ $recordTypeFieldsMock = Mockery::mock('overload:' . RecordTypeFields::class); 637▕ $recordTypeFieldsMock->shouldReceive('modelCriteria') 638▕ ->with('Customer') 639▕ ->andReturn($mappingCriteria); 640▕ ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Jobs\ImportJobs\ImportNetSuiteRecordsBatchApiLi… Error Call to undefined method App\Jobs\ImportJobs\ImportNetSuiteRecordsBatch@anonymous::getJobId() at tests/Unit/Jobs/ImportJobs/ImportNetSuiteRecordsBatchApiLimitTest.php:156 152▕ 153▕ expect($detectionTriggered)->toBeFalse(); 154▕ 155▕ // Verify no cache entry was created ➜ 156▕ $cacheKey = "netsuite_api_limit_reached_{$testJob->getJobId()}"; 157▕ expect(Cache::has($cacheKey))->toBeFalse(); 158▕ }); 159▕ }); 160▕ 1 tests/Unit/Jobs/ImportJobs/ImportNetSuiteRecordsBatchApiLimitTest.php:156 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Jobs\ImportJobs\ImportNetSuiteRecordsBatchApiLi… Error Call to undefined method App\Jobs\ImportJobs\ImportNetSuiteRecordsBatch@anonymous::cancelRemainingBatches() at tests/Unit/Jobs/ImportJobs/ImportNetSuiteRecordsBatchApiLimitTest.php:185 181▕ 182▕ // Test batch cancellation 183▕ $testJob = new class($this->jobData) extends ImportNetSuiteRecordsBatch { 184▕ public function publicCancelRemainingBatches() { ➜ 185▕ return $this->cancelRemainingBatches(); 186▕ } 187▕ }; 188▕ 189▕ $cancelledCount = $testJob->publicCancelRemainingBatches(); 1 tests/Unit/Jobs/ImportJobs/ImportNetSuiteRecordsBatchApiLimitTest.php:185 2 tests/Unit/Jobs/ImportJobs/ImportNetSuiteRecordsBatchApiLimitTest.php:189 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Jobs\ImportJobs\ImportNetSuiteRecordsBatchApiLi… Error Call to undefined method App\Jobs\ImportJobs\ImportNetSuiteRecordsBatch@anonymous::cancelRemainingBatches() at tests/Unit/Jobs/ImportJobs/ImportNetSuiteRecordsBatchApiLimitTest.php:231 227▕ ]); 228▕ 229▕ $testJob = new class($this->jobData) extends ImportNetSuiteRecordsBatch { 230▕ public function publicCancelRemainingBatches() { ➜ 231▕ return $this->cancelRemainingBatches(); 232▕ } 233▕ }; 234▕ 235▕ $cancelledCount = $testJob->publicCancelRemainingBatches(); 1 tests/Unit/Jobs/ImportJobs/ImportNetSuiteRecordsBatchApiLimitTest.php:231 2 tests/Unit/Jobs/ImportJobs/ImportNetSuiteRecordsBatchApiLimitTest.php:235 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Jobs\ImportJobs\ImportNetSuiteRecordsBatchApiLi… Error Call to protected method App\Jobs\ImportJobs\ImportNetSuiteRecordsBatch@anonymous::processBatch() from scope P\Tests\Unit\Jobs\ImportJobs\ImportNetSuiteRecordsBatchApiLimitTest at tests/Unit/Jobs/ImportJobs/ImportNetSuiteRecordsBatchApiLimitTest.php:279 275▕ } 276▕ }; 277▕ 278▕ // Simulate the skip check ➜ 279▕ $testJob->processBatch(); 280▕ 281▕ expect($testJob->shouldSkipProcessing)->toBeTrue(); 282▕ }); 283▕ 1 tests/Unit/Jobs/ImportJobs/ImportNetSuiteRecordsBatchApiLimitTest.php:279 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Jobs\ImportJobs\ImportNetSuiteRecordsBatchApiLi… Error Call to protected method App\Jobs\ImportJobs\ImportNetSuiteRecordsBatch@anonymous::processBatch() from scope P\Tests\Unit\Jobs\ImportJobs\ImportNetSuiteRecordsBatchApiLimitTest at tests/Unit/Jobs/ImportJobs/ImportNetSuiteRecordsBatchApiLimitTest.php:311 307▕ return ['processed_normally']; 308▕ } 309▕ }; 310▕ ➜ 311▕ $result = $testJob->processBatch(); 312▕ 313▕ expect($testJob->shouldSkipProcessing)->toBeFalse(); 314▕ expect($result)->toBe(['processed_normally']); 315▕ }); 1 tests/Unit/Jobs/ImportJobs/ImportNetSuiteRecordsBatchApiLimitTest.php:311 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Jobs\ImportJobs\ImportNetSuiteRecordsBatchApiLimitTest… Failed asserting that 0 is identical to 1. at tests/Unit/Jobs/ImportJobs/ImportNetSuiteRecordsBatchApiLimitTest.php:339 335▕ $testJob->publicMarkApiLimitReached(); 336▕ $testJob->publicMarkApiLimitReached(); 337▕ 338▕ // Should only process once due to cache check ➜ 339▕ expect($testJob->cancellationCallCount)->toBe(1); 340▕ }); 341▕ }); 342▕ }); 343▕ 1 tests/Unit/Jobs/ImportJobs/ImportNetSuiteRecordsBatchApiLimitTest.php:339 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Jobs\ImportJobs\ImportNetSuiteRec… ReflectionException Property App\Helpers\RecordTypeFields::$criteriaCache does not exist at tests/Unit/Jobs/ImportJobs/ImportNetSuiteRecordsBatchApiLimitTest.php:360 356▕ $originalBasePath = base_path(); 357▕ 358▕ // Use reflection to test the static cache 359▕ $reflection = new \ReflectionClass(\App\Helpers\RecordTypeFields::class); ➜ 360▕ $cacheProperty = $reflection->getProperty('criteriaCache'); 361▕ $cacheProperty->setAccessible(true); 362▕ 363▕ // Clear the static cache 364▕ $cacheProperty->setValue(null, []); 1 tests/Unit/Jobs/ImportJobs/ImportNetSuiteRecordsBatchApiLimitTest.php:360 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Jobs\ImportJobs\ImportNetSuiteRecord… RuntimeException Could not load mock App\Helpers\RecordTypeFields, class already exists at tests/Unit/Jobs/ImportJobs/ImportNetSuiteRecordsBatchQueryTest.php:34 30▕ 'model_name' => 'TransactionLine' 31▕ ]); 32▕ 33▕ // Mock RecordTypeFields for criteria lookup ➜ 34▕ $this->rtf = Mockery::mock('alias:App\\Helpers\\RecordTypeFields'); 35▕ $this->rtf->shouldReceive('modelCriteria')->byDefault()->andReturn(['criteria' => 'transactionline']); 36▕ }); 37▕ 38▕ afterEach(function () { ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Listeners\DerivedLinesGatingTest > it creates derived… Failed asserting that 0 is equal to 1 or is greater than 1. at tests/Unit/Listeners/DerivedLinesGatingTest.php:184 180▕ $derived = DB::connection('tenant_connection')->table('wave_coordination') 181▕ ->where('job_id', $jobId) 182▕ ->where('dependency_level', -1) 183▕ ->count(); ➜ 184▕ expect($derived)->toBeGreaterThanOrEqual(1); 185▕ 186▕ $derivedBatches = DB::connection('tenant_connection')->table('wave_batches') 187▕ ->where('job_id', $jobId) 188▕ ->where('record_type_id', -13) 1 tests/Unit/Listeners/DerivedLinesGatingTest.php:184 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Listeners\ImportJobs\BatchJobComplet… TestAlreadyExist A test with the description `actingAs App\Models\User` already exists in the filename `/home/wbeltran/Documentos/projects/SuiteX/vendor/pestphp/pest/bin/pest`. at tests/TestCase.php:76 72▕ }); 73▕ 74▕ // Optionally create a user and act as them for tests 75▕ $this->user = \App\Models\User::factory()->create(); ➜ 76▕ \Pest\Laravel\actingAs($this->user); 77▕ 78▕ // Load tenant routes if needed 79▕ require base_path('routes/tenant.php'); 80▕ } 1 tests/Unit/Listeners/ImportJobs/BatchJobCompletedListenerTest.php:17 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Models\ProjectTaskBroadcastTest > `Pro… QueryException SQLSTATE[23000]: Integrity constraint violation: 19 NOT NULL constraint failed: projecttasks.refid (Connection: tenant_connection, SQL: insert into "projecttasks" ("title", "updated_at", "created_at") values (Test Task, 2025-12-16 16:02:14, 2025-12-16 16:02:14)) at vendor/laravel/framework/src/Illuminate/Database/Connection.php:587 583▕ $this->bindValues($statement, $this->prepareBindings($bindings)); 584▕ 585▕ $this->recordsHaveBeenModified(); 586▕ ➜ 587▕ return $statement->execute(); 588▕ }); 589▕ } 590▕ 591▕ /** +11 vendor frames  12 tests/Unit/Models/ProjectTaskBroadcastTest.php:79 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Models\ProjectTaskBroadcastTest > `Pro… QueryException SQLSTATE[23000]: Integrity constraint violation: 19 NOT NULL constraint failed: projecttasks.refid (Connection: tenant_connection, SQL: insert into "projecttasks" ("title", "updated_at", "created_at") values (Test Task, 2025-12-16 16:02:14, 2025-12-16 16:02:14)) at vendor/laravel/framework/src/Illuminate/Database/Connection.php:587 583▕ $this->bindValues($statement, $this->prepareBindings($bindings)); 584▕ 585▕ $this->recordsHaveBeenModified(); 586▕ ➜ 587▕ return $statement->execute(); 588▕ }); 589▕ } 590▕ 591▕ /** +11 vendor frames  12 tests/Unit/Models/ProjectTaskBroadcastTest.php:99 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Models\ProjectTaskBroadcastTest > `Pro… QueryException SQLSTATE[23000]: Integrity constraint violation: 19 NOT NULL constraint failed: projecttasks.refid (Connection: tenant_connection, SQL: insert into "projecttasks" ("title", "updated_at", "created_at") values (Test Task, 2025-12-16 16:02:14, 2025-12-16 16:02:14)) at vendor/laravel/framework/src/Illuminate/Database/Connection.php:587 583▕ $this->bindValues($statement, $this->prepareBindings($bindings)); 584▕ 585▕ $this->recordsHaveBeenModified(); 586▕ ➜ 587▕ return $statement->execute(); 588▕ }); 589▕ } 590▕ 591▕ /** +11 vendor frames  12 tests/Unit/Models/ProjectTaskBroadcastTest.php:120 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Models\ProjectTaskBroadcastTest > `Pro… QueryException SQLSTATE[23000]: Integrity constraint violation: 19 NOT NULL constraint failed: projecttasks.refid (Connection: tenant_connection, SQL: insert into "projecttasks" ("title", "updated_at", "created_at") values (Test, 2025-12-16 16:02:14, 2025-12-16 16:02:14)) at vendor/laravel/framework/src/Illuminate/Database/Connection.php:587 583▕ $this->bindValues($statement, $this->prepareBindings($bindings)); 584▕ 585▕ $this->recordsHaveBeenModified(); 586▕ ➜ 587▕ return $statement->execute(); 588▕ }); 589▕ } 590▕ 591▕ /** +11 vendor frames  12 tests/Unit/Models/ProjectTaskBroadcastTest.php:156 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Models\ProjectTaskPredecessorBroadcast… QueryException SQLSTATE[23000]: Integrity constraint violation: 19 NOT NULL constraint failed: projecttasks.refid (Connection: tenant_connection, SQL: insert into "projecttasks" ("title", "updated_at", "created_at") values (Task 1, 2025-12-16 16:02:14, 2025-12-16 16:02:14)) at vendor/laravel/framework/src/Illuminate/Database/Connection.php:587 583▕ $this->bindValues($statement, $this->prepareBindings($bindings)); 584▕ 585▕ $this->recordsHaveBeenModified(); 586▕ ➜ 587▕ return $statement->execute(); 588▕ }); 589▕ } 590▕ 591▕ /** +11 vendor frames  12 tests/Unit/Models/ProjectTaskPredecessorBroadcastTest.php:79 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Models\ProjectTaskPredecessorBroadcast… QueryException SQLSTATE[23000]: Integrity constraint violation: 19 NOT NULL constraint failed: projecttasks.refid (Connection: tenant_connection, SQL: insert into "projecttasks" ("title", "updated_at", "created_at") values (Task 1, 2025-12-16 16:02:14, 2025-12-16 16:02:14)) at vendor/laravel/framework/src/Illuminate/Database/Connection.php:587 583▕ $this->bindValues($statement, $this->prepareBindings($bindings)); 584▕ 585▕ $this->recordsHaveBeenModified(); 586▕ ➜ 587▕ return $statement->execute(); 588▕ }); 589▕ } 590▕ 591▕ /** +11 vendor frames  12 tests/Unit/Models/ProjectTaskPredecessorBroadcastTest.php:108 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Models\ProjectTaskPredecessorBroadcast… QueryException SQLSTATE[23000]: Integrity constraint violation: 19 NOT NULL constraint failed: projecttasks.refid (Connection: tenant_connection, SQL: insert into "projecttasks" ("title", "updated_at", "created_at") values (Task 1, 2025-12-16 16:02:15, 2025-12-16 16:02:15)) at vendor/laravel/framework/src/Illuminate/Database/Connection.php:587 583▕ $this->bindValues($statement, $this->prepareBindings($bindings)); 584▕ 585▕ $this->recordsHaveBeenModified(); 586▕ ➜ 587▕ return $statement->execute(); 588▕ }); 589▕ } 590▕ 591▕ /** +11 vendor frames  12 tests/Unit/Models/ProjectTaskPredecessorBroadcastTest.php:144 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Models\SubtaskBroadcastTest > `Subtask… QueryException SQLSTATE[23000]: Integrity constraint violation: 19 NOT NULL constraint failed: projecttasks.refid (Connection: tenant_connection, SQL: insert into "projecttasks" ("title", "updated_at", "created_at") values (Parent Task, 2025-12-16 16:02:15, 2025-12-16 16:02:15)) at vendor/laravel/framework/src/Illuminate/Database/Connection.php:587 583▕ $this->bindValues($statement, $this->prepareBindings($bindings)); 584▕ 585▕ $this->recordsHaveBeenModified(); 586▕ ➜ 587▕ return $statement->execute(); 588▕ }); 589▕ } 590▕ 591▕ /** +11 vendor frames  12 tests/Unit/Models/SubtaskBroadcastTest.php:81 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Providers\TenantBootstrapProviderTest > `constr… Error Call to undefined method Tests\Unit\Providers\TenantBootstrapProviderTest::ensureAccountsTable() at tests/Unit/Providers/TenantBootstrapProviderTest.php:19 15▕ uses(SetupMultiTenancyForTests::class)->in('Unit'); 16▕ 17▕ beforeEach(function () { 18▕ // Use trait methods to create required tables ➜ 19▕ $this->ensureAccountsTable(); 20▕ $this->ensureInstancesTable(); 21▕ 22▕ $this->app = app(); 23▕ $this->provider = new TenantBootstrapProvider($this->app); 1 tests/Unit/Providers/TenantBootstrapProviderTest.php:19 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Providers\TenantBootstrapProviderTest > `regist… Error Call to undefined method Tests\Unit\Providers\TenantBootstrapProviderTest::ensureAccountsTable() at tests/Unit/Providers/TenantBootstrapProviderTest.php:19 15▕ uses(SetupMultiTenancyForTests::class)->in('Unit'); 16▕ 17▕ beforeEach(function () { 18▕ // Use trait methods to create required tables ➜ 19▕ $this->ensureAccountsTable(); 20▕ $this->ensureInstancesTable(); 21▕ 22▕ $this->app = app(); 23▕ $this->provider = new TenantBootstrapProvider($this->app); 1 tests/Unit/Providers/TenantBootstrapProviderTest.php:19 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Providers\TenantBootstrapProviderTest > `boot`… Error Call to undefined method Tests\Unit\Providers\TenantBootstrapProviderTest::ensureAccountsTable() at tests/Unit/Providers/TenantBootstrapProviderTest.php:19 15▕ uses(SetupMultiTenancyForTests::class)->in('Unit'); 16▕ 17▕ beforeEach(function () { 18▕ // Use trait methods to create required tables ➜ 19▕ $this->ensureAccountsTable(); 20▕ $this->ensureInstancesTable(); 21▕ 22▕ $this->app = app(); 23▕ $this->provider = new TenantBootstrapProvider($this->app); 1 tests/Unit/Providers/TenantBootstrapProviderTest.php:19 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Providers\TenantBootstrapProviderTest > `boot`… Error Call to undefined method Tests\Unit\Providers\TenantBootstrapProviderTest::ensureAccountsTable() at tests/Unit/Providers/TenantBootstrapProviderTest.php:19 15▕ uses(SetupMultiTenancyForTests::class)->in('Unit'); 16▕ 17▕ beforeEach(function () { 18▕ // Use trait methods to create required tables ➜ 19▕ $this->ensureAccountsTable(); 20▕ $this->ensureInstancesTable(); 21▕ 22▕ $this->app = app(); 23▕ $this->provider = new TenantBootstrapProvider($this->app); 1 tests/Unit/Providers/TenantBootstrapProviderTest.php:19 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Providers\TenantBootstrapProviderTest > `boot`… Error Call to undefined method Tests\Unit\Providers\TenantBootstrapProviderTest::ensureAccountsTable() at tests/Unit/Providers/TenantBootstrapProviderTest.php:19 15▕ uses(SetupMultiTenancyForTests::class)->in('Unit'); 16▕ 17▕ beforeEach(function () { 18▕ // Use trait methods to create required tables ➜ 19▕ $this->ensureAccountsTable(); 20▕ $this->ensureInstancesTable(); 21▕ 22▕ $this->app = app(); 23▕ $this->provider = new TenantBootstrapProvider($this->app); 1 tests/Unit/Providers/TenantBootstrapProviderTest.php:19 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Providers\TenantBootstrapProviderTest > `config… Error Call to undefined method Tests\Unit\Providers\TenantBootstrapProviderTest::ensureAccountsTable() at tests/Unit/Providers/TenantBootstrapProviderTest.php:19 15▕ uses(SetupMultiTenancyForTests::class)->in('Unit'); 16▕ 17▕ beforeEach(function () { 18▕ // Use trait methods to create required tables ➜ 19▕ $this->ensureAccountsTable(); 20▕ $this->ensureInstancesTable(); 21▕ 22▕ $this->app = app(); 23▕ $this->provider = new TenantBootstrapProvider($this->app); 1 tests/Unit/Providers/TenantBootstrapProviderTest.php:19 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Providers\TenantBootstrapProviderTest > `config… Error Call to undefined method Tests\Unit\Providers\TenantBootstrapProviderTest::ensureAccountsTable() at tests/Unit/Providers/TenantBootstrapProviderTest.php:19 15▕ uses(SetupMultiTenancyForTests::class)->in('Unit'); 16▕ 17▕ beforeEach(function () { 18▕ // Use trait methods to create required tables ➜ 19▕ $this->ensureAccountsTable(); 20▕ $this->ensureInstancesTable(); 21▕ 22▕ $this->app = app(); 23▕ $this->provider = new TenantBootstrapProvider($this->app); 1 tests/Unit/Providers/TenantBootstrapProviderTest.php:19 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Providers\TenantBootstrapProviderTest > `config… Error Call to undefined method Tests\Unit\Providers\TenantBootstrapProviderTest::ensureAccountsTable() at tests/Unit/Providers/TenantBootstrapProviderTest.php:19 15▕ uses(SetupMultiTenancyForTests::class)->in('Unit'); 16▕ 17▕ beforeEach(function () { 18▕ // Use trait methods to create required tables ➜ 19▕ $this->ensureAccountsTable(); 20▕ $this->ensureInstancesTable(); 21▕ 22▕ $this->app = app(); 23▕ $this->provider = new TenantBootstrapProvider($this->app); 1 tests/Unit/Providers/TenantBootstrapProviderTest.php:19 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Providers\TenantBootstrapProviderTest > `config… Error Call to undefined method Tests\Unit\Providers\TenantBootstrapProviderTest::ensureAccountsTable() at tests/Unit/Providers/TenantBootstrapProviderTest.php:19 15▕ uses(SetupMultiTenancyForTests::class)->in('Unit'); 16▕ 17▕ beforeEach(function () { 18▕ // Use trait methods to create required tables ➜ 19▕ $this->ensureAccountsTable(); 20▕ $this->ensureInstancesTable(); 21▕ 22▕ $this->app = app(); 23▕ $this->provider = new TenantBootstrapProvider($this->app); 1 tests/Unit/Providers/TenantBootstrapProviderTest.php:19 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Providers\TenantBootstrapProviderTest > `config… Error Call to undefined method Tests\Unit\Providers\TenantBootstrapProviderTest::ensureAccountsTable() at tests/Unit/Providers/TenantBootstrapProviderTest.php:19 15▕ uses(SetupMultiTenancyForTests::class)->in('Unit'); 16▕ 17▕ beforeEach(function () { 18▕ // Use trait methods to create required tables ➜ 19▕ $this->ensureAccountsTable(); 20▕ $this->ensureInstancesTable(); 21▕ 22▕ $this->app = app(); 23▕ $this->provider = new TenantBootstrapProvider($this->app); 1 tests/Unit/Providers/TenantBootstrapProviderTest.php:19 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Providers\TenantBootstrapProviderTest > `config… Error Call to undefined method Tests\Unit\Providers\TenantBootstrapProviderTest::ensureAccountsTable() at tests/Unit/Providers/TenantBootstrapProviderTest.php:19 15▕ uses(SetupMultiTenancyForTests::class)->in('Unit'); 16▕ 17▕ beforeEach(function () { 18▕ // Use trait methods to create required tables ➜ 19▕ $this->ensureAccountsTable(); 20▕ $this->ensureInstancesTable(); 21▕ 22▕ $this->app = app(); 23▕ $this->provider = new TenantBootstrapProvider($this->app); 1 tests/Unit/Providers/TenantBootstrapProviderTest.php:19 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Providers\TenantBootstrapProviderTest > `config… Error Call to undefined method Tests\Unit\Providers\TenantBootstrapProviderTest::ensureAccountsTable() at tests/Unit/Providers/TenantBootstrapProviderTest.php:19 15▕ uses(SetupMultiTenancyForTests::class)->in('Unit'); 16▕ 17▕ beforeEach(function () { 18▕ // Use trait methods to create required tables ➜ 19▕ $this->ensureAccountsTable(); 20▕ $this->ensureInstancesTable(); 21▕ 22▕ $this->app = app(); 23▕ $this->provider = new TenantBootstrapProvider($this->app); 1 tests/Unit/Providers/TenantBootstrapProviderTest.php:19 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\BatchUpsertSchemaValid… InvalidCountException Method error() from Mockery_0_Illuminate_Log_LogManager should be called at least 1 times but called 0 times. at tests/Unit/Services/BatchUpsertSchemaValidationTest.php:93 89▕ expect($result['strategy_used'])->toBe('individual_fallback'); 90▕ 91▕ // Should log the validation failure 92▕ Log::shouldHaveReceived('error') ➜ 93▕ ->with('❌ UPSERT: Batch validation failed - inconsistent field structure', \Mockery::any()) 94▕ ->once(); 95▕ }); 96▕ 97▕ it('handles valid batch with consistent field structure successfully', function () { ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\BatchUpsertSchemaValidationTest > `Pre-valida… Failed asserting that an array contains 'single_chunk_fallback'. at tests/Unit/Services/BatchUpsertSchemaValidationTest.php:131 127▕ 128▕ // Should handle the operation and return proper result structure 129▕ if (array_key_exists('strategy_used', $result)) { 130▕ // Standard upsert result structure ➜ 131▕ expect($result['strategy_used'])->toBeIn(['single_chunk_success', 'chunked_batch_success', 'individual_fallback']); 132▕ expect($result)->toHaveKey('success'); 133▕ } else if (array_key_exists('chunk_individual_success', $result)) { 134▕ // Chunk processing result structure 135▕ expect($result)->toHaveKey('chunk_individual_success'); 1 tests/Unit/Services/BatchUpsertSchemaValidationTest.php:131 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\BatchUpsertSchemaValidationTest > `ItemsBatch… Failed asserting that an array contains 'single_chunk_fallback'. at tests/Unit/Services/BatchUpsertSchemaValidationTest.php:182 178▕ ); 179▕ 180▕ // Should handle the error gracefully with proper strategy 181▕ expect($result)->toHaveKey('strategy_used'); ➜ 182▕ expect($result['strategy_used'])->toBeIn(['individual_fallback', 'single_chunk_success', 'chunked_batch_success']); 183▕ }); 184▕ 185▕ it('ensures required NOT NULL fields have proper defaults', function () { 186▕ $itemsService = new ItemsBatchUpsertService(); 1 tests/Unit/Services/BatchUpsertSchemaValidationTest.php:182 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\BatchUpsertSchemaValidationTest > `Large Batc… Failed asserting that an array contains 'single_chunk_fallback'. at tests/Unit/Services/BatchUpsertSchemaValidationTest.php:295 291▕ 292▕ // Should handle small batch processing gracefully 293▕ if (array_key_exists('strategy_used', $result)) { 294▕ // Standard upsert result structure ➜ 295▕ expect($result['strategy_used'])->toBeIn(['single_chunk_success', 'individual_fallback', 'individual_validation_fallback']); 296▕ if ($result['strategy_used'] === 'single_chunk_success') { 297▕ expect($result)->toHaveKey('chunks_processed'); 298▕ expect($result['chunks_processed'])->toBe(1); 299▕ } 1 tests/Unit/Services/BatchUpsertSchemaValidationTest.php:295 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\ChunkingIntegrationTest > `Chunking Integrati… Failed asserting that 0 is identical to 600. at tests/Unit/Services/ChunkingIntegrationTest.php:93 89▕ $duration = $endTime - $startTime; 90▕ 91▕ // Verify all records were processed successfully 92▕ expect($result)->toHaveKey('success'); ➜ 93▕ expect($result['success'])->toBe(600); 94▕ 95▕ // Verify all records were created in the database 96▕ $dbRecords = Project::count(); 97▕ expect($dbRecords)->toBe(600); 1 tests/Unit/Services/ChunkingIntegrationTest.php:93 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\ChunkingIntegrationTest > `Chunking Integrati… Failed asserting that 0 is identical to 100. at tests/Unit/Services/ChunkingIntegrationTest.php:146 142▕ $result = $service->handle($netsuiteRecords, 'test_wide_records_job', 1); 143▕ 144▕ // Should handle wide records successfully 145▕ expect($result)->toHaveKey('success'); ➜ 146▕ expect($result['success'])->toBe(100); 147▕ 148▕ // Verify all records were created 149▕ $dbRecords = Project::count(); 150▕ expect($dbRecords)->toBe(100); 1 tests/Unit/Services/ChunkingIntegrationTest.php:146 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\ChunkingIntegrationTest > `Chunking Integrati… Failed asserting that 0 is identical to 2. at tests/Unit/Services/ChunkingIntegrationTest.php:185 181▕ $result = $service->handle($netsuiteRecords, 'test_compatibility_job', 1); 182▕ 183▕ // Should work exactly as before 184▕ expect($result)->toHaveKey('success'); ➜ 185▕ expect($result['success'])->toBe(2); 186▕ 187▕ // Verify records 188▕ $dbRecords = Project::count(); 189▕ expect($dbRecords)->toBe(2); 1 tests/Unit/Services/ChunkingIntegrationTest.php:185 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\ChunkingIntegrationTest > `Chunking Integrati… Failed asserting that 0 is identical to 300. at tests/Unit/Services/ChunkingIntegrationTest.php:220 216▕ } 217▕ 218▕ $result = $service->handle($netsuiteRecords, 'test_logging_job', 1); 219▕ ➜ 220▕ expect($result['success'])->toBe(300); 221▕ 222▕ // Verify chunking-specific logs appear 223▕ Log::shouldHaveReceived('info') 224▕ ->with('🚀 UPSERT: Starting chunked batch upsert', Mockery::any()) 1 tests/Unit/Services/ChunkingIntegrationTest.php:220 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\CustomerBatchUpsertLogicCov… TestAlreadyExist A test with the description `actingAs App\Models\User` already exists in the filename `/home/wbeltran/Documentos/projects/SuiteX/vendor/pestphp/pest/bin/pest`. at tests/TestCase.php:76 72▕ }); 73▕ 74▕ // Optionally create a user and act as them for tests 75▕ $this->user = \App\Models\User::factory()->create(); ➜ 76▕ \Pest\Laravel\actingAs($this->user); 77▕ 78▕ // Load tenant routes if needed 79▕ require base_path('routes/tenant.php'); 80▕ } ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\CustomerBatchUpsertLogicCov… TestAlreadyExist A test with the description `actingAs App\Models\User` already exists in the filename `/home/wbeltran/Documentos/projects/SuiteX/vendor/pestphp/pest/bin/pest`. at tests/TestCase.php:76 72▕ }); 73▕ 74▕ // Optionally create a user and act as them for tests 75▕ $this->user = \App\Models\User::factory()->create(); ➜ 76▕ \Pest\Laravel\actingAs($this->user); 77▕ 78▕ // Load tenant routes if needed 79▕ require base_path('routes/tenant.php'); 80▕ } ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\CustomerBatchUpsertLogicCov… TestAlreadyExist A test with the description `actingAs App\Models\User` already exists in the filename `/home/wbeltran/Documentos/projects/SuiteX/vendor/pestphp/pest/bin/pest`. at tests/TestCase.php:76 72▕ }); 73▕ 74▕ // Optionally create a user and act as them for tests 75▕ $this->user = \App\Models\User::factory()->create(); ➜ 76▕ \Pest\Laravel\actingAs($this->user); 77▕ 78▕ // Load tenant routes if needed 79▕ require base_path('routes/tenant.php'); 80▕ } ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\CustomerBatchUpsertLogicCov… TestAlreadyExist A test with the description `actingAs App\Models\User` already exists in the filename `/home/wbeltran/Documentos/projects/SuiteX/vendor/pestphp/pest/bin/pest`. at tests/TestCase.php:76 72▕ }); 73▕ 74▕ // Optionally create a user and act as them for tests 75▕ $this->user = \App\Models\User::factory()->create(); ➜ 76▕ \Pest\Laravel\actingAs($this->user); 77▕ 78▕ // Load tenant routes if needed 79▕ require base_path('routes/tenant.php'); 80▕ } ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\CustomerBatchUpsertLogicCov… TestAlreadyExist A test with the description `actingAs App\Models\User` already exists in the filename `/home/wbeltran/Documentos/projects/SuiteX/vendor/pestphp/pest/bin/pest`. at tests/TestCase.php:76 72▕ }); 73▕ 74▕ // Optionally create a user and act as them for tests 75▕ $this->user = \App\Models\User::factory()->create(); ➜ 76▕ \Pest\Laravel\actingAs($this->user); 77▕ 78▕ // Load tenant routes if needed 79▕ require base_path('routes/tenant.php'); 80▕ } ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\FieldMappingCorruptionFixTest > `Field Mappin… Failed asserting that 0 is identical to 1. at tests/Unit/Services/FieldMappingCorruptionFixTest.php:112 108▕ $result = $service->batchUpsert($netsuiteRecords, $context); 109▕ 110▕ dump('Field Mapping Preservation Test Result:', $result); 111▕ ➜ 112▕ expect($result['success'])->toBe(1); 113▕ expect($result['errors'])->toBeEmpty(); 114▕ 115▕ // Verify the record was created with correctly mapped values 116▕ $customer = DB::connection('tenant_connection') 1 tests/Unit/Services/FieldMappingCorruptionFixTest.php:112 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\FieldMappingCorruptionFixTest > `Field Mappin… Failed asserting that false is true. at tests/Unit/Services/FieldMappingCorruptionFixTest.php:161 157▕ 158▕ // Check that validation detected potential issues (may be in detailed_performance_report) 159▕ $hasFieldMappingIssues = isset($result['performance_metrics']['field_mapping_issues']) || 160▕ isset($result['detailed_performance_report']['field_mapping_issues']); ➜ 161▕ expect($hasFieldMappingIssues)->toBeTrue(); 162▕ 163▕ // Verify logs were created for validation issues 164▕ Log::shouldHaveReceived('warning') 165▕ ->withArgs(function ($message, $data) { 1 tests/Unit/Services/FieldMappingCorruptionFixTest.php:161 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\FieldMappingCorruptionFixTest > `Field Mappin… Failed asserting that 0 is identical to 2. at tests/Unit/Services/FieldMappingCorruptionFixTest.php:222 218▕ $result = $service->batchUpsert($netsuiteRecords, $context); 219▕ 220▕ dump('Mixed Records Field Mapping Result:', $result); 221▕ ➜ 222▕ expect($result['success'])->toBe(2); 223▕ expect($result['errors'])->toBeEmpty(); 224▕ 225▕ // Verify person customer mapped correctly 226▕ $personCustomer = DB::connection('tenant_connection') 1 tests/Unit/Services/FieldMappingCorruptionFixTest.php:222 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\FieldMappingCorruptionFixTest > `Field Mappin… Failed asserting that 0 is identical to 1. at tests/Unit/Services/FieldMappingCorruptionFixTest.php:280 276▕ ]; 277▕ 278▕ $result = $service->batchUpsert($netsuiteRecords, $context); 279▕ ➜ 280▕ expect($result['success'])->toBe(1); 281▕ 282▕ $customer = DB::connection('tenant_connection') 283▕ ->table('customers') 284▕ ->where('refid', '999999') // Should use entityId, not id 1 tests/Unit/Services/FieldMappingCorruptionFixTest.php:280 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\FieldMappingCorruptionFixTest > `Field Mappin… Failed asserting that 0 is identical to 1. at tests/Unit/Services/FieldMappingCorruptionFixTest.php:321 317▕ ]; 318▕ 319▕ $result = $service->batchUpsert($netsuiteRecords, $context); 320▕ ➜ 321▕ expect($result['success'])->toBe(1); 322▕ 323▕ $customer = DB::connection('tenant_connection') 324▕ ->table('customers') 325▕ ->where('refid', '555555') 1 tests/Unit/Services/FieldMappingCorruptionFixTest.php:321 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\ImportJobs\WaveCoordinatorTra… QueryException SQLSTATE[HY000]: General error: 1 no such table: wave_coordination (Connection: tenant_connection, SQL: select "status" from "wave_coordination" where "job_id" = job_wci and "wave_number" = 10 limit 1) at vendor/laravel/framework/src/Illuminate/Database/Connection.php:423 419▕ // For select statements, we'll simply execute the query and return an array 420▕ // of the database result set. Each element in the array will be a single 421▕ // row from the database table, and will either be an array or objects. 422▕ $statement = $this->prepared( ➜ 423▕ $this->getPdoForSelect($useReadPdo)->prepare($query) 424▕ ); 425▕ 426▕ $this->bindValues($statement, $this->prepareBindings($bindings)); 427▕ +10 vendor frames  11 tests/Unit/Services/ImportJobs/WaveCoordinatorTransactionLineInjectionTest.php:99 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\Ipaas\ThrottleManagerTest > `ThrottleM… Error Class "RedisException" not found at tests/Unit/Services/Ipaas/ThrottleManagerTest.php:418 414▕ $attempts = 0; 415▕ Redis::shouldReceive('get') 416▕ ->andReturnUsing(function () use (&$attempts) { 417▕ $attempts++; ➜ 418▕ throw new \RedisException('Redis connection failed'); 419▕ }); 420▕ 421▕ $callback = function () { 422▕ return ['httpStatusCode' => 200, 'response' => 'success']; 1 tests/Unit/Services/Ipaas/ThrottleManagerTest.php:418 +1 vendor frames  3 src/App/Services/iPaas/ThrottleManager.php:267 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\NetSuite\CanonicalIdExtractorTest > `Canonica… Failed asserting that null is identical to 777. at tests/Unit/Services/NetSuite/CanonicalIdExtractorTest.php:19 15▕ it('falls back to line_id when uniquekey missing', function () { 16▕ [$refid, $external] = Extractor::forTransactionLine([ 17▕ 'line_id' => 777, 18▕ ]); ➜ 19▕ expect($refid)->toBe(777); 20▕ expect($external)->toBe('777'); 21▕ }); 22▕ 23▕ it('falls back to id_* suffix key when aliases absent', function () { 1 tests/Unit/Services/NetSuite/CanonicalIdExtractorTest.php:19 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\NetSuite\CanonicalIdExtractorTest > `Canonica… Failed asserting that null is identical to 456. at tests/Unit/Services/NetSuite/CanonicalIdExtractorTest.php:27 23▕ it('falls back to id_* suffix key when aliases absent', function () { 24▕ [$refid, $external] = Extractor::forTransactionLine([ 25▕ 'id_0' => 456, 26▕ ]); ➜ 27▕ expect($refid)->toBe(456); 28▕ expect($external)->toBe('456'); 29▕ }); 30▕ }); 31▕ 1 tests/Unit/Services/NetSuite/CanonicalIdExtractorTest.php:27 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\NetSuite\CanonicalIdExtractorTest > `Canonica… Failed asserting that two strings are identical. -'EXT-999' +'999' at tests/Unit/Services/NetSuite/CanonicalIdExtractorTest.php:39 35▕ 'item_id' => 999, 36▕ 'item_external_id' => 'EXT-999', 37▕ ]); 38▕ expect($refid)->toBe(999); ➜ 39▕ expect($external)->toBe('EXT-999'); 40▕ }); 41▕ 42▕ it('falls back to string(item_id) when external missing', function () { 43▕ [$refid, $external] = Extractor::forItem([ 1 tests/Unit/Services/NetSuite/CanonicalIdExtractorTest.php:39 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\NetSuite\UnifiedQueryBuilde… RuntimeException Could not load mock App\Helpers\RecordTypeFields, class already exists at tests/Unit/Services/NetSuite/UnifiedQueryBuilderTest.php:175 171▕ ]; 172▕ }); 173▕ 174▕ // Mock RecordTypeFields helper ➜ 175▕ Mockery::mock('alias:App\Helpers\RecordTypeFields') 176▕ ->shouldReceive('modelCriteria') 177▕ ->andReturn(['criteria' => 'test', 'where' => '', 'inner' => '']); 178▕ 179▕ $integration = createMockIntegration(); ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\NetSuite\UnifiedQueryBuilde… RuntimeException Could not load mock App\Helpers\RecordTypeFields, class already exists at tests/Unit/Services/NetSuite/UnifiedQueryBuilderTest.php:233 229▕ 230▕ return ['success' => false, 'data' => [], 'meta' => ['error' => 'Unexpected']]; 231▕ }); 232▕ ➜ 233▕ Mockery::mock('alias:App\Helpers\RecordTypeFields') 234▕ ->shouldReceive('modelCriteria') 235▕ ->andReturn(['criteria' => 'test', 'where' => '', 'inner' => '']); 236▕ 237▕ $integration = createMockIntegration(); ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\NetSuite\UnifiedQueryBuilde… RuntimeException Could not load mock App\Helpers\RecordTypeFields, class already exists at tests/Unit/Services/NetSuite/UnifiedQueryBuilderTest.php:295 291▕ 'meta' => ['count' => 1, 'offset' => 0, 'limit' => 1] 292▕ ]; 293▕ }); 294▕ ➜ 295▕ Mockery::mock('alias:App\Helpers\RecordTypeFields') 296▕ ->shouldReceive('modelCriteria') 297▕ ->andReturn(['criteria' => 'test', 'where' => '', 'inner' => '']); 298▕ 299▕ $integration = createMockIntegration(); ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\NetSuite\UnifiedQueryBuilde… RuntimeException Could not load mock App\Helpers\RecordTypeFields, class already exists at tests/Unit/Services/NetSuite/UnifiedQueryBuilderTest.php:332 328▕ 'meta' => ['count' => 0, 'offset' => 0, 'limit' => 1, 'error' => 'All fields invalid'] 329▕ ]; 330▕ }); 331▕ ➜ 332▕ Mockery::mock('alias:App\Helpers\RecordTypeFields') 333▕ ->shouldReceive('modelCriteria') 334▕ ->andReturn(['criteria' => 'test', 'where' => '', 'inner' => '']); 335▕ 336▕ $integration = createMockIntegration(); ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\NetSuite\UnifiedQueryBuilde… RuntimeException Could not load mock App\Helpers\RecordTypeFields, class already exists at tests/Unit/Services/NetSuite/UnifiedQueryBuilderTest.php:375 371▕ 'meta' => ['count' => 1, 'offset' => 0, 'limit' => 1] 372▕ ]; 373▕ }); 374▕ ➜ 375▕ Mockery::mock('alias:App\Helpers\RecordTypeFields') 376▕ ->shouldReceive('modelCriteria') 377▕ ->andReturn(['criteria' => 'test', 'where' => '', 'inner' => '']); 378▕ 379▕ $integration = createMockIntegration(); ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\NetSuite\UnifiedQueryBuilde… RuntimeException Could not load mock App\Helpers\RecordTypeFields, class already exists at tests/Unit/Services/NetSuite/UnifiedQueryBuilderTest.php:417 413▕ 'meta' => ['count' => 1, 'offset' => 0, 'limit' => 1] 414▕ ]; 415▕ }); 416▕ ➜ 417▕ Mockery::mock('alias:App\Helpers\RecordTypeFields') 418▕ ->shouldReceive('modelCriteria') 419▕ ->andReturn(['criteria' => 'test', 'where' => '', 'inner' => '']); 420▕ 421▕ $integration = createMockIntegration(); ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\NetSuite\UnifiedQueryBuilde… RuntimeException Could not load mock App\Helpers\RecordTypeFields, class already exists at tests/Unit/Services/NetSuite/UnifiedQueryBuilderTest.php:464 460▕ $mock->shouldReceive('setDeploy')->andReturnSelf(); 461▕ $mock->shouldReceive('fetchData')->never(); 462▕ }); 463▕ ➜ 464▕ Mockery::mock('alias:App\Helpers\RecordTypeFields') 465▕ ->shouldReceive('modelCriteria') 466▕ ->andReturn(['criteria' => 'test', 'where' => '', 'inner' => '']); 467▕ 468▕ $integration = createMockIntegration(); ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\NetSuite\UnifiedQueryBuilderTest > `UnifiedQu… Failed asserting that true is false. at tests/Unit/Services/NetSuite/UnifiedQueryBuilderTest.php:506 502▕ 'inParentIds' => [123, 456, 789], 503▕ 'skipCache' => true 504▕ ]); 505▕ ➜ 506▕ expect($result['probed'])->toBeFalse() 507▕ ->and($result['query'])->toContain('transaction IN (123,456,789)') 508▕ ->and($result['query'])->toContain("mainline = 'F'") 509▕ ->and($result['metadata']['parent_first'])->toBeTrue(); 510▕ }); 1 tests/Unit/Services/NetSuite/UnifiedQueryBuilderTest.php:506 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\QueryProcessingServiceTest… RuntimeException Could not load mock Domain\iPaas\Flows\Models\Flow, class already exists at tests/Unit/Services/QueryProcessingServiceTest.php:13 9▕ 10▕ beforeEach(function () { 11▕ $this->service = new QueryProcessingService(); 12▕ // Use Mockery alias for static method mocking ➜ 13▕ $this->mockFlow = Mockery::mock('alias:Domain\\iPaas\\Flows\\Models\\Flow'); 14▕ }); 15▕ 16▕ afterEach(function () { 17▕ Mockery::close(); ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\QueryProcessingServiceTest… RuntimeException Could not load mock Domain\iPaas\Flows\Models\Flow, class already exists at tests/Unit/Services/QueryProcessingServiceTest.php:13 9▕ 10▕ beforeEach(function () { 11▕ $this->service = new QueryProcessingService(); 12▕ // Use Mockery alias for static method mocking ➜ 13▕ $this->mockFlow = Mockery::mock('alias:Domain\\iPaas\\Flows\\Models\\Flow'); 14▕ }); 15▕ 16▕ afterEach(function () { 17▕ Mockery::close(); ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\QueryProcessingServiceTest… RuntimeException Could not load mock Domain\iPaas\Flows\Models\Flow, class already exists at tests/Unit/Services/QueryProcessingServiceTest.php:13 9▕ 10▕ beforeEach(function () { 11▕ $this->service = new QueryProcessingService(); 12▕ // Use Mockery alias for static method mocking ➜ 13▕ $this->mockFlow = Mockery::mock('alias:Domain\\iPaas\\Flows\\Models\\Flow'); 14▕ }); 15▕ 16▕ afterEach(function () { 17▕ Mockery::close(); ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\QueryProcessingServiceTest… RuntimeException Could not load mock Domain\iPaas\Flows\Models\Flow, class already exists at tests/Unit/Services/QueryProcessingServiceTest.php:13 9▕ 10▕ beforeEach(function () { 11▕ $this->service = new QueryProcessingService(); 12▕ // Use Mockery alias for static method mocking ➜ 13▕ $this->mockFlow = Mockery::mock('alias:Domain\\iPaas\\Flows\\Models\\Flow'); 14▕ }); 15▕ 16▕ afterEach(function () { 17▕ Mockery::close(); ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\QueryProcessingServiceTest… RuntimeException Could not load mock Domain\iPaas\Flows\Models\Flow, class already exists at tests/Unit/Services/QueryProcessingServiceTest.php:13 9▕ 10▕ beforeEach(function () { 11▕ $this->service = new QueryProcessingService(); 12▕ // Use Mockery alias for static method mocking ➜ 13▕ $this->mockFlow = Mockery::mock('alias:Domain\\iPaas\\Flows\\Models\\Flow'); 14▕ }); 15▕ 16▕ afterEach(function () { 17▕ Mockery::close(); ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\QueryProcessingServiceTest… RuntimeException Could not load mock Domain\iPaas\Flows\Models\Flow, class already exists at tests/Unit/Services/QueryProcessingServiceTest.php:13 9▕ 10▕ beforeEach(function () { 11▕ $this->service = new QueryProcessingService(); 12▕ // Use Mockery alias for static method mocking ➜ 13▕ $this->mockFlow = Mockery::mock('alias:Domain\\iPaas\\Flows\\Models\\Flow'); 14▕ }); 15▕ 16▕ afterEach(function () { 17▕ Mockery::close(); ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\QueryProcessingServiceTest… RuntimeException Could not load mock Domain\iPaas\Flows\Models\Flow, class already exists at tests/Unit/Services/QueryProcessingServiceTest.php:13 9▕ 10▕ beforeEach(function () { 11▕ $this->service = new QueryProcessingService(); 12▕ // Use Mockery alias for static method mocking ➜ 13▕ $this->mockFlow = Mockery::mock('alias:Domain\\iPaas\\Flows\\Models\\Flow'); 14▕ }); 15▕ 16▕ afterEach(function () { 17▕ Mockery::close(); ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\QueryProcessingServiceTest… RuntimeException Could not load mock Domain\iPaas\Flows\Models\Flow, class already exists at tests/Unit/Services/QueryProcessingServiceTest.php:13 9▕ 10▕ beforeEach(function () { 11▕ $this->service = new QueryProcessingService(); 12▕ // Use Mockery alias for static method mocking ➜ 13▕ $this->mockFlow = Mockery::mock('alias:Domain\\iPaas\\Flows\\Models\\Flow'); 14▕ }); 15▕ 16▕ afterEach(function () { 17▕ Mockery::close(); ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\QueryProcessingServiceTest… RuntimeException Could not load mock Domain\iPaas\Flows\Models\Flow, class already exists at tests/Unit/Services/QueryProcessingServiceTest.php:13 9▕ 10▕ beforeEach(function () { 11▕ $this->service = new QueryProcessingService(); 12▕ // Use Mockery alias for static method mocking ➜ 13▕ $this->mockFlow = Mockery::mock('alias:Domain\\iPaas\\Flows\\Models\\Flow'); 14▕ }); 15▕ 16▕ afterEach(function () { 17▕ Mockery::close(); ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\QueryProcessingServiceTest… RuntimeException Could not load mock Domain\iPaas\Flows\Models\Flow, class already exists at tests/Unit/Services/QueryProcessingServiceTest.php:13 9▕ 10▕ beforeEach(function () { 11▕ $this->service = new QueryProcessingService(); 12▕ // Use Mockery alias for static method mocking ➜ 13▕ $this->mockFlow = Mockery::mock('alias:Domain\\iPaas\\Flows\\Models\\Flow'); 14▕ }); 15▕ 16▕ afterEach(function () { 17▕ Mockery::close(); ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\QueryProcessingServiceTest… RuntimeException Could not load mock Domain\iPaas\Flows\Models\Flow, class already exists at tests/Unit/Services/QueryProcessingServiceTest.php:13 9▕ 10▕ beforeEach(function () { 11▕ $this->service = new QueryProcessingService(); 12▕ // Use Mockery alias for static method mocking ➜ 13▕ $this->mockFlow = Mockery::mock('alias:Domain\\iPaas\\Flows\\Models\\Flow'); 14▕ }); 15▕ 16▕ afterEach(function () { 17▕ Mockery::close(); ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\QueryProcessingServiceTest… RuntimeException Could not load mock Domain\iPaas\Flows\Models\Flow, class already exists at tests/Unit/Services/QueryProcessingServiceTest.php:13 9▕ 10▕ beforeEach(function () { 11▕ $this->service = new QueryProcessingService(); 12▕ // Use Mockery alias for static method mocking ➜ 13▕ $this->mockFlow = Mockery::mock('alias:Domain\\iPaas\\Flows\\Models\\Flow'); 14▕ }); 15▕ 16▕ afterEach(function () { 17▕ Mockery::close(); ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\QueryProcessingServiceTest… RuntimeException Could not load mock Domain\iPaas\Flows\Models\Flow, class already exists at tests/Unit/Services/QueryProcessingServiceTest.php:13 9▕ 10▕ beforeEach(function () { 11▕ $this->service = new QueryProcessingService(); 12▕ // Use Mockery alias for static method mocking ➜ 13▕ $this->mockFlow = Mockery::mock('alias:Domain\\iPaas\\Flows\\Models\\Flow'); 14▕ }); 15▕ 16▕ afterEach(function () { 17▕ Mockery::close(); ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\QueryProcessingServiceTest… RuntimeException Could not load mock Domain\iPaas\Flows\Models\Flow, class already exists at tests/Unit/Services/QueryProcessingServiceTest.php:13 9▕ 10▕ beforeEach(function () { 11▕ $this->service = new QueryProcessingService(); 12▕ // Use Mockery alias for static method mocking ➜ 13▕ $this->mockFlow = Mockery::mock('alias:Domain\\iPaas\\Flows\\Models\\Flow'); 14▕ }); 15▕ 16▕ afterEach(function () { 17▕ Mockery::close(); ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\QueryProcessingServiceTest… RuntimeException Could not load mock Domain\iPaas\Flows\Models\Flow, class already exists at tests/Unit/Services/QueryProcessingServiceTest.php:13 9▕ 10▕ beforeEach(function () { 11▕ $this->service = new QueryProcessingService(); 12▕ // Use Mockery alias for static method mocking ➜ 13▕ $this->mockFlow = Mockery::mock('alias:Domain\\iPaas\\Flows\\Models\\Flow'); 14▕ }); 15▕ 16▕ afterEach(function () { 17▕ Mockery::close(); ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\QueryProcessingServiceTest… RuntimeException Could not load mock Domain\iPaas\Flows\Models\Flow, class already exists at tests/Unit/Services/QueryProcessingServiceTest.php:13 9▕ 10▕ beforeEach(function () { 11▕ $this->service = new QueryProcessingService(); 12▕ // Use Mockery alias for static method mocking ➜ 13▕ $this->mockFlow = Mockery::mock('alias:Domain\\iPaas\\Flows\\Models\\Flow'); 14▕ }); 15▕ 16▕ afterEach(function () { 17▕ Mockery::close(); ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\QueryProcessingServiceTest… RuntimeException Could not load mock Domain\iPaas\Flows\Models\Flow, class already exists at tests/Unit/Services/QueryProcessingServiceTest.php:13 9▕ 10▕ beforeEach(function () { 11▕ $this->service = new QueryProcessingService(); 12▕ // Use Mockery alias for static method mocking ➜ 13▕ $this->mockFlow = Mockery::mock('alias:Domain\\iPaas\\Flows\\Models\\Flow'); 14▕ }); 15▕ 16▕ afterEach(function () { 17▕ Mockery::close(); ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\QueryProcessingServiceTimes… RuntimeException Could not load mock Domain\iPaas\Flows\Models\Flow, class already exists at tests/Unit/Services/QueryProcessingServiceTimestampTest.php:14 10▕ 11▕ beforeEach(function () { 12▕ $this->service = new QueryProcessingService(); 13▕ // Use Mockery alias for static method mocking ➜ 14▕ $this->mockFlow = Mockery::mock('alias:Domain\\iPaas\\Flows\\Models\\Flow'); 15▕ }); 16▕ 17▕ afterEach(function () { 18▕ Mockery::close(); ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\QueryProcessingServiceTimes… RuntimeException Could not load mock Domain\iPaas\Flows\Models\Flow, class already exists at tests/Unit/Services/QueryProcessingServiceTimestampTest.php:14 10▕ 11▕ beforeEach(function () { 12▕ $this->service = new QueryProcessingService(); 13▕ // Use Mockery alias for static method mocking ➜ 14▕ $this->mockFlow = Mockery::mock('alias:Domain\\iPaas\\Flows\\Models\\Flow'); 15▕ }); 16▕ 17▕ afterEach(function () { 18▕ Mockery::close(); ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\QueryProcessingServiceTimes… RuntimeException Could not load mock Domain\iPaas\Flows\Models\Flow, class already exists at tests/Unit/Services/QueryProcessingServiceTimestampTest.php:14 10▕ 11▕ beforeEach(function () { 12▕ $this->service = new QueryProcessingService(); 13▕ // Use Mockery alias for static method mocking ➜ 14▕ $this->mockFlow = Mockery::mock('alias:Domain\\iPaas\\Flows\\Models\\Flow'); 15▕ }); 16▕ 17▕ afterEach(function () { 18▕ Mockery::close(); ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\QueryProcessingServiceTimes… RuntimeException Could not load mock Domain\iPaas\Flows\Models\Flow, class already exists at tests/Unit/Services/QueryProcessingServiceTimestampTest.php:14 10▕ 11▕ beforeEach(function () { 12▕ $this->service = new QueryProcessingService(); 13▕ // Use Mockery alias for static method mocking ➜ 14▕ $this->mockFlow = Mockery::mock('alias:Domain\\iPaas\\Flows\\Models\\Flow'); 15▕ }); 16▕ 17▕ afterEach(function () { 18▕ Mockery::close(); ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\QueryProcessingServiceTimes… RuntimeException Could not load mock Domain\iPaas\Flows\Models\Flow, class already exists at tests/Unit/Services/QueryProcessingServiceTimestampTest.php:14 10▕ 11▕ beforeEach(function () { 12▕ $this->service = new QueryProcessingService(); 13▕ // Use Mockery alias for static method mocking ➜ 14▕ $this->mockFlow = Mockery::mock('alias:Domain\\iPaas\\Flows\\Models\\Flow'); 15▕ }); 16▕ 17▕ afterEach(function () { 18▕ Mockery::close(); ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\QueryProcessingServiceTimes… RuntimeException Could not load mock Domain\iPaas\Flows\Models\Flow, class already exists at tests/Unit/Services/QueryProcessingServiceTimestampTest.php:14 10▕ 11▕ beforeEach(function () { 12▕ $this->service = new QueryProcessingService(); 13▕ // Use Mockery alias for static method mocking ➜ 14▕ $this->mockFlow = Mockery::mock('alias:Domain\\iPaas\\Flows\\Models\\Flow'); 15▕ }); 16▕ 17▕ afterEach(function () { 18▕ Mockery::close(); ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\QueryProcessingServiceTimes… RuntimeException Could not load mock Domain\iPaas\Flows\Models\Flow, class already exists at tests/Unit/Services/QueryProcessingServiceTimestampTest.php:14 10▕ 11▕ beforeEach(function () { 12▕ $this->service = new QueryProcessingService(); 13▕ // Use Mockery alias for static method mocking ➜ 14▕ $this->mockFlow = Mockery::mock('alias:Domain\\iPaas\\Flows\\Models\\Flow'); 15▕ }); 16▕ 17▕ afterEach(function () { 18▕ Mockery::close(); ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\QueryProcessingServiceTimes… RuntimeException Could not load mock Domain\iPaas\Flows\Models\Flow, class already exists at tests/Unit/Services/QueryProcessingServiceTimestampTest.php:14 10▕ 11▕ beforeEach(function () { 12▕ $this->service = new QueryProcessingService(); 13▕ // Use Mockery alias for static method mocking ➜ 14▕ $this->mockFlow = Mockery::mock('alias:Domain\\iPaas\\Flows\\Models\\Flow'); 15▕ }); 16▕ 17▕ afterEach(function () { 18▕ Mockery::close(); ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\QueryProcessingServiceTimes… RuntimeException Could not load mock Domain\iPaas\Flows\Models\Flow, class already exists at tests/Unit/Services/QueryProcessingServiceTimestampTest.php:14 10▕ 11▕ beforeEach(function () { 12▕ $this->service = new QueryProcessingService(); 13▕ // Use Mockery alias for static method mocking ➜ 14▕ $this->mockFlow = Mockery::mock('alias:Domain\\iPaas\\Flows\\Models\\Flow'); 15▕ }); 16▕ 17▕ afterEach(function () { 18▕ Mockery::close(); ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\SalesOrderBatchUpsertTest > `SalesOrderBatchU… Failed asserting that 0 is greater than 0. at tests/Unit/Services/SalesOrderBatchUpsertTest.php:89 85▕ $result = $service->handle($netsuiteRecords, 'test_job_123', 1); 86▕ 87▕ expect($result)->toHaveKey('success'); 88▕ expect($result)->toHaveKey('strategy_used'); ➜ 89▕ expect($result['success'])->toBeGreaterThan(0); 90▕ 91▕ // Verify records were inserted into database 92▕ $recordCount = DB::connection('tenant_connection')->table('salesorders')->count(); 93▕ expect($recordCount)->toBe(2); 1 tests/Unit/Services/SalesOrderBatchUpsertTest.php:89 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\SalesOrderBatchUpsertTest > `SalesOrderBatchU… Failed asserting that 0 is greater than 0. at tests/Unit/Services/SalesOrderBatchUpsertTest.php:135 131▕ ]; 132▕ 133▕ $result = $service->handle($netsuiteRecords, 'test_job_123', 1); 134▕ ➜ 135▕ expect($result['success'])->toBeGreaterThan(0); 136▕ 137▕ // Verify boolean normalization 138▕ $salesOrder = DB::connection('tenant_connection') 139▕ ->table('salesorders') 1 tests/Unit/Services/SalesOrderBatchUpsertTest.php:135 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\SalesOrderBatchUpsertTest > `SalesOrderBatchU… Failed asserting that 0 is greater than 0. at tests/Unit/Services/SalesOrderBatchUpsertTest.php:184 180▕ ]; 181▕ 182▕ $result = $service->handle($netsuiteRecords, 'test_job_123', 1); 183▕ ➜ 184▕ expect($result['success'])->toBeGreaterThan(0); 185▕ 186▕ // Verify case-insensitive field mapping worked 187▕ $salesOrder = DB::connection('tenant_connection') 188▕ ->table('salesorders') 1 tests/Unit/Services/SalesOrderBatchUpsertTest.php:184 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\TransactionLineBatchUpsertTest > `Transaction… Failed asserting that 0 is greater than 0. at tests/Unit/Services/TransactionLineBatchUpsertTest.php:126 122▕ if ($result['success'] === 0) { 123▕ dump('Result details:', $result); 124▕ } 125▕ ➜ 126▕ expect($result['success'])->toBeGreaterThan(0); 127▕ 128▕ // Verify records were inserted into database 129▕ $recordCount = DB::connection('tenant_connection')->table('transaction_lines')->count(); 130▕ expect($recordCount)->toBe(2); 1 tests/Unit/Services/TransactionLineBatchUpsertTest.php:126 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\TransactionLineBatchUpsertTest > `Transaction… Failed asserting that 0 is greater than 0. at tests/Unit/Services/TransactionLineBatchUpsertTest.php:176 172▕ ]; 173▕ 174▕ $result = $service->handle($netsuiteRecords, 'test_job_123', 1); 175▕ ➜ 176▕ expect($result['success'])->toBeGreaterThan(0); 177▕ 178▕ // Verify boolean normalization 179▕ $transactionLine = DB::connection('tenant_connection') 180▕ ->table('transaction_lines') 1 tests/Unit/Services/TransactionLineBatchUpsertTest.php:176 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\TransactionLineBatchUpsertTest > `Transaction… Failed asserting that 0 is greater than 0. at tests/Unit/Services/TransactionLineBatchUpsertTest.php:209 205▕ ]; 206▕ 207▕ $result = $service->handle($netsuiteRecords, 'test_job_123', 1); 208▕ ➜ 209▕ expect($result['success'])->toBeGreaterThan(0); 210▕ 211▕ // Verify numeric normalization 212▕ $transactionLine = DB::connection('tenant_connection') 213▕ ->table('transaction_lines') 1 tests/Unit/Services/TransactionLineBatchUpsertTest.php:209 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\TransactionLineBatchUpsertTest > `Transaction… Failed asserting that 0 is greater than 0. at tests/Unit/Services/TransactionLineBatchUpsertTest.php:263 259▕ ]; 260▕ 261▕ $result = $service->handle($netsuiteRecords, 'test_job_123', 1); 262▕ ➜ 263▕ expect($result['success'])->toBeGreaterThan(0); 264▕ 265▕ // Verify case-insensitive field mapping worked 266▕ $transactionLine = DB::connection('tenant_connection') 267▕ ->table('transaction_lines') 1 tests/Unit/Services/TransactionLineBatchUpsertTest.php:263 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Services\TransactionLineBatchUpsertTest > `Transaction… Failed asserting that 0 is greater than 0. at tests/Unit/Services/TransactionLineBatchUpsertTest.php:305 301▕ ]; 302▕ 303▕ $result = $service->handle($netsuiteRecords, 'test_job_123', 1); 304▕ ➜ 305▕ expect($result['success'])->toBeGreaterThan(0); 306▕ 307▕ // Verify complex record was processed correctly 308▕ $transactionLine = DB::connection('tenant_connection') 309▕ ->table('transaction_lines') 1 tests/Unit/Services/TransactionLineBatchUpsertTest.php:305 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Unit\Traits\HasEncryptedFieldsTest > `Invitation Token Encr… Expecting 'invitation_token_12345' not to be 'invitation_token_12345'. at tests/Unit/Traits/HasEncryptedFieldsTest.php:203 199▕ ->table('invitations') 200▕ ->where('id', $invitation->id) 201▕ ->first(); 202▕ ➜ 203▕ expect($rawData->token)->not->toBe($testData['token']); 204▕ expect($rawData->token)->not->toBeEmpty(); 205▕ 206▕ // Verificar accessor interno 207▕ expect($invitation->getDecryptedToken())->toBe($testData['token']); 1 tests/Unit/Traits/HasEncryptedFieldsTest.php:203 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Feature\Http\Controllers\Api\ApiV1TenantContextTest > `API… Expected response status code [201] but received 404. Failed asserting that 404 is identical to 201. at tests/Feature/Http/Controllers/Api/ApiV1TenantContextTest.php:160 156▕ ]; 157▕ 158▕ $response = $this->postTenantJson('/api/v1/task', $projectData); 159▕ ➜ 160▕ $response->assertStatus(201) 161▕ ->assertJson([ 162▕ 'success' => true, 163▕ 'data' => [ 164▕ 'type' => 'project', ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Feature\Http\Controllers\Api\ApiV1TenantContextTest > `API… Failed asserting that an array contains 200. at tests/Feature/Http/Controllers/Api/ApiV1TenantContextTest.php:177 173▕ 'Host' => 'test-tenant.app.localhost', 174▕ ])->getJson('http://test-tenant.app.localhost/api/v1/example'); 175▕ 176▕ // Debería requerir autenticación ➜ 177▕ expect($response->getStatusCode())->toBeIn([401, 302]); 178▕ }); 179▕ }); 180▕ 1 tests/Feature/Http/Controllers/Api/ApiV1TenantContextTest.php:177 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Feature\Http\Controllers\ipaas\ApiNodeControllerTest > `Api… Expected response status code [201] but received 500. Failed asserting that 500 is identical to 201. at tests/Feature/Http/Controllers/ipaas/ApiNodeControllerTest.php:147 143▕ 144▕ $response = $this->postTenantJson('/ipaas/api-node/store', $apiNodeData); 145▕ 146▕ // MUST return exactly 201 (Created) ➜ 147▕ $response->assertStatus(201) 148▕ ->assertJson([ 149▕ 'success' => true, 150▕ 'message' => 'Api node created successfully' 151▕ ]) ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Feature\Http\Controllers\ipaas\ApiNodeControllerTest > `Api… Failed asserting that an array contains 500. at tests/Feature/Http/Controllers/ipaas/ApiNodeControllerTest.php:250 246▕ $response = $this->postTenantJson('/ipaas/api-node/store', $data); 247▕ 248▕ // With array validation, this might not fail on size but on structure 249▕ // Adjusting expectation: should still pass or fail on other grounds ➜ 250▕ expect($response->status())->toBeIn([201, 422]); 251▕ }); 252▕ }); 253▕ 254▕ describe('ApiNodeController - Show', function () { 1 tests/Feature/Http/Controllers/ipaas/ApiNodeControllerTest.php:250 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Feature\Http\Controllers\ipaas\ConnectorControllerTest > `C… Expected response status code [201] but received 500. Failed asserting that 500 is identical to 201. at tests/Feature/Http/Controllers/ipaas/ConnectorControllerTest.php:219 215▕ 216▕ // Use tenant-aware JSON request helper 217▕ $response = $this->postTenantJson('/ipaas/connector', $data); 218▕ ➜ 219▕ $response->assertStatus(201) 220▕ ->assertJson([ 221▕ 'success' => true, 222▕ 'message' => 'Connector created successfully' 223▕ ]) ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Feature\Http\Controllers\ipaas\ConnectorControllerTest > `C… Expected response status code [201] but received 500. Failed asserting that 500 is identical to 201. The following exception occurred during the last request: Error: Call to a member function __call() on null in /home/wbeltran/Documentos/projects/SuiteX/vendor/mockery/mockery/library/Mockery/Loader/EvalLoader.php(30) : eval()'d code:852 Stack trace: #0 /home/wbeltran/Documentos/projects/SuiteX/vendor/mockery/mockery/library/Mockery/Loader/EvalLoader.php(30) : eval()'d code(424): App\Helpers\IpaasHelper::_mockery_handleStaticMethodCall() #1 /home/wbeltran/Documentos/projects/SuiteX/src/Domain/iPaas/Connectors/Actions/CreateConnector.php(133): App\Helpers\IpaasHelper::__callStatic() #2 /home/wbeltran/Documentos/projects/SuiteX/src/App/Http/Controllers/iPaas/ConnectorController.php(67): Domain\iPaas\Connectors\Actions\CreateConnector::create() #3 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Routing/Controller.php(54): App\Http\Controllers\Ipaas\ConnectorController->store() #4 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(43): Illuminate\Routing\Controller->callAction() #5 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Routing/Route.php(259): Illuminate\Routing\ControllerDispatcher->dispatch() #6 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Routing/Route.php(205): Illuminate\Routing\Route->runController() #7 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Routing/Router.php(806): Illuminate\Routing\Route->run() #8 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\Routing\Router->Illuminate\Routing\{closure}() #9 /home/wbeltran/Documentos/projects/SuiteX/src/App/Http/Middleware/EnsureUserCanManageIpaas.php(66): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() #10 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): App\Http\Middleware\EnsureUserCanManageIpaas->handle() #11 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Auth/Middleware/Authenticate.php(57): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() #12 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Auth\Middleware\Authenticate->handle() #13 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() #14 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Routing/Router.php(805): Illuminate\Pipeline\Pipeline->then() #15 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Routing/Router.php(784): Illuminate\Routing\Router->runRouteWithinStack() #16 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Routing/Router.php(748): Illuminate\Routing\Router->runRoute() #17 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Routing/Router.php(737): Illuminate\Routing\Router->dispatchToRoute() #18 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(200): Illuminate\Routing\Router->dispatch() #19 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\Foundation\Http\Kernel->Illuminate\Foundation\Http\{closure}() #20 /home/wbeltran/Documentos/projects/SuiteX/vendor/livewire/livewire/src/Features/SupportDisablingBackButtonCache/DisableBackButtonCacheMiddleware.php(19): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() #21 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Livewire\Features\SupportDisablingBackButtonCache\DisableBackButtonCacheMiddleware->handle() #22 /home/wbeltran/Documentos/projects/SuiteX/vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php(59): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() #23 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Barryvdh\Debugbar\Middleware\InjectDebugbar->handle() #24 /home/wbeltran/Documentos/projects/SuiteX/src/App/Http/Middleware/AdminMiddleware.php(28): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() #25 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): App\Http\Middleware\AdminMiddleware->handle() #26 /home/wbeltran/Documentos/projects/SuiteX/src/App/Http/Middleware/TenantMiddleware.php(18): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() #27 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): App\Http\Middleware\TenantMiddleware->handle() #28 /home/wbeltran/Documentos/projects/SuiteX/src/App/Http/Middleware/SubdomainMiddleware.php(34): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() #29 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): App\Http\Middleware\SubdomainMiddleware->handle() #30 /home/wbeltran/Documentos/projects/SuiteX/src/App/Http/Middleware/CheckInstanceActive.php(42): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() #31 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): App\Http\Middleware\CheckInstanceActive->handle() #32 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() #33 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php(31): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle() #34 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull->handle() #35 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() #36 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle() #37 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Foundation\Http\Middleware\TrimStrings->handle() #38 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() #39 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Foundation\Http\Middleware\ValidatePostSize->handle() #40 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(99): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() #41 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Foundation\Http\Middleware\PreventRequestsDuringMaintenance->handle() #42 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(49): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() #43 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Http\Middleware\HandleCors->handle() #44 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(39): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() #45 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Http\Middleware\TrustProxies->handle() #46 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() #47 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(175): Illuminate\Pipeline\Pipeline->then() #48 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(144): Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter() #49 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Foundation/Testing/Concerns/MakesHttpRequests.php(585): Illuminate\Foundation\Http\Kernel->handle() #50 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Foundation/Testing/Concerns/MakesHttpRequests.php(551): Illuminate\Foundation\Testing\TestCase->call() #51 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Foundation/Testing/Concerns/MakesHttpRequests.php(389): Illuminate\Foundation\Testing\TestCase->json() #52 /home/wbeltran/Documentos/projects/SuiteX/tests/Feature/Http/Controllers/ipaas/ConnectorControllerTest.php(285): Illuminate\Foundation\Testing\TestCase->postJson() #53 /home/wbeltran/Documentos/projects/SuiteX/vendor/pestphp/pest/src/Factories/TestCaseMethodFactory.php(110): P\Tests\Feature\Http\Controllers\ipaas\ConnectorControllerTest->{closure}() #54 [internal function]: P\Tests\Feature\Http\Controllers\ipaas\ConnectorControllerTest->Pest\Factories\{closure}() #55 /home/wbeltran/Documentos/projects/SuiteX/vendor/pestphp/pest/src/Concerns/Testable.php(339): call_user_func_array() #56 /home/wbeltran/Documentos/projects/SuiteX/vendor/pestphp/pest/src/Support/ExceptionTrace.php(26): P\Tests\Feature\Http\Controllers\ipaas\ConnectorControllerTest->Pest\Concerns\{closure}() #57 /home/wbeltran/Documentos/projects/SuiteX/vendor/pestphp/pest/src/Concerns/Testable.php(339): Pest\Support\ExceptionTrace::ensure() #58 /home/wbeltran/Documentos/projects/SuiteX/vendor/pestphp/pest/src/Concerns/Testable.php(256): P\Tests\Feature\Http\Controllers\ipaas\ConnectorControllerTest->__callClosure() #59 /home/wbeltran/Documentos/projects/SuiteX/vendor/pestphp/pest/src/Factories/TestCaseFactory.php(197) : eval()'d code(56): P\Tests\Feature\Http\Controllers\ipaas\ConnectorControllerTest->__runTest() #60 /home/wbeltran/Documentos/projects/SuiteX/vendor/phpunit/phpunit/src/Framework/TestCase.php(1188): P\Tests\Feature\Http\Controllers\ipaas\ConnectorControllerTest->__pest_evaluable__ConnectorController__store_____JSON_API_Response__→_includes_OAuth_redirect_URL_when_applicable() #61 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Foundation/Testing/TestCase.php(61): PHPUnit\Framework\TestCase->runTest() #62 /home/wbeltran/Documentos/projects/SuiteX/vendor/phpunit/phpunit/src/Framework/TestCase.php(687): Illuminate\Foundation\Testing\TestCase->runTest() #63 /home/wbeltran/Documentos/projects/SuiteX/vendor/phpunit/phpunit/src/Framework/TestRunner.php(106): PHPUnit\Framework\TestCase->runBare() #64 /home/wbeltran/Documentos/projects/SuiteX/vendor/phpunit/phpunit/src/Framework/TestCase.php(517): PHPUnit\Framework\TestRunner->run() #65 /home/wbeltran/Documentos/projects/SuiteX/vendor/phpunit/phpunit/src/Framework/TestSuite.php(380): PHPUnit\Framework\TestCase->run() #66 /home/wbeltran/Documentos/projects/SuiteX/vendor/phpunit/phpunit/src/Framework/TestSuite.php(380): PHPUnit\Framework\TestSuite->run() #67 /home/wbeltran/Documentos/projects/SuiteX/vendor/phpunit/phpunit/src/Framework/TestSuite.php(380): PHPUnit\Framework\TestSuite->run() #68 /home/wbeltran/Documentos/projects/SuiteX/vendor/phpunit/phpunit/src/TextUI/TestRunner.php(64): PHPUnit\Framework\TestSuite->run() #69 /home/wbeltran/Documentos/projects/SuiteX/vendor/phpunit/phpunit/src/TextUI/Application.php(202): PHPUnit\TextUI\TestRunner->run() #70 /home/wbeltran/Documentos/projects/SuiteX/vendor/pestphp/pest/src/Kernel.php(103): PHPUnit\TextUI\Application->run() #71 /home/wbeltran/Documentos/projects/SuiteX/vendor/pestphp/pest/bin/pest(91): Pest\Kernel->handle() #72 /home/wbeltran/Documentos/projects/SuiteX/vendor/pestphp/pest/bin/pest(99): {closure}() #73 {main} ---------------------------------------------------------------------------------- Call to a member function __call() on null at tests/Feature/Http/Controllers/ipaas/ConnectorControllerTest.php:287 283▕ $response = $this->withHeaders([ 284▕ 'Host' => 'test-tenant.app.localhost', 285▕ ])->postJson('http://test-tenant.app.localhost/ipaas/connector', $data); 286▕ ➜ 287▕ $response->assertStatus(201); 288▕ 289▕ $json = $response->json(); 290▕ expect($json['success'])->toBeTrue(); 291▕ expect($json)->toHaveKey('redirect'); ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Feature\Http\Controllers\ipaas\ConnectorControllerTest > `C… Expected response status code [200] but received 500. Failed asserting that 500 is identical to 200. at tests/Feature/Http/Controllers/ipaas/ConnectorControllerTest.php:355 351▕ $response = $this->withHeaders([ 352▕ 'Host' => 'test-tenant.app.localhost', 353▕ ])->putJson('http://test-tenant.app.localhost/ipaas/connector/update?id=' . $connector->id, $updateData); 354▕ ➜ 355▕ $response->assertStatus(200) 356▕ ->assertJson([ 357▕ 'success' => true, 358▕ 'message' => 'Connector updated successfully' 359▕ ]) ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Feature\Http\Controllers\ipaas\Conne… InvalidCountException Method info() from Mockery_0_Illuminate_Log_LogManager should be called at least 1 times but called 0 times. at vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php:355 351▕ if (! $instance) { 352▕ throw new RuntimeException('A facade root has not been set.'); 353▕ } 354▕ ➜ 355▕ return $instance->$method(...$args); 356▕ } 357▕ } 358▕ 1 tests/Feature/Http/Controllers/ipaas/ConnectorControllerTest.php:570 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Feature\Http\Controllers\ipaas\Conne… InvalidCountException Method info() from Mockery_0_Illuminate_Log_LogManager should be called at least 1 times but called 0 times. at vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php:355 351▕ if (! $instance) { 352▕ throw new RuntimeException('A facade root has not been set.'); 353▕ } 354▕ ➜ 355▕ return $instance->$method(...$args); 356▕ } 357▕ } 358▕ 1 tests/Feature/Http/Controllers/ipaas/ConnectorControllerTest.php:623 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Feature\Http\Controllers\ipaas\ConnectorControllerTest > `C… Failed asserting that an array has the key 'success' The following exception occurred during the last request: Error: Call to a member function __call() on null in /home/wbeltran/Documentos/projects/SuiteX/vendor/mockery/mockery/library/Mockery/Loader/EvalLoader.php(30) : eval()'d code:852 Stack trace: #0 /home/wbeltran/Documentos/projects/SuiteX/vendor/mockery/mockery/library/Mockery/Loader/EvalLoader.php(30) : eval()'d code(424): App\Helpers\IpaasHelper::_mockery_handleStaticMethodCall() #1 /home/wbeltran/Documentos/projects/SuiteX/src/Domain/iPaas/Connectors/Actions/CreateConnector.php(133): App\Helpers\IpaasHelper::__callStatic() #2 /home/wbeltran/Documentos/projects/SuiteX/src/App/Http/Controllers/iPaas/ConnectorController.php(67): Domain\iPaas\Connectors\Actions\CreateConnector::create() #3 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Routing/Controller.php(54): App\Http\Controllers\Ipaas\ConnectorController->store() #4 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(43): Illuminate\Routing\Controller->callAction() #5 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Routing/Route.php(259): Illuminate\Routing\ControllerDispatcher->dispatch() #6 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Routing/Route.php(205): Illuminate\Routing\Route->runController() #7 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Routing/Router.php(806): Illuminate\Routing\Route->run() #8 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\Routing\Router->Illuminate\Routing\{closure}() #9 /home/wbeltran/Documentos/projects/SuiteX/src/App/Http/Middleware/EnsureUserCanManageIpaas.php(66): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() #10 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): App\Http\Middleware\EnsureUserCanManageIpaas->handle() #11 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Auth/Middleware/Authenticate.php(57): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() #12 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Auth\Middleware\Authenticate->handle() #13 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() #14 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Routing/Router.php(805): Illuminate\Pipeline\Pipeline->then() #15 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Routing/Router.php(784): Illuminate\Routing\Router->runRouteWithinStack() #16 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Routing/Router.php(748): Illuminate\Routing\Router->runRoute() #17 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Routing/Router.php(737): Illuminate\Routing\Router->dispatchToRoute() #18 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(200): Illuminate\Routing\Router->dispatch() #19 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\Foundation\Http\Kernel->Illuminate\Foundation\Http\{closure}() #20 /home/wbeltran/Documentos/projects/SuiteX/vendor/livewire/livewire/src/Features/SupportDisablingBackButtonCache/DisableBackButtonCacheMiddleware.php(19): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() #21 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Livewire\Features\SupportDisablingBackButtonCache\DisableBackButtonCacheMiddleware->handle() #22 /home/wbeltran/Documentos/projects/SuiteX/vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php(59): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() #23 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Barryvdh\Debugbar\Middleware\InjectDebugbar->handle() #24 /home/wbeltran/Documentos/projects/SuiteX/src/App/Http/Middleware/AdminMiddleware.php(28): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() #25 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): App\Http\Middleware\AdminMiddleware->handle() #26 /home/wbeltran/Documentos/projects/SuiteX/src/App/Http/Middleware/TenantMiddleware.php(18): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() #27 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): App\Http\Middleware\TenantMiddleware->handle() #28 /home/wbeltran/Documentos/projects/SuiteX/src/App/Http/Middleware/SubdomainMiddleware.php(34): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() #29 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): App\Http\Middleware\SubdomainMiddleware->handle() #30 /home/wbeltran/Documentos/projects/SuiteX/src/App/Http/Middleware/CheckInstanceActive.php(42): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() #31 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): App\Http\Middleware\CheckInstanceActive->handle() #32 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() #33 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php(31): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle() #34 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull->handle() #35 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() #36 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle() #37 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Foundation\Http\Middleware\TrimStrings->handle() #38 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() #39 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Foundation\Http\Middleware\ValidatePostSize->handle() #40 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(99): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() #41 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Foundation\Http\Middleware\PreventRequestsDuringMaintenance->handle() #42 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(49): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() #43 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Http\Middleware\HandleCors->handle() #44 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(39): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() #45 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Http\Middleware\TrustProxies->handle() #46 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() #47 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(175): Illuminate\Pipeline\Pipeline->then() #48 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(144): Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter() #49 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Foundation/Testing/Concerns/MakesHttpRequests.php(585): Illuminate\Foundation\Http\Kernel->handle() #50 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Foundation/Testing/Concerns/MakesHttpRequests.php(551): Illuminate\Foundation\Testing\TestCase->call() #51 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Foundation/Testing/Concerns/MakesHttpRequests.php(389): Illuminate\Foundation\Testing\TestCase->json() #52 /home/wbeltran/Documentos/projects/SuiteX/tests/Traits/SetupMultiTenancyForTests.php(671): Illuminate\Foundation\Testing\TestCase->postJson() #53 /home/wbeltran/Documentos/projects/SuiteX/tests/Feature/Http/Controllers/ipaas/ConnectorControllerTest.php(715): P\Tests\Feature\Http\Controllers\ipaas\ConnectorControllerTest->postTenantJson() #54 /home/wbeltran/Documentos/projects/SuiteX/vendor/pestphp/pest/src/Factories/TestCaseMethodFactory.php(110): P\Tests\Feature\Http\Controllers\ipaas\ConnectorControllerTest->{closure}() #55 [internal function]: P\Tests\Feature\Http\Controllers\ipaas\ConnectorControllerTest->Pest\Factories\{closure}() #56 /home/wbeltran/Documentos/projects/SuiteX/vendor/pestphp/pest/src/Concerns/Testable.php(339): call_user_func_array() #57 /home/wbeltran/Documentos/projects/SuiteX/vendor/pestphp/pest/src/Support/ExceptionTrace.php(26): P\Tests\Feature\Http\Controllers\ipaas\ConnectorControllerTest->Pest\Concerns\{closure}() #58 /home/wbeltran/Documentos/projects/SuiteX/vendor/pestphp/pest/src/Concerns/Testable.php(339): Pest\Support\ExceptionTrace::ensure() #59 /home/wbeltran/Documentos/projects/SuiteX/vendor/pestphp/pest/src/Concerns/Testable.php(256): P\Tests\Feature\Http\Controllers\ipaas\ConnectorControllerTest->__callClosure() #60 /home/wbeltran/Documentos/projects/SuiteX/vendor/pestphp/pest/src/Factories/TestCaseFactory.php(197) : eval()'d code(281): P\Tests\Feature\Http\Controllers\ipaas\ConnectorControllerTest->__runTest() #61 /home/wbeltran/Documentos/projects/SuiteX/vendor/phpunit/phpunit/src/Framework/TestCase.php(1188): P\Tests\Feature\Http\Controllers\ipaas\ConnectorControllerTest->__pest_evaluable__ConnectorController___Compatibility_with_Livewire__→_returns_format_compatible_with_ConnectorForm_expectations() #62 /home/wbeltran/Documentos/projects/SuiteX/vendor/laravel/framework/src/Illuminate/Foundation/Testing/TestCase.php(61): PHPUnit\Framework\TestCase->runTest() #63 /home/wbeltran/Documentos/projects/SuiteX/vendor/phpunit/phpunit/src/Framework/TestCase.php(687): Illuminate\Foundation\Testing\TestCase->runTest() #64 /home/wbeltran/Documentos/projects/SuiteX/vendor/phpunit/phpunit/src/Framework/TestRunner.php(106): PHPUnit\Framework\TestCase->runBare() #65 /home/wbeltran/Documentos/projects/SuiteX/vendor/phpunit/phpunit/src/Framework/TestCase.php(517): PHPUnit\Framework\TestRunner->run() #66 /home/wbeltran/Documentos/projects/SuiteX/vendor/phpunit/phpunit/src/Framework/TestSuite.php(380): PHPUnit\Framework\TestCase->run() #67 /home/wbeltran/Documentos/projects/SuiteX/vendor/phpunit/phpunit/src/Framework/TestSuite.php(380): PHPUnit\Framework\TestSuite->run() #68 /home/wbeltran/Documentos/projects/SuiteX/vendor/phpunit/phpunit/src/Framework/TestSuite.php(380): PHPUnit\Framework\TestSuite->run() #69 /home/wbeltran/Documentos/projects/SuiteX/vendor/phpunit/phpunit/src/TextUI/TestRunner.php(64): PHPUnit\Framework\TestSuite->run() #70 /home/wbeltran/Documentos/projects/SuiteX/vendor/phpunit/phpunit/src/TextUI/Application.php(202): PHPUnit\TextUI\TestRunner->run() #71 /home/wbeltran/Documentos/projects/SuiteX/vendor/pestphp/pest/src/Kernel.php(103): PHPUnit\TextUI\Application->run() #72 /home/wbeltran/Documentos/projects/SuiteX/vendor/pestphp/pest/bin/pest(91): Pest\Kernel->handle() #73 /home/wbeltran/Documentos/projects/SuiteX/vendor/pestphp/pest/bin/pest(99): {closure}() #74 {main} ---------------------------------------------------------------------------------- Call to a member function __call() on null at tests/Feature/Http/Controllers/ipaas/ConnectorControllerTest.php:720 716▕ 717▕ $json = $response->json(); 718▕ 719▕ // ConnectorForm expects these specific fields (redirect only included when OAuth) ➜ 720▕ expect($json)->toHaveKeys(['success', 'id', 'message']); 721▕ expect($json['success'])->toBeTrue(); 722▕ expect($json['id'])->toBeInt(); 723▕ expect($json)->not->toHaveKey('redirect'); // No OAuth in this test 724▕ }); 1 tests/Feature/Http/Controllers/ipaas/ConnectorControllerTest.php:720 ──────────────────────────────────────────────────────────────────────────── FAILED Tests\Feature\Http\Controllers\ipaas\ConnectorCon… ErrorException Undefined array key "success" at tests/Feature/Http/Controllers/ipaas/ConnectorControllerTest.php:752 748▕ 749▕ $json = $response->json(); 750▕ 751▕ // OAuth flows should include redirect URL ➜ 752▕ expect($json['success'])->toBeTrue(); 753▕ expect($json)->toHaveKey('redirect'); 754▕ 755▕ if ($json['redirect']) { 756▕ expect($json['redirect'])->toBeString(); Tests: 122 failed, 4 risky, 21 skipped, 1271 passed (4767 assertions) Duration: 194.58s