|
56367
|
1965
|
19
|
2026-05-19T08:02:14.054930+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-19/1779 /Users/lukas/.screenpipe/data/data/2026-05-19/1779177734054_m2.jpg...
|
PhpStorm
|
faVsco.js – AskJiminnyReportsControllerTest.php
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhostormVIewINavicarecodeFV faVsco.js?9 JY-20676-d PhostormVIewINavicarecodeFV faVsco.js?9 JY-20676-delete-report-related-objectsProiectC) AutomatedReport.onp© Serializer.php© TeamScimDetails.php> D bootstrap>D build>D config>@ contrib>@ database>@ docsU tront-end>C lanc> @ node_ modules library root>J phostan> D oublic>D resourcesv D routesphp api.ohophp api_v2.phpphp console.ohophp customer aoi.ohophp embedded.phpphp health.ohophp scim.ohophp unrotected web.ohophp web.ohophp webhook. oho> M serinte>• storagev Mtestsv M FoatureD ComponentD ConsoleMATOI> @ EventsC Exceptionsv D Httpv ControllersV DAPIv 0V2AskJiminnyReportsControllerTest.php X© AskAnythingPrompt.php© ActivityController.phg)constants.pngC) RoleAttr.php) RoleAttrTest.phpListenerRoleCannotHaveAdminOrManagerPermissionRule.php© Activity/Close/Service.php© Activity/RingCentral/Service.phpC) SyncActivity.php(C) Crm/Close/Service.phoAccept Rejectdecilare (strict tvnesai):Inamesnace Tests Feature Httn.Controllens APT.V2:use...final class AskJiminnyReportsControllerTest extends TestCaseuse vacabaselransactions22 D >public function testToggleStatusPreventsEnablingReportWithNullSearchId: voidk...}72 D >public function testToggleStatusPreventsEnablingReportWithNullPromptId0: voidk...}128 D>public function testToggleStatusAllowsEnablingReportWithVaLidReferencesO: voidk...}1168 10>public function testTogqleStatusAl1owsDisablingReportWithNul1ReferencesO: voidk...}@ Ask JiminnvReportsControllerTe> D Auth@ ActivitvAskAnvthinaTest.ohpc) sxoortControlllerRateLimitirest.onoC) FakeProohetClient.oho7 MiddlewareM Requests)M InteractionsmulistenersM MenAccept File &+X Reject File 4%€+9 of 9 files →The Huncnell nluain hac hoon denrecated. If voulre not writing in Hungarian vou can cafolv uninctall Huncnell without affecting the diries for other languages. (today 10:00)= custom.log= laravel.log4 SF jiminny@localhost]4 HS_local [jiminny@localhost]& console [PROD]# console [euyA console [STAGING]© CoachingFeedbackCoachUserln.php X<?phpA1. Ydeclare(scrict_cypes=l)nnamespace Jiminny Component Activ1tySearch Filterder1n1t1on:final class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefinitionInterface29 Ф >34 0 >45 đ >118119135136 @t›146 @t>150151 G>usadeorivate const int No GROUp 10 = 99913 usagesorivate UserRenository SuserRenository:public function__construct(UserRepository $userRepository)1...hpublic function shouldApplyQueries: boolf...}public function getQueries: FilterDefinitionQueryCollection{...hpublic function toArray: array{...hprivate function getOptions(): array{...}public function getValue: array{...}private function getDefaultValue: array{...}public function aetValidationRules(2strina Sorefix = null): arrav{...}public function aetSortOrder@: intf...}public function shouldBeIncluded(Team $team): bool{...}CascadeASK Jiminny Report"suppont Dally • In 3n oom100% Lz• Tue 19 May 11:02:13AskJiminnyReportActivityServiceTest v+0 ..ContinuewO files +300 7>Ask anvthina (84L)<> Code Claude Qnus 1.7 Medium* Reiect allAccent alliW Windsurf Teams1-1.UTE.9io 4 spaces...
|
NULL
|
-766342632057736309
|
NULL
|
click
|
ocr
|
NULL
|
PhostormVIewINavicarecodeFV faVsco.js?9 JY-20676-d PhostormVIewINavicarecodeFV faVsco.js?9 JY-20676-delete-report-related-objectsProiectC) AutomatedReport.onp© Serializer.php© TeamScimDetails.php> D bootstrap>D build>D config>@ contrib>@ database>@ docsU tront-end>C lanc> @ node_ modules library root>J phostan> D oublic>D resourcesv D routesphp api.ohophp api_v2.phpphp console.ohophp customer aoi.ohophp embedded.phpphp health.ohophp scim.ohophp unrotected web.ohophp web.ohophp webhook. oho> M serinte>• storagev Mtestsv M FoatureD ComponentD ConsoleMATOI> @ EventsC Exceptionsv D Httpv ControllersV DAPIv 0V2AskJiminnyReportsControllerTest.php X© AskAnythingPrompt.php© ActivityController.phg)constants.pngC) RoleAttr.php) RoleAttrTest.phpListenerRoleCannotHaveAdminOrManagerPermissionRule.php© Activity/Close/Service.php© Activity/RingCentral/Service.phpC) SyncActivity.php(C) Crm/Close/Service.phoAccept Rejectdecilare (strict tvnesai):Inamesnace Tests Feature Httn.Controllens APT.V2:use...final class AskJiminnyReportsControllerTest extends TestCaseuse vacabaselransactions22 D >public function testToggleStatusPreventsEnablingReportWithNullSearchId: voidk...}72 D >public function testToggleStatusPreventsEnablingReportWithNullPromptId0: voidk...}128 D>public function testToggleStatusAllowsEnablingReportWithVaLidReferencesO: voidk...}1168 10>public function testTogqleStatusAl1owsDisablingReportWithNul1ReferencesO: voidk...}@ Ask JiminnvReportsControllerTe> D Auth@ ActivitvAskAnvthinaTest.ohpc) sxoortControlllerRateLimitirest.onoC) FakeProohetClient.oho7 MiddlewareM Requests)M InteractionsmulistenersM MenAccept File &+X Reject File 4%€+9 of 9 files →The Huncnell nluain hac hoon denrecated. If voulre not writing in Hungarian vou can cafolv uninctall Huncnell without affecting the diries for other languages. (today 10:00)= custom.log= laravel.log4 SF jiminny@localhost]4 HS_local [jiminny@localhost]& console [PROD]# console [euyA console [STAGING]© CoachingFeedbackCoachUserln.php X<?phpA1. Ydeclare(scrict_cypes=l)nnamespace Jiminny Component Activ1tySearch Filterder1n1t1on:final class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefinitionInterface29 Ф >34 0 >45 đ >118119135136 @t›146 @t>150151 G>usadeorivate const int No GROUp 10 = 99913 usagesorivate UserRenository SuserRenository:public function__construct(UserRepository $userRepository)1...hpublic function shouldApplyQueries: boolf...}public function getQueries: FilterDefinitionQueryCollection{...hpublic function toArray: array{...hprivate function getOptions(): array{...}public function getValue: array{...}private function getDefaultValue: array{...}public function aetValidationRules(2strina Sorefix = null): arrav{...}public function aetSortOrder@: intf...}public function shouldBeIncluded(Team $team): bool{...}CascadeASK Jiminny Report"suppont Dally • In 3n oom100% Lz• Tue 19 May 11:02:13AskJiminnyReportActivityServiceTest v+0 ..ContinuewO files +300 7>Ask anvthina (84L)<> Code Claude Qnus 1.7 Medium* Reiect allAccent alliW Windsurf Teams1-1.UTE.9io 4 spaces...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
56366
|
1964
|
8
|
2026-05-19T08:02:14.101209+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-19/1779 /Users/lukas/.screenpipe/data/data/2026-05-19/1779177734101_m1.jpg...
|
PhpStorm
|
faVsco.js – AskJiminnyReportsControllerTest.php
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
PhpStormFileEditViewNavigateCodeLaravelRefactorRun PhpStormFileEditViewNavigateCodeLaravelRefactorRunToolsGitWindowHelpAPP (-zsh)DOCKER• ₴1DEV (-zsh)₴82APP (-zsh)*3app/Jobs/Crm/MatchActivityCrmData.phpapp/Jobs/Middleware/HandleHubspotRateLimit.phpapp/Mcp/Servers/JiminnyServer.phpapp/Mcp/Tools/GetMeTool.php47422157++++++++++++-*++++++++++++++++++++++++1app/Models/Feature/FeatureEnum.phpapp/Services/Activity/HubSpot/ProviderResolver.php+-app/Services/Activity/HubSpot/ProviderResolverInterface.php2app/Services/Activity/HubSpot/Providers/Provider.phpapp/Services/Activity/HubSpot/Providers/ProviderKixie.php+-+-app/Services/Activity/HubSpot/Providers/Provider0rum.php22app/Services/Activity/HubSpot/Providers/ProviderTwilio.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilioFlex.phpapp/Services/Activity/HubSpot/Service.phpapp/Services/Crm/Hubspot/Client.phpapp/Services/Crm/Hubspot/HubspotClientInterface.phpapp/Services/Crm/Hubspot/Pagination/HubspotPaginationService.php971321521225140+++++++-++++++++++----app/Services/Crm/Hubspot/Pagination/PaginationState.phpdatabase/migrations/2026_05_13_124153_create_mcp_feature_flag.phptests/Feature/Mcp/GetMeToolFeatureTest.php++++++++++++++++tests/Feature/Mcp/ListCallsToolFeatureTest.phptests/Feature/Mcp/McpTestHelpersTrait.phptests/Unit/Component/ES/ChunkSizeTest.phptests/Unit/Component/ES/Processor/DT0s/SelectionListTest.phptests/Unit/Component/ES/Processor/TargetEntitiesSelectorTest.phptests/Unit/Component/MeetingBot/Service/ParticipantMatcherTest.phptests/Unit/Exceptions/RateLimitExceptionTest.php195027396856++++++-ттІTTTttTтттттттт+++++++---+++++++*tests/Unit/Jobs/Crm/MatchActivityCrmDataTest.phptests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phptests/Unit/Services/Activity/HubSpot/ServiceTest.phptests/Unit/Services/Crm/Hubspot/ClientTest.phptests/Unit/Services/Crm/Hubspot/Pagination/HubspotPaginationServiceTest.php151109250283+++++=Ttt+++++37 files changed, 1587 insertions(+), 344 deletions(-)create mode 100644 app/Component/ES/ChunkSize.phpcreate mode 100644 app/Jobs/Middleware/HandLeHubspotRateLimit.phpcreate mode 100644 app/Mcp/Tools/GetMeTool.phpcreate mode 100644 database/migrations/2026_05_13_124153_create_mcp_feature_flag.phpcreate mode 100644 tests/Feature/Mcp/GetMeToolFeatureTest.phpcreate mode 100644 tests/Unit/Component/ES/ChunkSizeTest.phpcreate mode 100644 tests/Unit/Exceptions/RateLimitExceptionTest.phpcreate mode 100644 tests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phplukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pullAlready up to date.lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20676-delete-report-related-objectsSwitched to a new branch 'JY-20676-delete-report-related-objects'Lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20676-delete-report-related-objects) $I• Support Daily • in 3 h 58 m100% C4 8• Tue 19 May 11:02:14181screenpipe"0 ₴4-zsh*5APP...
|
NULL
|
3358218430996769495
|
NULL
|
click
|
ocr
|
NULL
|
PhpStormFileEditViewNavigateCodeLaravelRefactorRun PhpStormFileEditViewNavigateCodeLaravelRefactorRunToolsGitWindowHelpAPP (-zsh)DOCKER• ₴1DEV (-zsh)₴82APP (-zsh)*3app/Jobs/Crm/MatchActivityCrmData.phpapp/Jobs/Middleware/HandleHubspotRateLimit.phpapp/Mcp/Servers/JiminnyServer.phpapp/Mcp/Tools/GetMeTool.php47422157++++++++++++-*++++++++++++++++++++++++1app/Models/Feature/FeatureEnum.phpapp/Services/Activity/HubSpot/ProviderResolver.php+-app/Services/Activity/HubSpot/ProviderResolverInterface.php2app/Services/Activity/HubSpot/Providers/Provider.phpapp/Services/Activity/HubSpot/Providers/ProviderKixie.php+-+-app/Services/Activity/HubSpot/Providers/Provider0rum.php22app/Services/Activity/HubSpot/Providers/ProviderTwilio.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilioFlex.phpapp/Services/Activity/HubSpot/Service.phpapp/Services/Crm/Hubspot/Client.phpapp/Services/Crm/Hubspot/HubspotClientInterface.phpapp/Services/Crm/Hubspot/Pagination/HubspotPaginationService.php971321521225140+++++++-++++++++++----app/Services/Crm/Hubspot/Pagination/PaginationState.phpdatabase/migrations/2026_05_13_124153_create_mcp_feature_flag.phptests/Feature/Mcp/GetMeToolFeatureTest.php++++++++++++++++tests/Feature/Mcp/ListCallsToolFeatureTest.phptests/Feature/Mcp/McpTestHelpersTrait.phptests/Unit/Component/ES/ChunkSizeTest.phptests/Unit/Component/ES/Processor/DT0s/SelectionListTest.phptests/Unit/Component/ES/Processor/TargetEntitiesSelectorTest.phptests/Unit/Component/MeetingBot/Service/ParticipantMatcherTest.phptests/Unit/Exceptions/RateLimitExceptionTest.php195027396856++++++-ттІTTTttTтттттттт+++++++---+++++++*tests/Unit/Jobs/Crm/MatchActivityCrmDataTest.phptests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phptests/Unit/Services/Activity/HubSpot/ServiceTest.phptests/Unit/Services/Crm/Hubspot/ClientTest.phptests/Unit/Services/Crm/Hubspot/Pagination/HubspotPaginationServiceTest.php151109250283+++++=Ttt+++++37 files changed, 1587 insertions(+), 344 deletions(-)create mode 100644 app/Component/ES/ChunkSize.phpcreate mode 100644 app/Jobs/Middleware/HandLeHubspotRateLimit.phpcreate mode 100644 app/Mcp/Tools/GetMeTool.phpcreate mode 100644 database/migrations/2026_05_13_124153_create_mcp_feature_flag.phpcreate mode 100644 tests/Feature/Mcp/GetMeToolFeatureTest.phpcreate mode 100644 tests/Unit/Component/ES/ChunkSizeTest.phpcreate mode 100644 tests/Unit/Exceptions/RateLimitExceptionTest.phpcreate mode 100644 tests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phplukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pullAlready up to date.lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20676-delete-report-related-objectsSwitched to a new branch 'JY-20676-delete-report-related-objects'Lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20676-delete-report-related-objects) $I• Support Daily • in 3 h 58 m100% C4 8• Tue 19 May 11:02:14181screenpipe"0 ₴4-zsh*5APP...
|
56357
|
NULL
|
NULL
|
NULL
|
|
56368
|
1965
|
20
|
2026-05-19T08:02:16.453145+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-19/1779 /Users/lukas/.screenpipe/data/data/2026-05-19/1779177736453_m2.jpg...
|
PhpStorm
|
faVsco.js – AskJiminnyReportsControllerTest.php
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhpStormVIewINavicareCodeLaravelKeractorloolsWindo PhpStormVIewINavicareCodeLaravelKeractorloolsWindowFV faVsco.js?9 JY-20676-delete-report-related-objectsProiectC) AutomatedReport.pnp© AskAnythingPromptServiceTest.php© Serializer.php© TeamScimDetails.php> D bootstrap>D build>D config>@ contrib> @ database>@ docsAskJiminnyReportsControllerTest.php X© AskAnythingPrompt.php© ActivityController.phg© CrmOwnerResolver.phpbaseservice.pnp© CoreUserRequest.php)constants.png© RoleAttr.php") RoleAttrTest.phpListenerRoleCannotHaveAdminOrManagerPermissionRule.php©Activity/Close/Service.php© Activity/RingCentral/Service.php© SyncActivity.php(C) Crm/Close/Service.pho(C) TextMessaqingService.phpU tront-end>C lanc>@ node_modules library root> @ phpstan> C publicfinal class AskJiminnvReoortsControllerTest extends Testcase22 D >public function testToggleStatusPreventsEnablingReportWithNullSearchId: void{...}72 D >public function testToggleStatusPreventsEnablingReportWithNullPromptId: void{...}>D resourcesv D routes128D)public function testTogqleStatusAllowsEnablingReportWithValidReferencesO: void{...}php api.oho0 168 D)public function testTogqleStatusAllowsDisablingReportWithNul1ReferencesO: voidk...}php api_v2.phpphp console.ohophp customer abi.oho1 editX Reiect File 49g+ 9 ofgfiles →php embedded.phpLocal ChandesSheliConsole XLooXChanges 17 f=.env.local app© ActivityController.php app/Http/Controllers/API© AskAnythingPrompt.php app/Models/AskAnythingc) ASKAnvihinaPromotbto.ono apo/comoonent/AskAnvihino/Dros© AskAnvthinaPromptService.php app/Component/AskAnvthing@ AskAnvthinaPromptServiceTest.php tests/Unit/Component/AskAnvthina© Ask.JiminnvReportsController.pho app/Htto/Controllers/API/V2L8<→?C) Constants.ono apo/Comoonent/SClMI@ CoreUser.php app/DTO/SCIMIAAD/ResponseC) CoreUserRequest.ono ano/DTO/SCIMIAAD/[EMAIL] app/Console/Commandsphp loadina.nho confial@ SavedSearchCRUDFeatureTest.nhn tests/Feature/SavedSearches)C) ScimProvisionina.ohoann/Comnonent/SCIM© Search.php app/Models/ActivitySoftPhoneManager.php app/Component/Twilio/Conference/ConferenceManagC) ToytMoccadinaCervice nhn ann/Corvicac/Tolonhonu) Uinvercionod Siloc 11 filec40"suppont Dally • In 3n oom100% C47• Tue 19 May 11:02:15AskJiminnyReportActivityServiceTest v= custom.log= laravel.log« SF jiminny@localhost]4 HS_local [jiminny@localhost]& console [PROD]& console [EU]A console [STAGING)© CoachingFeedbackCoachUserln.php Xfinal class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefinim29 đ >34 đ >45 6t>63 >11811119T1131136 €t>public function construct(UserRepository SuserRepository){...}public function shouldApplyQueries: bool{...}public function getQueries: FilterDefinitionQueryCollection{...}public function toArrav@): arravs..?1usaaeprivate function getOptions(): array(...}public function getValue(): arrayf...1 usageprivate function getDefaultValue(): arrayf...;public function getValidationRules(?string $prefix = null): arrayf...}CascadewNothina to chowThe Hunspell plugin has been deprecated. If you're not writing in Hungarian, you can safely uninstall Hunspell without affecting the dictionaries for other languages. (today 10:00)W Windsurf Teamio 4 spaces...
|
NULL
|
-5717799326926529980
|
NULL
|
visual_change
|
ocr
|
NULL
|
PhpStormVIewINavicareCodeLaravelKeractorloolsWindo PhpStormVIewINavicareCodeLaravelKeractorloolsWindowFV faVsco.js?9 JY-20676-delete-report-related-objectsProiectC) AutomatedReport.pnp© AskAnythingPromptServiceTest.php© Serializer.php© TeamScimDetails.php> D bootstrap>D build>D config>@ contrib> @ database>@ docsAskJiminnyReportsControllerTest.php X© AskAnythingPrompt.php© ActivityController.phg© CrmOwnerResolver.phpbaseservice.pnp© CoreUserRequest.php)constants.png© RoleAttr.php") RoleAttrTest.phpListenerRoleCannotHaveAdminOrManagerPermissionRule.php©Activity/Close/Service.php© Activity/RingCentral/Service.php© SyncActivity.php(C) Crm/Close/Service.pho(C) TextMessaqingService.phpU tront-end>C lanc>@ node_modules library root> @ phpstan> C publicfinal class AskJiminnvReoortsControllerTest extends Testcase22 D >public function testToggleStatusPreventsEnablingReportWithNullSearchId: void{...}72 D >public function testToggleStatusPreventsEnablingReportWithNullPromptId: void{...}>D resourcesv D routes128D)public function testTogqleStatusAllowsEnablingReportWithValidReferencesO: void{...}php api.oho0 168 D)public function testTogqleStatusAllowsDisablingReportWithNul1ReferencesO: voidk...}php api_v2.phpphp console.ohophp customer abi.oho1 editX Reiect File 49g+ 9 ofgfiles →php embedded.phpLocal ChandesSheliConsole XLooXChanges 17 f=.env.local app© ActivityController.php app/Http/Controllers/API© AskAnythingPrompt.php app/Models/AskAnythingc) ASKAnvihinaPromotbto.ono apo/comoonent/AskAnvihino/Dros© AskAnvthinaPromptService.php app/Component/AskAnvthing@ AskAnvthinaPromptServiceTest.php tests/Unit/Component/AskAnvthina© Ask.JiminnvReportsController.pho app/Htto/Controllers/API/V2L8<→?C) Constants.ono apo/Comoonent/SClMI@ CoreUser.php app/DTO/SCIMIAAD/ResponseC) CoreUserRequest.ono ano/DTO/SCIMIAAD/[EMAIL] app/Console/Commandsphp loadina.nho confial@ SavedSearchCRUDFeatureTest.nhn tests/Feature/SavedSearches)C) ScimProvisionina.ohoann/Comnonent/SCIM© Search.php app/Models/ActivitySoftPhoneManager.php app/Component/Twilio/Conference/ConferenceManagC) ToytMoccadinaCervice nhn ann/Corvicac/Tolonhonu) Uinvercionod Siloc 11 filec40"suppont Dally • In 3n oom100% C47• Tue 19 May 11:02:15AskJiminnyReportActivityServiceTest v= custom.log= laravel.log« SF jiminny@localhost]4 HS_local [jiminny@localhost]& console [PROD]& console [EU]A console [STAGING)© CoachingFeedbackCoachUserln.php Xfinal class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefinim29 đ >34 đ >45 6t>63 >11811119T1131136 €t>public function construct(UserRepository SuserRepository){...}public function shouldApplyQueries: bool{...}public function getQueries: FilterDefinitionQueryCollection{...}public function toArrav@): arravs..?1usaaeprivate function getOptions(): array(...}public function getValue(): arrayf...1 usageprivate function getDefaultValue(): arrayf...;public function getValidationRules(?string $prefix = null): arrayf...}CascadewNothina to chowThe Hunspell plugin has been deprecated. If you're not writing in Hungarian, you can safely uninstall Hunspell without affecting the dictionaries for other languages. (today 10:00)W Windsurf Teamio 4 spaces...
|
56367
|
NULL
|
NULL
|
NULL
|
|
56369
|
1965
|
21
|
2026-05-19T08:02:19.480106+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-19/1779 /Users/lukas/.screenpipe/data/data/2026-05-19/1779177739480_m2.jpg...
|
PhpStorm
|
faVsco.js – AskJiminnyReportsControllerTest.php
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20676-delete-report-re Project: faVsco.js, menu
JY-20676-delete-report-related-objects, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Code changed:
Hide
Sync Changes
Hide This Notification
<?php
declare(strict_types=1);
namespace Tests\Feature\Http\Controllers\API\V2;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Illuminate\Support\Str;
use Jiminny\Models\AutomatedReport;
use Jiminny\Models\AskAnything\AskAnythingPrompt;
use Jiminny\Models\Activity\Search;
use Jiminny\Models\Role;
use Jiminny\Models\Team;
use Jiminny\Models\User;
use Jiminny\Services\Kiosk\AutomatedReports\AutomatedReportsService;
use Tests\TestCase;
final class AskJiminnyReportsControllerTest extends TestCase
{
use DatabaseTransactions;
public function testToggleStatusPreventsEnablingReportWithNullSearchId(): void
{
$team = Team::factory()->create([
'uuid' => Str::uuid()->toString(),
'crm_id' => 1,
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$prompt = AskAnythingPrompt::factory()->create([
'owner_id' => $user->id,
]);
$report = AutomatedReport::factory()->create([
'team_id' => $team->id,
'type' => AutomatedReportsService::TYPE_ASK_JIMINNY,
'status' => false,
'activity_search_id' => null,
'ask_anything_prompt_id' => $prompt->id,
'created_by' => $user->id,
]);
$this->apiGuardLogin($user);
$response = $this->actingAs($user)
->postJson(route('api.v2.ask_jiminny_reports.toggle_status', $report->uuid), [
'enabled' => true,
]);
$response->assertStatus(422)
->assertJson([
'error' => 'Cannot enable report with missing saved search or prompt',
]);
$this->assertDatabaseHas('automated_reports', [
'id' => $report->id,
'status' => false,
]);
}
public function testToggleStatusPreventsEnablingReportWithNullPromptId(): void
{
$team = Team::factory()->create([
'uuid' => Str::uuid()->toString(),
'crm_id' => 1,
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create();
$report = AutomatedReport::factory()->create([
'team_id' => $team->id,
'type' => AutomatedReportsService::TYPE_ASK_JIMINNY,
'status' => false,
'activity_search_id' => $search->id,
'ask_anything_prompt_id' => null,
'created_by' => $user->id,
]);
$this->apiGuardLogin($user);
$response = $this->actingAs($user)
->postJson(route('api.v2.ask_jiminny_reports.toggle_status', $report->uuid), [
'enabled' => true,
]);
$response->assertStatus(422)
->assertJson([
'error' => 'Cannot enable report with missing saved search or prompt',
]);
$this->assertDatabaseHas('automated_reports', [
'id' => $report->id,
'status' => false,
]);
}
public function testToggleStatusAllowsEnablingReportWithValidReferences(): void
{
$team = Team::factory()->create([
'uuid' => Str::uuid()->toString(),
'crm_id' => 1,
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create();
$prompt = AskAnythingPrompt::factory()->create([
'owner_id' => $user->id,
]);
$report = AutomatedReport::factory()->create([
'team_id' => $team->id,
'type' => AutomatedReportsService::TYPE_ASK_JIMINNY,
'status' => false,
'activity_search_id' => $search->id,
'ask_anything_prompt_id' => $prompt->id,
'created_by' => $user->id,
]);
$this->apiGuardLogin($user);
$response = $this->actingAs($user)
->postJson(route('api.v2.ask_jiminny_reports.toggle_status', $report->uuid), [
'enabled' => true,
]);
$response->assertStatus(200);
$this->assertDatabaseHas('automated_reports', [
'id' => $report->id,
'status' => true,
]);
}
public function testToggleStatusAllowsDisablingReportWithNullReferences(): void
{
$team = Team::factory()->create([
'uuid' => Str::uuid()->toString(),
'crm_id' => 1,
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$report = AutomatedReport::factory()->create([
'team_id' => $team->id,
'type' => AutomatedReportsService::TYPE_ASK_JIMINNY,
'status' => true,
'activity_search_id' => null,
'ask_anything_prompt_id' => null,
'created_by' => $user->id,
]);
$this->apiGuardLogin($user);
$response = $this->actingAs($user)
->postJson(route('api.v2.ask_jiminny_reports.toggle_status', $report->uuid), [
'enabled' => false,
]);
$response->assertStatus(200);
$this->assertDatabaseHas('automated_reports', [
'id' => $report->id,
'status' => false,
]);
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
1
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Component\ActivitySearch\FilterDefinition;
use Illuminate\Support\Collection;
use Jiminny\Component\ActivitySearch\FilterDefinition;
use Jiminny\Component\ActivitySearch\FilterDefinitionQuery;
use Jiminny\Component\ActivitySearch\FilterDefinitionQueryCollection;
use Jiminny\Contracts\ActivitySearch\ValidatedFilterDefinitionInterface;
use Jiminny\Contracts\Repositories\UserRepository;
use Jiminny\Models;
use Jiminny\Models\Feature\FeatureEnum;
use Jiminny\Models\Team;
use Jiminny\Traits\RequiresUUID;
use Elastica\Query;
final class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefinitionInterface
{
private const int NO_GROUP_ID = 999;
private UserRepository $userRepository;
public function __construct(UserRepository $userRepository)
{
$this->userRepository = $userRepository;
}
public function shouldApplyQueries(): bool
{
return count($this->getValue()) > 0;
}
public function getQueries(): FilterDefinitionQueryCollection
{
$userIds = $this->getValue();
return FilterDefinitionQueryCollection::make([
FilterDefinitionQuery::instance()
->setQuery(new Query\Terms('coachingFeedbacks.coach.id_string', $userIds))
->setPath('coachingFeedbacks.coach', 'coachingFeedbacks'),
]);
}
public function toArray(): array
{
return [
'id' => 'coaching-feedback-user-filter',
'label' => 'Coach',
'helpText' => 'The person who completed the Coaching Framework',
'placeholder' => 'Search coaches',
'inputType' => InputTypeEnum::DROPDOWN_MULTIPLE,
'queryParam' => 'coaching_feedback_coach_id',
'options' => $this->getOptions(),
'groupLabelKey' => 'label',
'groupValuesKey' => 'users',
'optionLabelKey' => 'name',
'optionValueKey' => 'id',
'value' => $this->getValue(),
];
}
private function getOptions(): array
{
$user = $this->executedBy;
$query = $user
->getTeam()
->users()
->whereNotIn(
'uuid',
$this->userRepository->findInaccessibleDeactivatedUserUuids($user)
->map(static fn (string $uuid): string => RequiresUUID::toOptimized($uuid))
->all(),
)
->orderBy('name');
$users = $query
->with('group')
->get()
->reduce(
static function (array $carry, Models\User $user): array {
$group = $user->getGroup();
$groupId = $group !== null
? $group->getUuid()
: self::NO_GROUP_ID;
$groupName = $group !== null
? $group->getName()
: '(NON-GROUPED)';
if (! array_key_exists($groupId, $carry)) {
$carry[$groupId] = [
'label' => $groupName,
'users' => [],
];
}
$carry[$groupId]['users'][] = [
'id' => $user->getUuid(),
'name' => sprintf(
'%s%s',
$user->getName(),
! $user->isStatusActive()
? ' (Inactive)'
: ''
),
];
return $carry;
},
[]
);
return Collection::make($users)
->sortBy('label')
->values()
->toArray();
}
public function getValue(): array
{
if (! $this->criteria->hasCoachingFeedbackCoachUserIds()) {
return $this->getDefaultValue();
}
return array_diff(
$this->criteria->getCoachingFeedbackCoachUserId(),
$this->userRepository->findInaccessibleDeactivatedUserUuids($this->executedBy)->all(),
);
}
private function getDefaultValue(): array
{
return [];
}
public function getValidationRules(?string $prefix = null): array
{
$team = $this->executedBy->getTeam();
return [
$prefix . 'coaching_feedback_coach_id' => 'array',
$prefix . 'coaching_feedback_coach_id.*' => 'uuid:users,team_id,' . $team->getId(),
];
}
public function getSortOrder(): int
{
return 86;
}
public function shouldBeIncluded(Team $team): bool
{
return $team->hasFeature(FeatureEnum::COACHING_FRAMEWORK);
}
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20676-delete-report-related-objects, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.098071806,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: JY-20676-delete-report-related-objects","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.8081782,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceTest","depth":6,"bounds":{"left":0.8234708,"top":0.019952115,"width":0.09208777,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"bounds":{"left":0.9155585,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest'","depth":6,"bounds":{"left":0.9268617,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"bounds":{"left":0.9381649,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"bounds":{"left":0.96609044,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"bounds":{"left":0.9773936,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"bounds":{"left":0.9886968,"top":0.019952115,"width":0.011303186,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Tests\\Feature\\Http\\Controllers\\API\\V2;\n\nuse Illuminate\\Foundation\\Testing\\DatabaseTransactions;\nuse Illuminate\\Support\\Str;\nuse Jiminny\\Models\\AutomatedReport;\nuse Jiminny\\Models\\AskAnything\\AskAnythingPrompt;\nuse Jiminny\\Models\\Activity\\Search;\nuse Jiminny\\Models\\Role;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AutomatedReportsService;\nuse Tests\\TestCase;\n\nfinal class AskJiminnyReportsControllerTest extends TestCase\n{\n use DatabaseTransactions;\n\n public function testToggleStatusPreventsEnablingReportWithNullSearchId(): void\n {\n $team = Team::factory()->create([\n 'uuid' => Str::uuid()->toString(),\n 'crm_id' => 1,\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $prompt = AskAnythingPrompt::factory()->create([\n 'owner_id' => $user->id,\n ]);\n\n $report = AutomatedReport::factory()->create([\n 'team_id' => $team->id,\n 'type' => AutomatedReportsService::TYPE_ASK_JIMINNY,\n 'status' => false,\n 'activity_search_id' => null,\n 'ask_anything_prompt_id' => $prompt->id,\n 'created_by' => $user->id,\n ]);\n\n $this->apiGuardLogin($user);\n\n $response = $this->actingAs($user)\n ->postJson(route('api.v2.ask_jiminny_reports.toggle_status', $report->uuid), [\n 'enabled' => true,\n ]);\n\n $response->assertStatus(422)\n ->assertJson([\n 'error' => 'Cannot enable report with missing saved search or prompt',\n ]);\n\n $this->assertDatabaseHas('automated_reports', [\n 'id' => $report->id,\n 'status' => false,\n ]);\n }\n\n public function testToggleStatusPreventsEnablingReportWithNullPromptId(): void\n {\n $team = Team::factory()->create([\n 'uuid' => Str::uuid()->toString(),\n 'crm_id' => 1,\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create();\n\n $report = AutomatedReport::factory()->create([\n 'team_id' => $team->id,\n 'type' => AutomatedReportsService::TYPE_ASK_JIMINNY,\n 'status' => false,\n 'activity_search_id' => $search->id,\n 'ask_anything_prompt_id' => null,\n 'created_by' => $user->id,\n ]);\n\n $this->apiGuardLogin($user);\n\n $response = $this->actingAs($user)\n ->postJson(route('api.v2.ask_jiminny_reports.toggle_status', $report->uuid), [\n 'enabled' => true,\n ]);\n\n $response->assertStatus(422)\n ->assertJson([\n 'error' => 'Cannot enable report with missing saved search or prompt',\n ]);\n\n $this->assertDatabaseHas('automated_reports', [\n 'id' => $report->id,\n 'status' => false,\n ]);\n }\n\n public function testToggleStatusAllowsEnablingReportWithValidReferences(): void\n {\n $team = Team::factory()->create([\n 'uuid' => Str::uuid()->toString(),\n 'crm_id' => 1,\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create();\n $prompt = AskAnythingPrompt::factory()->create([\n 'owner_id' => $user->id,\n ]);\n\n $report = AutomatedReport::factory()->create([\n 'team_id' => $team->id,\n 'type' => AutomatedReportsService::TYPE_ASK_JIMINNY,\n 'status' => false,\n 'activity_search_id' => $search->id,\n 'ask_anything_prompt_id' => $prompt->id,\n 'created_by' => $user->id,\n ]);\n\n $this->apiGuardLogin($user);\n\n $response = $this->actingAs($user)\n ->postJson(route('api.v2.ask_jiminny_reports.toggle_status', $report->uuid), [\n 'enabled' => true,\n ]);\n\n $response->assertStatus(200);\n\n $this->assertDatabaseHas('automated_reports', [\n 'id' => $report->id,\n 'status' => true,\n ]);\n }\n\n public function testToggleStatusAllowsDisablingReportWithNullReferences(): void\n {\n $team = Team::factory()->create([\n 'uuid' => Str::uuid()->toString(),\n 'crm_id' => 1,\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $report = AutomatedReport::factory()->create([\n 'team_id' => $team->id,\n 'type' => AutomatedReportsService::TYPE_ASK_JIMINNY,\n 'status' => true,\n 'activity_search_id' => null,\n 'ask_anything_prompt_id' => null,\n 'created_by' => $user->id,\n ]);\n\n $this->apiGuardLogin($user);\n\n $response = $this->actingAs($user)\n ->postJson(route('api.v2.ask_jiminny_reports.toggle_status', $report->uuid), [\n 'enabled' => false,\n ]);\n\n $response->assertStatus(200);\n\n $this->assertDatabaseHas('automated_reports', [\n 'id' => $report->id,\n 'status' => false,\n ]);\n }\n}","depth":4,"bounds":{"left":0.15990691,"top":0.02952913,"width":0.26728722,"height":0.45650437},"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Tests\\Feature\\Http\\Controllers\\API\\V2;\n\nuse Illuminate\\Foundation\\Testing\\DatabaseTransactions;\nuse Illuminate\\Support\\Str;\nuse Jiminny\\Models\\AutomatedReport;\nuse Jiminny\\Models\\AskAnything\\AskAnythingPrompt;\nuse Jiminny\\Models\\Activity\\Search;\nuse Jiminny\\Models\\Role;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AutomatedReportsService;\nuse Tests\\TestCase;\n\nfinal class AskJiminnyReportsControllerTest extends TestCase\n{\n use DatabaseTransactions;\n\n public function testToggleStatusPreventsEnablingReportWithNullSearchId(): void\n {\n $team = Team::factory()->create([\n 'uuid' => Str::uuid()->toString(),\n 'crm_id' => 1,\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $prompt = AskAnythingPrompt::factory()->create([\n 'owner_id' => $user->id,\n ]);\n\n $report = AutomatedReport::factory()->create([\n 'team_id' => $team->id,\n 'type' => AutomatedReportsService::TYPE_ASK_JIMINNY,\n 'status' => false,\n 'activity_search_id' => null,\n 'ask_anything_prompt_id' => $prompt->id,\n 'created_by' => $user->id,\n ]);\n\n $this->apiGuardLogin($user);\n\n $response = $this->actingAs($user)\n ->postJson(route('api.v2.ask_jiminny_reports.toggle_status', $report->uuid), [\n 'enabled' => true,\n ]);\n\n $response->assertStatus(422)\n ->assertJson([\n 'error' => 'Cannot enable report with missing saved search or prompt',\n ]);\n\n $this->assertDatabaseHas('automated_reports', [\n 'id' => $report->id,\n 'status' => false,\n ]);\n }\n\n public function testToggleStatusPreventsEnablingReportWithNullPromptId(): void\n {\n $team = Team::factory()->create([\n 'uuid' => Str::uuid()->toString(),\n 'crm_id' => 1,\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create();\n\n $report = AutomatedReport::factory()->create([\n 'team_id' => $team->id,\n 'type' => AutomatedReportsService::TYPE_ASK_JIMINNY,\n 'status' => false,\n 'activity_search_id' => $search->id,\n 'ask_anything_prompt_id' => null,\n 'created_by' => $user->id,\n ]);\n\n $this->apiGuardLogin($user);\n\n $response = $this->actingAs($user)\n ->postJson(route('api.v2.ask_jiminny_reports.toggle_status', $report->uuid), [\n 'enabled' => true,\n ]);\n\n $response->assertStatus(422)\n ->assertJson([\n 'error' => 'Cannot enable report with missing saved search or prompt',\n ]);\n\n $this->assertDatabaseHas('automated_reports', [\n 'id' => $report->id,\n 'status' => false,\n ]);\n }\n\n public function testToggleStatusAllowsEnablingReportWithValidReferences(): void\n {\n $team = Team::factory()->create([\n 'uuid' => Str::uuid()->toString(),\n 'crm_id' => 1,\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create();\n $prompt = AskAnythingPrompt::factory()->create([\n 'owner_id' => $user->id,\n ]);\n\n $report = AutomatedReport::factory()->create([\n 'team_id' => $team->id,\n 'type' => AutomatedReportsService::TYPE_ASK_JIMINNY,\n 'status' => false,\n 'activity_search_id' => $search->id,\n 'ask_anything_prompt_id' => $prompt->id,\n 'created_by' => $user->id,\n ]);\n\n $this->apiGuardLogin($user);\n\n $response = $this->actingAs($user)\n ->postJson(route('api.v2.ask_jiminny_reports.toggle_status', $report->uuid), [\n 'enabled' => true,\n ]);\n\n $response->assertStatus(200);\n\n $this->assertDatabaseHas('automated_reports', [\n 'id' => $report->id,\n 'status' => true,\n ]);\n }\n\n public function testToggleStatusAllowsDisablingReportWithNullReferences(): void\n {\n $team = Team::factory()->create([\n 'uuid' => Str::uuid()->toString(),\n 'crm_id' => 1,\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $report = AutomatedReport::factory()->create([\n 'team_id' => $team->id,\n 'type' => AutomatedReportsService::TYPE_ASK_JIMINNY,\n 'status' => true,\n 'activity_search_id' => null,\n 'ask_anything_prompt_id' => null,\n 'created_by' => $user->id,\n ]);\n\n $this->apiGuardLogin($user);\n\n $response = $this->actingAs($user)\n ->postJson(route('api.v2.ask_jiminny_reports.toggle_status', $report->uuid), [\n 'enabled' => false,\n ]);\n\n $response->assertStatus(200);\n\n $this->assertDatabaseHas('automated_reports', [\n 'id' => $report->id,\n 'status' => false,\n ]);\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"1","depth":4,"bounds":{"left":0.7124335,"top":0.10055866,"width":0.00731383,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.72140956,"top":0.09896249,"width":0.00731383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.7287234,"top":0.09896249,"width":0.006981383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Component\\ActivitySearch\\FilterDefinition;\n\nuse Illuminate\\Support\\Collection;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinitionQuery;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinitionQueryCollection;\nuse Jiminny\\Contracts\\ActivitySearch\\ValidatedFilterDefinitionInterface;\nuse Jiminny\\Contracts\\Repositories\\UserRepository;\nuse Jiminny\\Models;\nuse Jiminny\\Models\\Feature\\FeatureEnum;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Traits\\RequiresUUID;\nuse Elastica\\Query;\n\nfinal class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefinitionInterface\n{\n private const int NO_GROUP_ID = 999;\n private UserRepository $userRepository;\n\n public function __construct(UserRepository $userRepository)\n {\n $this->userRepository = $userRepository;\n }\n\n public function shouldApplyQueries(): bool\n {\n return count($this->getValue()) > 0;\n }\n\n public function getQueries(): FilterDefinitionQueryCollection\n {\n $userIds = $this->getValue();\n\n return FilterDefinitionQueryCollection::make([\n FilterDefinitionQuery::instance()\n ->setQuery(new Query\\Terms('coachingFeedbacks.coach.id_string', $userIds))\n ->setPath('coachingFeedbacks.coach', 'coachingFeedbacks'),\n ]);\n }\n\n public function toArray(): array\n {\n return [\n 'id' => 'coaching-feedback-user-filter',\n 'label' => 'Coach',\n 'helpText' => 'The person who completed the Coaching Framework',\n 'placeholder' => 'Search coaches',\n 'inputType' => InputTypeEnum::DROPDOWN_MULTIPLE,\n 'queryParam' => 'coaching_feedback_coach_id',\n 'options' => $this->getOptions(),\n 'groupLabelKey' => 'label',\n 'groupValuesKey' => 'users',\n 'optionLabelKey' => 'name',\n 'optionValueKey' => 'id',\n 'value' => $this->getValue(),\n ];\n }\n\n private function getOptions(): array\n {\n $user = $this->executedBy;\n $query = $user\n ->getTeam()\n ->users()\n ->whereNotIn(\n 'uuid',\n $this->userRepository->findInaccessibleDeactivatedUserUuids($user)\n ->map(static fn (string $uuid): string => RequiresUUID::toOptimized($uuid))\n ->all(),\n )\n ->orderBy('name');\n\n $users = $query\n ->with('group')\n ->get()\n ->reduce(\n static function (array $carry, Models\\User $user): array {\n $group = $user->getGroup();\n $groupId = $group !== null\n ? $group->getUuid()\n : self::NO_GROUP_ID;\n $groupName = $group !== null\n ? $group->getName()\n : '(NON-GROUPED)';\n\n if (! array_key_exists($groupId, $carry)) {\n $carry[$groupId] = [\n 'label' => $groupName,\n 'users' => [],\n ];\n }\n\n $carry[$groupId]['users'][] = [\n 'id' => $user->getUuid(),\n 'name' => sprintf(\n '%s%s',\n $user->getName(),\n ! $user->isStatusActive()\n ? ' (Inactive)'\n : ''\n ),\n ];\n\n return $carry;\n },\n []\n );\n\n return Collection::make($users)\n ->sortBy('label')\n ->values()\n ->toArray();\n }\n\n public function getValue(): array\n {\n if (! $this->criteria->hasCoachingFeedbackCoachUserIds()) {\n return $this->getDefaultValue();\n }\n\n return array_diff(\n $this->criteria->getCoachingFeedbackCoachUserId(),\n $this->userRepository->findInaccessibleDeactivatedUserUuids($this->executedBy)->all(),\n );\n }\n\n private function getDefaultValue(): array\n {\n return [];\n }\n\n public function getValidationRules(?string $prefix = null): array\n {\n $team = $this->executedBy->getTeam();\n\n return [\n $prefix . 'coaching_feedback_coach_id' => 'array',\n $prefix . 'coaching_feedback_coach_id.*' => 'uuid:users,team_id,' . $team->getId(),\n ];\n }\n\n public function getSortOrder(): int\n {\n return 86;\n }\n\n public function shouldBeIncluded(Team $team): bool\n {\n return $team->hasFeature(FeatureEnum::COACHING_FRAMEWORK);\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Component\\ActivitySearch\\FilterDefinition;\n\nuse Illuminate\\Support\\Collection;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinitionQuery;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinitionQueryCollection;\nuse Jiminny\\Contracts\\ActivitySearch\\ValidatedFilterDefinitionInterface;\nuse Jiminny\\Contracts\\Repositories\\UserRepository;\nuse Jiminny\\Models;\nuse Jiminny\\Models\\Feature\\FeatureEnum;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Traits\\RequiresUUID;\nuse Elastica\\Query;\n\nfinal class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefinitionInterface\n{\n private const int NO_GROUP_ID = 999;\n private UserRepository $userRepository;\n\n public function __construct(UserRepository $userRepository)\n {\n $this->userRepository = $userRepository;\n }\n\n public function shouldApplyQueries(): bool\n {\n return count($this->getValue()) > 0;\n }\n\n public function getQueries(): FilterDefinitionQueryCollection\n {\n $userIds = $this->getValue();\n\n return FilterDefinitionQueryCollection::make([\n FilterDefinitionQuery::instance()\n ->setQuery(new Query\\Terms('coachingFeedbacks.coach.id_string', $userIds))\n ->setPath('coachingFeedbacks.coach', 'coachingFeedbacks'),\n ]);\n }\n\n public function toArray(): array\n {\n return [\n 'id' => 'coaching-feedback-user-filter',\n 'label' => 'Coach',\n 'helpText' => 'The person who completed the Coaching Framework',\n 'placeholder' => 'Search coaches',\n 'inputType' => InputTypeEnum::DROPDOWN_MULTIPLE,\n 'queryParam' => 'coaching_feedback_coach_id',\n 'options' => $this->getOptions(),\n 'groupLabelKey' => 'label',\n 'groupValuesKey' => 'users',\n 'optionLabelKey' => 'name',\n 'optionValueKey' => 'id',\n 'value' => $this->getValue(),\n ];\n }\n\n private function getOptions(): array\n {\n $user = $this->executedBy;\n $query = $user\n ->getTeam()\n ->users()\n ->whereNotIn(\n 'uuid',\n $this->userRepository->findInaccessibleDeactivatedUserUuids($user)\n ->map(static fn (string $uuid): string => RequiresUUID::toOptimized($uuid))\n ->all(),\n )\n ->orderBy('name');\n\n $users = $query\n ->with('group')\n ->get()\n ->reduce(\n static function (array $carry, Models\\User $user): array {\n $group = $user->getGroup();\n $groupId = $group !== null\n ? $group->getUuid()\n : self::NO_GROUP_ID;\n $groupName = $group !== null\n ? $group->getName()\n : '(NON-GROUPED)';\n\n if (! array_key_exists($groupId, $carry)) {\n $carry[$groupId] = [\n 'label' => $groupName,\n 'users' => [],\n ];\n }\n\n $carry[$groupId]['users'][] = [\n 'id' => $user->getUuid(),\n 'name' => sprintf(\n '%s%s',\n $user->getName(),\n ! $user->isStatusActive()\n ? ' (Inactive)'\n : ''\n ),\n ];\n\n return $carry;\n },\n []\n );\n\n return Collection::make($users)\n ->sortBy('label')\n ->values()\n ->toArray();\n }\n\n public function getValue(): array\n {\n if (! $this->criteria->hasCoachingFeedbackCoachUserIds()) {\n return $this->getDefaultValue();\n }\n\n return array_diff(\n $this->criteria->getCoachingFeedbackCoachUserId(),\n $this->userRepository->findInaccessibleDeactivatedUserUuids($this->executedBy)->all(),\n );\n }\n\n private function getDefaultValue(): array\n {\n return [];\n }\n\n public function getValidationRules(?string $prefix = null): array\n {\n $team = $this->executedBy->getTeam();\n\n return [\n $prefix . 'coaching_feedback_coach_id' => 'array',\n $prefix . 'coaching_feedback_coach_id.*' => 'uuid:users,team_id,' . $team->getId(),\n ];\n }\n\n public function getSortOrder(): int\n {\n return 86;\n }\n\n public function shouldBeIncluded(Team $team): bool\n {\n return $team->hasFeature(FeatureEnum::COACHING_FRAMEWORK);\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"bounds":{"left":0.011968086,"top":0.047885075,"width":0.024268618,"height":0.024740623},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
853080125825835349
|
-7496656036878021658
|
visual_change
|
accessibility
|
NULL
|
Project: faVsco.js, menu
JY-20676-delete-report-re Project: faVsco.js, menu
JY-20676-delete-report-related-objects, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Code changed:
Hide
Sync Changes
Hide This Notification
<?php
declare(strict_types=1);
namespace Tests\Feature\Http\Controllers\API\V2;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Illuminate\Support\Str;
use Jiminny\Models\AutomatedReport;
use Jiminny\Models\AskAnything\AskAnythingPrompt;
use Jiminny\Models\Activity\Search;
use Jiminny\Models\Role;
use Jiminny\Models\Team;
use Jiminny\Models\User;
use Jiminny\Services\Kiosk\AutomatedReports\AutomatedReportsService;
use Tests\TestCase;
final class AskJiminnyReportsControllerTest extends TestCase
{
use DatabaseTransactions;
public function testToggleStatusPreventsEnablingReportWithNullSearchId(): void
{
$team = Team::factory()->create([
'uuid' => Str::uuid()->toString(),
'crm_id' => 1,
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$prompt = AskAnythingPrompt::factory()->create([
'owner_id' => $user->id,
]);
$report = AutomatedReport::factory()->create([
'team_id' => $team->id,
'type' => AutomatedReportsService::TYPE_ASK_JIMINNY,
'status' => false,
'activity_search_id' => null,
'ask_anything_prompt_id' => $prompt->id,
'created_by' => $user->id,
]);
$this->apiGuardLogin($user);
$response = $this->actingAs($user)
->postJson(route('api.v2.ask_jiminny_reports.toggle_status', $report->uuid), [
'enabled' => true,
]);
$response->assertStatus(422)
->assertJson([
'error' => 'Cannot enable report with missing saved search or prompt',
]);
$this->assertDatabaseHas('automated_reports', [
'id' => $report->id,
'status' => false,
]);
}
public function testToggleStatusPreventsEnablingReportWithNullPromptId(): void
{
$team = Team::factory()->create([
'uuid' => Str::uuid()->toString(),
'crm_id' => 1,
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create();
$report = AutomatedReport::factory()->create([
'team_id' => $team->id,
'type' => AutomatedReportsService::TYPE_ASK_JIMINNY,
'status' => false,
'activity_search_id' => $search->id,
'ask_anything_prompt_id' => null,
'created_by' => $user->id,
]);
$this->apiGuardLogin($user);
$response = $this->actingAs($user)
->postJson(route('api.v2.ask_jiminny_reports.toggle_status', $report->uuid), [
'enabled' => true,
]);
$response->assertStatus(422)
->assertJson([
'error' => 'Cannot enable report with missing saved search or prompt',
]);
$this->assertDatabaseHas('automated_reports', [
'id' => $report->id,
'status' => false,
]);
}
public function testToggleStatusAllowsEnablingReportWithValidReferences(): void
{
$team = Team::factory()->create([
'uuid' => Str::uuid()->toString(),
'crm_id' => 1,
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create();
$prompt = AskAnythingPrompt::factory()->create([
'owner_id' => $user->id,
]);
$report = AutomatedReport::factory()->create([
'team_id' => $team->id,
'type' => AutomatedReportsService::TYPE_ASK_JIMINNY,
'status' => false,
'activity_search_id' => $search->id,
'ask_anything_prompt_id' => $prompt->id,
'created_by' => $user->id,
]);
$this->apiGuardLogin($user);
$response = $this->actingAs($user)
->postJson(route('api.v2.ask_jiminny_reports.toggle_status', $report->uuid), [
'enabled' => true,
]);
$response->assertStatus(200);
$this->assertDatabaseHas('automated_reports', [
'id' => $report->id,
'status' => true,
]);
}
public function testToggleStatusAllowsDisablingReportWithNullReferences(): void
{
$team = Team::factory()->create([
'uuid' => Str::uuid()->toString(),
'crm_id' => 1,
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$report = AutomatedReport::factory()->create([
'team_id' => $team->id,
'type' => AutomatedReportsService::TYPE_ASK_JIMINNY,
'status' => true,
'activity_search_id' => null,
'ask_anything_prompt_id' => null,
'created_by' => $user->id,
]);
$this->apiGuardLogin($user);
$response = $this->actingAs($user)
->postJson(route('api.v2.ask_jiminny_reports.toggle_status', $report->uuid), [
'enabled' => false,
]);
$response->assertStatus(200);
$this->assertDatabaseHas('automated_reports', [
'id' => $report->id,
'status' => false,
]);
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
1
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Component\ActivitySearch\FilterDefinition;
use Illuminate\Support\Collection;
use Jiminny\Component\ActivitySearch\FilterDefinition;
use Jiminny\Component\ActivitySearch\FilterDefinitionQuery;
use Jiminny\Component\ActivitySearch\FilterDefinitionQueryCollection;
use Jiminny\Contracts\ActivitySearch\ValidatedFilterDefinitionInterface;
use Jiminny\Contracts\Repositories\UserRepository;
use Jiminny\Models;
use Jiminny\Models\Feature\FeatureEnum;
use Jiminny\Models\Team;
use Jiminny\Traits\RequiresUUID;
use Elastica\Query;
final class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefinitionInterface
{
private const int NO_GROUP_ID = 999;
private UserRepository $userRepository;
public function __construct(UserRepository $userRepository)
{
$this->userRepository = $userRepository;
}
public function shouldApplyQueries(): bool
{
return count($this->getValue()) > 0;
}
public function getQueries(): FilterDefinitionQueryCollection
{
$userIds = $this->getValue();
return FilterDefinitionQueryCollection::make([
FilterDefinitionQuery::instance()
->setQuery(new Query\Terms('coachingFeedbacks.coach.id_string', $userIds))
->setPath('coachingFeedbacks.coach', 'coachingFeedbacks'),
]);
}
public function toArray(): array
{
return [
'id' => 'coaching-feedback-user-filter',
'label' => 'Coach',
'helpText' => 'The person who completed the Coaching Framework',
'placeholder' => 'Search coaches',
'inputType' => InputTypeEnum::DROPDOWN_MULTIPLE,
'queryParam' => 'coaching_feedback_coach_id',
'options' => $this->getOptions(),
'groupLabelKey' => 'label',
'groupValuesKey' => 'users',
'optionLabelKey' => 'name',
'optionValueKey' => 'id',
'value' => $this->getValue(),
];
}
private function getOptions(): array
{
$user = $this->executedBy;
$query = $user
->getTeam()
->users()
->whereNotIn(
'uuid',
$this->userRepository->findInaccessibleDeactivatedUserUuids($user)
->map(static fn (string $uuid): string => RequiresUUID::toOptimized($uuid))
->all(),
)
->orderBy('name');
$users = $query
->with('group')
->get()
->reduce(
static function (array $carry, Models\User $user): array {
$group = $user->getGroup();
$groupId = $group !== null
? $group->getUuid()
: self::NO_GROUP_ID;
$groupName = $group !== null
? $group->getName()
: '(NON-GROUPED)';
if (! array_key_exists($groupId, $carry)) {
$carry[$groupId] = [
'label' => $groupName,
'users' => [],
];
}
$carry[$groupId]['users'][] = [
'id' => $user->getUuid(),
'name' => sprintf(
'%s%s',
$user->getName(),
! $user->isStatusActive()
? ' (Inactive)'
: ''
),
];
return $carry;
},
[]
);
return Collection::make($users)
->sortBy('label')
->values()
->toArray();
}
public function getValue(): array
{
if (! $this->criteria->hasCoachingFeedbackCoachUserIds()) {
return $this->getDefaultValue();
}
return array_diff(
$this->criteria->getCoachingFeedbackCoachUserId(),
$this->userRepository->findInaccessibleDeactivatedUserUuids($this->executedBy)->all(),
);
}
private function getDefaultValue(): array
{
return [];
}
public function getValidationRules(?string $prefix = null): array
{
$team = $this->executedBy->getTeam();
return [
$prefix . 'coaching_feedback_coach_id' => 'array',
$prefix . 'coaching_feedback_coach_id.*' => 'uuid:users,team_id,' . $team->getId(),
];
}
public function getSortOrder(): int
{
return 86;
}
public function shouldBeIncluded(Team $team): bool
{
return $team->hasFeature(FeatureEnum::COACHING_FRAMEWORK);
}
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
56370
|
1965
|
22
|
2026-05-19T08:02:34.626510+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-19/1779 /Users/lukas/.screenpipe/data/data/2026-05-19/1779177754626_m2.jpg...
|
Firefox
|
NULL
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
ActivityFilesLaterMoreSlackcalVIewmistonWindowhelp ActivityFilesLaterMoreSlackcalVIewmistonWindowhelp@ Describe what you are looking forJiminny...y# bugsi contusion-clinic# curiosity_lab# engineering# general#jiminny-bgic olattorm-nckets# product launches*random# releases# sofia-office# support# thank-yous# the peonle of iim...0 Direct messagesVasil VasilevNikolay YankovGalva Dimitrova. Aneliya AngelovaStefka StoyanovaStovan omovCa Todor Stamatov IMario GeorgievNikolav Ivanov•nJames Granami* Stovan TanevNikolay Yankov• Messagest Add canva( Filesтимаше ли y~ VesterdayLukas Kovalik 2:28 PNтрябва да си вързан към SF да работиNikolay Yankov 2:28 PMNikolay Yankov 2:41 PMимаме approve на PRда го даваме за QА?Lukas Kovallk 2.42 pMlNikolav Yankoy 3:02 PMTеCTORA пейлRатоъннах го 2 пьтиNikolav Yankov 10:05 AM/api/v2/user/ask-anything-prompts?10:06ani/vil/activity/saved-searchMessage Nikolay Yankov+ Aal© Search.php app/Models/Activity© SoftPhoneManager.php app/Component/Twilio/Conference/ConferenceManag© TextMessagingService.php app/Services/Telephony) UInvercioned Siloc 11 filoclукeрonscontroller.ong© AskAnythingPromptServiceTest.phpAskJiminnyReportsControllerTest.php X © Search.php© AskAnythingPrompt.phpAnythingPromptservice.ong© ActivityController.phgager.php© CoreUserRequest.php)constants.pngC) RoleAttr.php" ListenerRoleCannotHaveAdminOrManagerPermissionRuleTest.php) RoleAttrTest.phperPermissionRule.php(C)Activity/Close/Service.php(C) Activity/RinqCentral/Service.phpvice.php© TextMessagingService.phpportscontroLerTest extends TestCaseToggleStatusPreventsEnablingReportWithNullSearchId: void{...}ToggleStatusPreventsEnablingReportWithNullPromptIdO: void{...}TogqleStatusAllowsEnablingReportWithValidReferencesO: voidk...}TogqleStatusA1lowsDisablingReportWithNul1ReferencesO: voidk...}®® Side-by-side viewer ~Do not ignore4af40 .env.locaIRTTY HSANER CISTOM CCP=ONNECTTON=mvsallIOST=127.0.0.10RT-73A4DATABASE=jiminnyISERNAME=rootUNNECILUN UNLU=On1OHOST_OHI0=host.docker.internalDB PORT 0HL0=/652DB DATABASE_OHI0=jiminnyDB USERNAME OHIDEB PASSWORD OHTO=DB CONMECIOION IRELANDEIre LandIDB HOST TRELANDehost docker internalDB PORT TRELAND=7532DB DATABASE RELANdeTiminnv.IB PASSWORD TRELANDEnR CONNECTTON STACTNG=staginalut affectina the dictionarios for other lanquades (todav 10:001Highlight wordsx 15= custom.log= laravel.log4 SF jiminny@localhost]4 HS_local [jiminny@localhost]& console [PROD]& console [EU]A console [STAGING]© CoachingFeedbackCoachUserln.php Xfinal class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefini~pubLic tunccion conscruccuserkeposicory suserkeposicorvor...r29 6tpublic function shouldApplyQueries(): boolf...}34 6t >public function getQueries: FilterDefinitionQueryCollection{...}45 6tpubLic function toArrayo): arrayi...h1 usageprivate function getOptions: arrayt...118f 119.public function getValue: arrayt...lusageprivate function getDefaultValue: arrayt...136 >public function getValidationRules(?string $prefix = null): array{...}Current versionSECIRTTY HEANER CISTOM CCP=DB_CONNECTION=mysqlDB_HOST=mariadb#DB_HOST=mariadbnR PORT-7304DB_DATABASE=jiminnyDB_USERNAME=jmnyadminDB_PASSWORD=[PASSWORD] ADMIN_ USERNAME=imnyadmin#DB_ [ENV_SECRET] Models User#CASHIER_MODELEJ1minny Models UserhubsBROADCAST DRMErenuSherCACHE_DRIVER=redisCACHE PRESIXe-imnySESSTON DRIVER=redisQUEUE CONNECTIONeredisGITHUB TOKEN=nu11REDTS CITENT=nhnnedisREnTS HOST=nedis"suppont Dally • In 3n oom100% 5• Tue 19 May 11:02:34CascadeO ASk Jiminny Report+0 ..searcned ask_jminny_reports.toggle and pertormed & oter quenlesASKAnychingPrompt don't nave tactorles and the fule says notto write tests for controllers. Let me remove that tlle° Fusers/tukas/31m/ny/app/tests/Feature/Http/Controllers/APZ/V2/A5KJ1m/nnyßeportsControLlertes.PRun &~ SkipQ files 4200 -7 >B Reject allAccept allAsk anvthina (4D14 @s Codo Chudo Onuc 17 Modium48 ditterencesPo. 4 spaces...
|
NULL
|
2683592971908040264
|
NULL
|
visual_change
|
ocr
|
NULL
|
ActivityFilesLaterMoreSlackcalVIewmistonWindowhelp ActivityFilesLaterMoreSlackcalVIewmistonWindowhelp@ Describe what you are looking forJiminny...y# bugsi contusion-clinic# curiosity_lab# engineering# general#jiminny-bgic olattorm-nckets# product launches*random# releases# sofia-office# support# thank-yous# the peonle of iim...0 Direct messagesVasil VasilevNikolay YankovGalva Dimitrova. Aneliya AngelovaStefka StoyanovaStovan omovCa Todor Stamatov IMario GeorgievNikolav Ivanov•nJames Granami* Stovan TanevNikolay Yankov• Messagest Add canva( Filesтимаше ли y~ VesterdayLukas Kovalik 2:28 PNтрябва да си вързан към SF да работиNikolay Yankov 2:28 PMNikolay Yankov 2:41 PMимаме approve на PRда го даваме за QА?Lukas Kovallk 2.42 pMlNikolav Yankoy 3:02 PMTеCTORA пейлRатоъннах го 2 пьтиNikolav Yankov 10:05 AM/api/v2/user/ask-anything-prompts?10:06ani/vil/activity/saved-searchMessage Nikolay Yankov+ Aal© Search.php app/Models/Activity© SoftPhoneManager.php app/Component/Twilio/Conference/ConferenceManag© TextMessagingService.php app/Services/Telephony) UInvercioned Siloc 11 filoclукeрonscontroller.ong© AskAnythingPromptServiceTest.phpAskJiminnyReportsControllerTest.php X © Search.php© AskAnythingPrompt.phpAnythingPromptservice.ong© ActivityController.phgager.php© CoreUserRequest.php)constants.pngC) RoleAttr.php" ListenerRoleCannotHaveAdminOrManagerPermissionRuleTest.php) RoleAttrTest.phperPermissionRule.php(C)Activity/Close/Service.php(C) Activity/RinqCentral/Service.phpvice.php© TextMessagingService.phpportscontroLerTest extends TestCaseToggleStatusPreventsEnablingReportWithNullSearchId: void{...}ToggleStatusPreventsEnablingReportWithNullPromptIdO: void{...}TogqleStatusAllowsEnablingReportWithValidReferencesO: voidk...}TogqleStatusA1lowsDisablingReportWithNul1ReferencesO: voidk...}®® Side-by-side viewer ~Do not ignore4af40 .env.locaIRTTY HSANER CISTOM CCP=ONNECTTON=mvsallIOST=127.0.0.10RT-73A4DATABASE=jiminnyISERNAME=rootUNNECILUN UNLU=On1OHOST_OHI0=host.docker.internalDB PORT 0HL0=/652DB DATABASE_OHI0=jiminnyDB USERNAME OHIDEB PASSWORD OHTO=DB CONMECIOION IRELANDEIre LandIDB HOST TRELANDehost docker internalDB PORT TRELAND=7532DB DATABASE RELANdeTiminnv.IB PASSWORD TRELANDEnR CONNECTTON STACTNG=staginalut affectina the dictionarios for other lanquades (todav 10:001Highlight wordsx 15= custom.log= laravel.log4 SF jiminny@localhost]4 HS_local [jiminny@localhost]& console [PROD]& console [EU]A console [STAGING]© CoachingFeedbackCoachUserln.php Xfinal class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefini~pubLic tunccion conscruccuserkeposicory suserkeposicorvor...r29 6tpublic function shouldApplyQueries(): boolf...}34 6t >public function getQueries: FilterDefinitionQueryCollection{...}45 6tpubLic function toArrayo): arrayi...h1 usageprivate function getOptions: arrayt...118f 119.public function getValue: arrayt...lusageprivate function getDefaultValue: arrayt...136 >public function getValidationRules(?string $prefix = null): array{...}Current versionSECIRTTY HEANER CISTOM CCP=DB_CONNECTION=mysqlDB_HOST=mariadb#DB_HOST=mariadbnR PORT-7304DB_DATABASE=jiminnyDB_USERNAME=jmnyadminDB_PASSWORD=[PASSWORD] ADMIN_ USERNAME=imnyadmin#DB_ [ENV_SECRET] Models User#CASHIER_MODELEJ1minny Models UserhubsBROADCAST DRMErenuSherCACHE_DRIVER=redisCACHE PRESIXe-imnySESSTON DRIVER=redisQUEUE CONNECTIONeredisGITHUB TOKEN=nu11REDTS CITENT=nhnnedisREnTS HOST=nedis"suppont Dally • In 3n oom100% 5• Tue 19 May 11:02:34CascadeO ASk Jiminny Report+0 ..searcned ask_jminny_reports.toggle and pertormed & oter quenlesASKAnychingPrompt don't nave tactorles and the fule says notto write tests for controllers. Let me remove that tlle° Fusers/tukas/31m/ny/app/tests/Feature/Http/Controllers/APZ/V2/A5KJ1m/nnyßeportsControLlertes.PRun &~ SkipQ files 4200 -7 >B Reject allAccept allAsk anvthina (4D14 @s Codo Chudo Onuc 17 Modium48 ditterencesPo. 4 spaces...
|
56369
|
NULL
|
NULL
|
NULL
|
|
56371
|
1964
|
9
|
2026-05-19T08:02:36.773911+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-19/1779 /Users/lukas/.screenpipe/data/data/2026-05-19/1779177756773_m1.jpg...
|
Firefox
|
NULL
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
SlackFileEditViewGoHistoryWindowHelpAPPDOCKERO ₴1D SlackFileEditViewGoHistoryWindowHelpAPPDOCKERO ₴1DEV (-zsh)₴82app/Jobs/Crm/MatchActivityCrmData.phpapp/Jobs/Middleware/HandleHubspotRateLimit.phpAPP (-zsl47++++++p42++++++*app/Mcp/Servers/JiminnyServer.phpapp/Mcp/Tools/GetMeTool.php157++++++•app/Models/Feature/FeatureEnum.phpapp/Services/Activity/HubSpot/ProviderResolver.php+-app/Services/Activity/HubSpot/ProviderResolverInterface.phpapp/Services/Activity/HubSpot/Providers/Provider.phpapp/Services/Activity/HubSpot/Providers/ProviderKixie.php+-app/Services/Activity/HubSpot/Providers/Provider0rum.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilio.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilioFlex.phpapp/Services/Activity/HubSpot/Service.phpapp/Services/Crm/Hubspot/Client.phpapp/Services/Crm/Hubspot/HubspotClientInterface.phpapp/Services/Crm/Hubspot/Pagination/HubspotPaginationService.phpapp/Services/Crm/Hubspot/Pagination/PaginationState.phpdatabase/migrations/2026_05_13_124153_create_mcp_feature_flag.phptests/Feature/Mcp/GetMeToolFeatureTest.phptests/Feature/Mcp/ListCallsToolFeatureTest.phptests/Feature/Mcp/McpTestHelpersTrait.phptests/Unit/Component/ES/ChunkSizeTest.phptests/Unit/Component/ES/Processor/DT0s/SelectionListTest.phptests/Unit/Component/ES/Processor/TargetEntitiesSelectorTest.phptests/Unit/Component/MeetingBot/Service/ParticipantMatcherTest.phptests/Unit/Exceptions/RateLimitExceptionTest.php97++++++-132++++++•15++++++21++++--2+-25++++++.140++++++•2+-19++++++50++++++27++++++39++++++-6856++++++•tests/Unit/Jobs/Crm/MatchActivityCrmDataTest.phptests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phptests/Unit/Services/Activity/HubSpot/ServiceTest.phptests/Unit/Services/Crm/Hubspot/ClientTest.phptests/Unit/Services/Crm/Hubspot/Pagination/HubspotPaginationServiceTest.php151++++++-109++++++-250++++++283++++++37 files changed, 1587 insertions(+), 344 deletions(-)create mode 100644 app/Component/ES/ChunkSize.phpcreate mode 100644 app/Jobs/Middleware/HandleHubspotRateLimit.phpcreate mode 100644 app/Mcp/Tools/GetMeTool.phpcreate mode 100644 database/migrations/2026_05_13_124153_create_mcp_feature_flag.phpcreate mode 100644 tests/Feature/Mcp/GetMeToolFeatureTest.phpcreate mode 100644 tests/Unit/Component/ES/ChunkSizeTest.phpcreate mode 100644 tests/Unit/Exceptions/RateLimitExceptionTest.phpcreate mode 100644 tests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phplukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pullAlready up to date.lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20676-delete-reSwitched to a new branch 'JY-20676-delete-report-related-objects'lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20676-delete-report-related-obHomeDMsActivityFilesLaterMoreED→Jiminny ...# bugs# confusion-clinic# curiosity_lab# engineering# general# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jim...Direct messagese. Vasil Vasilev8. Nikolay Yankov®. Galya Dimitrovae. Aneliya Angelova&. Stefka Stoyanova. Stoyan TomovBs Todor Stamatov *M. Mario GeorgievNikolay IvanovJames GrahamStoyan TanevUnread mentionsSupport Daily - in 3h 58 m100% C8• Tue 19 May 11:02:36CDescribe what you are looking forNikolay Yankov6 0MessagesAdd canvasO Files+Nikolay YankovYesterday ~имаше ли нещь . y...Lukas Kovalik 2:28 PMтрябва да си вързан към SF да работиNikolay Yankov 2:28 PMaxaaaNikolay Yankov 2:41 PMимаме approve на PRда го даваме за QA?Lukas Kovalik 2:42 PMдаNikolay Yankov 3:02 PMтестове фейлватрьннах го 2 пътиToday ~Nikolay Yankov 10:05 AM/api/v2/user/ask-anything-prompts?target=on_demand10:06has_report:V99api/v2/user/ask-anythF1a3-431d-9510-bd079cd80ed/api/v1/activity/saved-searchMessage Nikolay Yankov...
|
NULL
|
-4043169192770493052
|
NULL
|
visual_change
|
ocr
|
NULL
|
SlackFileEditViewGoHistoryWindowHelpAPPDOCKERO ₴1D SlackFileEditViewGoHistoryWindowHelpAPPDOCKERO ₴1DEV (-zsh)₴82app/Jobs/Crm/MatchActivityCrmData.phpapp/Jobs/Middleware/HandleHubspotRateLimit.phpAPP (-zsl47++++++p42++++++*app/Mcp/Servers/JiminnyServer.phpapp/Mcp/Tools/GetMeTool.php157++++++•app/Models/Feature/FeatureEnum.phpapp/Services/Activity/HubSpot/ProviderResolver.php+-app/Services/Activity/HubSpot/ProviderResolverInterface.phpapp/Services/Activity/HubSpot/Providers/Provider.phpapp/Services/Activity/HubSpot/Providers/ProviderKixie.php+-app/Services/Activity/HubSpot/Providers/Provider0rum.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilio.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilioFlex.phpapp/Services/Activity/HubSpot/Service.phpapp/Services/Crm/Hubspot/Client.phpapp/Services/Crm/Hubspot/HubspotClientInterface.phpapp/Services/Crm/Hubspot/Pagination/HubspotPaginationService.phpapp/Services/Crm/Hubspot/Pagination/PaginationState.phpdatabase/migrations/2026_05_13_124153_create_mcp_feature_flag.phptests/Feature/Mcp/GetMeToolFeatureTest.phptests/Feature/Mcp/ListCallsToolFeatureTest.phptests/Feature/Mcp/McpTestHelpersTrait.phptests/Unit/Component/ES/ChunkSizeTest.phptests/Unit/Component/ES/Processor/DT0s/SelectionListTest.phptests/Unit/Component/ES/Processor/TargetEntitiesSelectorTest.phptests/Unit/Component/MeetingBot/Service/ParticipantMatcherTest.phptests/Unit/Exceptions/RateLimitExceptionTest.php97++++++-132++++++•15++++++21++++--2+-25++++++.140++++++•2+-19++++++50++++++27++++++39++++++-6856++++++•tests/Unit/Jobs/Crm/MatchActivityCrmDataTest.phptests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phptests/Unit/Services/Activity/HubSpot/ServiceTest.phptests/Unit/Services/Crm/Hubspot/ClientTest.phptests/Unit/Services/Crm/Hubspot/Pagination/HubspotPaginationServiceTest.php151++++++-109++++++-250++++++283++++++37 files changed, 1587 insertions(+), 344 deletions(-)create mode 100644 app/Component/ES/ChunkSize.phpcreate mode 100644 app/Jobs/Middleware/HandleHubspotRateLimit.phpcreate mode 100644 app/Mcp/Tools/GetMeTool.phpcreate mode 100644 database/migrations/2026_05_13_124153_create_mcp_feature_flag.phpcreate mode 100644 tests/Feature/Mcp/GetMeToolFeatureTest.phpcreate mode 100644 tests/Unit/Component/ES/ChunkSizeTest.phpcreate mode 100644 tests/Unit/Exceptions/RateLimitExceptionTest.phpcreate mode 100644 tests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phplukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pullAlready up to date.lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20676-delete-reSwitched to a new branch 'JY-20676-delete-report-related-objects'lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20676-delete-report-related-obHomeDMsActivityFilesLaterMoreED→Jiminny ...# bugs# confusion-clinic# curiosity_lab# engineering# general# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jim...Direct messagese. Vasil Vasilev8. Nikolay Yankov®. Galya Dimitrovae. Aneliya Angelova&. Stefka Stoyanova. Stoyan TomovBs Todor Stamatov *M. Mario GeorgievNikolay IvanovJames GrahamStoyan TanevUnread mentionsSupport Daily - in 3h 58 m100% C8• Tue 19 May 11:02:36CDescribe what you are looking forNikolay Yankov6 0MessagesAdd canvasO Files+Nikolay YankovYesterday ~имаше ли нещь . y...Lukas Kovalik 2:28 PMтрябва да си вързан към SF да работиNikolay Yankov 2:28 PMaxaaaNikolay Yankov 2:41 PMимаме approve на PRда го даваме за QA?Lukas Kovalik 2:42 PMдаNikolay Yankov 3:02 PMтестове фейлватрьннах го 2 пътиToday ~Nikolay Yankov 10:05 AM/api/v2/user/ask-anything-prompts?target=on_demand10:06has_report:V99api/v2/user/ask-anythF1a3-431d-9510-bd079cd80ed/api/v1/activity/saved-searchMessage Nikolay Yankov...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
56372
|
NULL
|
0
|
2026-05-19T08:02:37.650120+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-19/1779 /Users/lukas/.screenpipe/data/data/2026-05-19/1779177757650_m2.jpg...
|
Firefox
|
NULL
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
slackFV faVsco.js°9 JY-20676-delete-report-related slackFV faVsco.js°9 JY-20676-delete-report-related-objectsProiect(C) AutomatedReport.onp© AskAnythingPromptServiceTest.php© Serializer.php© TeamScimDetails.php> D bootstrap>D build>D config>@ contrib> @ database>@ docs> C front-end>C lanc>@ node_modules library root> @ phpstan> C publicAskJiminnyReportsControllerTest.php X© Search.php© AskAnythingPrompt.php© ActivityController.phgbaseservice.pnp)constants.pngC) RoleAttr.phpcscimProvisionina.pno) RoleAttrTest.phpListenerRoleCannotHaveAdminOrManagerPermissionRule.php(C)Activity/Close/Service.php(C) Activity/RinqCentral/Service.phpC) SyncActivity.php(C) Crm/Close/Service.pho(C) TextMessaqingService.phpfinal class AskJiminnvReoortsControllerTest extends Testcase22 D >public function testToggleStatusPreventsEnablingReportWithNullSearchId: void{...}72 D >public function testToggleStatusPreventsEnablingReportWithNullPromptId: void{...}>D resourcesv O routesphp api.oho120 D ›public function testTogqleStatusAllowsEnablingReportWithValidReferencesO: voidk...}168 D >public function testTogqleStatusAllowsDisablingReportWithNul1ReferencesO: voidk...}php api_v2.phpphp console.ohophp customer abi.ohophp embedded.phpLocal ChandesConsole XLooXChanges 17 file=.env.local app© ActivityController.php app/Http/Controllers/API© AskAnythingPrompt.php app/Models/AskAnythingc) ASKAnvihinaPromotbto,ono apo/comoonent/AskAnvihino/Dros© AskAnvthinaPromptService.php app/Component/AskAnvthina@ AskAnvthinaPromptServiceTest.php tests/Unit/Component/AskAnvthina© Ask.JiminnvReportsController.pho app/Htto/Controllers/APIV2Side-by-side viewerDo not ignoreHighlight words 158 5604af40 .env.locaSECIRTTY HSANEP CISTOM CCP=OR_CONNECTTON=mvsall= DR HOST=127 A A.1.C) Constants.ono apo/Comoonent/SClMI© CoreUser.php app/DTO/SCIM/AAD/ResponseC) CoreUserRequest.ono ano/DTO/SCIMIAAD/[EMAIL] apn/Console/Commande-nR PORT-73A6- DB_DATABASE=jiminny-DB_USERNAME=rootne pAccwnon-czunz+.ephp loadina.nho confial@ SavedSearchCRUDFeatureTest.nho tests/Feature/SavedSearchesJB CUNNECILUN UHLU=0N10C) ScimProvisionina.ohnann/Comnonent/SCIMDB HOST_OHI0=host.docker.internal© Search.php app/Models/ActivitySoftPhoneManager.php app/Component/Twilio/Conference/ConferenceManagDB PORT 0HL0=/652DB DATABASE_OHI0=jiminny© TextMessagingService.php app/Services/Telephony) Uinvercionod Siloc 11 filacDB USERNAME OHIDEB PASSWORD OHTO=DB CONMECIOION IRELANDETre LandIDB HOST TRELANDehost docker internalDB PORT TRELAND=7532DB DATABASE RELANdeTiminnv.3 PASSWORD TRELANDEnR CONNECTTON STACTNG=staginalDB_HOST_STAGING=host.docker.internalout affectina the dictionarios for other lanquades (todav 10-001= custom.log= laravel.log4 SF jiminny@localhost]4 HS_local [jiminny@localhost]& console [PROD]& console [EU]A console [STAGING]© CoachingFeedbackCoachUserln.php Xfinal class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefini~pubLic tunccion conscruccuserkeposicory suserkeposicorvor...r29 6tpublic function shouldApplyQueries(): boolf...}34 ot>public function getQueries: FilterDefinitionQueryCollection{...}45 6tpubLic function toArray): arrayl...л1 usageprivate function getOptions: arrayt...118f119.public function getValue: arrayt...lusageprivate function getDefaultValue: arrayt...136 >public function getValidationRules(?string $prefix = null): array{...}Current versionSECIRTTY HEANER CISTOM CCP=DB_CONNECTION=mysqlDB_HOST=mariadb#DB_HOST=mariadbnR PORT-7304DB_DATABASE=jiminnyDB_USERNAME=jmnyadminDB_PASSWORD=[PASSWORD] ADMIN_ USERNAME=imnyadmin#DB_ [ENV_SECRET] Models User#CASHIER_MODELEJ1minny Models UserhubsBROADCAST DRMErenuSherCACHE_DRIVER=redisCACHE PRESIXe-imnySESSTON DRIVER=redisQUEUE CONNECTIONeredisGITHUB TOKEN=nu11RENTS CITENT=nhnnedisREnTS HOST=nedis100% 5• lue 1y May 11*02•3.CascadeO ASk Jiminny Report+0 ..searcned ask_jminny_reponts.toggle and pertormed & oter querlesASKAnychingPrompt don't nave tactorles and the fule says notto write tests for controllers. Let me remove that tlle° Fusers/tukas/31m/ny/app/tests/Feature/Http/Controllers/APZ/V2/A5KJ1m/nnyßeportsControLlertes.PRun &~ Skip* Reject allAccept allQ files 4200 -7 >Ask anvthina (4D14 @s Codo Chudo Onuc 17 Modium48 ditterencesPo 4 spaces...
|
NULL
|
-7657350687453221516
|
NULL
|
visual_change
|
ocr
|
NULL
|
slackFV faVsco.js°9 JY-20676-delete-report-related slackFV faVsco.js°9 JY-20676-delete-report-related-objectsProiect(C) AutomatedReport.onp© AskAnythingPromptServiceTest.php© Serializer.php© TeamScimDetails.php> D bootstrap>D build>D config>@ contrib> @ database>@ docs> C front-end>C lanc>@ node_modules library root> @ phpstan> C publicAskJiminnyReportsControllerTest.php X© Search.php© AskAnythingPrompt.php© ActivityController.phgbaseservice.pnp)constants.pngC) RoleAttr.phpcscimProvisionina.pno) RoleAttrTest.phpListenerRoleCannotHaveAdminOrManagerPermissionRule.php(C)Activity/Close/Service.php(C) Activity/RinqCentral/Service.phpC) SyncActivity.php(C) Crm/Close/Service.pho(C) TextMessaqingService.phpfinal class AskJiminnvReoortsControllerTest extends Testcase22 D >public function testToggleStatusPreventsEnablingReportWithNullSearchId: void{...}72 D >public function testToggleStatusPreventsEnablingReportWithNullPromptId: void{...}>D resourcesv O routesphp api.oho120 D ›public function testTogqleStatusAllowsEnablingReportWithValidReferencesO: voidk...}168 D >public function testTogqleStatusAllowsDisablingReportWithNul1ReferencesO: voidk...}php api_v2.phpphp console.ohophp customer abi.ohophp embedded.phpLocal ChandesConsole XLooXChanges 17 file=.env.local app© ActivityController.php app/Http/Controllers/API© AskAnythingPrompt.php app/Models/AskAnythingc) ASKAnvihinaPromotbto,ono apo/comoonent/AskAnvihino/Dros© AskAnvthinaPromptService.php app/Component/AskAnvthina@ AskAnvthinaPromptServiceTest.php tests/Unit/Component/AskAnvthina© Ask.JiminnvReportsController.pho app/Htto/Controllers/APIV2Side-by-side viewerDo not ignoreHighlight words 158 5604af40 .env.locaSECIRTTY HSANEP CISTOM CCP=OR_CONNECTTON=mvsall= DR HOST=127 A A.1.C) Constants.ono apo/Comoonent/SClMI© CoreUser.php app/DTO/SCIM/AAD/ResponseC) CoreUserRequest.ono ano/DTO/SCIMIAAD/[EMAIL] apn/Console/Commande-nR PORT-73A6- DB_DATABASE=jiminny-DB_USERNAME=rootne pAccwnon-czunz+.ephp loadina.nho confial@ SavedSearchCRUDFeatureTest.nho tests/Feature/SavedSearchesJB CUNNECILUN UHLU=0N10C) ScimProvisionina.ohnann/Comnonent/SCIMDB HOST_OHI0=host.docker.internal© Search.php app/Models/ActivitySoftPhoneManager.php app/Component/Twilio/Conference/ConferenceManagDB PORT 0HL0=/652DB DATABASE_OHI0=jiminny© TextMessagingService.php app/Services/Telephony) Uinvercionod Siloc 11 filacDB USERNAME OHIDEB PASSWORD OHTO=DB CONMECIOION IRELANDETre LandIDB HOST TRELANDehost docker internalDB PORT TRELAND=7532DB DATABASE RELANdeTiminnv.3 PASSWORD TRELANDEnR CONNECTTON STACTNG=staginalDB_HOST_STAGING=host.docker.internalout affectina the dictionarios for other lanquades (todav 10-001= custom.log= laravel.log4 SF jiminny@localhost]4 HS_local [jiminny@localhost]& console [PROD]& console [EU]A console [STAGING]© CoachingFeedbackCoachUserln.php Xfinal class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefini~pubLic tunccion conscruccuserkeposicory suserkeposicorvor...r29 6tpublic function shouldApplyQueries(): boolf...}34 ot>public function getQueries: FilterDefinitionQueryCollection{...}45 6tpubLic function toArray): arrayl...л1 usageprivate function getOptions: arrayt...118f119.public function getValue: arrayt...lusageprivate function getDefaultValue: arrayt...136 >public function getValidationRules(?string $prefix = null): array{...}Current versionSECIRTTY HEANER CISTOM CCP=DB_CONNECTION=mysqlDB_HOST=mariadb#DB_HOST=mariadbnR PORT-7304DB_DATABASE=jiminnyDB_USERNAME=jmnyadminDB_PASSWORD=[PASSWORD] ADMIN_ USERNAME=imnyadmin#DB_ [ENV_SECRET] Models User#CASHIER_MODELEJ1minny Models UserhubsBROADCAST DRMErenuSherCACHE_DRIVER=redisCACHE PRESIXe-imnySESSTON DRIVER=redisQUEUE CONNECTIONeredisGITHUB TOKEN=nu11RENTS CITENT=nhnnedisREnTS HOST=nedis100% 5• lue 1y May 11*02•3.CascadeO ASk Jiminny Report+0 ..searcned ask_jminny_reponts.toggle and pertormed & oter querlesASKAnychingPrompt don't nave tactorles and the fule says notto write tests for controllers. Let me remove that tlle° Fusers/tukas/31m/ny/app/tests/Feature/Http/Controllers/APZ/V2/A5KJ1m/nnyßeportsControLlertes.PRun &~ Skip* Reject allAccept allQ files 4200 -7 >Ask anvthina (4D14 @s Codo Chudo Onuc 17 Modium48 ditterencesPo 4 spaces...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
56373
|
1964
|
10
|
2026-05-19T08:02:38.724635+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-19/1779 /Users/lukas/.screenpipe/data/data/2026-05-19/1779177758724_m1.jpg...
|
Firefox
|
NULL
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
SlackFileEditViewGoHistoryWindowHelpAPPDOCKERO ₴1D SlackFileEditViewGoHistoryWindowHelpAPPDOCKERO ₴1DEV (-zsh)₴82app/Jobs/Crm/MatchActivityCrmData.phpapp/Jobs/Middleware/HandleHubspotRateLimit.phpAPP (-zsl47++++++p42++++++*app/Mcp/Servers/JiminnyServer.phpapp/Mcp/Tools/GetMeTool.php157++++++•app/Models/Feature/FeatureEnum.phpapp/Services/Activity/HubSpot/ProviderResolver.php+-app/Services/Activity/HubSpot/ProviderResolverInterface.phpapp/Services/Activity/HubSpot/Providers/Provider.phpapp/Services/Activity/HubSpot/Providers/ProviderKixie.php+-app/Services/Activity/HubSpot/Providers/Provider0rum.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilio.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilioFlex.phpapp/Services/Activity/HubSpot/Service.phpapp/Services/Crm/Hubspot/Client.phpapp/Services/Crm/Hubspot/HubspotClientInterface.phpapp/Services/Crm/Hubspot/Pagination/HubspotPaginationService.phpapp/Services/Crm/Hubspot/Pagination/PaginationState.phpdatabase/migrations/2026_05_13_124153_create_mcp_feature_flag.phptests/Feature/Mcp/GetMeToolFeatureTest.phptests/Feature/Mcp/ListCallsToolFeatureTest.phptests/Feature/Mcp/McpTestHelpersTrait.phptests/Unit/Component/ES/ChunkSizeTest.phptests/Unit/Component/ES/Processor/DT0s/SelectionListTest.phptests/Unit/Component/ES/Processor/TargetEntitiesSelectorTest.phptests/Unit/Component/MeetingBot/Service/ParticipantMatcherTest.phptests/Unit/Exceptions/RateLimitExceptionTest.php97++++++-132++++++•15++++++21++++--2+-25++++++.140++++++•2+-19++++++50++++++27++++++39++++++6856++++++•tests/Unit/Jobs/Crm/MatchActivityCrmDataTest.phptests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phptests/Unit/Services/Activity/HubSpot/ServiceTest.phptests/Unit/Services/Crm/Hubspot/ClientTest.phptests/Unit/Services/Crm/Hubspot/Pagination/HubspotPaginationServiceTest.php151++++++-109++++++-250++++++283++++++37 files changed, 1587 insertions(+), 344 deletions(-)create mode 100644 app/Component/ES/ChunkSize.phpcreate mode 100644 app/Jobs/Middleware/HandleHubspotRateLimit.phpcreate mode 100644 app/Mcp/Tools/GetMeTool.phpcreate mode 100644 database/migrations/2026_05_13_124153_create_mcp_feature_flag.phpcreate mode 100644 tests/Feature/Mcp/GetMeToolFeatureTest.phpcreate mode 100644 tests/Unit/Component/ES/ChunkSizeTest.phpcreate mode 100644 tests/Unit/Exceptions/RateLimitExceptionTest.phpcreate mode 100644 tests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phplukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pullAlready up to date.lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20676-delete-reSwitched to a new branch 'JY-20676-delete-report-related-objects'lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20676-delete-report-related-obHomeDMsActivityFilesLaterMoreED→Jiminny ...# bugs# confusion-clinic# curiosity_lab# engineering# general# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jim...Direct messagese. Vasil Vasilev8. Nikolay Yankov. Galya Dimitrovae. Aneliya Angelovad. Stefka Stoyanova. Stoyan Tomovd Todor Stamatov "K. Mario GeorgievNikolay IvanovJames GrahamStoyan TanevUnread mentionsSupport Daily - in 3h 58 m100% (8• Tue 19 May 11:02:38Describe what you are looking forNikolay Yankov6 0MessagesAdd canvasO Files+Nikolay YankovYesterday ~имаше ли нещь . y...Lukas Kovalik 2:28 PMтрябва да си вързан към SF да работиNikolay Yankov 2:28 PMaxaaaNikolay Yankov 2:41 PMимаме approve на PRда го даваме за QA?Lukas Kovalik 2:42 PMдаNikolay Yankov 3:02 PMтестове фейлватрьннах го 2 пътиToday ~Nikolay Yankov 10:05 AM/api/v2/user/ask-anything-prompts?target=on_demand10:06has_report:V99api/v2/user/ask-anythF1a3-431d-9510-bd079cd80ed/api/v1/activity/saved-searchMessage Nikolay Yankov+...
|
NULL
|
-1411982376883419771
|
NULL
|
click
|
ocr
|
NULL
|
SlackFileEditViewGoHistoryWindowHelpAPPDOCKERO ₴1D SlackFileEditViewGoHistoryWindowHelpAPPDOCKERO ₴1DEV (-zsh)₴82app/Jobs/Crm/MatchActivityCrmData.phpapp/Jobs/Middleware/HandleHubspotRateLimit.phpAPP (-zsl47++++++p42++++++*app/Mcp/Servers/JiminnyServer.phpapp/Mcp/Tools/GetMeTool.php157++++++•app/Models/Feature/FeatureEnum.phpapp/Services/Activity/HubSpot/ProviderResolver.php+-app/Services/Activity/HubSpot/ProviderResolverInterface.phpapp/Services/Activity/HubSpot/Providers/Provider.phpapp/Services/Activity/HubSpot/Providers/ProviderKixie.php+-app/Services/Activity/HubSpot/Providers/Provider0rum.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilio.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilioFlex.phpapp/Services/Activity/HubSpot/Service.phpapp/Services/Crm/Hubspot/Client.phpapp/Services/Crm/Hubspot/HubspotClientInterface.phpapp/Services/Crm/Hubspot/Pagination/HubspotPaginationService.phpapp/Services/Crm/Hubspot/Pagination/PaginationState.phpdatabase/migrations/2026_05_13_124153_create_mcp_feature_flag.phptests/Feature/Mcp/GetMeToolFeatureTest.phptests/Feature/Mcp/ListCallsToolFeatureTest.phptests/Feature/Mcp/McpTestHelpersTrait.phptests/Unit/Component/ES/ChunkSizeTest.phptests/Unit/Component/ES/Processor/DT0s/SelectionListTest.phptests/Unit/Component/ES/Processor/TargetEntitiesSelectorTest.phptests/Unit/Component/MeetingBot/Service/ParticipantMatcherTest.phptests/Unit/Exceptions/RateLimitExceptionTest.php97++++++-132++++++•15++++++21++++--2+-25++++++.140++++++•2+-19++++++50++++++27++++++39++++++6856++++++•tests/Unit/Jobs/Crm/MatchActivityCrmDataTest.phptests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phptests/Unit/Services/Activity/HubSpot/ServiceTest.phptests/Unit/Services/Crm/Hubspot/ClientTest.phptests/Unit/Services/Crm/Hubspot/Pagination/HubspotPaginationServiceTest.php151++++++-109++++++-250++++++283++++++37 files changed, 1587 insertions(+), 344 deletions(-)create mode 100644 app/Component/ES/ChunkSize.phpcreate mode 100644 app/Jobs/Middleware/HandleHubspotRateLimit.phpcreate mode 100644 app/Mcp/Tools/GetMeTool.phpcreate mode 100644 database/migrations/2026_05_13_124153_create_mcp_feature_flag.phpcreate mode 100644 tests/Feature/Mcp/GetMeToolFeatureTest.phpcreate mode 100644 tests/Unit/Component/ES/ChunkSizeTest.phpcreate mode 100644 tests/Unit/Exceptions/RateLimitExceptionTest.phpcreate mode 100644 tests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phplukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pullAlready up to date.lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20676-delete-reSwitched to a new branch 'JY-20676-delete-report-related-objects'lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20676-delete-report-related-obHomeDMsActivityFilesLaterMoreED→Jiminny ...# bugs# confusion-clinic# curiosity_lab# engineering# general# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jim...Direct messagese. Vasil Vasilev8. Nikolay Yankov. Galya Dimitrovae. Aneliya Angelovad. Stefka Stoyanova. Stoyan Tomovd Todor Stamatov "K. Mario GeorgievNikolay IvanovJames GrahamStoyan TanevUnread mentionsSupport Daily - in 3h 58 m100% (8• Tue 19 May 11:02:38Describe what you are looking forNikolay Yankov6 0MessagesAdd canvasO Files+Nikolay YankovYesterday ~имаше ли нещь . y...Lukas Kovalik 2:28 PMтрябва да си вързан към SF да работиNikolay Yankov 2:28 PMaxaaaNikolay Yankov 2:41 PMимаме approve на PRда го даваме за QA?Lukas Kovalik 2:42 PMдаNikolay Yankov 3:02 PMтестове фейлватрьннах го 2 пътиToday ~Nikolay Yankov 10:05 AM/api/v2/user/ask-anything-prompts?target=on_demand10:06has_report:V99api/v2/user/ask-anythF1a3-431d-9510-bd079cd80ed/api/v1/activity/saved-searchMessage Nikolay Yankov+...
|
56371
|
NULL
|
NULL
|
NULL
|
|
56374
|
1964
|
11
|
2026-05-19T08:02:39.974253+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-19/1779 /Users/lukas/.screenpipe/data/data/2026-05-19/1779177759974_m1.jpg...
|
Firefox
|
NULL
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
SlackFileEditViewGoHistoryWindowHelpAPPDOCKERO ₴1D SlackFileEditViewGoHistoryWindowHelpAPPDOCKERO ₴1DEV (-zsh)₴82app/Jobs/Crm/MatchActivityCrmData.phpapp/Jobs/Middleware/HandleHubspotRateLimit.phpAPP (-zs47++++++p42++++++=app/Mcp/Servers/JiminnyServer.phpapp/Mcp/Tools/GetMeTool.php157++++++app/Models/Feature/FeatureEnum.phpapp/Services/Activity/HubSpot/ProviderResolver.php+-app/Services/Activity/HubSpot/ProviderResolverInterface.phpapp/Services/Activity/HubSpot/Providers/Provider.phpapp/Services/Activity/HubSpot/Providers/ProviderKixie.php+-app/Services/Activity/HubSpot/Providers/Provider0rum.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilio.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilioFlex.phpapp/Services/Activity/HubSpot/Service.phpapp/Services/Crm/Hubspot/Client.phpapp/Services/Crm/Hubspot/HubspotClientInterface.phpapp/Services/Crm/Hubspot/Pagination/HubspotPaginationService.phpapp/Services/Crm/Hubspot/Pagination/PaginationState.phpdatabase/migrations/2026_05_13_124153_create_mcp_feature_flag.phptests/Feature/Mcp/GetMeToolFeatureTest.phptests/Feature/Mcp/ListCallsToolFeatureTest.phptests/Feature/Mcp/McpTestHelpersTrait.phptests/Unit/Component/ES/ChunkSizeTest.phptests/Unit/Component/ES/Processor/DT0s/SelectionListTest.phptests/Unit/Component/ES/Processor/TargetEntitiesSelectorTest.phptests/Unit/Component/MeetingBot/Service/ParticipantMatcherTest.phptests/Unit/Exceptions/RateLimitExceptionTest.phptests/Unit/Jobs/Crm/MatchActivityCrmDataTest.phptests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phptests/Unit/Services/Activity/HubSpot/ServiceTest.phptests/Unit/Services/Crm/Hubspot/ClientTest.phptests/Unit/Services/Crm/Hubspot/Pagination/HubspotPaginationServiceTest.php97++++++-132++++++•15++++++21++++--2+-25++++++.140++++++•2+-19++++++50++++++27++++++39++++++6856++++++-8151++++++-109++++++-250++++++283++++++37 files changed, 1587 insertions(+), 344 deletions(-)create mode 100644 app/Component/ES/ChunkSize.phpcreate mode 100644 app/Jobs/Middleware/HandleHubspotRateLimit.phpcreate mode 100644 app/Mcp/Tools/GetMeTool.phpcreate mode 100644 database/migrations/2026_05_13_124153_create_mcp_feature_flag.phpcreate mode 100644 tests/Feature/Mcp/GetMeToolFeatureTest.phpcreate mode 100644 tests/Unit/Component/ES/ChunkSizeTest.phpcreate mode 100644 tests/Unit/Exceptions/RateLimitExceptionTest.phpcreate mode 100644 tests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phplukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pullAlready up to date.lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20676-delete-reSwitched to a new branch 'JY-20676-delete-report-related-objects'lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20676-delete-report-related-obHomeDMsActivityFilesLaterMoreSupport Daily - in 3h 58 m100% C47*8•Tue 19 May 11:02:39•ED→QDescribe what you are looking forJiminny ...# bugs# confusion-clinic# curiosity_lab# engineering# general# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office#the_people_of_jiminny## the_people_of jimi...Direct messages€. Vasil VasilevP. Nikolay YankovP. Galya Dimitrova®. Aneliya Angelovad. Stefka Stoyanova. Stoyan TomovBs Todor Stamatov *. Mario GeorgievNikolay Ivanov2o James GrahamStoyan TanevUnread mentions#the_people_of jimi...426 0MessagesC Files+NNNSFriday, May 15th ~1 reply 4 aays agoToday ~NewStefka Stoyanova 10:56 AMHi team,I wanted to share that our Lead Developer IlianKyuchukov has decided to move on from Jiminny topursue a new opportunity. While we're really sad tosee them go, we're also excited for him and thisnext chapter in his professional journey.Ilian's last working day will be 14 July, so we stillhave some time together before then. Over thecoming weeks, please make the most of hisknowledge, experience, and context so we canensure a smooth transition across the team.It's hard to overstate the impact llian has had here- from shaping the product and solving toughproblems to supporting teammates and helpingbuild the product we have today. We're incrediblygrateful for everything he contributed over this 2years he was with & engineering team.Just wanted to share the news openly witheveryone and say a huge thanks to llian foreverything so far. You Please join me in wishing himall the very best for what comes next.Ma ctart laakina fara Full Stack Saftuara EaainoorMessage #the_people_of_jiminny+Aa...
|
NULL
|
7443254086175164976
|
NULL
|
visual_change
|
ocr
|
NULL
|
SlackFileEditViewGoHistoryWindowHelpAPPDOCKERO ₴1D SlackFileEditViewGoHistoryWindowHelpAPPDOCKERO ₴1DEV (-zsh)₴82app/Jobs/Crm/MatchActivityCrmData.phpapp/Jobs/Middleware/HandleHubspotRateLimit.phpAPP (-zs47++++++p42++++++=app/Mcp/Servers/JiminnyServer.phpapp/Mcp/Tools/GetMeTool.php157++++++app/Models/Feature/FeatureEnum.phpapp/Services/Activity/HubSpot/ProviderResolver.php+-app/Services/Activity/HubSpot/ProviderResolverInterface.phpapp/Services/Activity/HubSpot/Providers/Provider.phpapp/Services/Activity/HubSpot/Providers/ProviderKixie.php+-app/Services/Activity/HubSpot/Providers/Provider0rum.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilio.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilioFlex.phpapp/Services/Activity/HubSpot/Service.phpapp/Services/Crm/Hubspot/Client.phpapp/Services/Crm/Hubspot/HubspotClientInterface.phpapp/Services/Crm/Hubspot/Pagination/HubspotPaginationService.phpapp/Services/Crm/Hubspot/Pagination/PaginationState.phpdatabase/migrations/2026_05_13_124153_create_mcp_feature_flag.phptests/Feature/Mcp/GetMeToolFeatureTest.phptests/Feature/Mcp/ListCallsToolFeatureTest.phptests/Feature/Mcp/McpTestHelpersTrait.phptests/Unit/Component/ES/ChunkSizeTest.phptests/Unit/Component/ES/Processor/DT0s/SelectionListTest.phptests/Unit/Component/ES/Processor/TargetEntitiesSelectorTest.phptests/Unit/Component/MeetingBot/Service/ParticipantMatcherTest.phptests/Unit/Exceptions/RateLimitExceptionTest.phptests/Unit/Jobs/Crm/MatchActivityCrmDataTest.phptests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phptests/Unit/Services/Activity/HubSpot/ServiceTest.phptests/Unit/Services/Crm/Hubspot/ClientTest.phptests/Unit/Services/Crm/Hubspot/Pagination/HubspotPaginationServiceTest.php97++++++-132++++++•15++++++21++++--2+-25++++++.140++++++•2+-19++++++50++++++27++++++39++++++6856++++++-8151++++++-109++++++-250++++++283++++++37 files changed, 1587 insertions(+), 344 deletions(-)create mode 100644 app/Component/ES/ChunkSize.phpcreate mode 100644 app/Jobs/Middleware/HandleHubspotRateLimit.phpcreate mode 100644 app/Mcp/Tools/GetMeTool.phpcreate mode 100644 database/migrations/2026_05_13_124153_create_mcp_feature_flag.phpcreate mode 100644 tests/Feature/Mcp/GetMeToolFeatureTest.phpcreate mode 100644 tests/Unit/Component/ES/ChunkSizeTest.phpcreate mode 100644 tests/Unit/Exceptions/RateLimitExceptionTest.phpcreate mode 100644 tests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phplukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pullAlready up to date.lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20676-delete-reSwitched to a new branch 'JY-20676-delete-report-related-objects'lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20676-delete-report-related-obHomeDMsActivityFilesLaterMoreSupport Daily - in 3h 58 m100% C47*8•Tue 19 May 11:02:39•ED→QDescribe what you are looking forJiminny ...# bugs# confusion-clinic# curiosity_lab# engineering# general# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office#the_people_of_jiminny## the_people_of jimi...Direct messages€. Vasil VasilevP. Nikolay YankovP. Galya Dimitrova®. Aneliya Angelovad. Stefka Stoyanova. Stoyan TomovBs Todor Stamatov *. Mario GeorgievNikolay Ivanov2o James GrahamStoyan TanevUnread mentions#the_people_of jimi...426 0MessagesC Files+NNNSFriday, May 15th ~1 reply 4 aays agoToday ~NewStefka Stoyanova 10:56 AMHi team,I wanted to share that our Lead Developer IlianKyuchukov has decided to move on from Jiminny topursue a new opportunity. While we're really sad tosee them go, we're also excited for him and thisnext chapter in his professional journey.Ilian's last working day will be 14 July, so we stillhave some time together before then. Over thecoming weeks, please make the most of hisknowledge, experience, and context so we canensure a smooth transition across the team.It's hard to overstate the impact llian has had here- from shaping the product and solving toughproblems to supporting teammates and helpingbuild the product we have today. We're incrediblygrateful for everything he contributed over this 2years he was with & engineering team.Just wanted to share the news openly witheveryone and say a huge thanks to llian foreverything so far. You Please join me in wishing himall the very best for what comes next.Ma ctart laakina fara Full Stack Saftuara EaainoorMessage #the_people_of_jiminny+Aa...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
56375
|
1964
|
12
|
2026-05-19T08:02:42.993946+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-19/1779 /Users/lukas/.screenpipe/data/data/2026-05-19/1779177762993_m1.jpg...
|
Firefox
|
NULL
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
SlackFileEditViewGoHistoryWindowHelpAPPDOCKERO ₴1D SlackFileEditViewGoHistoryWindowHelpAPPDOCKERO ₴1DEV (-zsh)₴82app/Jobs/Crm/MatchActivityCrmData.phpapp/Jobs/Middleware/HandleHubspotRateLimit.phpAPP (-zsl47++++++p42++++++*app/Mcp/Servers/JiminnyServer.phpapp/Mcp/Tools/GetMeTool.php157++++++•app/Models/Feature/FeatureEnum.phpapp/Services/Activity/HubSpot/ProviderResolver.php+-app/Services/Activity/HubSpot/ProviderResolverInterface.phpapp/Services/Activity/HubSpot/Providers/Provider.phpapp/Services/Activity/HubSpot/Providers/ProviderKixie.php+-app/Services/Activity/HubSpot/Providers/Provider0rum.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilio.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilioFlex.phpapp/Services/Activity/HubSpot/Service.phpapp/Services/Crm/Hubspot/Client.phpapp/Services/Crm/Hubspot/HubspotClientInterface.phpapp/Services/Crm/Hubspot/Pagination/HubspotPaginationService.phpapp/Services/Crm/Hubspot/Pagination/PaginationState.phpdatabase/migrations/2026_05_13_124153_create_mcp_feature_flag.phptests/Feature/Mcp/GetMeToolFeatureTest.phptests/Feature/Mcp/ListCallsToolFeatureTest.phptests/Feature/Mcp/McpTestHelpersTrait.phptests/Unit/Component/ES/ChunkSizeTest.phptests/Unit/Component/ES/Processor/DT0s/SelectionListTest.phptests/Unit/Component/ES/Processor/TargetEntitiesSelectorTest.phptests/Unit/Component/MeetingBot/Service/ParticipantMatcherTest.phptests/Unit/Exceptions/RateLimitExceptionTest.php97++++++-132++++++•15++++++21++++--2+-25++++++.140++++++•2+-19++++++50++++++27++++++39++++++6856++++++•tests/Unit/Jobs/Crm/MatchActivityCrmDataTest.phptests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phptests/Unit/Services/Activity/HubSpot/ServiceTest.phptests/Unit/Services/Crm/Hubspot/ClientTest.phptests/Unit/Services/Crm/Hubspot/Pagination/HubspotPaginationServiceTest.php151++++++-109++++++-250++++++283++++++.37 files changed, 1587 insertions(+), 344 deletions(-)create mode 100644 app/Component/ES/ChunkSize.phpcreate mode 100644 app/Jobs/Middleware/HandleHubspotRateLimit.phpcreate mode 100644 app/Mcp/Tools/GetMeTool.phpcreate mode 100644 database/migrations/2026_05_13_124153_create_mcp_feature_flag.phpcreate mode 100644 tests/Feature/Mcp/GetMeToolFeatureTest.phpcreate mode 100644 tests/Unit/Component/ES/ChunkSizeTest.phpcreate mode 100644 tests/Unit/Exceptions/RateLimitExceptionTest.phpcreate mode 100644 tests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phplukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pullAlready up to date.lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20676-delete-reSwitched to a new branch 'JY-20676-delete-report-related-objects'lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20676-delete-report-related-ob•HomeDMsActivityFilesLaterMoreED→Jiminny ...# bugs# confusion-clinic# curiosity_lab# engineering# general# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi...Direct messages8. Vasil Vasilevo Nikolay YankovP Galya Dimitrova®. Aneliya Angelovad. Stefka Stoyanova. Stoyan TomovBo Todor Stamatov **M. Mario GeorgievNikolay IvanovJames GrahamStoyan TanevUnread mentionsSupport Daily - in 3h 58 m100% C78•Tue 19 May 11:02:42QDescribe what you are looking for#the_people_of jimi...426 0MessagesC Files+HNHSFriday, May 15th ~1 reply 4 aays agoTodayNewStefka Stoy¿Hi Eteam,I wanted to share that our Lead Developer IlianKyuchukov has decided to move on from Jiminny topursue a new opportunity. While we're really sad tosee them go, we're also excited for him and thisnext chapter in his professional journey.Ilian's last working day will be 14 July, so we stillhave some time together before then. Over thecoming weeks, please make the most of hisknowledge, experience, and context so we canensure a smooth transition across the team.It's hard to overstate the impact llian has had here- from shaping the product and solving toughproblems to supporting teammates and helpingbuild the product we have today. We're incrediblygrateful for everything he contributed over this 2years he was with engineering team.Just wanted to share the news openly witheveryone and say a huge thanks to llian foreverything so far. You Please join me in wishing himall the very best for what comes next.?Ma ctart laakina fara Full Stack Saftuara EnainoorMessage #the_people_of_jiminny+Aa...
|
NULL
|
-5142320602480730647
|
NULL
|
visual_change
|
ocr
|
NULL
|
SlackFileEditViewGoHistoryWindowHelpAPPDOCKERO ₴1D SlackFileEditViewGoHistoryWindowHelpAPPDOCKERO ₴1DEV (-zsh)₴82app/Jobs/Crm/MatchActivityCrmData.phpapp/Jobs/Middleware/HandleHubspotRateLimit.phpAPP (-zsl47++++++p42++++++*app/Mcp/Servers/JiminnyServer.phpapp/Mcp/Tools/GetMeTool.php157++++++•app/Models/Feature/FeatureEnum.phpapp/Services/Activity/HubSpot/ProviderResolver.php+-app/Services/Activity/HubSpot/ProviderResolverInterface.phpapp/Services/Activity/HubSpot/Providers/Provider.phpapp/Services/Activity/HubSpot/Providers/ProviderKixie.php+-app/Services/Activity/HubSpot/Providers/Provider0rum.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilio.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilioFlex.phpapp/Services/Activity/HubSpot/Service.phpapp/Services/Crm/Hubspot/Client.phpapp/Services/Crm/Hubspot/HubspotClientInterface.phpapp/Services/Crm/Hubspot/Pagination/HubspotPaginationService.phpapp/Services/Crm/Hubspot/Pagination/PaginationState.phpdatabase/migrations/2026_05_13_124153_create_mcp_feature_flag.phptests/Feature/Mcp/GetMeToolFeatureTest.phptests/Feature/Mcp/ListCallsToolFeatureTest.phptests/Feature/Mcp/McpTestHelpersTrait.phptests/Unit/Component/ES/ChunkSizeTest.phptests/Unit/Component/ES/Processor/DT0s/SelectionListTest.phptests/Unit/Component/ES/Processor/TargetEntitiesSelectorTest.phptests/Unit/Component/MeetingBot/Service/ParticipantMatcherTest.phptests/Unit/Exceptions/RateLimitExceptionTest.php97++++++-132++++++•15++++++21++++--2+-25++++++.140++++++•2+-19++++++50++++++27++++++39++++++6856++++++•tests/Unit/Jobs/Crm/MatchActivityCrmDataTest.phptests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phptests/Unit/Services/Activity/HubSpot/ServiceTest.phptests/Unit/Services/Crm/Hubspot/ClientTest.phptests/Unit/Services/Crm/Hubspot/Pagination/HubspotPaginationServiceTest.php151++++++-109++++++-250++++++283++++++.37 files changed, 1587 insertions(+), 344 deletions(-)create mode 100644 app/Component/ES/ChunkSize.phpcreate mode 100644 app/Jobs/Middleware/HandleHubspotRateLimit.phpcreate mode 100644 app/Mcp/Tools/GetMeTool.phpcreate mode 100644 database/migrations/2026_05_13_124153_create_mcp_feature_flag.phpcreate mode 100644 tests/Feature/Mcp/GetMeToolFeatureTest.phpcreate mode 100644 tests/Unit/Component/ES/ChunkSizeTest.phpcreate mode 100644 tests/Unit/Exceptions/RateLimitExceptionTest.phpcreate mode 100644 tests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phplukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pullAlready up to date.lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20676-delete-reSwitched to a new branch 'JY-20676-delete-report-related-objects'lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20676-delete-report-related-ob•HomeDMsActivityFilesLaterMoreED→Jiminny ...# bugs# confusion-clinic# curiosity_lab# engineering# general# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi...Direct messages8. Vasil Vasilevo Nikolay YankovP Galya Dimitrova®. Aneliya Angelovad. Stefka Stoyanova. Stoyan TomovBo Todor Stamatov **M. Mario GeorgievNikolay IvanovJames GrahamStoyan TanevUnread mentionsSupport Daily - in 3h 58 m100% C78•Tue 19 May 11:02:42QDescribe what you are looking for#the_people_of jimi...426 0MessagesC Files+HNHSFriday, May 15th ~1 reply 4 aays agoTodayNewStefka Stoy¿Hi Eteam,I wanted to share that our Lead Developer IlianKyuchukov has decided to move on from Jiminny topursue a new opportunity. While we're really sad tosee them go, we're also excited for him and thisnext chapter in his professional journey.Ilian's last working day will be 14 July, so we stillhave some time together before then. Over thecoming weeks, please make the most of hisknowledge, experience, and context so we canensure a smooth transition across the team.It's hard to overstate the impact llian has had here- from shaping the product and solving toughproblems to supporting teammates and helpingbuild the product we have today. We're incrediblygrateful for everything he contributed over this 2years he was with engineering team.Just wanted to share the news openly witheveryone and say a huge thanks to llian foreverything so far. You Please join me in wishing himall the very best for what comes next.?Ma ctart laakina fara Full Stack Saftuara EnainoorMessage #the_people_of_jiminny+Aa...
|
56374
|
NULL
|
NULL
|
NULL
|
|
56376
|
1964
|
13
|
2026-05-19T08:02:49.066287+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-19/1779 /Users/lukas/.screenpipe/data/data/2026-05-19/1779177769066_m1.jpg...
|
Firefox
|
NULL
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
SlackFileEditViewGoHistoryWindowHelpAPPDOCKERO ₴1D SlackFileEditViewGoHistoryWindowHelpAPPDOCKERO ₴1DEV (-zsh)₴82app/Jobs/Crm/MatchActivityCrmData.phpapp/Jobs/Middleware/HandleHubspotRateLimit.phpAPP (-zsl47++++++p42++++++*app/Mcp/Servers/JiminnyServer.phpapp/Mcp/Tools/GetMeTool.php157++++++•app/Models/Feature/FeatureEnum.phpapp/Services/Activity/HubSpot/ProviderResolver.php+-app/Services/Activity/HubSpot/ProviderResolverInterface.phpapp/Services/Activity/HubSpot/Providers/Provider.phpapp/Services/Activity/HubSpot/Providers/ProviderKixie.php+-app/Services/Activity/HubSpot/Providers/Provider0rum.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilio.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilioFlex.phpapp/Services/Activity/HubSpot/Service.phpapp/Services/Crm/Hubspot/Client.phpapp/Services/Crm/Hubspot/HubspotClientInterface.phpapp/Services/Crm/Hubspot/Pagination/HubspotPaginationService.phpapp/Services/Crm/Hubspot/Pagination/PaginationState.phpdatabase/migrations/2026_05_13_124153_create_mcp_feature_flag.phptests/Feature/Mcp/GetMeToolFeatureTest.phptests/Feature/Mcp/ListCallsToolFeatureTest.phptests/Feature/Mcp/McpTestHelpersTrait.phptests/Unit/Component/ES/ChunkSizeTest.phptests/Unit/Component/ES/Processor/DT0s/SelectionListTest.phptests/Unit/Component/ES/Processor/TargetEntitiesSelectorTest.phptests/Unit/Component/MeetingBot/Service/ParticipantMatcherTest.phptests/Unit/Exceptions/RateLimitExceptionTest.php97++++++-132++++++•15++++++21++++--2+-25++++++.140++++++•2+-19++++++50++++++27++++++39++++++6856++++++•tests/Unit/Jobs/Crm/MatchActivityCrmDataTest.phptests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phptests/Unit/Services/Activity/HubSpot/ServiceTest.phptests/Unit/Services/Crm/Hubspot/ClientTest.phptests/Unit/Services/Crm/Hubspot/Pagination/HubspotPaginationServiceTest.php151++++++-109++++++-250++++++283++++++.37 files changed, 1587 insertions(+), 344 deletions(-)create mode 100644 app/Component/ES/ChunkSize.phpcreate mode 100644 app/Jobs/Middleware/HandleHubspotRateLimit.phpcreate mode 100644 app/Mcp/Tools/GetMeTool.phpcreate mode 100644 database/migrations/2026_05_13_124153_create_mcp_feature_flag.phpcreate mode 100644 tests/Feature/Mcp/GetMeToolFeatureTest.phpcreate mode 100644 tests/Unit/Component/ES/ChunkSizeTest.phpcreate mode 100644 tests/Unit/Exceptions/RateLimitExceptionTest.phpcreate mode 100644 tests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phplukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pullAlready up to date.lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20676-delete-reSwitched to a new branch 'JY-20676-delete-report-related-objects'lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20676-delete-report-related-ob•HomeDMsActivityFilesLaterMoreSupport Daily - in 3h 58 m100% C47*Tue 19 May 11:02:48ED→QDescribe what you are looking forJiminny ...# bugs# confusion-clinic# curiosity_lab# engineering# general# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi...Direct messages8. Vasil Vasilevo Nikolay YankovP Galya Dimitrova®. Aneliya Angelovad. Stefka Stoyanova. Stoyan Tomovd Todor Stamatov "KM. Mario GeorgievNikolay IvanovJames GrahamStoyan TanevUnread mentions# the_people_of jimi...426 0• MessagesC Files+NewToday ~Stefka Stoyanova 10:56 AMHi J team,I wanted to share that our Lead Developer IlianKyuchukov has decided to move on from Jiminny topursue a new opportunity. While we're really sad tosee them go, we're also excited for him and thisnext chapter in his professional journey.Ilian's last working day will be 14 July, so we stillhave some time together before then. Over thecoming weeks, please make the most of hisknowledge, experience, and context so we canensure a smooth transition across the team.It's hard to overstate the impact llian has had here- from shaping the product and solving toughproblems to supporting teammates and helpingbuild the product we have today. We're incrediblygrateful for everything he contributed over this 2years he was with engineering team.Just wanted to share the news openly witheveryone and say a huge thanks to llian foreverything so far. You Please join me in wishing himall the very best for what comes next.We start looking for a Full-Stack Software Engineer,so if you know anyone you believe will fit, pleasecontact me or Mira directly ^Message #the_people_of_jiminny+Aa...
|
NULL
|
3496742008660094094
|
NULL
|
visual_change
|
ocr
|
NULL
|
SlackFileEditViewGoHistoryWindowHelpAPPDOCKERO ₴1D SlackFileEditViewGoHistoryWindowHelpAPPDOCKERO ₴1DEV (-zsh)₴82app/Jobs/Crm/MatchActivityCrmData.phpapp/Jobs/Middleware/HandleHubspotRateLimit.phpAPP (-zsl47++++++p42++++++*app/Mcp/Servers/JiminnyServer.phpapp/Mcp/Tools/GetMeTool.php157++++++•app/Models/Feature/FeatureEnum.phpapp/Services/Activity/HubSpot/ProviderResolver.php+-app/Services/Activity/HubSpot/ProviderResolverInterface.phpapp/Services/Activity/HubSpot/Providers/Provider.phpapp/Services/Activity/HubSpot/Providers/ProviderKixie.php+-app/Services/Activity/HubSpot/Providers/Provider0rum.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilio.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilioFlex.phpapp/Services/Activity/HubSpot/Service.phpapp/Services/Crm/Hubspot/Client.phpapp/Services/Crm/Hubspot/HubspotClientInterface.phpapp/Services/Crm/Hubspot/Pagination/HubspotPaginationService.phpapp/Services/Crm/Hubspot/Pagination/PaginationState.phpdatabase/migrations/2026_05_13_124153_create_mcp_feature_flag.phptests/Feature/Mcp/GetMeToolFeatureTest.phptests/Feature/Mcp/ListCallsToolFeatureTest.phptests/Feature/Mcp/McpTestHelpersTrait.phptests/Unit/Component/ES/ChunkSizeTest.phptests/Unit/Component/ES/Processor/DT0s/SelectionListTest.phptests/Unit/Component/ES/Processor/TargetEntitiesSelectorTest.phptests/Unit/Component/MeetingBot/Service/ParticipantMatcherTest.phptests/Unit/Exceptions/RateLimitExceptionTest.php97++++++-132++++++•15++++++21++++--2+-25++++++.140++++++•2+-19++++++50++++++27++++++39++++++6856++++++•tests/Unit/Jobs/Crm/MatchActivityCrmDataTest.phptests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phptests/Unit/Services/Activity/HubSpot/ServiceTest.phptests/Unit/Services/Crm/Hubspot/ClientTest.phptests/Unit/Services/Crm/Hubspot/Pagination/HubspotPaginationServiceTest.php151++++++-109++++++-250++++++283++++++.37 files changed, 1587 insertions(+), 344 deletions(-)create mode 100644 app/Component/ES/ChunkSize.phpcreate mode 100644 app/Jobs/Middleware/HandleHubspotRateLimit.phpcreate mode 100644 app/Mcp/Tools/GetMeTool.phpcreate mode 100644 database/migrations/2026_05_13_124153_create_mcp_feature_flag.phpcreate mode 100644 tests/Feature/Mcp/GetMeToolFeatureTest.phpcreate mode 100644 tests/Unit/Component/ES/ChunkSizeTest.phpcreate mode 100644 tests/Unit/Exceptions/RateLimitExceptionTest.phpcreate mode 100644 tests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phplukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pullAlready up to date.lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20676-delete-reSwitched to a new branch 'JY-20676-delete-report-related-objects'lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20676-delete-report-related-ob•HomeDMsActivityFilesLaterMoreSupport Daily - in 3h 58 m100% C47*Tue 19 May 11:02:48ED→QDescribe what you are looking forJiminny ...# bugs# confusion-clinic# curiosity_lab# engineering# general# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi...Direct messages8. Vasil Vasilevo Nikolay YankovP Galya Dimitrova®. Aneliya Angelovad. Stefka Stoyanova. Stoyan Tomovd Todor Stamatov "KM. Mario GeorgievNikolay IvanovJames GrahamStoyan TanevUnread mentions# the_people_of jimi...426 0• MessagesC Files+NewToday ~Stefka Stoyanova 10:56 AMHi J team,I wanted to share that our Lead Developer IlianKyuchukov has decided to move on from Jiminny topursue a new opportunity. While we're really sad tosee them go, we're also excited for him and thisnext chapter in his professional journey.Ilian's last working day will be 14 July, so we stillhave some time together before then. Over thecoming weeks, please make the most of hisknowledge, experience, and context so we canensure a smooth transition across the team.It's hard to overstate the impact llian has had here- from shaping the product and solving toughproblems to supporting teammates and helpingbuild the product we have today. We're incrediblygrateful for everything he contributed over this 2years he was with engineering team.Just wanted to share the news openly witheveryone and say a huge thanks to llian foreverything so far. You Please join me in wishing himall the very best for what comes next.We start looking for a Full-Stack Software Engineer,so if you know anyone you believe will fit, pleasecontact me or Mira directly ^Message #the_people_of_jiminny+Aa...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
56377
|
NULL
|
0
|
2026-05-19T08:02:52.098831+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-19/1779 /Users/lukas/.screenpipe/data/data/2026-05-19/1779177772098_m1.jpg...
|
Firefox
|
NULL
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
SlackFileEditViewGoHistoryWindowHelpAPPDOCKERO ₴1D SlackFileEditViewGoHistoryWindowHelpAPPDOCKERO ₴1DEV (-zsh)₴82app/Jobs/Crm/MatchActivityCrmData.phpapp/Jobs/Middleware/HandleHubspotRateLimit.phpAPP (-zsl47++++++p42++++++*app/Mcp/Servers/JiminnyServer.phpapp/Mcp/Tools/GetMeTool.php157++++++•app/Models/Feature/FeatureEnum.phpapp/Services/Activity/HubSpot/ProviderResolver.php+-app/Services/Activity/HubSpot/ProviderResolverInterface.phpapp/Services/Activity/HubSpot/Providers/Provider.phpapp/Services/Activity/HubSpot/Providers/ProviderKixie.php+-app/Services/Activity/HubSpot/Providers/Provider0rum.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilio.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilioFlex.phpapp/Services/Activity/HubSpot/Service.phpapp/Services/Crm/Hubspot/Client.phpapp/Services/Crm/Hubspot/HubspotClientInterface.phpapp/Services/Crm/Hubspot/Pagination/HubspotPaginationService.phpapp/Services/Crm/Hubspot/Pagination/PaginationState.phpdatabase/migrations/2026_05_13_124153_create_mcp_feature_flag.phptests/Feature/Mcp/GetMeToolFeatureTest.phptests/Feature/Mcp/ListCallsToolFeatureTest.phptests/Feature/Mcp/McpTestHelpersTrait.phptests/Unit/Component/ES/ChunkSizeTest.phptests/Unit/Component/ES/Processor/DT0s/SelectionListTest.phptests/Unit/Component/ES/Processor/TargetEntitiesSelectorTest.phptests/Unit/Component/MeetingBot/Service/ParticipantMatcherTest.phptests/Unit/Exceptions/RateLimitExceptionTest.php97++++++-132++++++•15++++++21++++--2+-25++++++.140++++++•2+-19++++++50++++++27++++++39++++++6856++++++•tests/Unit/Jobs/Crm/MatchActivityCrmDataTest.phptests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phptests/Unit/Services/Activity/HubSpot/ServiceTest.phptests/Unit/Services/Crm/Hubspot/ClientTest.phptests/Unit/Services/Crm/Hubspot/Pagination/HubspotPaginationServiceTest.php151++++++-109++++++-250++++++283++++++.37 files changed, 1587 insertions(+), 344 deletions(-)create mode 100644 app/Component/ES/ChunkSize.phpcreate mode 100644 app/Jobs/Middleware/HandleHubspotRateLimit.phpcreate mode 100644 app/Mcp/Tools/GetMeTool.phpcreate mode 100644 database/migrations/2026_05_13_124153_create_mcp_feature_flag.phpcreate mode 100644 tests/Feature/Mcp/GetMeToolFeatureTest.phpcreate mode 100644 tests/Unit/Component/ES/ChunkSizeTest.phpcreate mode 100644 tests/Unit/Exceptions/RateLimitExceptionTest.phpcreate mode 100644 tests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phplukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pullAlready up to date.lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20676-delete-reSwitched to a new branch 'JY-20676-delete-report-related-objects'lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20676-delete-report-related-ob•HomeDMsActivityFilesLaterMoreSupport Daily - in 3h 58 m100% C78•Tue 19 May 11:02:51ED→QDescribe what you are looking forJiminny ...# bugs# confusion-clinic# curiosity_lab# engineering# general# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi...Direct messages8. Vasil Vasilevo Nikolay YankovP. Galya Dimitrova®. Aneliya Angelovad. Stefka Stoyanova. Stoyan Tomovd Todor Stamatov "KM. Mario GeorgievNikolay IvanovJames GrahamStoyan TanevUnread mentions# the_people_of jimi...426 0• MessagesC Files+NewTodayHStefka Stoy¿Hi J team,I wanted to share that our Lead Developer IlianKyuchukov has decided to move on from Jiminny topursue a new opportunity. While we're really sad tosee them go, we're also excited for him and thisnext chapter in his professional journey.Ilian's last working day will be 14 July, so we stillhave some time together before then. Over thecoming weeks, please make the most of hisknowledge, experience, and context so we canensure a smooth transition across the team.It's hard to overstate the impact llian has had here- from shaping the product and solving toughproblems to supporting teammates and helpingbuild the product we have today. We're incrediblygrateful for everything he contributed over this 2years he was with engineering team.Just wanted to share the news openly witheveryone and say a huge thanks to llian foreverything so far. You Please join me in wishing himall the very best for what comes next.We start looking for a Full-Stack Software Engineer,so if you know anyone you believe will fit, pleasecontact me or Mira directly AMessage #the_people_of_jiminny+Aa...
|
NULL
|
-6924353142476997904
|
NULL
|
visual_change
|
ocr
|
NULL
|
SlackFileEditViewGoHistoryWindowHelpAPPDOCKERO ₴1D SlackFileEditViewGoHistoryWindowHelpAPPDOCKERO ₴1DEV (-zsh)₴82app/Jobs/Crm/MatchActivityCrmData.phpapp/Jobs/Middleware/HandleHubspotRateLimit.phpAPP (-zsl47++++++p42++++++*app/Mcp/Servers/JiminnyServer.phpapp/Mcp/Tools/GetMeTool.php157++++++•app/Models/Feature/FeatureEnum.phpapp/Services/Activity/HubSpot/ProviderResolver.php+-app/Services/Activity/HubSpot/ProviderResolverInterface.phpapp/Services/Activity/HubSpot/Providers/Provider.phpapp/Services/Activity/HubSpot/Providers/ProviderKixie.php+-app/Services/Activity/HubSpot/Providers/Provider0rum.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilio.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilioFlex.phpapp/Services/Activity/HubSpot/Service.phpapp/Services/Crm/Hubspot/Client.phpapp/Services/Crm/Hubspot/HubspotClientInterface.phpapp/Services/Crm/Hubspot/Pagination/HubspotPaginationService.phpapp/Services/Crm/Hubspot/Pagination/PaginationState.phpdatabase/migrations/2026_05_13_124153_create_mcp_feature_flag.phptests/Feature/Mcp/GetMeToolFeatureTest.phptests/Feature/Mcp/ListCallsToolFeatureTest.phptests/Feature/Mcp/McpTestHelpersTrait.phptests/Unit/Component/ES/ChunkSizeTest.phptests/Unit/Component/ES/Processor/DT0s/SelectionListTest.phptests/Unit/Component/ES/Processor/TargetEntitiesSelectorTest.phptests/Unit/Component/MeetingBot/Service/ParticipantMatcherTest.phptests/Unit/Exceptions/RateLimitExceptionTest.php97++++++-132++++++•15++++++21++++--2+-25++++++.140++++++•2+-19++++++50++++++27++++++39++++++6856++++++•tests/Unit/Jobs/Crm/MatchActivityCrmDataTest.phptests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phptests/Unit/Services/Activity/HubSpot/ServiceTest.phptests/Unit/Services/Crm/Hubspot/ClientTest.phptests/Unit/Services/Crm/Hubspot/Pagination/HubspotPaginationServiceTest.php151++++++-109++++++-250++++++283++++++.37 files changed, 1587 insertions(+), 344 deletions(-)create mode 100644 app/Component/ES/ChunkSize.phpcreate mode 100644 app/Jobs/Middleware/HandleHubspotRateLimit.phpcreate mode 100644 app/Mcp/Tools/GetMeTool.phpcreate mode 100644 database/migrations/2026_05_13_124153_create_mcp_feature_flag.phpcreate mode 100644 tests/Feature/Mcp/GetMeToolFeatureTest.phpcreate mode 100644 tests/Unit/Component/ES/ChunkSizeTest.phpcreate mode 100644 tests/Unit/Exceptions/RateLimitExceptionTest.phpcreate mode 100644 tests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phplukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pullAlready up to date.lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20676-delete-reSwitched to a new branch 'JY-20676-delete-report-related-objects'lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20676-delete-report-related-ob•HomeDMsActivityFilesLaterMoreSupport Daily - in 3h 58 m100% C78•Tue 19 May 11:02:51ED→QDescribe what you are looking forJiminny ...# bugs# confusion-clinic# curiosity_lab# engineering# general# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi...Direct messages8. Vasil Vasilevo Nikolay YankovP. Galya Dimitrova®. Aneliya Angelovad. Stefka Stoyanova. Stoyan Tomovd Todor Stamatov "KM. Mario GeorgievNikolay IvanovJames GrahamStoyan TanevUnread mentions# the_people_of jimi...426 0• MessagesC Files+NewTodayHStefka Stoy¿Hi J team,I wanted to share that our Lead Developer IlianKyuchukov has decided to move on from Jiminny topursue a new opportunity. While we're really sad tosee them go, we're also excited for him and thisnext chapter in his professional journey.Ilian's last working day will be 14 July, so we stillhave some time together before then. Over thecoming weeks, please make the most of hisknowledge, experience, and context so we canensure a smooth transition across the team.It's hard to overstate the impact llian has had here- from shaping the product and solving toughproblems to supporting teammates and helpingbuild the product we have today. We're incrediblygrateful for everything he contributed over this 2years he was with engineering team.Just wanted to share the news openly witheveryone and say a huge thanks to llian foreverything so far. You Please join me in wishing himall the very best for what comes next.We start looking for a Full-Stack Software Engineer,so if you know anyone you believe will fit, pleasecontact me or Mira directly AMessage #the_people_of_jiminny+Aa...
|
56376
|
NULL
|
NULL
|
NULL
|
|
56378
|
1966
|
0
|
2026-05-19T08:03:07.209449+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-19/1779 /Users/lukas/.screenpipe/data/data/2026-05-19/1779177787209_m1.jpg...
|
Firefox
|
NULL
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
SlackFileEditViewGoHistoryWindowHelpAPPDOCKERO ₴1D SlackFileEditViewGoHistoryWindowHelpAPPDOCKERO ₴1DEV (-zsh)₴82app/Jobs/Crm/MatchActivityCrmData.phpapp/Jobs/Middleware/HandleHubspotRateLimit.phpAPP (-zsl47++++++p42++++++*app/Mcp/Servers/JiminnyServer.phpapp/Mcp/Tools/GetMeTool.php157++++++•app/Models/Feature/FeatureEnum.phpapp/Services/Activity/HubSpot/ProviderResolver.php+-app/Services/Activity/HubSpot/ProviderResolverInterface.phpapp/Services/Activity/HubSpot/Providers/Provider.phpapp/Services/Activity/HubSpot/Providers/ProviderKixie.php+-app/Services/Activity/HubSpot/Providers/Provider0rum.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilio.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilioFlex.phpapp/Services/Activity/HubSpot/Service.phpapp/Services/Crm/Hubspot/Client.phpapp/Services/Crm/Hubspot/HubspotClientInterface.phpapp/Services/Crm/Hubspot/Pagination/HubspotPaginationService.phpapp/Services/Crm/Hubspot/Pagination/PaginationState.phpdatabase/migrations/2026_05_13_124153_create_mcp_feature_flag.phptests/Feature/Mcp/GetMeToolFeatureTest.phptests/Feature/Mcp/ListCallsToolFeatureTest.phptests/Feature/Mcp/McpTestHelpersTrait.phptests/Unit/Component/ES/ChunkSizeTest.phptests/Unit/Component/ES/Processor/DT0s/SelectionListTest.phptests/Unit/Component/ES/Processor/TargetEntitiesSelectorTest.phptests/Unit/Component/MeetingBot/Service/ParticipantMatcherTest.phptests/Unit/Exceptions/RateLimitExceptionTest.php97++++++-132++++++•15++++++21++++--2+-25++++++.140++++++•2+-19++++++50++++++27++++++39++++++6856++++++•tests/Unit/Jobs/Crm/MatchActivityCrmDataTest.phptests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phptests/Unit/Services/Activity/HubSpot/ServiceTest.phptests/Unit/Services/Crm/Hubspot/ClientTest.phptests/Unit/Services/Crm/Hubspot/Pagination/HubspotPaginationServiceTest.php151++++++-109++++++-250++++++283++++++.37 files changed, 1587 insertions(+), 344 deletions(-)create mode 100644 app/Component/ES/ChunkSize.phpcreate mode 100644 app/Jobs/Middleware/HandleHubspotRateLimit.phpcreate mode 100644 app/Mcp/Tools/GetMeTool.phpcreate mode 100644 database/migrations/2026_05_13_124153_create_mcp_feature_flag.phpcreate mode 100644 tests/Feature/Mcp/GetMeToolFeatureTest.phpcreate mode 100644 tests/Unit/Component/ES/ChunkSizeTest.phpcreate mode 100644 tests/Unit/Exceptions/RateLimitExceptionTest.phpcreate mode 100644 tests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phplukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pullAlready up to date.lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20676-delete-reSwitched to a new branch 'JY-20676-delete-report-related-objects'lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20676-delete-report-related-obHomeDMsActivityFilesLaterMore§ Support Daily - in 3 h 57 m100% C47*8• Tue 19 May 11:03:06•ED→QDescribe what you are looking forJiminny ...# bugs# confusion-clinic# curiosity_lab# engineering# general# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi...• MessagesC Files+Stefka Stoyanov:Today ~Hі Eteam,I wanted to share that our Lead Developer llianKyuchukov has decided to move on from Jiminny topursue a new opportunity. While we're really sad tosee them go, we're also excited for him and thisnext chapter in his professional journey.llian's last working day will be 14 July, so we stillhave some time together before then. Over thecoming weeks, please make the most of hisknowledge, experience, and context so we canensure a smooth transition across the team.It's hard to overstate the impact llian has had here- from shaping the product and solving toughproblems to supporting teammates and helpingbuild the product we have today. We re incrediblyDirect messagesgrateful for everything he contributed over this 28. Vasil Vasilevyears he was with & engineering team.o Nikolay YankovP Galya Dimitrova®. Aneliya Angelovad. Stefka Stoyanova. Stoyan TomovBs Todor Stamatov *M. Mario GeorgievJust wanted to share the news openly witheveryone and say a huge thanks to llian foreverything so far. Vou Please join me in wishing himall the very best for what comes next.We start looking for a Full-Stack Software Engineer,so if you know anyone you believe will fit, pleasecontact me or Mira directly A2Nikolay IvanovJames GrahamMessage #the_people_of_jiminnyStoyan Tanev+Unread mentions# the_people_of jimi...8 426 0...
|
NULL
|
5785222564060343101
|
NULL
|
click
|
ocr
|
NULL
|
SlackFileEditViewGoHistoryWindowHelpAPPDOCKERO ₴1D SlackFileEditViewGoHistoryWindowHelpAPPDOCKERO ₴1DEV (-zsh)₴82app/Jobs/Crm/MatchActivityCrmData.phpapp/Jobs/Middleware/HandleHubspotRateLimit.phpAPP (-zsl47++++++p42++++++*app/Mcp/Servers/JiminnyServer.phpapp/Mcp/Tools/GetMeTool.php157++++++•app/Models/Feature/FeatureEnum.phpapp/Services/Activity/HubSpot/ProviderResolver.php+-app/Services/Activity/HubSpot/ProviderResolverInterface.phpapp/Services/Activity/HubSpot/Providers/Provider.phpapp/Services/Activity/HubSpot/Providers/ProviderKixie.php+-app/Services/Activity/HubSpot/Providers/Provider0rum.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilio.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilioFlex.phpapp/Services/Activity/HubSpot/Service.phpapp/Services/Crm/Hubspot/Client.phpapp/Services/Crm/Hubspot/HubspotClientInterface.phpapp/Services/Crm/Hubspot/Pagination/HubspotPaginationService.phpapp/Services/Crm/Hubspot/Pagination/PaginationState.phpdatabase/migrations/2026_05_13_124153_create_mcp_feature_flag.phptests/Feature/Mcp/GetMeToolFeatureTest.phptests/Feature/Mcp/ListCallsToolFeatureTest.phptests/Feature/Mcp/McpTestHelpersTrait.phptests/Unit/Component/ES/ChunkSizeTest.phptests/Unit/Component/ES/Processor/DT0s/SelectionListTest.phptests/Unit/Component/ES/Processor/TargetEntitiesSelectorTest.phptests/Unit/Component/MeetingBot/Service/ParticipantMatcherTest.phptests/Unit/Exceptions/RateLimitExceptionTest.php97++++++-132++++++•15++++++21++++--2+-25++++++.140++++++•2+-19++++++50++++++27++++++39++++++6856++++++•tests/Unit/Jobs/Crm/MatchActivityCrmDataTest.phptests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phptests/Unit/Services/Activity/HubSpot/ServiceTest.phptests/Unit/Services/Crm/Hubspot/ClientTest.phptests/Unit/Services/Crm/Hubspot/Pagination/HubspotPaginationServiceTest.php151++++++-109++++++-250++++++283++++++.37 files changed, 1587 insertions(+), 344 deletions(-)create mode 100644 app/Component/ES/ChunkSize.phpcreate mode 100644 app/Jobs/Middleware/HandleHubspotRateLimit.phpcreate mode 100644 app/Mcp/Tools/GetMeTool.phpcreate mode 100644 database/migrations/2026_05_13_124153_create_mcp_feature_flag.phpcreate mode 100644 tests/Feature/Mcp/GetMeToolFeatureTest.phpcreate mode 100644 tests/Unit/Component/ES/ChunkSizeTest.phpcreate mode 100644 tests/Unit/Exceptions/RateLimitExceptionTest.phpcreate mode 100644 tests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phplukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pullAlready up to date.lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20676-delete-reSwitched to a new branch 'JY-20676-delete-report-related-objects'lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20676-delete-report-related-obHomeDMsActivityFilesLaterMore§ Support Daily - in 3 h 57 m100% C47*8• Tue 19 May 11:03:06•ED→QDescribe what you are looking forJiminny ...# bugs# confusion-clinic# curiosity_lab# engineering# general# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi...• MessagesC Files+Stefka Stoyanov:Today ~Hі Eteam,I wanted to share that our Lead Developer llianKyuchukov has decided to move on from Jiminny topursue a new opportunity. While we're really sad tosee them go, we're also excited for him and thisnext chapter in his professional journey.llian's last working day will be 14 July, so we stillhave some time together before then. Over thecoming weeks, please make the most of hisknowledge, experience, and context so we canensure a smooth transition across the team.It's hard to overstate the impact llian has had here- from shaping the product and solving toughproblems to supporting teammates and helpingbuild the product we have today. We re incrediblyDirect messagesgrateful for everything he contributed over this 28. Vasil Vasilevyears he was with & engineering team.o Nikolay YankovP Galya Dimitrova®. Aneliya Angelovad. Stefka Stoyanova. Stoyan TomovBs Todor Stamatov *M. Mario GeorgievJust wanted to share the news openly witheveryone and say a huge thanks to llian foreverything so far. Vou Please join me in wishing himall the very best for what comes next.We start looking for a Full-Stack Software Engineer,so if you know anyone you believe will fit, pleasecontact me or Mira directly A2Nikolay IvanovJames GrahamMessage #the_people_of_jiminnyStoyan Tanev+Unread mentions# the_people_of jimi...8 426 0...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
56379
|
1967
|
0
|
2026-05-19T08:03:11.538301+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-19/1779 /Users/lukas/.screenpipe/data/data/2026-05-19/1779177791538_m2.jpg...
|
Firefox
|
NULL
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
slackFV faVsco.js°9 JY-20676-delete-report-related slackFV faVsco.js°9 JY-20676-delete-report-related-objectsProiect(C) AutomatedReport.onp© AskAnythingPromptServiceTest.php© Serializer.php© TeamScimDetails.php> D bootstrap>D build>D config>@ contrib> @ database>@ docs> C front-end>C lanc>@ node_modules library root> @ phpstan> C publicAskJiminnyReportsControllerTest.php X© Search.php© AskAnythingPrompt.php© ActivityController.phgbaseservice.pnp)constants.pngC) RoleAttr.php) RoleAttrTest.phpListenerRoleCannotHaveAdminOrManagerPermissionRule.php(C)Activity/Close/Service.php(C) Activity/RinqCentral/Service.phpC) SyncActivity.php(C) Crm/Close/Service.pho(C) TextMessaqingService.phpfinal class AskJiminnvReoortsControllerTest extends Testcase22 D >public function testToggleStatusPreventsEnablingReportWithNullSearchId: void{...}72 D >public function testToggleStatusPreventsEnablingReportWithNullPromptId: void{...}>D resourcesv O routesphp api.oho120 D ›public function testTogqleStatusAllowsEnablingReportWithValidReferencesO: voidk...}168 D >public function testTogqleStatusAllowsDisablingReportWithNul1ReferencesO: voidk...}php api_v2.phpphp console.ohophp customer aoi.ohophp embedded.phpLocal ChandesConsole XLoo XChanges 17 file=.env.local app© ActivityController.php app/Http/Controllers/API© AskAnythingPrompt.php app/Models/AskAnythingc) ASKAnvihinaPromotbto,ono apo/comoonent/AskAnvihino/Dros© AskAnvthinaPromptService.php app/Component/AskAnvthina@ AskAnvthinaPromptServiceTest.php tests/Unit/Component/AskAnvthina© Ask.JiminnvReportsController.pho app/Htto/Controllers/APIV2Side-by-side viewerDo not ignoreHighlight words 158 5604af40 .env.locaSECIRTTY HSANEP CISTOM CCP=OR_CONNECTTON=mvsall= DR HOST=127 A A.1.C) Constants.ono apo/Comoonent/SClMI© CoreUser.php app/DTO/SCIM/AAD/ResponseC) CoreUserRequest.ono ano/DTO/SCIMIAAD/[EMAIL] apn/Console/Commande-nR PORT-73A6- DB_DATABASE=jiminny-DB_USERNAME=rootne pAccwnon-czunz+.ephp loadina.nho confial@ SavedSearchCRUDFeatureTest.nho tests/Feature/SavedSearchesJB CUNNECILUN UHLU=0N10C) ScimProvisionina.ohnann/Comnonent/SCIMDB HOST_OHI0=host.docker.internal© Search.php app/Models/ActivitySoftPhoneManager.php app/Component/Twilio/Conference/ConferenceManagDB PORT 0HL0=/652DB DATABASE_OHI0=jiminny© TextMessagingService.php app/Services/Telephony) Uinvercionod Siloc 11 filacDB USERNAME OHIDEB PASSWORD OHTO=DB CONMECIOION IRELANDETre LandIDB HOST TRELANDehost docker internalDB PORT TRELAND=7532B DATABASE TRELANde iminnv.USERNAME TRELANDE3 PASSWORD TRELANDEnR CONNECTTON STACTNG=staginalDB_HOST_STAGING=host.docker.internalout affectina the dictionarios for other lanquades (todav 10-001= custom.log= laravel.log4 SF jiminny@localhost]4 HS_local [jiminny@localhost]& console [PROD]& console [EU]A console [STAGING]© CoachingFeedbackCoachUserln.php Xfinal class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefini~pubLic tunccion conscruccuserkeposicory suserkeposicorvor...r29 6tpublic function shouldApplyQueries(): boolf...}34 ot>public function getQueries: FilterDefinitionQueryCollection{...}45 6tpubLic function toArray): arrayl...л1 usageprivate function getOptions: arrayt...118f 119.public function getValue: arrayt...lusageprivate function getDefaultValue: arrayt...136 >public function getValidationRules(?string $prefix = null): array{...}Current versionSECIRTTY HEANER CISTOM CCP=DB_CONNECTION=mysqlDB_HOST=mariadb#DB_HOST=mariadbnR PORT-7304DB_DATABASE=jiminnyDB_USERNAME=jmnyadminDB_PASSWORD=[PASSWORD] ADMIN_ USERNAME=imnyadmin#DB_ [ENV_SECRET] Models User#CASHIER_MODELEJ1minny Models UserhubsBROADCAST DRMErenuSherCACHE_DRIVER=redisCACHE PRESIXe-imnySESSTON DRIVER=redisQUEUE CONNECTIONeredisGITHUB TOKEN=nu11RENTS CITENT=nhnnedisREnTS HOST=nedis100% 5• lue 1y May 11:03.1CascadeO ASk Jiminny Report+0 ..searcned ask_jminny_reponts.toggle and pertormed & oter querlesASKAnychingPrompt don't nave tactorles and the fule says notto write tests for controllers. Let me remove that tlle° fusers/lukas/ 1n/ny/ap/tests/Feature/fttp/Controllers/APB/Z/ASK31n/myñeportsControlLeriEBtaRun &~ Skip* Reject allAccept allQ files 4200 -7 >Ask anvthina (4D14 @s Codo Chudo Onuc 17 Modium48 ditterencesPo. 4 spaces...
|
NULL
|
1272721981285678362
|
NULL
|
click
|
ocr
|
NULL
|
slackFV faVsco.js°9 JY-20676-delete-report-related slackFV faVsco.js°9 JY-20676-delete-report-related-objectsProiect(C) AutomatedReport.onp© AskAnythingPromptServiceTest.php© Serializer.php© TeamScimDetails.php> D bootstrap>D build>D config>@ contrib> @ database>@ docs> C front-end>C lanc>@ node_modules library root> @ phpstan> C publicAskJiminnyReportsControllerTest.php X© Search.php© AskAnythingPrompt.php© ActivityController.phgbaseservice.pnp)constants.pngC) RoleAttr.php) RoleAttrTest.phpListenerRoleCannotHaveAdminOrManagerPermissionRule.php(C)Activity/Close/Service.php(C) Activity/RinqCentral/Service.phpC) SyncActivity.php(C) Crm/Close/Service.pho(C) TextMessaqingService.phpfinal class AskJiminnvReoortsControllerTest extends Testcase22 D >public function testToggleStatusPreventsEnablingReportWithNullSearchId: void{...}72 D >public function testToggleStatusPreventsEnablingReportWithNullPromptId: void{...}>D resourcesv O routesphp api.oho120 D ›public function testTogqleStatusAllowsEnablingReportWithValidReferencesO: voidk...}168 D >public function testTogqleStatusAllowsDisablingReportWithNul1ReferencesO: voidk...}php api_v2.phpphp console.ohophp customer aoi.ohophp embedded.phpLocal ChandesConsole XLoo XChanges 17 file=.env.local app© ActivityController.php app/Http/Controllers/API© AskAnythingPrompt.php app/Models/AskAnythingc) ASKAnvihinaPromotbto,ono apo/comoonent/AskAnvihino/Dros© AskAnvthinaPromptService.php app/Component/AskAnvthina@ AskAnvthinaPromptServiceTest.php tests/Unit/Component/AskAnvthina© Ask.JiminnvReportsController.pho app/Htto/Controllers/APIV2Side-by-side viewerDo not ignoreHighlight words 158 5604af40 .env.locaSECIRTTY HSANEP CISTOM CCP=OR_CONNECTTON=mvsall= DR HOST=127 A A.1.C) Constants.ono apo/Comoonent/SClMI© CoreUser.php app/DTO/SCIM/AAD/ResponseC) CoreUserRequest.ono ano/DTO/SCIMIAAD/[EMAIL] apn/Console/Commande-nR PORT-73A6- DB_DATABASE=jiminny-DB_USERNAME=rootne pAccwnon-czunz+.ephp loadina.nho confial@ SavedSearchCRUDFeatureTest.nho tests/Feature/SavedSearchesJB CUNNECILUN UHLU=0N10C) ScimProvisionina.ohnann/Comnonent/SCIMDB HOST_OHI0=host.docker.internal© Search.php app/Models/ActivitySoftPhoneManager.php app/Component/Twilio/Conference/ConferenceManagDB PORT 0HL0=/652DB DATABASE_OHI0=jiminny© TextMessagingService.php app/Services/Telephony) Uinvercionod Siloc 11 filacDB USERNAME OHIDEB PASSWORD OHTO=DB CONMECIOION IRELANDETre LandIDB HOST TRELANDehost docker internalDB PORT TRELAND=7532B DATABASE TRELANde iminnv.USERNAME TRELANDE3 PASSWORD TRELANDEnR CONNECTTON STACTNG=staginalDB_HOST_STAGING=host.docker.internalout affectina the dictionarios for other lanquades (todav 10-001= custom.log= laravel.log4 SF jiminny@localhost]4 HS_local [jiminny@localhost]& console [PROD]& console [EU]A console [STAGING]© CoachingFeedbackCoachUserln.php Xfinal class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefini~pubLic tunccion conscruccuserkeposicory suserkeposicorvor...r29 6tpublic function shouldApplyQueries(): boolf...}34 ot>public function getQueries: FilterDefinitionQueryCollection{...}45 6tpubLic function toArray): arrayl...л1 usageprivate function getOptions: arrayt...118f 119.public function getValue: arrayt...lusageprivate function getDefaultValue: arrayt...136 >public function getValidationRules(?string $prefix = null): array{...}Current versionSECIRTTY HEANER CISTOM CCP=DB_CONNECTION=mysqlDB_HOST=mariadb#DB_HOST=mariadbnR PORT-7304DB_DATABASE=jiminnyDB_USERNAME=jmnyadminDB_PASSWORD=[PASSWORD] ADMIN_ USERNAME=imnyadmin#DB_ [ENV_SECRET] Models User#CASHIER_MODELEJ1minny Models UserhubsBROADCAST DRMErenuSherCACHE_DRIVER=redisCACHE PRESIXe-imnySESSTON DRIVER=redisQUEUE CONNECTIONeredisGITHUB TOKEN=nu11RENTS CITENT=nhnnedisREnTS HOST=nedis100% 5• lue 1y May 11:03.1CascadeO ASk Jiminny Report+0 ..searcned ask_jminny_reponts.toggle and pertormed & oter querlesASKAnychingPrompt don't nave tactorles and the fule says notto write tests for controllers. Let me remove that tlle° fusers/lukas/ 1n/ny/ap/tests/Feature/fttp/Controllers/APB/Z/ASK31n/myñeportsControlLeriEBtaRun &~ Skip* Reject allAccept allQ files 4200 -7 >Ask anvthina (4D14 @s Codo Chudo Onuc 17 Modium48 ditterencesPo. 4 spaces...
|
56372
|
NULL
|
NULL
|
NULL
|
|
56380
|
1966
|
1
|
2026-05-19T08:03:38.381604+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-19/1779 /Users/lukas/.screenpipe/data/data/2026-05-19/1779177818381_m1.jpg...
|
Firefox
|
NULL
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
SlackFileEditViewGoHistoryWindowHelpAPPDOCKERO ₴1D SlackFileEditViewGoHistoryWindowHelpAPPDOCKERO ₴1DEV (-zsh)₴82app/Jobs/Crm/MatchActivityCrmData.phpapp/Jobs/Middleware/HandleHubspotRateLimit.phpAPP (-zsl47++++++p42++++++*app/Mcp/Servers/JiminnyServer.phpapp/Mcp/Tools/GetMeTool.php157++++++app/Models/Feature/FeatureEnum.phpapp/Services/Activity/HubSpot/ProviderResolver.php+-app/Services/Activity/HubSpot/ProviderResolverInterface.phpapp/Services/Activity/HubSpot/Providers/Provider.phpapp/Services/Activity/HubSpot/Providers/ProviderKixie.php+-app/Services/Activity/HubSpot/Providers/Provider0rum.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilio.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilioFlex.phpapp/Services/Activity/HubSpot/Service.phpapp/Services/Crm/Hubspot/Client.phpapp/Services/Crm/Hubspot/HubspotClientInterface.phpapp/Services/Crm/Hubspot/Pagination/HubspotPaginationService.phpapp/Services/Crm/Hubspot/Pagination/PaginationState.phpdatabase/migrations/2026_05_13_124153_create_mcp_feature_flag.phptests/Feature/Mcp/GetMeToolFeatureTest.phptests/Feature/Mcp/ListCallsToolFeatureTest.phptests/Feature/Mcp/McpTestHelpersTrait.phptests/Unit/Component/ES/ChunkSizeTest.phptests/Unit/Component/ES/Processor/DT0s/SelectionListTest.phptests/Unit/Component/ES/Processor/TargetEntitiesSelectorTest.phptests/Unit/Component/MeetingBot/Service/ParticipantMatcherTest.phptests/Unit/Exceptions/RateLimitExceptionTest.phptests/Unit/Jobs/Crm/MatchActivityCrmDataTest.phptests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phptests/Unit/Services/Activity/HubSpot/ServiceTest.phptests/Unit/Services/Crm/Hubspot/ClientTest.phptests/Unit/Services/Crm/Hubspot/Pagination/HubspotPaginationServiceTest.php97++++++-132++++++•15++++++21++++-2+-25++++++-140++++++-+-19++++++50++++++27++++++39++++++-6856++++++-8151++++++-109++++++-250++++++283++++++•37 files changed, 1587 insertions(+), 344 deletions(-)create mode 100644 app/Component/ES/ChunkSize.phpcreate mode 100644 app/Jobs/Middleware/HandleHubspotRateLimit.phpcreate mode 100644 app/Mcp/Tools/GetMeTool.phpcreate mode 100644 database/migrations/2026_05_13_124153_create_mcp_feature_flag.phpcreate mode 100644 tests/Feature/Mcp/GetMeToolFeatureTest.phpcreate mode 100644 tests/Unit/Component/ES/ChunkSizeTest.phpcreate mode 100644 tests/Unit/Exceptions/RateLimitExceptionTest.phpcreate mode 100644 tests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phplukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pullAlready up to date.lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20676-delete-reSwitched to a new branch 'JY-20676-delete-report-related-objects'lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20676-delete-report-related-obHomeDMsActivityFilesLater...MoreED→Jiminny ...# Jiminny-Dg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi...• Direct messages€. Vasil VasilevP. Nikolay Yankov% Galya DimitrovaP. Aneliya Angelovaã. Stefka Stoyanova. Stoyan Tomovd Todor Stamatov "Kd. Mario GeorgievNikolay Ivanovdo James Graham2 Stoyan TanevR. Steliyan Georgiev&. Petko Kashinski. Lukas Kovalik y... 0::: AppsJira CloudToast§ Support Daily - in 3 h 57 m100% C47*8• Tue 19 May 11:03:38QDescribe what you are looking for# the_people_of jimi...8 426 0• MessagesC Files+Stefka Stoyanov:Today ~Hі Eteam,I wanted to share that our Lead Developer llianKyuchukov has decided to move on from Jiminny topursue a new opportunity. While we're really sad tosee them go, we're also excited for him and thisnext chapter in his professional journey.llian's last working day will be 14 July, so we stillhave some time together before then. Over thecoming weeks, please make the most of hisknowledge, experience, and context so we canensure a smooth transition across the team.It's hard to overstate the impact llian has had here- from shaping the product and solving toughproblems to supporting teammates and helpingbuild the product we have today. We re incrediblygrateful for everything he contributed over this 2years he was with engineering team.Just wanted to share the news openly witheveryone and say a huge thanks to llian foreverything so far. Vou Please join me in wishing himall the very best for what comes next.We start looking for a Full-Stack Software Engineer,so if you know anyone you believe will fit, pleasecontact me or Mira directly A©3 63692Message #the_people_of_jiminny+Aa...
|
NULL
|
-2856194325592806745
|
NULL
|
idle
|
ocr
|
NULL
|
SlackFileEditViewGoHistoryWindowHelpAPPDOCKERO ₴1D SlackFileEditViewGoHistoryWindowHelpAPPDOCKERO ₴1DEV (-zsh)₴82app/Jobs/Crm/MatchActivityCrmData.phpapp/Jobs/Middleware/HandleHubspotRateLimit.phpAPP (-zsl47++++++p42++++++*app/Mcp/Servers/JiminnyServer.phpapp/Mcp/Tools/GetMeTool.php157++++++app/Models/Feature/FeatureEnum.phpapp/Services/Activity/HubSpot/ProviderResolver.php+-app/Services/Activity/HubSpot/ProviderResolverInterface.phpapp/Services/Activity/HubSpot/Providers/Provider.phpapp/Services/Activity/HubSpot/Providers/ProviderKixie.php+-app/Services/Activity/HubSpot/Providers/Provider0rum.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilio.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilioFlex.phpapp/Services/Activity/HubSpot/Service.phpapp/Services/Crm/Hubspot/Client.phpapp/Services/Crm/Hubspot/HubspotClientInterface.phpapp/Services/Crm/Hubspot/Pagination/HubspotPaginationService.phpapp/Services/Crm/Hubspot/Pagination/PaginationState.phpdatabase/migrations/2026_05_13_124153_create_mcp_feature_flag.phptests/Feature/Mcp/GetMeToolFeatureTest.phptests/Feature/Mcp/ListCallsToolFeatureTest.phptests/Feature/Mcp/McpTestHelpersTrait.phptests/Unit/Component/ES/ChunkSizeTest.phptests/Unit/Component/ES/Processor/DT0s/SelectionListTest.phptests/Unit/Component/ES/Processor/TargetEntitiesSelectorTest.phptests/Unit/Component/MeetingBot/Service/ParticipantMatcherTest.phptests/Unit/Exceptions/RateLimitExceptionTest.phptests/Unit/Jobs/Crm/MatchActivityCrmDataTest.phptests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phptests/Unit/Services/Activity/HubSpot/ServiceTest.phptests/Unit/Services/Crm/Hubspot/ClientTest.phptests/Unit/Services/Crm/Hubspot/Pagination/HubspotPaginationServiceTest.php97++++++-132++++++•15++++++21++++-2+-25++++++-140++++++-+-19++++++50++++++27++++++39++++++-6856++++++-8151++++++-109++++++-250++++++283++++++•37 files changed, 1587 insertions(+), 344 deletions(-)create mode 100644 app/Component/ES/ChunkSize.phpcreate mode 100644 app/Jobs/Middleware/HandleHubspotRateLimit.phpcreate mode 100644 app/Mcp/Tools/GetMeTool.phpcreate mode 100644 database/migrations/2026_05_13_124153_create_mcp_feature_flag.phpcreate mode 100644 tests/Feature/Mcp/GetMeToolFeatureTest.phpcreate mode 100644 tests/Unit/Component/ES/ChunkSizeTest.phpcreate mode 100644 tests/Unit/Exceptions/RateLimitExceptionTest.phpcreate mode 100644 tests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phplukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pullAlready up to date.lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20676-delete-reSwitched to a new branch 'JY-20676-delete-report-related-objects'lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20676-delete-report-related-obHomeDMsActivityFilesLater...MoreED→Jiminny ...# Jiminny-Dg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi...• Direct messages€. Vasil VasilevP. Nikolay Yankov% Galya DimitrovaP. Aneliya Angelovaã. Stefka Stoyanova. Stoyan Tomovd Todor Stamatov "Kd. Mario GeorgievNikolay Ivanovdo James Graham2 Stoyan TanevR. Steliyan Georgiev&. Petko Kashinski. Lukas Kovalik y... 0::: AppsJira CloudToast§ Support Daily - in 3 h 57 m100% C47*8• Tue 19 May 11:03:38QDescribe what you are looking for# the_people_of jimi...8 426 0• MessagesC Files+Stefka Stoyanov:Today ~Hі Eteam,I wanted to share that our Lead Developer llianKyuchukov has decided to move on from Jiminny topursue a new opportunity. While we're really sad tosee them go, we're also excited for him and thisnext chapter in his professional journey.llian's last working day will be 14 July, so we stillhave some time together before then. Over thecoming weeks, please make the most of hisknowledge, experience, and context so we canensure a smooth transition across the team.It's hard to overstate the impact llian has had here- from shaping the product and solving toughproblems to supporting teammates and helpingbuild the product we have today. We re incrediblygrateful for everything he contributed over this 2years he was with engineering team.Just wanted to share the news openly witheveryone and say a huge thanks to llian foreverything so far. Vou Please join me in wishing himall the very best for what comes next.We start looking for a Full-Stack Software Engineer,so if you know anyone you believe will fit, pleasecontact me or Mira directly A©3 63692Message #the_people_of_jiminny+Aa...
|
56378
|
NULL
|
NULL
|
NULL
|
|
56381
|
1967
|
1
|
2026-05-19T08:03:42.375309+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-19/1779 /Users/lukas/.screenpipe/data/data/2026-05-19/1779177822375_m2.jpg...
|
Firefox
|
NULL
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
slackFV faVsco.js°9 JY-20676-delete-report-related slackFV faVsco.js°9 JY-20676-delete-report-related-objectsProiect(C) AutomatedReport.onp© AskAnythingPromptServiceTest.php© Serializer.php© TeamScimDetails.php> D bootstrap>D build>D config>@ contrib> @ database>@ docs> C front-end>C lanc>@ node_modules library root> @ phpstan> C publicAskJiminnyReportsControllerTest.php X© Search.php© AskAnythingPrompt.php© ActivityController.phgbaseservice.pnp)constants.pngC) RoleAttr.php) RoleAttrTest.phpListenerRoleCannotHaveAdminOrManagerPermissionRule.php(C)Activity/Close/Service.php(C) Activity/RinqCentral/Service.phpC) SyncActivity.php(C) Crm/Close/Service.pho(C) TextMessaqingService.phpfinal class AskJiminnvReoortsControllerTest extends Testcase22 D >public function testToggleStatusPreventsEnablingReportWithNullSearchId: void{...}72 D >public function testToggleStatusPreventsEnablingReportWithNullPromptId: void{...}>D resourcesv O routesphp api.oho120 D ›public function testTogqleStatusAllowsEnablingReportWithValidReferencesO: voidk...}168 D >public function testTogqleStatusAllowsDisablingReportWithNul1ReferencesO: voidk...}php api_v2.phpphp console.ohophp customer aoi.ohophp embedded.phpLocal ChandesConsole XLoo XChanges 17 file=.env.local app© ActivityController.php app/Http/Controllers/API© AskAnythingPrompt.php app/Models/AskAnythingc) ASKAnvihinaPromotbto,ono apo/comoonent/AskAnvihino/Dros© AskAnvthinaPromptService.php app/Component/AskAnvthina@ AskAnvthinaPromptServiceTest.php tests/Unit/Component/AskAnvthina© Ask.JiminnvReportsController.pho app/Htto/Controllers/APIV2Side-by-side viewerDo not ignoreHighlight words 158 5604af40 .env.locaSECIRTTY HSANEP CISTOM CCP=OR_CONNECTTON=mvsall= DR HOST=127 A A.1.C) Constants.ono apo/Comoonent/SClMI© CoreUser.php app/DTO/SCIM/AAD/ResponseC) CoreUserRequest.ono ano/DTO/SCIMIAAD/[EMAIL] apn/Console/Commande-nR PORT-73A6- DB_DATABASE=jiminny-DB_USERNAME=rootne pAccwnon-czunz+.ephp loadina.nho confial@ SavedSearchCRUDFeatureTest.nho tests/Feature/SavedSearchesJB CUNNECILUN UHLU=0N10C) ScimProvisionina.ohnann/Comnonent/SCIMDB HOST_OHI0=host.docker.internal© Search.php app/Models/ActivitySoftPhoneManager.php app/Component/Twilio/Conference/ConferenceManagDB PORT 0HL0=/652DB DATABASE_OHI0=jiminny© TextMessagingService.php app/Services/Telephony) Uinvercionod Siloc 11 filacDB USERNAME OHIDEB PASSWORD OHTO=DB CONMECIOION IRELANDETre LandIDB HOST TRELANDehost docker internalDB PORT TRELAND=7532B DATABASE TRELANde iminnv.USERNAME TRELANDE3 PASSWORD TRELANDEnR CONNECTTON STACTNG=staginalDB_HOST_STAGING=host.docker.internalout affectina the dictionarios for other lanquades (todav 10-001= custom.log= laravel.log4 SF jiminny@localhost]4 HS_local [jiminny@localhost]& console [PROD]& console [EU]A console [STAGING]© CoachingFeedbackCoachUserln.php Xfinal class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefini~pubLic tunccion conscruccuserkeposicory suserkeposicorvor...r29 6tpublic function shouldApplyQueries(): boolf...}34 ot>public function getQueries: FilterDefinitionQueryCollection{...}45 6tpubLic function toArray): arrayl...л1 usageprivate function getOptions: arrayt...118f 119.public function getValue: arrayt...lusageprivate function getDefaultValue: arrayt...136 >public function getValidationRules(?string $prefix = null): array{...}Current versionSECIRTTY HEANER CISTOM CCP=DB_CONNECTION=mysqlDB_HOST=mariadb#DB_HOST=mariadbnR PORT-7304DB_DATABASE=jiminnyDB_USERNAME=jmnyadminDB_PASSWORD=[PASSWORD] ADMIN_ USERNAME=imnyadmin#DB_ [ENV_SECRET] Models User#CASHIER_MODELEJ1minny Models UserhubsBROADCAST DRMErenuSherCACHE_DRIVER=redisCACHE PRESIXe-imnySESSTON DRIVER=redisQUEUE CONNECTIONeredisGITHUB TOKEN=nu11RENTS CITENT=nhnnedisREnTS HOST=nedis100% 5• lue 19 May 11:03.44CascadeO ASk Jiminny Report+0 ..searcned ask_jminny_reponts.toggle and pertormed & oter querlesASKAnychingPrompt don't nave tactorles and the fule says notto write tests for controllers. Let me remove that tlle° fusers/lukas/ 1n/ny/ap/tests/Feature/fttp/Controllers/APB/Z/ASK31n/myñeportsControlLeriEBtaRun &~ Skip* Reject allAccept allQ files 4200 -7 >Ask anvthina (4D14 @s Codo Chudo Onuc 17 Modium48 ditterencesPo. 4 spaces...
|
NULL
|
379416325417498291
|
NULL
|
idle
|
ocr
|
NULL
|
slackFV faVsco.js°9 JY-20676-delete-report-related slackFV faVsco.js°9 JY-20676-delete-report-related-objectsProiect(C) AutomatedReport.onp© AskAnythingPromptServiceTest.php© Serializer.php© TeamScimDetails.php> D bootstrap>D build>D config>@ contrib> @ database>@ docs> C front-end>C lanc>@ node_modules library root> @ phpstan> C publicAskJiminnyReportsControllerTest.php X© Search.php© AskAnythingPrompt.php© ActivityController.phgbaseservice.pnp)constants.pngC) RoleAttr.php) RoleAttrTest.phpListenerRoleCannotHaveAdminOrManagerPermissionRule.php(C)Activity/Close/Service.php(C) Activity/RinqCentral/Service.phpC) SyncActivity.php(C) Crm/Close/Service.pho(C) TextMessaqingService.phpfinal class AskJiminnvReoortsControllerTest extends Testcase22 D >public function testToggleStatusPreventsEnablingReportWithNullSearchId: void{...}72 D >public function testToggleStatusPreventsEnablingReportWithNullPromptId: void{...}>D resourcesv O routesphp api.oho120 D ›public function testTogqleStatusAllowsEnablingReportWithValidReferencesO: voidk...}168 D >public function testTogqleStatusAllowsDisablingReportWithNul1ReferencesO: voidk...}php api_v2.phpphp console.ohophp customer aoi.ohophp embedded.phpLocal ChandesConsole XLoo XChanges 17 file=.env.local app© ActivityController.php app/Http/Controllers/API© AskAnythingPrompt.php app/Models/AskAnythingc) ASKAnvihinaPromotbto,ono apo/comoonent/AskAnvihino/Dros© AskAnvthinaPromptService.php app/Component/AskAnvthina@ AskAnvthinaPromptServiceTest.php tests/Unit/Component/AskAnvthina© Ask.JiminnvReportsController.pho app/Htto/Controllers/APIV2Side-by-side viewerDo not ignoreHighlight words 158 5604af40 .env.locaSECIRTTY HSANEP CISTOM CCP=OR_CONNECTTON=mvsall= DR HOST=127 A A.1.C) Constants.ono apo/Comoonent/SClMI© CoreUser.php app/DTO/SCIM/AAD/ResponseC) CoreUserRequest.ono ano/DTO/SCIMIAAD/[EMAIL] apn/Console/Commande-nR PORT-73A6- DB_DATABASE=jiminny-DB_USERNAME=rootne pAccwnon-czunz+.ephp loadina.nho confial@ SavedSearchCRUDFeatureTest.nho tests/Feature/SavedSearchesJB CUNNECILUN UHLU=0N10C) ScimProvisionina.ohnann/Comnonent/SCIMDB HOST_OHI0=host.docker.internal© Search.php app/Models/ActivitySoftPhoneManager.php app/Component/Twilio/Conference/ConferenceManagDB PORT 0HL0=/652DB DATABASE_OHI0=jiminny© TextMessagingService.php app/Services/Telephony) Uinvercionod Siloc 11 filacDB USERNAME OHIDEB PASSWORD OHTO=DB CONMECIOION IRELANDETre LandIDB HOST TRELANDehost docker internalDB PORT TRELAND=7532B DATABASE TRELANde iminnv.USERNAME TRELANDE3 PASSWORD TRELANDEnR CONNECTTON STACTNG=staginalDB_HOST_STAGING=host.docker.internalout affectina the dictionarios for other lanquades (todav 10-001= custom.log= laravel.log4 SF jiminny@localhost]4 HS_local [jiminny@localhost]& console [PROD]& console [EU]A console [STAGING]© CoachingFeedbackCoachUserln.php Xfinal class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefini~pubLic tunccion conscruccuserkeposicory suserkeposicorvor...r29 6tpublic function shouldApplyQueries(): boolf...}34 ot>public function getQueries: FilterDefinitionQueryCollection{...}45 6tpubLic function toArray): arrayl...л1 usageprivate function getOptions: arrayt...118f 119.public function getValue: arrayt...lusageprivate function getDefaultValue: arrayt...136 >public function getValidationRules(?string $prefix = null): array{...}Current versionSECIRTTY HEANER CISTOM CCP=DB_CONNECTION=mysqlDB_HOST=mariadb#DB_HOST=mariadbnR PORT-7304DB_DATABASE=jiminnyDB_USERNAME=jmnyadminDB_PASSWORD=[PASSWORD] ADMIN_ USERNAME=imnyadmin#DB_ [ENV_SECRET] Models User#CASHIER_MODELEJ1minny Models UserhubsBROADCAST DRMErenuSherCACHE_DRIVER=redisCACHE PRESIXe-imnySESSTON DRIVER=redisQUEUE CONNECTIONeredisGITHUB TOKEN=nu11RENTS CITENT=nhnnedisREnTS HOST=nedis100% 5• lue 19 May 11:03.44CascadeO ASk Jiminny Report+0 ..searcned ask_jminny_reponts.toggle and pertormed & oter querlesASKAnychingPrompt don't nave tactorles and the fule says notto write tests for controllers. Let me remove that tlle° fusers/lukas/ 1n/ny/ap/tests/Feature/fttp/Controllers/APB/Z/ASK31n/myñeportsControlLeriEBtaRun &~ Skip* Reject allAccept allQ files 4200 -7 >Ask anvthina (4D14 @s Codo Chudo Onuc 17 Modium48 ditterencesPo. 4 spaces...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
56382
|
1966
|
2
|
2026-05-19T08:04:09.270347+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-19/1779 /Users/lukas/.screenpipe/data/data/2026-05-19/1779177849270_m1.jpg...
|
Firefox
|
NULL
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
SlackFileEditViewGoHistoryWindowHelpAPPDOCKERO ₴1D SlackFileEditViewGoHistoryWindowHelpAPPDOCKERO ₴1DEV (-zsh)₴82app/Jobs/Crm/MatchActivityCrmData.phpapp/Jobs/Middleware/HandleHubspotRateLimit.phpAPP (-zsl47++++++*42++++++*app/Mcp/Servers/JiminnyServer.phpapp/Mcp/Tools/GetMeTool.php157++++++app/Models/Feature/FeatureEnum.phpapp/Services/Activity/HubSpot/ProviderResolver.php+-app/Services/Activity/HubSpot/ProviderResolverInterface.phpapp/Services/Activity/HubSpot/Providers/Provider.phpapp/Services/Activity/HubSpot/Providers/ProviderKixie.php+-app/Services/Activity/HubSpot/Providers/Provider0rum.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilio.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilioFlex.phpapp/Services/Activity/HubSpot/Service.phpapp/Services/Crm/Hubspot/Client.phpapp/Services/Crm/Hubspot/HubspotClientInterface.phpapp/Services/Crm/Hubspot/Pagination/HubspotPaginationService.phpapp/Services/Crm/Hubspot/Pagination/PaginationState.phpdatabase/migrations/2026_05_13_124153_create_mcp_feature_flag.phptests/Feature/Mcp/GetMeToolFeatureTest.phptests/Feature/Mcp/ListCallsToolFeatureTest.phptests/Feature/Mcp/McpTestHelpersTrait.phptests/Unit/Component/ES/ChunkSizeTest.phptests/Unit/Component/ES/Processor/DT0s/SelectionListTest.phptests/Unit/Component/ES/Processor/TargetEntitiesSelectorTest.phptests/Unit/Component/MeetingBot/Service/ParticipantMatcherTest.phptests/Unit/Exceptions/RateLimitExceptionTest.php97++++++-132++++++•15++++++21++++-12+-25++++++-140++++++-+-19++++++50++++++27++++++=39++++++-6856++++++-tests/Unit/Jobs/Crm/MatchActivityCrmDataTest.phptests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phptests/Unit/Services/Activity/HubSpot/ServiceTest.phptests/Unit/Services/Crm/Hubspot/ClientTest.phptests/Unit/Services/Crm/Hubspot/Pagination/HubspotPaginationServiceTest.php151++++++-109++++++-250++++++283++++++.37 files changed, 1587 insertions(+), 344 deletions(-)create mode 100644 app/Component/ES/ChunkSize.phpcreate mode 100644 app/Jobs/Middleware/HandleHubspotRateLimit.phpcreate mode 100644 app/Mcp/Tools/GetMeTool.phpcreate mode 100644 database/migrations/2026_05_13_124153_create_mcp_feature_flag.phpcreate mode 100644 tests/Feature/Mcp/GetMeToolFeatureTest.phpcreate mode 100644 tests/Unit/Component/ES/ChunkSizeTest.phpcreate mode 100644 tests/Unit/Exceptions/RateLimitExceptionTest.phpcreate mode 100644 tests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phplukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pullAlready up to date.lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20676-delete-reSwitched to a new branch 'JY-20676-delete-report-related-objects'lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20676-delete-report-related-obHomeDMsActivityFilesLater...MoreED→Jiminny ...# Jiminny-Dg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi...• Direct messages€. Vasil VasilevP. Nikolay Yankov. Galya Dimitrova®. Aneliya Angelovaã. Stefka StoyanovaStoyan Tomovd Todor Stamatov "Kd. Mario GeorgievNikolay Ivanovdo James Graham& Stoyan TanevRo Steliyan GeorgievLukas Kovalik y...AppsJira CloudToastSupport Daily - in 3h 56 m100% C47*8• Tue 19 May 11:04:08QDescribe what you are looking for# the_people_of jimi...8 426 0• MessagesC Files+Stefka Stoyanov:Today ~Hі Eteam,I wanted to share that our Lead Developer llianKyuchukov has decided to move on from Jiminny topursue a new opportunity. While we're really sad tosee them go, we're also excited for him and thisnext chapter in his professional journey.llian's last working day will be 14 July, so we stillhave some time together before then. Over thecoming weeks, please make the most of hisknowledge, experience, and context so we canensure a smooth transition across the team.It's hard to overstate the impact llian has had here- from shaping the product and solving toughproblems to supporting teammates and helpingbuild the product we have today. We re incrediblygrateful for everything he contributed over this 2years he was with engineering team.Just wanted to share the news openly witheveryone and say a huge thanks to llian foreverything so far. Vou Please join me in wishing himall the very best for what comes next.We start looking for a Full-Stack Software Engineer,so if you know anyone you believe will fit, pleasecontact me or Mira directly A® 32Message #the_people_of_jiminny+Aa...
|
NULL
|
1663772291527350772
|
NULL
|
idle
|
ocr
|
NULL
|
SlackFileEditViewGoHistoryWindowHelpAPPDOCKERO ₴1D SlackFileEditViewGoHistoryWindowHelpAPPDOCKERO ₴1DEV (-zsh)₴82app/Jobs/Crm/MatchActivityCrmData.phpapp/Jobs/Middleware/HandleHubspotRateLimit.phpAPP (-zsl47++++++*42++++++*app/Mcp/Servers/JiminnyServer.phpapp/Mcp/Tools/GetMeTool.php157++++++app/Models/Feature/FeatureEnum.phpapp/Services/Activity/HubSpot/ProviderResolver.php+-app/Services/Activity/HubSpot/ProviderResolverInterface.phpapp/Services/Activity/HubSpot/Providers/Provider.phpapp/Services/Activity/HubSpot/Providers/ProviderKixie.php+-app/Services/Activity/HubSpot/Providers/Provider0rum.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilio.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilioFlex.phpapp/Services/Activity/HubSpot/Service.phpapp/Services/Crm/Hubspot/Client.phpapp/Services/Crm/Hubspot/HubspotClientInterface.phpapp/Services/Crm/Hubspot/Pagination/HubspotPaginationService.phpapp/Services/Crm/Hubspot/Pagination/PaginationState.phpdatabase/migrations/2026_05_13_124153_create_mcp_feature_flag.phptests/Feature/Mcp/GetMeToolFeatureTest.phptests/Feature/Mcp/ListCallsToolFeatureTest.phptests/Feature/Mcp/McpTestHelpersTrait.phptests/Unit/Component/ES/ChunkSizeTest.phptests/Unit/Component/ES/Processor/DT0s/SelectionListTest.phptests/Unit/Component/ES/Processor/TargetEntitiesSelectorTest.phptests/Unit/Component/MeetingBot/Service/ParticipantMatcherTest.phptests/Unit/Exceptions/RateLimitExceptionTest.php97++++++-132++++++•15++++++21++++-12+-25++++++-140++++++-+-19++++++50++++++27++++++=39++++++-6856++++++-tests/Unit/Jobs/Crm/MatchActivityCrmDataTest.phptests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phptests/Unit/Services/Activity/HubSpot/ServiceTest.phptests/Unit/Services/Crm/Hubspot/ClientTest.phptests/Unit/Services/Crm/Hubspot/Pagination/HubspotPaginationServiceTest.php151++++++-109++++++-250++++++283++++++.37 files changed, 1587 insertions(+), 344 deletions(-)create mode 100644 app/Component/ES/ChunkSize.phpcreate mode 100644 app/Jobs/Middleware/HandleHubspotRateLimit.phpcreate mode 100644 app/Mcp/Tools/GetMeTool.phpcreate mode 100644 database/migrations/2026_05_13_124153_create_mcp_feature_flag.phpcreate mode 100644 tests/Feature/Mcp/GetMeToolFeatureTest.phpcreate mode 100644 tests/Unit/Component/ES/ChunkSizeTest.phpcreate mode 100644 tests/Unit/Exceptions/RateLimitExceptionTest.phpcreate mode 100644 tests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phplukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pullAlready up to date.lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20676-delete-reSwitched to a new branch 'JY-20676-delete-report-related-objects'lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20676-delete-report-related-obHomeDMsActivityFilesLater...MoreED→Jiminny ...# Jiminny-Dg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi...• Direct messages€. Vasil VasilevP. Nikolay Yankov. Galya Dimitrova®. Aneliya Angelovaã. Stefka StoyanovaStoyan Tomovd Todor Stamatov "Kd. Mario GeorgievNikolay Ivanovdo James Graham& Stoyan TanevRo Steliyan GeorgievLukas Kovalik y...AppsJira CloudToastSupport Daily - in 3h 56 m100% C47*8• Tue 19 May 11:04:08QDescribe what you are looking for# the_people_of jimi...8 426 0• MessagesC Files+Stefka Stoyanov:Today ~Hі Eteam,I wanted to share that our Lead Developer llianKyuchukov has decided to move on from Jiminny topursue a new opportunity. While we're really sad tosee them go, we're also excited for him and thisnext chapter in his professional journey.llian's last working day will be 14 July, so we stillhave some time together before then. Over thecoming weeks, please make the most of hisknowledge, experience, and context so we canensure a smooth transition across the team.It's hard to overstate the impact llian has had here- from shaping the product and solving toughproblems to supporting teammates and helpingbuild the product we have today. We re incrediblygrateful for everything he contributed over this 2years he was with engineering team.Just wanted to share the news openly witheveryone and say a huge thanks to llian foreverything so far. Vou Please join me in wishing himall the very best for what comes next.We start looking for a Full-Stack Software Engineer,so if you know anyone you believe will fit, pleasecontact me or Mira directly A® 32Message #the_people_of_jiminny+Aa...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
56383
|
1967
|
2
|
2026-05-19T08:04:13.227344+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-19/1779 /Users/lukas/.screenpipe/data/data/2026-05-19/1779177853227_m2.jpg...
|
Firefox
|
NULL
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
slackFV faVsco.js°9 JY-20676-delete-report-related slackFV faVsco.js°9 JY-20676-delete-report-related-objectsProiect(C) AutomatedReport.onp© AskAnythingPromptServiceTest.php© Serializer.php© TeamScimDetails.php> D bootstrap>D build>D config>@ contrib> @ database>@ docs> C front-end>C lanc>@ node_modules library root> @ phpstan> C publicAskJiminnyReportsControllerTest.php X© Search.php© AskAnythingPrompt.php© ActivityController.phgbaseservice.pnp)constants.pngC) RoleAttr.php) RoleAttrTest.phpListenerRoleCannotHaveAdminOrManagerPermissionRule.php(C)Activity/Close/Service.php(C) Activity/RinqCentral/Service.phpC) SyncActivity.php(C) Crm/Close/Service.pho(C) TextMessaqingService.phpfinal class AskJiminnvReoortsControllerTest extends Testcase22 D >public function testToggleStatusPreventsEnablingReportWithNullSearchId: void{...}72 D >public function testToggleStatusPreventsEnablingReportWithNullPromptId: void{...}>D resourcesv O routesphp api.oho120 D ›public function testTogqleStatusAllowsEnablingReportWithValidReferencesO: voidk...}168 D >public function testTogqleStatusAllowsDisablingReportWithNul1ReferencesO: voidk...}php api_v2.phpphp console.ohophp customer aoi.ohophp embedded.phpLocal ChandesConsole XLoo XChanges 17 file=.env.local app© ActivityController.php app/Http/Controllers/API© AskAnythingPrompt.php app/Models/AskAnythingc) ASKAnvihinaPromotbto,ono apo/comoonent/AskAnvihino/Dros© AskAnvthinaPromptService.php app/Component/AskAnvthina@ AskAnvthinaPromptServiceTest.php tests/Unit/Component/AskAnvthina© Ask.JiminnvReportsController.pho app/Htto/Controllers/APIV2Side-by-side viewerDo not ignoreHighlight wordsx 158 5604af40 .env.locaSECIRTTY HSANEP CISTOM CCP=OR_CONNECTTON=mvsall= 0R HOST=127 A A 1.C) Constants.ono apo/Comoonent/SClMI© CoreUser.php app/DTO/SCIM/AAD/ResponseC) CoreUserRequest.ono ano/DTO/SCIMIAAD/[EMAIL] apn/Console/Commande-nR PORT-73A6- DB_DATABASE=jiminny-DB_USERNAME=rootne pAccwnon-czunz+.ephp loadina.nho confial@ SavedSearchCRUDFeatureTest.nho tests/Feature/SavedSearchesJB CUNNECILUN UHLU=0N10C) ScimProvisionina.ohnann/Comnonent/SCIMDB HOST_OHI0=host.docker.internal© Search.php app/Models/ActivitySoftPhoneManager.php app/Component/Twilio/Conference/ConferenceManagDB PORT 0HL0=/652DB DATABASE_OHI0=jiminny© TextMessagingService.php app/Services/Telephony) Uinvercionod Siloc 11 filacDB USERNAME OHIDEB PASSWORD OHTO=DB CONMECIOION IRELANDETre LandIDB HOST TRELANDehost docker internalDB PORT TRELAND=7532B DATABASE TRELANde iminnv.USERNAME TRELANDE3 PASSWORD TRELAND=nR CONNECTTON STACTNG=staginalDB_HOST_STAGING=host.docker.internalout affectina the dictionarios for other lanquades (todav 10-001= custom.log= laravel.log4 SF jiminny@localhost]4 HS_local [jiminny@localhost]& console [PROD]& console [EU]A console [STAGING]© CoachingFeedbackCoachUserln.php Xfinal class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefini~pubLic tunccion conscruccuserkeposicory suserkeposicorvor...r29 6tpublic function shouldApplyQueries(): boolf...}34 ot>public function getQueries: FilterDefinitionQueryCollection{...}45 6tpubLic function toArray): arrayl...л1 usageprivate function getOptions: arrayt...118f119.public function getValue: arrayt...lusageprivate function getDefaultValue: arrayt...136 >public function getValidationRules(?string $prefix = null): array{...}Current versionSECIRTTY HEANER CISTOM CCP=DB_CONNECTION=mysqlDB_HOST=mariadb#DB_HOST=mariadbnR PORT-7304DB_DATABASE=jiminnyDB_USERNAME=jmnyadminDB_PASSWORD=[PASSWORD] ADMIN_ USERNAME=imnyadmin#DB_ [ENV_SECRET] Models User#CASHIER_MODELEJ1minny Models UserhubsBROADCAST DRMErenuSherCACHE_DRIVER=redisCACHE PRESIXe-imnySESSTON DRIVER=redisQUEUE CONNECTIONeredisGITHUB TOKEN=nu11RENTS CITENT=nhnnedisREnTS HOST=nedissuppont Dally• In sn obm100% 5• lue 19 May 11:04.12CascadeO ASk Jiminny Report+0 ..searcned ask_jminny_reponts.toggle and pertormed & oter querlesASKAnychingPrompt don't nave tactorles and the fule says notto write tests for controllers. Let me remove that tlle° Fusers/tukas/31m/ny/app/tests/Feature/Http/Controllers/APZ/V2/A5KJ1m/nnyßeportsControLlertes.PRun &~ Skip* Reject allAccept allQ files 4200 -7 >Ask anvthina (4D14 @s Codo Chudo Onuc 17 Modium48 ditterencesPo 4 spaces...
|
NULL
|
-5937038258647043607
|
NULL
|
idle
|
ocr
|
NULL
|
slackFV faVsco.js°9 JY-20676-delete-report-related slackFV faVsco.js°9 JY-20676-delete-report-related-objectsProiect(C) AutomatedReport.onp© AskAnythingPromptServiceTest.php© Serializer.php© TeamScimDetails.php> D bootstrap>D build>D config>@ contrib> @ database>@ docs> C front-end>C lanc>@ node_modules library root> @ phpstan> C publicAskJiminnyReportsControllerTest.php X© Search.php© AskAnythingPrompt.php© ActivityController.phgbaseservice.pnp)constants.pngC) RoleAttr.php) RoleAttrTest.phpListenerRoleCannotHaveAdminOrManagerPermissionRule.php(C)Activity/Close/Service.php(C) Activity/RinqCentral/Service.phpC) SyncActivity.php(C) Crm/Close/Service.pho(C) TextMessaqingService.phpfinal class AskJiminnvReoortsControllerTest extends Testcase22 D >public function testToggleStatusPreventsEnablingReportWithNullSearchId: void{...}72 D >public function testToggleStatusPreventsEnablingReportWithNullPromptId: void{...}>D resourcesv O routesphp api.oho120 D ›public function testTogqleStatusAllowsEnablingReportWithValidReferencesO: voidk...}168 D >public function testTogqleStatusAllowsDisablingReportWithNul1ReferencesO: voidk...}php api_v2.phpphp console.ohophp customer aoi.ohophp embedded.phpLocal ChandesConsole XLoo XChanges 17 file=.env.local app© ActivityController.php app/Http/Controllers/API© AskAnythingPrompt.php app/Models/AskAnythingc) ASKAnvihinaPromotbto,ono apo/comoonent/AskAnvihino/Dros© AskAnvthinaPromptService.php app/Component/AskAnvthina@ AskAnvthinaPromptServiceTest.php tests/Unit/Component/AskAnvthina© Ask.JiminnvReportsController.pho app/Htto/Controllers/APIV2Side-by-side viewerDo not ignoreHighlight wordsx 158 5604af40 .env.locaSECIRTTY HSANEP CISTOM CCP=OR_CONNECTTON=mvsall= 0R HOST=127 A A 1.C) Constants.ono apo/Comoonent/SClMI© CoreUser.php app/DTO/SCIM/AAD/ResponseC) CoreUserRequest.ono ano/DTO/SCIMIAAD/[EMAIL] apn/Console/Commande-nR PORT-73A6- DB_DATABASE=jiminny-DB_USERNAME=rootne pAccwnon-czunz+.ephp loadina.nho confial@ SavedSearchCRUDFeatureTest.nho tests/Feature/SavedSearchesJB CUNNECILUN UHLU=0N10C) ScimProvisionina.ohnann/Comnonent/SCIMDB HOST_OHI0=host.docker.internal© Search.php app/Models/ActivitySoftPhoneManager.php app/Component/Twilio/Conference/ConferenceManagDB PORT 0HL0=/652DB DATABASE_OHI0=jiminny© TextMessagingService.php app/Services/Telephony) Uinvercionod Siloc 11 filacDB USERNAME OHIDEB PASSWORD OHTO=DB CONMECIOION IRELANDETre LandIDB HOST TRELANDehost docker internalDB PORT TRELAND=7532B DATABASE TRELANde iminnv.USERNAME TRELANDE3 PASSWORD TRELAND=nR CONNECTTON STACTNG=staginalDB_HOST_STAGING=host.docker.internalout affectina the dictionarios for other lanquades (todav 10-001= custom.log= laravel.log4 SF jiminny@localhost]4 HS_local [jiminny@localhost]& console [PROD]& console [EU]A console [STAGING]© CoachingFeedbackCoachUserln.php Xfinal class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefini~pubLic tunccion conscruccuserkeposicory suserkeposicorvor...r29 6tpublic function shouldApplyQueries(): boolf...}34 ot>public function getQueries: FilterDefinitionQueryCollection{...}45 6tpubLic function toArray): arrayl...л1 usageprivate function getOptions: arrayt...118f119.public function getValue: arrayt...lusageprivate function getDefaultValue: arrayt...136 >public function getValidationRules(?string $prefix = null): array{...}Current versionSECIRTTY HEANER CISTOM CCP=DB_CONNECTION=mysqlDB_HOST=mariadb#DB_HOST=mariadbnR PORT-7304DB_DATABASE=jiminnyDB_USERNAME=jmnyadminDB_PASSWORD=[PASSWORD] ADMIN_ USERNAME=imnyadmin#DB_ [ENV_SECRET] Models User#CASHIER_MODELEJ1minny Models UserhubsBROADCAST DRMErenuSherCACHE_DRIVER=redisCACHE PRESIXe-imnySESSTON DRIVER=redisQUEUE CONNECTIONeredisGITHUB TOKEN=nu11RENTS CITENT=nhnnedisREnTS HOST=nedissuppont Dally• In sn obm100% 5• lue 19 May 11:04.12CascadeO ASk Jiminny Report+0 ..searcned ask_jminny_reponts.toggle and pertormed & oter querlesASKAnychingPrompt don't nave tactorles and the fule says notto write tests for controllers. Let me remove that tlle° Fusers/tukas/31m/ny/app/tests/Feature/Http/Controllers/APZ/V2/A5KJ1m/nnyßeportsControLlertes.PRun &~ Skip* Reject allAccept allQ files 4200 -7 >Ask anvthina (4D14 @s Codo Chudo Onuc 17 Modium48 ditterencesPo 4 spaces...
|
56381
|
NULL
|
NULL
|
NULL
|
|
56384
|
1966
|
3
|
2026-05-19T08:04:24.209920+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-19/1779 /Users/lukas/.screenpipe/data/data/2026-05-19/1779177864209_m1.jpg...
|
PhpStorm
|
faVsco.js – AskJiminnyReportsControllerTest.php
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
SlackFileEditViewGoHistoryWindowHelpAPPDOCKERO ₴1D SlackFileEditViewGoHistoryWindowHelpAPPDOCKERO ₴1DEV (-zsh)₴82app/Jobs/Crm/MatchActivityCrmData.phpapp/Jobs/Middleware/HandleHubspotRateLimit.phpAPP (-zsl47++++++*42++++++*app/Mcp/Servers/JiminnyServer.phpapp/Mcp/Tools/GetMeTool.php157++++++app/Models/Feature/FeatureEnum.phpapp/Services/Activity/HubSpot/ProviderResolver.php+-app/Services/Activity/HubSpot/ProviderResolverInterface.phpapp/Services/Activity/HubSpot/Providers/Provider.phpapp/Services/Activity/HubSpot/Providers/ProviderKixie.php+-app/Services/Activity/HubSpot/Providers/Provider0rum.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilio.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilioFlex.phpapp/Services/Activity/HubSpot/Service.phpapp/Services/Crm/Hubspot/Client.phpapp/Services/Crm/Hubspot/HubspotClientInterface.phpapp/Services/Crm/Hubspot/Pagination/HubspotPaginationService.phpapp/Services/Crm/Hubspot/Pagination/PaginationState.phpdatabase/migrations/2026_05_13_124153_create_mcp_feature_flag.phptests/Feature/Mcp/GetMeToolFeatureTest.phptests/Feature/Mcp/ListCallsToolFeatureTest.phptests/Feature/Mcp/McpTestHelpersTrait.phptests/Unit/Component/ES/ChunkSizeTest.phptests/Unit/Component/ES/Processor/DT0s/SelectionListTest.phptests/Unit/Component/ES/Processor/TargetEntitiesSelectorTest.phptests/Unit/Component/MeetingBot/Service/ParticipantMatcherTest.phptests/Unit/Exceptions/RateLimitExceptionTest.php97++++++-132++++++•15++++++21++++-12+-25++++++-140++++++-+-19++++++50++++++27++++++=39++++++-6856++++++-tests/Unit/Jobs/Crm/MatchActivityCrmDataTest.phptests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phptests/Unit/Services/Activity/HubSpot/ServiceTest.phptests/Unit/Services/Crm/Hubspot/ClientTest.phptests/Unit/Services/Crm/Hubspot/Pagination/HubspotPaginationServiceTest.php151++++++-109++++++-250++++++283++++++37 files changed, 1587 insertions(+), 344 deletions(-)create mode 100644 app/Component/ES/ChunkSize.phpcreate mode 100644 app/Jobs/Middleware/HandleHubspotRateLimit.phpcreate mode 100644 app/Mcp/Tools/GetMeTool.phpcreate mode 100644 database/migrations/2026_05_13_124153_create_mcp_feature_flag.phpcreate mode 100644 tests/Feature/Mcp/GetMeToolFeatureTest.phpcreate mode 100644 tests/Unit/Component/ES/ChunkSizeTest.phpcreate mode 100644 tests/Unit/Exceptions/RateLimitExceptionTest.phpcreate mode 100644 tests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phplukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pullAlready up to date.lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20676-delete-reSwitched to a new branch 'JY-20676-delete-report-related-objects'lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20676-delete-report-related-obHomeDMsActivityFilesLater...MoreED→Jiminny ...# Jiminny-Dg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi...• Direct messages€. Vasil VasilevP. Nikolay Yankov%. Galya Dimitrova LP. Aneliya Angelovaã. Stefka StoyanovaStoyan Tomovd Todor Stamatov "Kd. Mario GeorgievNikolay Ivanovdo James Graham& Stoyan TanevRo Steliyan GeorgievLukas Kovalik y…..AppsJira CloudToastSupport Daily - in 3h 56 m100% C78• Tue 19 May 11:04:23QDescribe what you are looking for# the_people_of jimi...8 426 0• MessagesC Files+Stefka Stoyanov:Today ~Hі Eteam,I wanted to share that our Lead Developer llianKyuchukov has decided to move on from Jiminny topursue a new opportunity. While we're really sad tosee them go, we're also excited for him and thisnext chapter in his professional journey.llian's last working day will be 14 July, so we stillhave some time together before then. Over thecoming weeks, please make the most of hisknowledge, experience, and context so we canensure a smooth transition across the team.It's hard to overstate the impact llian has had here- from shaping the product and solving toughproblems to supporting teammates and helpingbuild the product we have today. We re incrediblygrateful for everything he contributed over this 2years he was with & engineering team.Just wanted to share the news openly witheveryone and say a huge thanks to llian foreverything so far. Vou Please join me in wishing himall the very best for what comes next.We start looking for a Full-Stack Software Engineer,so if you know anyone you believe will fit, pleasecontact me or Mira directly A® 3$ 6Message #the_people_of_jiminny+Аal...
|
NULL
|
5650977091465151751
|
NULL
|
click
|
ocr
|
NULL
|
SlackFileEditViewGoHistoryWindowHelpAPPDOCKERO ₴1D SlackFileEditViewGoHistoryWindowHelpAPPDOCKERO ₴1DEV (-zsh)₴82app/Jobs/Crm/MatchActivityCrmData.phpapp/Jobs/Middleware/HandleHubspotRateLimit.phpAPP (-zsl47++++++*42++++++*app/Mcp/Servers/JiminnyServer.phpapp/Mcp/Tools/GetMeTool.php157++++++app/Models/Feature/FeatureEnum.phpapp/Services/Activity/HubSpot/ProviderResolver.php+-app/Services/Activity/HubSpot/ProviderResolverInterface.phpapp/Services/Activity/HubSpot/Providers/Provider.phpapp/Services/Activity/HubSpot/Providers/ProviderKixie.php+-app/Services/Activity/HubSpot/Providers/Provider0rum.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilio.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilioFlex.phpapp/Services/Activity/HubSpot/Service.phpapp/Services/Crm/Hubspot/Client.phpapp/Services/Crm/Hubspot/HubspotClientInterface.phpapp/Services/Crm/Hubspot/Pagination/HubspotPaginationService.phpapp/Services/Crm/Hubspot/Pagination/PaginationState.phpdatabase/migrations/2026_05_13_124153_create_mcp_feature_flag.phptests/Feature/Mcp/GetMeToolFeatureTest.phptests/Feature/Mcp/ListCallsToolFeatureTest.phptests/Feature/Mcp/McpTestHelpersTrait.phptests/Unit/Component/ES/ChunkSizeTest.phptests/Unit/Component/ES/Processor/DT0s/SelectionListTest.phptests/Unit/Component/ES/Processor/TargetEntitiesSelectorTest.phptests/Unit/Component/MeetingBot/Service/ParticipantMatcherTest.phptests/Unit/Exceptions/RateLimitExceptionTest.php97++++++-132++++++•15++++++21++++-12+-25++++++-140++++++-+-19++++++50++++++27++++++=39++++++-6856++++++-tests/Unit/Jobs/Crm/MatchActivityCrmDataTest.phptests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phptests/Unit/Services/Activity/HubSpot/ServiceTest.phptests/Unit/Services/Crm/Hubspot/ClientTest.phptests/Unit/Services/Crm/Hubspot/Pagination/HubspotPaginationServiceTest.php151++++++-109++++++-250++++++283++++++37 files changed, 1587 insertions(+), 344 deletions(-)create mode 100644 app/Component/ES/ChunkSize.phpcreate mode 100644 app/Jobs/Middleware/HandleHubspotRateLimit.phpcreate mode 100644 app/Mcp/Tools/GetMeTool.phpcreate mode 100644 database/migrations/2026_05_13_124153_create_mcp_feature_flag.phpcreate mode 100644 tests/Feature/Mcp/GetMeToolFeatureTest.phpcreate mode 100644 tests/Unit/Component/ES/ChunkSizeTest.phpcreate mode 100644 tests/Unit/Exceptions/RateLimitExceptionTest.phpcreate mode 100644 tests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phplukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pullAlready up to date.lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20676-delete-reSwitched to a new branch 'JY-20676-delete-report-related-objects'lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20676-delete-report-related-obHomeDMsActivityFilesLater...MoreED→Jiminny ...# Jiminny-Dg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi...• Direct messages€. Vasil VasilevP. Nikolay Yankov%. Galya Dimitrova LP. Aneliya Angelovaã. Stefka StoyanovaStoyan Tomovd Todor Stamatov "Kd. Mario GeorgievNikolay Ivanovdo James Graham& Stoyan TanevRo Steliyan GeorgievLukas Kovalik y…..AppsJira CloudToastSupport Daily - in 3h 56 m100% C78• Tue 19 May 11:04:23QDescribe what you are looking for# the_people_of jimi...8 426 0• MessagesC Files+Stefka Stoyanov:Today ~Hі Eteam,I wanted to share that our Lead Developer llianKyuchukov has decided to move on from Jiminny topursue a new opportunity. While we're really sad tosee them go, we're also excited for him and thisnext chapter in his professional journey.llian's last working day will be 14 July, so we stillhave some time together before then. Over thecoming weeks, please make the most of hisknowledge, experience, and context so we canensure a smooth transition across the team.It's hard to overstate the impact llian has had here- from shaping the product and solving toughproblems to supporting teammates and helpingbuild the product we have today. We re incrediblygrateful for everything he contributed over this 2years he was with & engineering team.Just wanted to share the news openly witheveryone and say a huge thanks to llian foreverything so far. Vou Please join me in wishing himall the very best for what comes next.We start looking for a Full-Stack Software Engineer,so if you know anyone you believe will fit, pleasecontact me or Mira directly A® 3$ 6Message #the_people_of_jiminny+Аal...
|
56382
|
NULL
|
NULL
|
NULL
|
|
56385
|
1967
|
3
|
2026-05-19T08:04:24.233887+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-19/1779 /Users/lukas/.screenpipe/data/data/2026-05-19/1779177864233_m2.jpg...
|
PhpStorm
|
faVsco.js – AskJiminnyReportsControllerTest.php
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
slackFV faVsco.js?9 JY-20676-delete-report-related slackFV faVsco.js?9 JY-20676-delete-report-related-objectsProiect(C) AutomatedReport.onp© AskAnythingPromptServiceTest.php© Serializer.php© TeamScimDetails.php> D bootstrap>D build>D config>@ contrib> @ database>@ docs> C front-end>C lanc>@ node_modules library root> @ phpstan> C publicAskJiminnyReportsControllerTest.php X© Search.php© AskAnythingPrompt.php© ActivityController.phgbaseservice.pnp)constants.pngC) RoleAttr.php) RoleAttrTest.phpListenerRoleCannotHaveAdminOrManagerPermissionRule.php(C)Activity/Close/Service.php(C) Activity/RinqCentral/Service.phpC) SyncActivity.php(C) Crm/Close/Service.pho(C) TextMessaqingService.phpfinal class AskJiminnvReoortsControllerTest extends Testcase22 D >public function testToggleStatusPreventsEnablingReportWithNullSearchId: void{...}72 D >public function testToggleStatusPreventsEnablingReportWithNullPromptId: void{...}>D resourcesv O routesphp api.oho120 D ›public function testTogqleStatusAllowsEnablingReportWithValidReferencesO: voidk...}168 D >public function testTogqleStatusAllowsDisablingReportWithNul1ReferencesO: voidk...}php api_v2.phpphp console.ohophp customer aoi.ohophp embedded.phpLocal ChandesConsole XLoo XChanges 17 file=.env.local app© ActivityController.php app/Http/Controllers/API© AskAnythingPrompt.php app/Models/AskAnythingc) ASKAnvihinaPromotbto,ono apo/comoonent/AskAnvihino/Dros© AskAnvthinaPromptService.php app/Component/AskAnvthina@ AskAnvthinaPromptServiceTest.php tests/Unit/Component/AskAnvthina© Ask.JiminnvReportsController.pho app/Htto/Controllers/APIV2Side-by-side viewerDo not ignoreHighlight wordsx 158 5604af40 .env.locaSECIRTTY HSANEP CISTOM CCP=OR_CONNECTTON=mvsall= DR HOST=127 A A.1.C) Constants.ono apo/Comoonent/SClMI© CoreUser.php app/DTO/SCIM/AAD/ResponseC) CoreUserRequest.ono ano/DTO/SCIMIAAD/[EMAIL] apn/Console/Commande-nR PORT-73A6- DB_DATABASE=jiminny-DB_USERNAME=rootne pAccwnon-czunz+.ephp loadina.nho confial@ SavedSearchCRUDFeatureTest.nho tests/Feature/SavedSearchesJB CUNNECILUN UHLU=0N10C) ScimProvisionina.ohnann/Comnonent/SCIMDB HOST_OHI0=host.docker.internal© Search.php app/Models/ActivitySoftPhoneManager.php app/Component/Twilio/Conference/ConferenceManagDB PORT 0HL0=/652DB DATABASE_OHI0=jiminny© TextMessagingService.php app/Services/Telephony) Uinvercionod Siloc 11 filacDB USERNAME OHIDEB PASSWORD OHTO=DB CONMECIOION IRELANDETre LandIDB HOST TRELANDehost docker internalDB PORT TRELAND=7532B DATABASE TRELANde iminnv.USERNAME TRELANDE3 PASSWORD TRELANDEnR CONNECTTON STACTNG=staginalDB_HOST_STAGING=host.docker.internalout affectina the dictionarios for other lanquades (todav 10-001= custom.log= laravel.log4 SF jiminny@localhost]4 HS_local [jiminny@localhost]& console [PROD]& console [EU]A console [STAGING]© CoachingFeedbackCoachUserln.php Xfinal class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefini~pubLic tunccion conscruccuserkeposicory suserkeposicorvor...r29 6tpublic function shouldApplyQueries(): boolf...}34 6t >public function getQueries: FilterDefinitionQueryCollection{...}45 6tpubLic function toArrayo): arrayi...h1 usageprivate function getOptions: arrayt...118f 119.public function getValue: arrayt...lusageprivate function getDefaultValue: arrayt...136 >public function getValidationRules(?string $prefix = null): array{...}Current versionSECIRTTY HEANER CISTOM CCP=DB_CONNECTION=mysqlDB_HOST=mariadb#DB_HOST=mariadbnR PORT-7304DB_DATABASE=jiminnyDB_USERNAME=jmnyadminDB_PASSWORD=[PASSWORD] ADMIN_ USERNAME=imnyadmin#DB_ [ENV_SECRET] Models User#CASHIER_MODELEJ1minny Models UserhubsBROADCAST DRMErenuSherCACHE_DRIVER=redisCACHE PRESIXe-imnySESSTON DRIVER=redisQUEUE CONNECTIONeredisGITHUB TOKEN=nu11RENTS CITENT=nhnnedisREnTS HOST=nedissuppont Dally• In sn obm100% 5• lue 19 May 11:04.2.CascadeO ASk Jiminny Report+0 ..searcned ask_jminny_reponts.toggle and pertormed & oter querlesASKAnychingPrompt don't nave tactorles and the fule says notto write tests for controllers. Let me remove that tlle° Fusers/1ukas/31miny/app/tests/Feature/Http/Controllers/APZ/V2/A5KJnÄmyßeportsControLertes.PSkip* Reject allAccept allQ files 4200 -7 >Ask anvthina (4D1+ <> Code Claude Opus 4.7 Medium48 ditterencesPo 4 spaces...
|
NULL
|
7957557096403325184
|
NULL
|
click
|
ocr
|
NULL
|
slackFV faVsco.js?9 JY-20676-delete-report-related slackFV faVsco.js?9 JY-20676-delete-report-related-objectsProiect(C) AutomatedReport.onp© AskAnythingPromptServiceTest.php© Serializer.php© TeamScimDetails.php> D bootstrap>D build>D config>@ contrib> @ database>@ docs> C front-end>C lanc>@ node_modules library root> @ phpstan> C publicAskJiminnyReportsControllerTest.php X© Search.php© AskAnythingPrompt.php© ActivityController.phgbaseservice.pnp)constants.pngC) RoleAttr.php) RoleAttrTest.phpListenerRoleCannotHaveAdminOrManagerPermissionRule.php(C)Activity/Close/Service.php(C) Activity/RinqCentral/Service.phpC) SyncActivity.php(C) Crm/Close/Service.pho(C) TextMessaqingService.phpfinal class AskJiminnvReoortsControllerTest extends Testcase22 D >public function testToggleStatusPreventsEnablingReportWithNullSearchId: void{...}72 D >public function testToggleStatusPreventsEnablingReportWithNullPromptId: void{...}>D resourcesv O routesphp api.oho120 D ›public function testTogqleStatusAllowsEnablingReportWithValidReferencesO: voidk...}168 D >public function testTogqleStatusAllowsDisablingReportWithNul1ReferencesO: voidk...}php api_v2.phpphp console.ohophp customer aoi.ohophp embedded.phpLocal ChandesConsole XLoo XChanges 17 file=.env.local app© ActivityController.php app/Http/Controllers/API© AskAnythingPrompt.php app/Models/AskAnythingc) ASKAnvihinaPromotbto,ono apo/comoonent/AskAnvihino/Dros© AskAnvthinaPromptService.php app/Component/AskAnvthina@ AskAnvthinaPromptServiceTest.php tests/Unit/Component/AskAnvthina© Ask.JiminnvReportsController.pho app/Htto/Controllers/APIV2Side-by-side viewerDo not ignoreHighlight wordsx 158 5604af40 .env.locaSECIRTTY HSANEP CISTOM CCP=OR_CONNECTTON=mvsall= DR HOST=127 A A.1.C) Constants.ono apo/Comoonent/SClMI© CoreUser.php app/DTO/SCIM/AAD/ResponseC) CoreUserRequest.ono ano/DTO/SCIMIAAD/[EMAIL] apn/Console/Commande-nR PORT-73A6- DB_DATABASE=jiminny-DB_USERNAME=rootne pAccwnon-czunz+.ephp loadina.nho confial@ SavedSearchCRUDFeatureTest.nho tests/Feature/SavedSearchesJB CUNNECILUN UHLU=0N10C) ScimProvisionina.ohnann/Comnonent/SCIMDB HOST_OHI0=host.docker.internal© Search.php app/Models/ActivitySoftPhoneManager.php app/Component/Twilio/Conference/ConferenceManagDB PORT 0HL0=/652DB DATABASE_OHI0=jiminny© TextMessagingService.php app/Services/Telephony) Uinvercionod Siloc 11 filacDB USERNAME OHIDEB PASSWORD OHTO=DB CONMECIOION IRELANDETre LandIDB HOST TRELANDehost docker internalDB PORT TRELAND=7532B DATABASE TRELANde iminnv.USERNAME TRELANDE3 PASSWORD TRELANDEnR CONNECTTON STACTNG=staginalDB_HOST_STAGING=host.docker.internalout affectina the dictionarios for other lanquades (todav 10-001= custom.log= laravel.log4 SF jiminny@localhost]4 HS_local [jiminny@localhost]& console [PROD]& console [EU]A console [STAGING]© CoachingFeedbackCoachUserln.php Xfinal class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefini~pubLic tunccion conscruccuserkeposicory suserkeposicorvor...r29 6tpublic function shouldApplyQueries(): boolf...}34 6t >public function getQueries: FilterDefinitionQueryCollection{...}45 6tpubLic function toArrayo): arrayi...h1 usageprivate function getOptions: arrayt...118f 119.public function getValue: arrayt...lusageprivate function getDefaultValue: arrayt...136 >public function getValidationRules(?string $prefix = null): array{...}Current versionSECIRTTY HEANER CISTOM CCP=DB_CONNECTION=mysqlDB_HOST=mariadb#DB_HOST=mariadbnR PORT-7304DB_DATABASE=jiminnyDB_USERNAME=jmnyadminDB_PASSWORD=[PASSWORD] ADMIN_ USERNAME=imnyadmin#DB_ [ENV_SECRET] Models User#CASHIER_MODELEJ1minny Models UserhubsBROADCAST DRMErenuSherCACHE_DRIVER=redisCACHE PRESIXe-imnySESSTON DRIVER=redisQUEUE CONNECTIONeredisGITHUB TOKEN=nu11RENTS CITENT=nhnnedisREnTS HOST=nedissuppont Dally• In sn obm100% 5• lue 19 May 11:04.2.CascadeO ASk Jiminny Report+0 ..searcned ask_jminny_reponts.toggle and pertormed & oter querlesASKAnychingPrompt don't nave tactorles and the fule says notto write tests for controllers. Let me remove that tlle° Fusers/1ukas/31miny/app/tests/Feature/Http/Controllers/APZ/V2/A5KJnÄmyßeportsControLertes.PSkip* Reject allAccept allQ files 4200 -7 >Ask anvthina (4D1+ <> Code Claude Opus 4.7 Medium48 ditterencesPo 4 spaces...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
56386
|
1967
|
4
|
2026-05-19T08:04:28.681879+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-19/1779 /Users/lukas/.screenpipe/data/data/2026-05-19/1779177868681_m2.jpg...
|
PhpStorm
|
faVsco.js – SavedSearchCRUDFeatureTest.php
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20676-delete-report-re Project: faVsco.js, menu
JY-20676-delete-report-related-objects, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
<?php
namespace Tests\Feature\SavedSearches;
use Illuminate\Support\LazyCollection;
use Illuminate\Support\Str;
use Mockery\MockInterface;
use Illuminate\Database\Eloquent\Factories\Sequence;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Illuminate\Support\Facades\Event;
use Illuminate\Testing\Fluent\AssertableJson;
use Jiminny\Events\Nudges\NudgeCreated;
use Jiminny\Models\Activity\Search;
use Jiminny\Models\Activity\SearchFilter;
use Jiminny\Models\Nudge;
use Jiminny\Models\Role;
use Jiminny\Models\Team;
use Jiminny\Models\User;
use Jiminny\Repositories\ElasticActivityRepository;
use Tests\TestCase;
final class SavedSearchCRUDFeatureTest extends TestCase
{
use DatabaseTransactions;
#[\PHPUnit\Framework\Attributes\Test]
public function userCanGetAListOfSavedSearches(): void
{
$this->markTestSkipped('Needs to be fixed');
/** @var Team $team */
$team = Team::factory()->create([
'crm_id' => 1, // temporary
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'status' => User::STATUS_ACTIVE,
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create();
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
$nudges = Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->getJson(route('api.saved_search.index'))
->assertStatus(200)
->assertJson(
fn (AssertableJson $json) =>
$json->has(1)
->first(
fn ($json) =>
$json->where('id', $search->id_string)
->where('name', $search->getName())
->where('filters', ['max_customer_questions' => 5, 'min_engaging_questions' => 3])
->has('nudges', 2)
->has(
'nudges.0',
fn ($json) =>
$json->where('id', $nudges[0]->id_string)
->where('frequency', 'daily')
->where('channel', 'email')
->has('expiresAt')
)
->has(
'nudges.1',
fn ($json) =>
$json->where('id', $nudges[1]->id_string)
->where('frequency', 'weekly')
->where('channel', 'slack')
->has('expiresAt')
)
)
);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanCreateASavedSearchBasedOnActivityFilters(): void
{
$this->markTestSkipped('Needs to be fixed');
Event::fake();
$this->partialMock(ElasticActivityRepository::class, function (MockInterface $mock) {
$mock->shouldReceive('onDemandScroll')
->times(2)
->andReturn(LazyCollection::empty());
});
/** @var Team $team */
$team = Team::factory()->create([
'uuid' => Str::uuid()->toString(),
'crm_id' => 1, // temporary
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->createQuietly([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$this->apiGuardLogin($user);
$this->actingAs($user)
->postJson(route('api.saved_search.create'), [
'name' => '::searchName::',
'filters' => [
'min_duration' => 1,
'only_recorded' => 1,
],
'nudges' => [
[
'frequency' => 'daily',
'channel' => 'email',
'expiresAt' => now()->addWeek()->format('Y-m-d'),
],
[
'frequency' => 'daily',
'channel' => 'slack',
'expiresAt' => now()->addWeek()->format('Y-m-d'),
],
],
])
->assertStatus(200);
$this->assertDatabaseHas('activity_searches', [
'name' => '::searchName::',
'user_id' => $user->id,
]);
$search = $user->searches()->first();
$this->assertDatabaseHas('nudges', [
'activity_search_id' => $search->id,
'frequency' => 2,
'channel' => 2,
]);
$this->assertDatabaseHas('nudges', [
'activity_search_id' => $search->id,
'frequency' => 2,
'channel' => 4,
]);
$this->assertDatabaseHas('activity_search_filters', [
'activity_search_id' => $search->id,
'filter' => 'min_duration',
'value' => 1,
]);
$this->assertDatabaseHas('activity_search_filters', [
'activity_search_id' => $search->id,
'filter' => 'only_recorded',
'value' => 1,
]);
Event::assertDispatched(NudgeCreated::class, 2);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanUpdateASavedSearchBasedOnActivityFilters(): void
{
/** @var Team $team */
$team = Team::factory()->createQuietly([
'uuid' => Str::uuid()->toString(),
'crm_id' => 1,
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create([
'name' => 'Search Name',
]);
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->putJson(route('api.saved_search.update', $search->id_string), [
'name' => 'Updated Search Name',
])->assertOk()
->assertJson([]);
$this->assertDatabaseMissing('activity_searches', [
'name' => 'Search Name',
'user_id' => $user->id,
]);
$this->assertDatabaseHas('activity_searches', [
'name' => 'Updated Search Name',
'user_id' => $user->id,
]);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanDeleteASavedSearch(): void
{
/** @var Team $team */
$team = Team::factory()->create([
'crm_id' => 1,
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create([
'name' => 'Search Name',
]);
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->deleteJson(route('api.saved_search.delete', $search->id_string))
->assertStatus(200)
->assertJson([]);
$this->assertDatabaseMissing('activity_searches', [
'user_id' => $user->id,
]);
$this->assertDatabaseMissing('activity_search_filters', [
'activity_search_id' => $search->id,
]);
}
#[\PHPUnit\Framework\Attributes\Test]
public function deletingSavedSearchDisablesRelatedReports(): void
{
/** @var Team $team */
$team = Team::factory()->create([
'crm_id' => 1,
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create([
'name' => 'Search Name',
]);
$report = \Jiminny\Models\AutomatedReport::factory()->create([
'team_id' => $team->id,
'type' => 'ask_jiminny',
'status' => true,
'activity_search_id' => $search->id,
'created_by' => $user->id,
]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->deleteJson(route('api.saved_search.delete', $search->id_string))
->assertStatus(200);
$this->assertDatabaseHas('automated_reports', [
'id' => $report->id,
'activity_search_id' => null,
'status' => false,
]);
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
1
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Component\ActivitySearch\FilterDefinition;
use Illuminate\Support\Collection;
use Jiminny\Component\ActivitySearch\FilterDefinition;
use Jiminny\Component\ActivitySearch\FilterDefinitionQuery;
use Jiminny\Component\ActivitySearch\FilterDefinitionQueryCollection;
use Jiminny\Contracts\ActivitySearch\ValidatedFilterDefinitionInterface;
use Jiminny\Contracts\Repositories\UserRepository;
use Jiminny\Models;
use Jiminny\Models\Feature\FeatureEnum;
use Jiminny\Models\Team;
use Jiminny\Traits\RequiresUUID;
use Elastica\Query;
final class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefinitionInterface
{
private const int NO_GROUP_ID = 999;
private UserRepository $userRepository;
public function __construct(UserRepository $userRepository)
{
$this->userRepository = $userRepository;
}
public function shouldApplyQueries(): bool
{
return count($this->getValue()) > 0;
}
public function getQueries(): FilterDefinitionQueryCollection
{
$userIds = $this->getValue();
return FilterDefinitionQueryCollection::make([
FilterDefinitionQuery::instance()
->setQuery(new Query\Terms('coachingFeedbacks.coach.id_string', $userIds))
->setPath('coachingFeedbacks.coach', 'coachingFeedbacks'),
]);
}
public function toArray(): array
{
return [
'id' => 'coaching-feedback-user-filter',
'label' => 'Coach',
'helpText' => 'The person who completed the Coaching Framework',
'placeholder' => 'Search coaches',
'inputType' => InputTypeEnum::DROPDOWN_MULTIPLE,
'queryParam' => 'coaching_feedback_coach_id',
'options' => $this->getOptions(),
'groupLabelKey' => 'label',
'groupValuesKey' => 'users',
'optionLabelKey' => 'name',
'optionValueKey' => 'id',
'value' => $this->getValue(),
];
}
private function getOptions(): array
{
$user = $this->executedBy;
$query = $user
->getTeam()
->users()
->whereNotIn(
'uuid',
$this->userRepository->findInaccessibleDeactivatedUserUuids($user)
->map(static fn (string $uuid): string => RequiresUUID::toOptimized($uuid))
->all(),
)
->orderBy('name');
$users = $query
->with('group')
->get()
->reduce(
static function (array $carry, Models\User $user): array {
$group = $user->getGroup();
$groupId = $group !== null
? $group->getUuid()
: self::NO_GROUP_ID;
$groupName = $group !== null
? $group->getName()
: '(NON-GROUPED)';
if (! array_key_exists($groupId, $carry)) {
$carry[$groupId] = [
'label' => $groupName,
'users' => [],
];
}
$carry[$groupId]['users'][] = [
'id' => $user->getUuid(),
'name' => sprintf(
'%s%s',
$user->getName(),
! $user->isStatusActive()
? ' (Inactive)'
: ''
),
];
return $carry;
},
[]
);
return Collection::make($users)
->sortBy('label')
->values()
->toArray();
}
public function getValue(): array
{
if (! $this->criteria->hasCoachingFeedbackCoachUserIds()) {
return $this->getDefaultValue();
}
return array_diff(
$this->criteria->getCoachingFeedbackCoachUserId(),
$this->userRepository->findInaccessibleDeactivatedUserUuids($this->executedBy)->all(),
);
}
private function getDefaultValue(): array
{
return [];
}
public function getValidationRules(?string $prefix = null): array
{
$team = $this->executedBy->getTeam();
return [
$prefix . 'coaching_feedback_coach_id' => 'array',
$prefix . 'coaching_feedback_coach_id.*' => 'uuid:users,team_id,' . $team->getId(),
];
}
public function getSortOrder(): int
{
return 86;
}
public function shouldBeIncluded(Team $team): bool
{
return $team->hasFeature(FeatureEnum::COACHING_FRAMEWORK);
}
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20676-delete-report-related-objects, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.098071806,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: JY-20676-delete-report-related-objects","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.8081782,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceTest","depth":6,"bounds":{"left":0.8234708,"top":0.019952115,"width":0.09208777,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"bounds":{"left":0.9155585,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest'","depth":6,"bounds":{"left":0.9268617,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"bounds":{"left":0.9381649,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"bounds":{"left":0.96609044,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"bounds":{"left":0.9773936,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"bounds":{"left":0.9886968,"top":0.019952115,"width":0.011303186,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\nnamespace Tests\\Feature\\SavedSearches;\n\nuse Illuminate\\Support\\LazyCollection;\nuse Illuminate\\Support\\Str;\nuse Mockery\\MockInterface;\nuse Illuminate\\Database\\Eloquent\\Factories\\Sequence;\nuse Illuminate\\Foundation\\Testing\\DatabaseTransactions;\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\Testing\\Fluent\\AssertableJson;\nuse Jiminny\\Events\\Nudges\\NudgeCreated;\nuse Jiminny\\Models\\Activity\\Search;\nuse Jiminny\\Models\\Activity\\SearchFilter;\nuse Jiminny\\Models\\Nudge;\nuse Jiminny\\Models\\Role;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\ElasticActivityRepository;\nuse Tests\\TestCase;\n\nfinal class SavedSearchCRUDFeatureTest extends TestCase\n{\n use DatabaseTransactions;\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanGetAListOfSavedSearches(): void\n {\n $this->markTestSkipped('Needs to be fixed');\n /** @var Team $team */\n $team = Team::factory()->create([\n 'crm_id' => 1, // temporary\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'status' => User::STATUS_ACTIVE,\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create();\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n $nudges = Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->getJson(route('api.saved_search.index'))\n ->assertStatus(200)\n ->assertJson(\n fn (AssertableJson $json) =>\n $json->has(1)\n ->first(\n fn ($json) =>\n $json->where('id', $search->id_string)\n ->where('name', $search->getName())\n ->where('filters', ['max_customer_questions' => 5, 'min_engaging_questions' => 3])\n ->has('nudges', 2)\n ->has(\n 'nudges.0',\n fn ($json) =>\n $json->where('id', $nudges[0]->id_string)\n ->where('frequency', 'daily')\n ->where('channel', 'email')\n ->has('expiresAt')\n )\n ->has(\n 'nudges.1',\n fn ($json) =>\n $json->where('id', $nudges[1]->id_string)\n ->where('frequency', 'weekly')\n ->where('channel', 'slack')\n ->has('expiresAt')\n )\n )\n );\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanCreateASavedSearchBasedOnActivityFilters(): void\n {\n $this->markTestSkipped('Needs to be fixed');\n\n Event::fake();\n\n $this->partialMock(ElasticActivityRepository::class, function (MockInterface $mock) {\n $mock->shouldReceive('onDemandScroll')\n ->times(2)\n ->andReturn(LazyCollection::empty());\n });\n\n /** @var Team $team */\n $team = Team::factory()->create([\n 'uuid' => Str::uuid()->toString(),\n 'crm_id' => 1, // temporary\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->createQuietly([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->postJson(route('api.saved_search.create'), [\n 'name' => '::searchName::',\n 'filters' => [\n 'min_duration' => 1,\n 'only_recorded' => 1,\n ],\n 'nudges' => [\n [\n 'frequency' => 'daily',\n 'channel' => 'email',\n 'expiresAt' => now()->addWeek()->format('Y-m-d'),\n ],\n [\n 'frequency' => 'daily',\n 'channel' => 'slack',\n 'expiresAt' => now()->addWeek()->format('Y-m-d'),\n ],\n ],\n ])\n ->assertStatus(200);\n\n $this->assertDatabaseHas('activity_searches', [\n 'name' => '::searchName::',\n 'user_id' => $user->id,\n ]);\n\n $search = $user->searches()->first();\n\n $this->assertDatabaseHas('nudges', [\n 'activity_search_id' => $search->id,\n 'frequency' => 2,\n 'channel' => 2,\n ]);\n\n $this->assertDatabaseHas('nudges', [\n 'activity_search_id' => $search->id,\n 'frequency' => 2,\n 'channel' => 4,\n ]);\n\n $this->assertDatabaseHas('activity_search_filters', [\n 'activity_search_id' => $search->id,\n 'filter' => 'min_duration',\n 'value' => 1,\n ]);\n\n $this->assertDatabaseHas('activity_search_filters', [\n 'activity_search_id' => $search->id,\n 'filter' => 'only_recorded',\n 'value' => 1,\n ]);\n\n Event::assertDispatched(NudgeCreated::class, 2);\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanUpdateASavedSearchBasedOnActivityFilters(): void\n {\n /** @var Team $team */\n $team = Team::factory()->createQuietly([\n 'uuid' => Str::uuid()->toString(),\n 'crm_id' => 1,\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create([\n 'name' => 'Search Name',\n ]);\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->putJson(route('api.saved_search.update', $search->id_string), [\n 'name' => 'Updated Search Name',\n ])->assertOk()\n ->assertJson([]);\n\n $this->assertDatabaseMissing('activity_searches', [\n 'name' => 'Search Name',\n 'user_id' => $user->id,\n ]);\n\n $this->assertDatabaseHas('activity_searches', [\n 'name' => 'Updated Search Name',\n 'user_id' => $user->id,\n ]);\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanDeleteASavedSearch(): void\n {\n /** @var Team $team */\n $team = Team::factory()->create([\n 'crm_id' => 1,\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create([\n 'name' => 'Search Name',\n ]);\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->deleteJson(route('api.saved_search.delete', $search->id_string))\n ->assertStatus(200)\n ->assertJson([]);\n\n $this->assertDatabaseMissing('activity_searches', [\n 'user_id' => $user->id,\n ]);\n\n $this->assertDatabaseMissing('activity_search_filters', [\n 'activity_search_id' => $search->id,\n ]);\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function deletingSavedSearchDisablesRelatedReports(): void\n {\n /** @var Team $team */\n $team = Team::factory()->create([\n 'crm_id' => 1,\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create([\n 'name' => 'Search Name',\n ]);\n\n $report = \\Jiminny\\Models\\AutomatedReport::factory()->create([\n 'team_id' => $team->id,\n 'type' => 'ask_jiminny',\n 'status' => true,\n 'activity_search_id' => $search->id,\n 'created_by' => $user->id,\n ]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->deleteJson(route('api.saved_search.delete', $search->id_string))\n ->assertStatus(200);\n\n $this->assertDatabaseHas('automated_reports', [\n 'id' => $report->id,\n 'activity_search_id' => null,\n 'status' => false,\n ]);\n }\n}","depth":4,"bounds":{"left":0.15990691,"top":0.0,"width":0.26728722,"height":0.5442937},"on_screen":true,"value":"<?php\n\nnamespace Tests\\Feature\\SavedSearches;\n\nuse Illuminate\\Support\\LazyCollection;\nuse Illuminate\\Support\\Str;\nuse Mockery\\MockInterface;\nuse Illuminate\\Database\\Eloquent\\Factories\\Sequence;\nuse Illuminate\\Foundation\\Testing\\DatabaseTransactions;\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\Testing\\Fluent\\AssertableJson;\nuse Jiminny\\Events\\Nudges\\NudgeCreated;\nuse Jiminny\\Models\\Activity\\Search;\nuse Jiminny\\Models\\Activity\\SearchFilter;\nuse Jiminny\\Models\\Nudge;\nuse Jiminny\\Models\\Role;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\ElasticActivityRepository;\nuse Tests\\TestCase;\n\nfinal class SavedSearchCRUDFeatureTest extends TestCase\n{\n use DatabaseTransactions;\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanGetAListOfSavedSearches(): void\n {\n $this->markTestSkipped('Needs to be fixed');\n /** @var Team $team */\n $team = Team::factory()->create([\n 'crm_id' => 1, // temporary\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'status' => User::STATUS_ACTIVE,\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create();\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n $nudges = Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->getJson(route('api.saved_search.index'))\n ->assertStatus(200)\n ->assertJson(\n fn (AssertableJson $json) =>\n $json->has(1)\n ->first(\n fn ($json) =>\n $json->where('id', $search->id_string)\n ->where('name', $search->getName())\n ->where('filters', ['max_customer_questions' => 5, 'min_engaging_questions' => 3])\n ->has('nudges', 2)\n ->has(\n 'nudges.0',\n fn ($json) =>\n $json->where('id', $nudges[0]->id_string)\n ->where('frequency', 'daily')\n ->where('channel', 'email')\n ->has('expiresAt')\n )\n ->has(\n 'nudges.1',\n fn ($json) =>\n $json->where('id', $nudges[1]->id_string)\n ->where('frequency', 'weekly')\n ->where('channel', 'slack')\n ->has('expiresAt')\n )\n )\n );\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanCreateASavedSearchBasedOnActivityFilters(): void\n {\n $this->markTestSkipped('Needs to be fixed');\n\n Event::fake();\n\n $this->partialMock(ElasticActivityRepository::class, function (MockInterface $mock) {\n $mock->shouldReceive('onDemandScroll')\n ->times(2)\n ->andReturn(LazyCollection::empty());\n });\n\n /** @var Team $team */\n $team = Team::factory()->create([\n 'uuid' => Str::uuid()->toString(),\n 'crm_id' => 1, // temporary\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->createQuietly([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->postJson(route('api.saved_search.create'), [\n 'name' => '::searchName::',\n 'filters' => [\n 'min_duration' => 1,\n 'only_recorded' => 1,\n ],\n 'nudges' => [\n [\n 'frequency' => 'daily',\n 'channel' => 'email',\n 'expiresAt' => now()->addWeek()->format('Y-m-d'),\n ],\n [\n 'frequency' => 'daily',\n 'channel' => 'slack',\n 'expiresAt' => now()->addWeek()->format('Y-m-d'),\n ],\n ],\n ])\n ->assertStatus(200);\n\n $this->assertDatabaseHas('activity_searches', [\n 'name' => '::searchName::',\n 'user_id' => $user->id,\n ]);\n\n $search = $user->searches()->first();\n\n $this->assertDatabaseHas('nudges', [\n 'activity_search_id' => $search->id,\n 'frequency' => 2,\n 'channel' => 2,\n ]);\n\n $this->assertDatabaseHas('nudges', [\n 'activity_search_id' => $search->id,\n 'frequency' => 2,\n 'channel' => 4,\n ]);\n\n $this->assertDatabaseHas('activity_search_filters', [\n 'activity_search_id' => $search->id,\n 'filter' => 'min_duration',\n 'value' => 1,\n ]);\n\n $this->assertDatabaseHas('activity_search_filters', [\n 'activity_search_id' => $search->id,\n 'filter' => 'only_recorded',\n 'value' => 1,\n ]);\n\n Event::assertDispatched(NudgeCreated::class, 2);\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanUpdateASavedSearchBasedOnActivityFilters(): void\n {\n /** @var Team $team */\n $team = Team::factory()->createQuietly([\n 'uuid' => Str::uuid()->toString(),\n 'crm_id' => 1,\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create([\n 'name' => 'Search Name',\n ]);\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->putJson(route('api.saved_search.update', $search->id_string), [\n 'name' => 'Updated Search Name',\n ])->assertOk()\n ->assertJson([]);\n\n $this->assertDatabaseMissing('activity_searches', [\n 'name' => 'Search Name',\n 'user_id' => $user->id,\n ]);\n\n $this->assertDatabaseHas('activity_searches', [\n 'name' => 'Updated Search Name',\n 'user_id' => $user->id,\n ]);\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanDeleteASavedSearch(): void\n {\n /** @var Team $team */\n $team = Team::factory()->create([\n 'crm_id' => 1,\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create([\n 'name' => 'Search Name',\n ]);\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->deleteJson(route('api.saved_search.delete', $search->id_string))\n ->assertStatus(200)\n ->assertJson([]);\n\n $this->assertDatabaseMissing('activity_searches', [\n 'user_id' => $user->id,\n ]);\n\n $this->assertDatabaseMissing('activity_search_filters', [\n 'activity_search_id' => $search->id,\n ]);\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function deletingSavedSearchDisablesRelatedReports(): void\n {\n /** @var Team $team */\n $team = Team::factory()->create([\n 'crm_id' => 1,\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create([\n 'name' => 'Search Name',\n ]);\n\n $report = \\Jiminny\\Models\\AutomatedReport::factory()->create([\n 'team_id' => $team->id,\n 'type' => 'ask_jiminny',\n 'status' => true,\n 'activity_search_id' => $search->id,\n 'created_by' => $user->id,\n ]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->deleteJson(route('api.saved_search.delete', $search->id_string))\n ->assertStatus(200);\n\n $this->assertDatabaseHas('automated_reports', [\n 'id' => $report->id,\n 'activity_search_id' => null,\n 'status' => false,\n ]);\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"1","depth":4,"bounds":{"left":0.7124335,"top":0.10055866,"width":0.00731383,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.72140956,"top":0.09896249,"width":0.00731383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.7287234,"top":0.09896249,"width":0.006981383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Component\\ActivitySearch\\FilterDefinition;\n\nuse Illuminate\\Support\\Collection;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinitionQuery;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinitionQueryCollection;\nuse Jiminny\\Contracts\\ActivitySearch\\ValidatedFilterDefinitionInterface;\nuse Jiminny\\Contracts\\Repositories\\UserRepository;\nuse Jiminny\\Models;\nuse Jiminny\\Models\\Feature\\FeatureEnum;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Traits\\RequiresUUID;\nuse Elastica\\Query;\n\nfinal class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefinitionInterface\n{\n private const int NO_GROUP_ID = 999;\n private UserRepository $userRepository;\n\n public function __construct(UserRepository $userRepository)\n {\n $this->userRepository = $userRepository;\n }\n\n public function shouldApplyQueries(): bool\n {\n return count($this->getValue()) > 0;\n }\n\n public function getQueries(): FilterDefinitionQueryCollection\n {\n $userIds = $this->getValue();\n\n return FilterDefinitionQueryCollection::make([\n FilterDefinitionQuery::instance()\n ->setQuery(new Query\\Terms('coachingFeedbacks.coach.id_string', $userIds))\n ->setPath('coachingFeedbacks.coach', 'coachingFeedbacks'),\n ]);\n }\n\n public function toArray(): array\n {\n return [\n 'id' => 'coaching-feedback-user-filter',\n 'label' => 'Coach',\n 'helpText' => 'The person who completed the Coaching Framework',\n 'placeholder' => 'Search coaches',\n 'inputType' => InputTypeEnum::DROPDOWN_MULTIPLE,\n 'queryParam' => 'coaching_feedback_coach_id',\n 'options' => $this->getOptions(),\n 'groupLabelKey' => 'label',\n 'groupValuesKey' => 'users',\n 'optionLabelKey' => 'name',\n 'optionValueKey' => 'id',\n 'value' => $this->getValue(),\n ];\n }\n\n private function getOptions(): array\n {\n $user = $this->executedBy;\n $query = $user\n ->getTeam()\n ->users()\n ->whereNotIn(\n 'uuid',\n $this->userRepository->findInaccessibleDeactivatedUserUuids($user)\n ->map(static fn (string $uuid): string => RequiresUUID::toOptimized($uuid))\n ->all(),\n )\n ->orderBy('name');\n\n $users = $query\n ->with('group')\n ->get()\n ->reduce(\n static function (array $carry, Models\\User $user): array {\n $group = $user->getGroup();\n $groupId = $group !== null\n ? $group->getUuid()\n : self::NO_GROUP_ID;\n $groupName = $group !== null\n ? $group->getName()\n : '(NON-GROUPED)';\n\n if (! array_key_exists($groupId, $carry)) {\n $carry[$groupId] = [\n 'label' => $groupName,\n 'users' => [],\n ];\n }\n\n $carry[$groupId]['users'][] = [\n 'id' => $user->getUuid(),\n 'name' => sprintf(\n '%s%s',\n $user->getName(),\n ! $user->isStatusActive()\n ? ' (Inactive)'\n : ''\n ),\n ];\n\n return $carry;\n },\n []\n );\n\n return Collection::make($users)\n ->sortBy('label')\n ->values()\n ->toArray();\n }\n\n public function getValue(): array\n {\n if (! $this->criteria->hasCoachingFeedbackCoachUserIds()) {\n return $this->getDefaultValue();\n }\n\n return array_diff(\n $this->criteria->getCoachingFeedbackCoachUserId(),\n $this->userRepository->findInaccessibleDeactivatedUserUuids($this->executedBy)->all(),\n );\n }\n\n private function getDefaultValue(): array\n {\n return [];\n }\n\n public function getValidationRules(?string $prefix = null): array\n {\n $team = $this->executedBy->getTeam();\n\n return [\n $prefix . 'coaching_feedback_coach_id' => 'array',\n $prefix . 'coaching_feedback_coach_id.*' => 'uuid:users,team_id,' . $team->getId(),\n ];\n }\n\n public function getSortOrder(): int\n {\n return 86;\n }\n\n public function shouldBeIncluded(Team $team): bool\n {\n return $team->hasFeature(FeatureEnum::COACHING_FRAMEWORK);\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Component\\ActivitySearch\\FilterDefinition;\n\nuse Illuminate\\Support\\Collection;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinitionQuery;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinitionQueryCollection;\nuse Jiminny\\Contracts\\ActivitySearch\\ValidatedFilterDefinitionInterface;\nuse Jiminny\\Contracts\\Repositories\\UserRepository;\nuse Jiminny\\Models;\nuse Jiminny\\Models\\Feature\\FeatureEnum;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Traits\\RequiresUUID;\nuse Elastica\\Query;\n\nfinal class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefinitionInterface\n{\n private const int NO_GROUP_ID = 999;\n private UserRepository $userRepository;\n\n public function __construct(UserRepository $userRepository)\n {\n $this->userRepository = $userRepository;\n }\n\n public function shouldApplyQueries(): bool\n {\n return count($this->getValue()) > 0;\n }\n\n public function getQueries(): FilterDefinitionQueryCollection\n {\n $userIds = $this->getValue();\n\n return FilterDefinitionQueryCollection::make([\n FilterDefinitionQuery::instance()\n ->setQuery(new Query\\Terms('coachingFeedbacks.coach.id_string', $userIds))\n ->setPath('coachingFeedbacks.coach', 'coachingFeedbacks'),\n ]);\n }\n\n public function toArray(): array\n {\n return [\n 'id' => 'coaching-feedback-user-filter',\n 'label' => 'Coach',\n 'helpText' => 'The person who completed the Coaching Framework',\n 'placeholder' => 'Search coaches',\n 'inputType' => InputTypeEnum::DROPDOWN_MULTIPLE,\n 'queryParam' => 'coaching_feedback_coach_id',\n 'options' => $this->getOptions(),\n 'groupLabelKey' => 'label',\n 'groupValuesKey' => 'users',\n 'optionLabelKey' => 'name',\n 'optionValueKey' => 'id',\n 'value' => $this->getValue(),\n ];\n }\n\n private function getOptions(): array\n {\n $user = $this->executedBy;\n $query = $user\n ->getTeam()\n ->users()\n ->whereNotIn(\n 'uuid',\n $this->userRepository->findInaccessibleDeactivatedUserUuids($user)\n ->map(static fn (string $uuid): string => RequiresUUID::toOptimized($uuid))\n ->all(),\n )\n ->orderBy('name');\n\n $users = $query\n ->with('group')\n ->get()\n ->reduce(\n static function (array $carry, Models\\User $user): array {\n $group = $user->getGroup();\n $groupId = $group !== null\n ? $group->getUuid()\n : self::NO_GROUP_ID;\n $groupName = $group !== null\n ? $group->getName()\n : '(NON-GROUPED)';\n\n if (! array_key_exists($groupId, $carry)) {\n $carry[$groupId] = [\n 'label' => $groupName,\n 'users' => [],\n ];\n }\n\n $carry[$groupId]['users'][] = [\n 'id' => $user->getUuid(),\n 'name' => sprintf(\n '%s%s',\n $user->getName(),\n ! $user->isStatusActive()\n ? ' (Inactive)'\n : ''\n ),\n ];\n\n return $carry;\n },\n []\n );\n\n return Collection::make($users)\n ->sortBy('label')\n ->values()\n ->toArray();\n }\n\n public function getValue(): array\n {\n if (! $this->criteria->hasCoachingFeedbackCoachUserIds()) {\n return $this->getDefaultValue();\n }\n\n return array_diff(\n $this->criteria->getCoachingFeedbackCoachUserId(),\n $this->userRepository->findInaccessibleDeactivatedUserUuids($this->executedBy)->all(),\n );\n }\n\n private function getDefaultValue(): array\n {\n return [];\n }\n\n public function getValidationRules(?string $prefix = null): array\n {\n $team = $this->executedBy->getTeam();\n\n return [\n $prefix . 'coaching_feedback_coach_id' => 'array',\n $prefix . 'coaching_feedback_coach_id.*' => 'uuid:users,team_id,' . $team->getId(),\n ];\n }\n\n public function getSortOrder(): int\n {\n return 86;\n }\n\n public function shouldBeIncluded(Team $team): bool\n {\n return $team->hasFeature(FeatureEnum::COACHING_FRAMEWORK);\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"bounds":{"left":0.011968086,"top":0.047885075,"width":0.024268618,"height":0.024740623},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-6920777432722650556
|
-9140731309851991260
|
visual_change
|
accessibility
|
NULL
|
Project: faVsco.js, menu
JY-20676-delete-report-re Project: faVsco.js, menu
JY-20676-delete-report-related-objects, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
<?php
namespace Tests\Feature\SavedSearches;
use Illuminate\Support\LazyCollection;
use Illuminate\Support\Str;
use Mockery\MockInterface;
use Illuminate\Database\Eloquent\Factories\Sequence;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Illuminate\Support\Facades\Event;
use Illuminate\Testing\Fluent\AssertableJson;
use Jiminny\Events\Nudges\NudgeCreated;
use Jiminny\Models\Activity\Search;
use Jiminny\Models\Activity\SearchFilter;
use Jiminny\Models\Nudge;
use Jiminny\Models\Role;
use Jiminny\Models\Team;
use Jiminny\Models\User;
use Jiminny\Repositories\ElasticActivityRepository;
use Tests\TestCase;
final class SavedSearchCRUDFeatureTest extends TestCase
{
use DatabaseTransactions;
#[\PHPUnit\Framework\Attributes\Test]
public function userCanGetAListOfSavedSearches(): void
{
$this->markTestSkipped('Needs to be fixed');
/** @var Team $team */
$team = Team::factory()->create([
'crm_id' => 1, // temporary
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'status' => User::STATUS_ACTIVE,
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create();
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
$nudges = Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->getJson(route('api.saved_search.index'))
->assertStatus(200)
->assertJson(
fn (AssertableJson $json) =>
$json->has(1)
->first(
fn ($json) =>
$json->where('id', $search->id_string)
->where('name', $search->getName())
->where('filters', ['max_customer_questions' => 5, 'min_engaging_questions' => 3])
->has('nudges', 2)
->has(
'nudges.0',
fn ($json) =>
$json->where('id', $nudges[0]->id_string)
->where('frequency', 'daily')
->where('channel', 'email')
->has('expiresAt')
)
->has(
'nudges.1',
fn ($json) =>
$json->where('id', $nudges[1]->id_string)
->where('frequency', 'weekly')
->where('channel', 'slack')
->has('expiresAt')
)
)
);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanCreateASavedSearchBasedOnActivityFilters(): void
{
$this->markTestSkipped('Needs to be fixed');
Event::fake();
$this->partialMock(ElasticActivityRepository::class, function (MockInterface $mock) {
$mock->shouldReceive('onDemandScroll')
->times(2)
->andReturn(LazyCollection::empty());
});
/** @var Team $team */
$team = Team::factory()->create([
'uuid' => Str::uuid()->toString(),
'crm_id' => 1, // temporary
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->createQuietly([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$this->apiGuardLogin($user);
$this->actingAs($user)
->postJson(route('api.saved_search.create'), [
'name' => '::searchName::',
'filters' => [
'min_duration' => 1,
'only_recorded' => 1,
],
'nudges' => [
[
'frequency' => 'daily',
'channel' => 'email',
'expiresAt' => now()->addWeek()->format('Y-m-d'),
],
[
'frequency' => 'daily',
'channel' => 'slack',
'expiresAt' => now()->addWeek()->format('Y-m-d'),
],
],
])
->assertStatus(200);
$this->assertDatabaseHas('activity_searches', [
'name' => '::searchName::',
'user_id' => $user->id,
]);
$search = $user->searches()->first();
$this->assertDatabaseHas('nudges', [
'activity_search_id' => $search->id,
'frequency' => 2,
'channel' => 2,
]);
$this->assertDatabaseHas('nudges', [
'activity_search_id' => $search->id,
'frequency' => 2,
'channel' => 4,
]);
$this->assertDatabaseHas('activity_search_filters', [
'activity_search_id' => $search->id,
'filter' => 'min_duration',
'value' => 1,
]);
$this->assertDatabaseHas('activity_search_filters', [
'activity_search_id' => $search->id,
'filter' => 'only_recorded',
'value' => 1,
]);
Event::assertDispatched(NudgeCreated::class, 2);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanUpdateASavedSearchBasedOnActivityFilters(): void
{
/** @var Team $team */
$team = Team::factory()->createQuietly([
'uuid' => Str::uuid()->toString(),
'crm_id' => 1,
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create([
'name' => 'Search Name',
]);
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->putJson(route('api.saved_search.update', $search->id_string), [
'name' => 'Updated Search Name',
])->assertOk()
->assertJson([]);
$this->assertDatabaseMissing('activity_searches', [
'name' => 'Search Name',
'user_id' => $user->id,
]);
$this->assertDatabaseHas('activity_searches', [
'name' => 'Updated Search Name',
'user_id' => $user->id,
]);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanDeleteASavedSearch(): void
{
/** @var Team $team */
$team = Team::factory()->create([
'crm_id' => 1,
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create([
'name' => 'Search Name',
]);
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->deleteJson(route('api.saved_search.delete', $search->id_string))
->assertStatus(200)
->assertJson([]);
$this->assertDatabaseMissing('activity_searches', [
'user_id' => $user->id,
]);
$this->assertDatabaseMissing('activity_search_filters', [
'activity_search_id' => $search->id,
]);
}
#[\PHPUnit\Framework\Attributes\Test]
public function deletingSavedSearchDisablesRelatedReports(): void
{
/** @var Team $team */
$team = Team::factory()->create([
'crm_id' => 1,
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create([
'name' => 'Search Name',
]);
$report = \Jiminny\Models\AutomatedReport::factory()->create([
'team_id' => $team->id,
'type' => 'ask_jiminny',
'status' => true,
'activity_search_id' => $search->id,
'created_by' => $user->id,
]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->deleteJson(route('api.saved_search.delete', $search->id_string))
->assertStatus(200);
$this->assertDatabaseHas('automated_reports', [
'id' => $report->id,
'activity_search_id' => null,
'status' => false,
]);
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
1
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Component\ActivitySearch\FilterDefinition;
use Illuminate\Support\Collection;
use Jiminny\Component\ActivitySearch\FilterDefinition;
use Jiminny\Component\ActivitySearch\FilterDefinitionQuery;
use Jiminny\Component\ActivitySearch\FilterDefinitionQueryCollection;
use Jiminny\Contracts\ActivitySearch\ValidatedFilterDefinitionInterface;
use Jiminny\Contracts\Repositories\UserRepository;
use Jiminny\Models;
use Jiminny\Models\Feature\FeatureEnum;
use Jiminny\Models\Team;
use Jiminny\Traits\RequiresUUID;
use Elastica\Query;
final class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefinitionInterface
{
private const int NO_GROUP_ID = 999;
private UserRepository $userRepository;
public function __construct(UserRepository $userRepository)
{
$this->userRepository = $userRepository;
}
public function shouldApplyQueries(): bool
{
return count($this->getValue()) > 0;
}
public function getQueries(): FilterDefinitionQueryCollection
{
$userIds = $this->getValue();
return FilterDefinitionQueryCollection::make([
FilterDefinitionQuery::instance()
->setQuery(new Query\Terms('coachingFeedbacks.coach.id_string', $userIds))
->setPath('coachingFeedbacks.coach', 'coachingFeedbacks'),
]);
}
public function toArray(): array
{
return [
'id' => 'coaching-feedback-user-filter',
'label' => 'Coach',
'helpText' => 'The person who completed the Coaching Framework',
'placeholder' => 'Search coaches',
'inputType' => InputTypeEnum::DROPDOWN_MULTIPLE,
'queryParam' => 'coaching_feedback_coach_id',
'options' => $this->getOptions(),
'groupLabelKey' => 'label',
'groupValuesKey' => 'users',
'optionLabelKey' => 'name',
'optionValueKey' => 'id',
'value' => $this->getValue(),
];
}
private function getOptions(): array
{
$user = $this->executedBy;
$query = $user
->getTeam()
->users()
->whereNotIn(
'uuid',
$this->userRepository->findInaccessibleDeactivatedUserUuids($user)
->map(static fn (string $uuid): string => RequiresUUID::toOptimized($uuid))
->all(),
)
->orderBy('name');
$users = $query
->with('group')
->get()
->reduce(
static function (array $carry, Models\User $user): array {
$group = $user->getGroup();
$groupId = $group !== null
? $group->getUuid()
: self::NO_GROUP_ID;
$groupName = $group !== null
? $group->getName()
: '(NON-GROUPED)';
if (! array_key_exists($groupId, $carry)) {
$carry[$groupId] = [
'label' => $groupName,
'users' => [],
];
}
$carry[$groupId]['users'][] = [
'id' => $user->getUuid(),
'name' => sprintf(
'%s%s',
$user->getName(),
! $user->isStatusActive()
? ' (Inactive)'
: ''
),
];
return $carry;
},
[]
);
return Collection::make($users)
->sortBy('label')
->values()
->toArray();
}
public function getValue(): array
{
if (! $this->criteria->hasCoachingFeedbackCoachUserIds()) {
return $this->getDefaultValue();
}
return array_diff(
$this->criteria->getCoachingFeedbackCoachUserId(),
$this->userRepository->findInaccessibleDeactivatedUserUuids($this->executedBy)->all(),
);
}
private function getDefaultValue(): array
{
return [];
}
public function getValidationRules(?string $prefix = null): array
{
$team = $this->executedBy->getTeam();
return [
$prefix . 'coaching_feedback_coach_id' => 'array',
$prefix . 'coaching_feedback_coach_id.*' => 'uuid:users,team_id,' . $team->getId(),
];
}
public function getSortOrder(): int
{
return 86;
}
public function shouldBeIncluded(Team $team): bool
{
return $team->hasFeature(FeatureEnum::COACHING_FRAMEWORK);
}
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
56385
|
NULL
|
NULL
|
NULL
|
|
56387
|
1967
|
5
|
2026-05-19T08:04:37.800088+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-19/1779 /Users/lukas/.screenpipe/data/data/2026-05-19/1779177877800_m2.jpg...
|
PhpStorm
|
faVsco.js – SavedSearchCRUDFeatureTest.php
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20676-delete-report-re Project: faVsco.js, menu
JY-20676-delete-report-related-objects, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
3
16
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Tests\Feature\SavedSearches;
use Illuminate\Support\LazyCollection;
use Illuminate\Support\Str;
use Mockery\MockInterface;
use Illuminate\Database\Eloquent\Factories\Sequence;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Illuminate\Support\Facades\Event;
use Illuminate\Testing\Fluent\AssertableJson;
use Jiminny\Events\Nudges\NudgeCreated;
use Jiminny\Models\Activity\Search;
use Jiminny\Models\Activity\SearchFilter;
use Jiminny\Models\Nudge;
use Jiminny\Models\Role;
use Jiminny\Models\Team;
use Jiminny\Models\User;
use Jiminny\Repositories\ElasticActivityRepository;
use Tests\TestCase;
final class SavedSearchCRUDFeatureTest extends TestCase
{
use DatabaseTransactions;
#[\PHPUnit\Framework\Attributes\Test]
public function userCanGetAListOfSavedSearches(): void
{
$this->markTestSkipped('Needs to be fixed');
/** @var Team $team */
$team = Team::factory()->create([
'crm_id' => 1, // temporary
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'status' => User::STATUS_ACTIVE,
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create();
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
$nudges = Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->getJson(route('api.saved_search.index'))
->assertStatus(200)
->assertJson(
fn (AssertableJson $json) =>
$json->has(1)
->first(
fn ($json) =>
$json->where('id', $search->id_string)
->where('name', $search->getName())
->where('filters', ['max_customer_questions' => 5, 'min_engaging_questions' => 3])
->has('nudges', 2)
->has(
'nudges.0',
fn ($json) =>
$json->where('id', $nudges[0]->id_string)
->where('frequency', 'daily')
->where('channel', 'email')
->has('expiresAt')
)
->has(
'nudges.1',
fn ($json) =>
$json->where('id', $nudges[1]->id_string)
->where('frequency', 'weekly')
->where('channel', 'slack')
->has('expiresAt')
)
)
);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanCreateASavedSearchBasedOnActivityFilters(): void
{
$this->markTestSkipped('Needs to be fixed');
Event::fake();
$this->partialMock(ElasticActivityRepository::class, function (MockInterface $mock) {
$mock->shouldReceive('onDemandScroll')
->times(2)
->andReturn(LazyCollection::empty());
});
/** @var Team $team */
$team = Team::factory()->create([
'uuid' => Str::uuid()->toString(),
'crm_id' => 1, // temporary
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->createQuietly([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$this->apiGuardLogin($user);
$this->actingAs($user)
->postJson(route('api.saved_search.create'), [
'name' => '::searchName::',
'filters' => [
'min_duration' => 1,
'only_recorded' => 1,
],
'nudges' => [
[
'frequency' => 'daily',
'channel' => 'email',
'expiresAt' => now()->addWeek()->format('Y-m-d'),
],
[
'frequency' => 'daily',
'channel' => 'slack',
'expiresAt' => now()->addWeek()->format('Y-m-d'),
],
],
])
->assertStatus(200);
$this->assertDatabaseHas('activity_searches', [
'name' => '::searchName::',
'user_id' => $user->id,
]);
$search = $user->searches()->first();
$this->assertDatabaseHas('nudges', [
'activity_search_id' => $search->id,
'frequency' => 2,
'channel' => 2,
]);
$this->assertDatabaseHas('nudges', [
'activity_search_id' => $search->id,
'frequency' => 2,
'channel' => 4,
]);
$this->assertDatabaseHas('activity_search_filters', [
'activity_search_id' => $search->id,
'filter' => 'min_duration',
'value' => 1,
]);
$this->assertDatabaseHas('activity_search_filters', [
'activity_search_id' => $search->id,
'filter' => 'only_recorded',
'value' => 1,
]);
Event::assertDispatched(NudgeCreated::class, 2);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanUpdateASavedSearchBasedOnActivityFilters(): void
{
/** @var Team $team */
$team = Team::factory()->createQuietly([
'uuid' => Str::uuid()->toString(),
'crm_id' => 1,
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create([
'name' => 'Search Name',
]);
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->putJson(route('api.saved_search.update', $search->id_string), [
'name' => 'Updated Search Name',
])->assertOk()
->assertJson([]);
$this->assertDatabaseMissing('activity_searches', [
'name' => 'Search Name',
'user_id' => $user->id,
]);
$this->assertDatabaseHas('activity_searches', [
'name' => 'Updated Search Name',
'user_id' => $user->id,
]);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanDeleteASavedSearch(): void
{
/** @var Team $team */
$team = Team::factory()->create([
'crm_id' => 1,
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create([
'name' => 'Search Name',
]);
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->deleteJson(route('api.saved_search.delete', $search->id_string))
->assertStatus(200)
->assertJson([]);
$this->assertDatabaseMissing('activity_searches', [
'user_id' => $user->id,
]);
$this->assertDatabaseMissing('activity_search_filters', [
'activity_search_id' => $search->id,
]);
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
1
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Component\ActivitySearch\FilterDefinition;
use Illuminate\Support\Collection;
use Jiminny\Component\ActivitySearch\FilterDefinition;
use Jiminny\Component\ActivitySearch\FilterDefinitionQuery;
use Jiminny\Component\ActivitySearch\FilterDefinitionQueryCollection;
use Jiminny\Contracts\ActivitySearch\ValidatedFilterDefinitionInterface;
use Jiminny\Contracts\Repositories\UserRepository;
use Jiminny\Models;
use Jiminny\Models\Feature\FeatureEnum;
use Jiminny\Models\Team;
use Jiminny\Traits\RequiresUUID;
use Elastica\Query;
final class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefinitionInterface
{
private const int NO_GROUP_ID = 999;
private UserRepository $userRepository;
public function __construct(UserRepository $userRepository)
{
$this->userRepository = $userRepository;
}
public function shouldApplyQueries(): bool
{
return count($this->getValue()) > 0;
}
public function getQueries(): FilterDefinitionQueryCollection
{
$userIds = $this->getValue();
return FilterDefinitionQueryCollection::make([
FilterDefinitionQuery::instance()
->setQuery(new Query\Terms('coachingFeedbacks.coach.id_string', $userIds))
->setPath('coachingFeedbacks.coach', 'coachingFeedbacks'),
]);
}
public function toArray(): array
{
return [
'id' => 'coaching-feedback-user-filter',
'label' => 'Coach',
'helpText' => 'The person who completed the Coaching Framework',
'placeholder' => 'Search coaches',
'inputType' => InputTypeEnum::DROPDOWN_MULTIPLE,
'queryParam' => 'coaching_feedback_coach_id',
'options' => $this->getOptions(),
'groupLabelKey' => 'label',
'groupValuesKey' => 'users',
'optionLabelKey' => 'name',
'optionValueKey' => 'id',
'value' => $this->getValue(),
];
}
private function getOptions(): array
{
$user = $this->executedBy;
$query = $user
->getTeam()
->users()
->whereNotIn(
'uuid',
$this->userRepository->findInaccessibleDeactivatedUserUuids($user)
->map(static fn (string $uuid): string => RequiresUUID::toOptimized($uuid))
->all(),
)
->orderBy('name');
$users = $query
->with('group')
->get()
->reduce(
static function (array $carry, Models\User $user): array {
$group = $user->getGroup();
$groupId = $group !== null
? $group->getUuid()
: self::NO_GROUP_ID;
$groupName = $group !== null
? $group->getName()
: '(NON-GROUPED)';
if (! array_key_exists($groupId, $carry)) {
$carry[$groupId] = [
'label' => $groupName,
'users' => [],
];
}
$carry[$groupId]['users'][] = [
'id' => $user->getUuid(),
'name' => sprintf(
'%s%s',
$user->getName(),
! $user->isStatusActive()
? ' (Inactive)'
: ''
),
];
return $carry;
},
[]
);
return Collection::make($users)
->sortBy('label')
->values()
->toArray();
}
public function getValue(): array
{
if (! $this->criteria->hasCoachingFeedbackCoachUserIds()) {
return $this->getDefaultValue();
}
return array_diff(
$this->criteria->getCoachingFeedbackCoachUserId(),
$this->userRepository->findInaccessibleDeactivatedUserUuids($this->executedBy)->all(),
);
}
private function getDefaultValue(): array
{
return [];
}
public function getValidationRules(?string $prefix = null): array
{
$team = $this->executedBy->getTeam();
return [
$prefix . 'coaching_feedback_coach_id' => 'array',
$prefix . 'coaching_feedback_coach_id.*' => 'uuid:users,team_id,' . $team->getId(),
];
}
public function getSortOrder(): int
{
return 86;
}
public function shouldBeIncluded(Team $team): bool
{
return $team->hasFeature(FeatureEnum::COACHING_FRAMEWORK);
}
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20676-delete-report-related-objects, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.098071806,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: JY-20676-delete-report-related-objects","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.8081782,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceTest","depth":6,"bounds":{"left":0.8234708,"top":0.019952115,"width":0.09208777,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"bounds":{"left":0.9155585,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest'","depth":6,"bounds":{"left":0.9268617,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"bounds":{"left":0.9381649,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"bounds":{"left":0.96609044,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"bounds":{"left":0.9773936,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"bounds":{"left":0.9886968,"top":0.019952115,"width":0.011303186,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"3","depth":4,"bounds":{"left":0.390625,"top":0.22426178,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"16","depth":4,"bounds":{"left":0.4005984,"top":0.22426178,"width":0.009640957,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.4119016,"top":0.22266561,"width":0.00731383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.4192154,"top":0.22266561,"width":0.006981383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\nnamespace Tests\\Feature\\SavedSearches;\n\nuse Illuminate\\Support\\LazyCollection;\nuse Illuminate\\Support\\Str;\nuse Mockery\\MockInterface;\nuse Illuminate\\Database\\Eloquent\\Factories\\Sequence;\nuse Illuminate\\Foundation\\Testing\\DatabaseTransactions;\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\Testing\\Fluent\\AssertableJson;\nuse Jiminny\\Events\\Nudges\\NudgeCreated;\nuse Jiminny\\Models\\Activity\\Search;\nuse Jiminny\\Models\\Activity\\SearchFilter;\nuse Jiminny\\Models\\Nudge;\nuse Jiminny\\Models\\Role;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\ElasticActivityRepository;\nuse Tests\\TestCase;\n\nfinal class SavedSearchCRUDFeatureTest extends TestCase\n{\n use DatabaseTransactions;\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanGetAListOfSavedSearches(): void\n {\n $this->markTestSkipped('Needs to be fixed');\n /** @var Team $team */\n $team = Team::factory()->create([\n 'crm_id' => 1, // temporary\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'status' => User::STATUS_ACTIVE,\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create();\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n $nudges = Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->getJson(route('api.saved_search.index'))\n ->assertStatus(200)\n ->assertJson(\n fn (AssertableJson $json) =>\n $json->has(1)\n ->first(\n fn ($json) =>\n $json->where('id', $search->id_string)\n ->where('name', $search->getName())\n ->where('filters', ['max_customer_questions' => 5, 'min_engaging_questions' => 3])\n ->has('nudges', 2)\n ->has(\n 'nudges.0',\n fn ($json) =>\n $json->where('id', $nudges[0]->id_string)\n ->where('frequency', 'daily')\n ->where('channel', 'email')\n ->has('expiresAt')\n )\n ->has(\n 'nudges.1',\n fn ($json) =>\n $json->where('id', $nudges[1]->id_string)\n ->where('frequency', 'weekly')\n ->where('channel', 'slack')\n ->has('expiresAt')\n )\n )\n );\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanCreateASavedSearchBasedOnActivityFilters(): void\n {\n $this->markTestSkipped('Needs to be fixed');\n\n Event::fake();\n\n $this->partialMock(ElasticActivityRepository::class, function (MockInterface $mock) {\n $mock->shouldReceive('onDemandScroll')\n ->times(2)\n ->andReturn(LazyCollection::empty());\n });\n\n /** @var Team $team */\n $team = Team::factory()->create([\n 'uuid' => Str::uuid()->toString(),\n 'crm_id' => 1, // temporary\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->createQuietly([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->postJson(route('api.saved_search.create'), [\n 'name' => '::searchName::',\n 'filters' => [\n 'min_duration' => 1,\n 'only_recorded' => 1,\n ],\n 'nudges' => [\n [\n 'frequency' => 'daily',\n 'channel' => 'email',\n 'expiresAt' => now()->addWeek()->format('Y-m-d'),\n ],\n [\n 'frequency' => 'daily',\n 'channel' => 'slack',\n 'expiresAt' => now()->addWeek()->format('Y-m-d'),\n ],\n ],\n ])\n ->assertStatus(200);\n\n $this->assertDatabaseHas('activity_searches', [\n 'name' => '::searchName::',\n 'user_id' => $user->id,\n ]);\n\n $search = $user->searches()->first();\n\n $this->assertDatabaseHas('nudges', [\n 'activity_search_id' => $search->id,\n 'frequency' => 2,\n 'channel' => 2,\n ]);\n\n $this->assertDatabaseHas('nudges', [\n 'activity_search_id' => $search->id,\n 'frequency' => 2,\n 'channel' => 4,\n ]);\n\n $this->assertDatabaseHas('activity_search_filters', [\n 'activity_search_id' => $search->id,\n 'filter' => 'min_duration',\n 'value' => 1,\n ]);\n\n $this->assertDatabaseHas('activity_search_filters', [\n 'activity_search_id' => $search->id,\n 'filter' => 'only_recorded',\n 'value' => 1,\n ]);\n\n Event::assertDispatched(NudgeCreated::class, 2);\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanUpdateASavedSearchBasedOnActivityFilters(): void\n {\n /** @var Team $team */\n $team = Team::factory()->createQuietly([\n 'uuid' => Str::uuid()->toString(),\n 'crm_id' => 1,\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create([\n 'name' => 'Search Name',\n ]);\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->putJson(route('api.saved_search.update', $search->id_string), [\n 'name' => 'Updated Search Name',\n ])->assertOk()\n ->assertJson([]);\n\n $this->assertDatabaseMissing('activity_searches', [\n 'name' => 'Search Name',\n 'user_id' => $user->id,\n ]);\n\n $this->assertDatabaseHas('activity_searches', [\n 'name' => 'Updated Search Name',\n 'user_id' => $user->id,\n ]);\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanDeleteASavedSearch(): void\n {\n /** @var Team $team */\n $team = Team::factory()->create([\n 'crm_id' => 1,\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create([\n 'name' => 'Search Name',\n ]);\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->deleteJson(route('api.saved_search.delete', $search->id_string))\n ->assertStatus(200)\n ->assertJson([]);\n\n $this->assertDatabaseMissing('activity_searches', [\n 'user_id' => $user->id,\n ]);\n\n $this->assertDatabaseMissing('activity_search_filters', [\n 'activity_search_id' => $search->id,\n ]);\n }\n}","depth":4,"bounds":{"left":0.15990691,"top":0.0,"width":0.2662899,"height":0.49162012},"on_screen":true,"value":"<?php\n\nnamespace Tests\\Feature\\SavedSearches;\n\nuse Illuminate\\Support\\LazyCollection;\nuse Illuminate\\Support\\Str;\nuse Mockery\\MockInterface;\nuse Illuminate\\Database\\Eloquent\\Factories\\Sequence;\nuse Illuminate\\Foundation\\Testing\\DatabaseTransactions;\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\Testing\\Fluent\\AssertableJson;\nuse Jiminny\\Events\\Nudges\\NudgeCreated;\nuse Jiminny\\Models\\Activity\\Search;\nuse Jiminny\\Models\\Activity\\SearchFilter;\nuse Jiminny\\Models\\Nudge;\nuse Jiminny\\Models\\Role;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\ElasticActivityRepository;\nuse Tests\\TestCase;\n\nfinal class SavedSearchCRUDFeatureTest extends TestCase\n{\n use DatabaseTransactions;\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanGetAListOfSavedSearches(): void\n {\n $this->markTestSkipped('Needs to be fixed');\n /** @var Team $team */\n $team = Team::factory()->create([\n 'crm_id' => 1, // temporary\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'status' => User::STATUS_ACTIVE,\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create();\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n $nudges = Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->getJson(route('api.saved_search.index'))\n ->assertStatus(200)\n ->assertJson(\n fn (AssertableJson $json) =>\n $json->has(1)\n ->first(\n fn ($json) =>\n $json->where('id', $search->id_string)\n ->where('name', $search->getName())\n ->where('filters', ['max_customer_questions' => 5, 'min_engaging_questions' => 3])\n ->has('nudges', 2)\n ->has(\n 'nudges.0',\n fn ($json) =>\n $json->where('id', $nudges[0]->id_string)\n ->where('frequency', 'daily')\n ->where('channel', 'email')\n ->has('expiresAt')\n )\n ->has(\n 'nudges.1',\n fn ($json) =>\n $json->where('id', $nudges[1]->id_string)\n ->where('frequency', 'weekly')\n ->where('channel', 'slack')\n ->has('expiresAt')\n )\n )\n );\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanCreateASavedSearchBasedOnActivityFilters(): void\n {\n $this->markTestSkipped('Needs to be fixed');\n\n Event::fake();\n\n $this->partialMock(ElasticActivityRepository::class, function (MockInterface $mock) {\n $mock->shouldReceive('onDemandScroll')\n ->times(2)\n ->andReturn(LazyCollection::empty());\n });\n\n /** @var Team $team */\n $team = Team::factory()->create([\n 'uuid' => Str::uuid()->toString(),\n 'crm_id' => 1, // temporary\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->createQuietly([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->postJson(route('api.saved_search.create'), [\n 'name' => '::searchName::',\n 'filters' => [\n 'min_duration' => 1,\n 'only_recorded' => 1,\n ],\n 'nudges' => [\n [\n 'frequency' => 'daily',\n 'channel' => 'email',\n 'expiresAt' => now()->addWeek()->format('Y-m-d'),\n ],\n [\n 'frequency' => 'daily',\n 'channel' => 'slack',\n 'expiresAt' => now()->addWeek()->format('Y-m-d'),\n ],\n ],\n ])\n ->assertStatus(200);\n\n $this->assertDatabaseHas('activity_searches', [\n 'name' => '::searchName::',\n 'user_id' => $user->id,\n ]);\n\n $search = $user->searches()->first();\n\n $this->assertDatabaseHas('nudges', [\n 'activity_search_id' => $search->id,\n 'frequency' => 2,\n 'channel' => 2,\n ]);\n\n $this->assertDatabaseHas('nudges', [\n 'activity_search_id' => $search->id,\n 'frequency' => 2,\n 'channel' => 4,\n ]);\n\n $this->assertDatabaseHas('activity_search_filters', [\n 'activity_search_id' => $search->id,\n 'filter' => 'min_duration',\n 'value' => 1,\n ]);\n\n $this->assertDatabaseHas('activity_search_filters', [\n 'activity_search_id' => $search->id,\n 'filter' => 'only_recorded',\n 'value' => 1,\n ]);\n\n Event::assertDispatched(NudgeCreated::class, 2);\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanUpdateASavedSearchBasedOnActivityFilters(): void\n {\n /** @var Team $team */\n $team = Team::factory()->createQuietly([\n 'uuid' => Str::uuid()->toString(),\n 'crm_id' => 1,\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create([\n 'name' => 'Search Name',\n ]);\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->putJson(route('api.saved_search.update', $search->id_string), [\n 'name' => 'Updated Search Name',\n ])->assertOk()\n ->assertJson([]);\n\n $this->assertDatabaseMissing('activity_searches', [\n 'name' => 'Search Name',\n 'user_id' => $user->id,\n ]);\n\n $this->assertDatabaseHas('activity_searches', [\n 'name' => 'Updated Search Name',\n 'user_id' => $user->id,\n ]);\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanDeleteASavedSearch(): void\n {\n /** @var Team $team */\n $team = Team::factory()->create([\n 'crm_id' => 1,\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create([\n 'name' => 'Search Name',\n ]);\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->deleteJson(route('api.saved_search.delete', $search->id_string))\n ->assertStatus(200)\n ->assertJson([]);\n\n $this->assertDatabaseMissing('activity_searches', [\n 'user_id' => $user->id,\n ]);\n\n $this->assertDatabaseMissing('activity_search_filters', [\n 'activity_search_id' => $search->id,\n ]);\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"1","depth":4,"bounds":{"left":0.7124335,"top":0.10055866,"width":0.00731383,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.72140956,"top":0.09896249,"width":0.00731383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.7287234,"top":0.09896249,"width":0.006981383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Component\\ActivitySearch\\FilterDefinition;\n\nuse Illuminate\\Support\\Collection;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinitionQuery;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinitionQueryCollection;\nuse Jiminny\\Contracts\\ActivitySearch\\ValidatedFilterDefinitionInterface;\nuse Jiminny\\Contracts\\Repositories\\UserRepository;\nuse Jiminny\\Models;\nuse Jiminny\\Models\\Feature\\FeatureEnum;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Traits\\RequiresUUID;\nuse Elastica\\Query;\n\nfinal class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefinitionInterface\n{\n private const int NO_GROUP_ID = 999;\n private UserRepository $userRepository;\n\n public function __construct(UserRepository $userRepository)\n {\n $this->userRepository = $userRepository;\n }\n\n public function shouldApplyQueries(): bool\n {\n return count($this->getValue()) > 0;\n }\n\n public function getQueries(): FilterDefinitionQueryCollection\n {\n $userIds = $this->getValue();\n\n return FilterDefinitionQueryCollection::make([\n FilterDefinitionQuery::instance()\n ->setQuery(new Query\\Terms('coachingFeedbacks.coach.id_string', $userIds))\n ->setPath('coachingFeedbacks.coach', 'coachingFeedbacks'),\n ]);\n }\n\n public function toArray(): array\n {\n return [\n 'id' => 'coaching-feedback-user-filter',\n 'label' => 'Coach',\n 'helpText' => 'The person who completed the Coaching Framework',\n 'placeholder' => 'Search coaches',\n 'inputType' => InputTypeEnum::DROPDOWN_MULTIPLE,\n 'queryParam' => 'coaching_feedback_coach_id',\n 'options' => $this->getOptions(),\n 'groupLabelKey' => 'label',\n 'groupValuesKey' => 'users',\n 'optionLabelKey' => 'name',\n 'optionValueKey' => 'id',\n 'value' => $this->getValue(),\n ];\n }\n\n private function getOptions(): array\n {\n $user = $this->executedBy;\n $query = $user\n ->getTeam()\n ->users()\n ->whereNotIn(\n 'uuid',\n $this->userRepository->findInaccessibleDeactivatedUserUuids($user)\n ->map(static fn (string $uuid): string => RequiresUUID::toOptimized($uuid))\n ->all(),\n )\n ->orderBy('name');\n\n $users = $query\n ->with('group')\n ->get()\n ->reduce(\n static function (array $carry, Models\\User $user): array {\n $group = $user->getGroup();\n $groupId = $group !== null\n ? $group->getUuid()\n : self::NO_GROUP_ID;\n $groupName = $group !== null\n ? $group->getName()\n : '(NON-GROUPED)';\n\n if (! array_key_exists($groupId, $carry)) {\n $carry[$groupId] = [\n 'label' => $groupName,\n 'users' => [],\n ];\n }\n\n $carry[$groupId]['users'][] = [\n 'id' => $user->getUuid(),\n 'name' => sprintf(\n '%s%s',\n $user->getName(),\n ! $user->isStatusActive()\n ? ' (Inactive)'\n : ''\n ),\n ];\n\n return $carry;\n },\n []\n );\n\n return Collection::make($users)\n ->sortBy('label')\n ->values()\n ->toArray();\n }\n\n public function getValue(): array\n {\n if (! $this->criteria->hasCoachingFeedbackCoachUserIds()) {\n return $this->getDefaultValue();\n }\n\n return array_diff(\n $this->criteria->getCoachingFeedbackCoachUserId(),\n $this->userRepository->findInaccessibleDeactivatedUserUuids($this->executedBy)->all(),\n );\n }\n\n private function getDefaultValue(): array\n {\n return [];\n }\n\n public function getValidationRules(?string $prefix = null): array\n {\n $team = $this->executedBy->getTeam();\n\n return [\n $prefix . 'coaching_feedback_coach_id' => 'array',\n $prefix . 'coaching_feedback_coach_id.*' => 'uuid:users,team_id,' . $team->getId(),\n ];\n }\n\n public function getSortOrder(): int\n {\n return 86;\n }\n\n public function shouldBeIncluded(Team $team): bool\n {\n return $team->hasFeature(FeatureEnum::COACHING_FRAMEWORK);\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Component\\ActivitySearch\\FilterDefinition;\n\nuse Illuminate\\Support\\Collection;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinitionQuery;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinitionQueryCollection;\nuse Jiminny\\Contracts\\ActivitySearch\\ValidatedFilterDefinitionInterface;\nuse Jiminny\\Contracts\\Repositories\\UserRepository;\nuse Jiminny\\Models;\nuse Jiminny\\Models\\Feature\\FeatureEnum;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Traits\\RequiresUUID;\nuse Elastica\\Query;\n\nfinal class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefinitionInterface\n{\n private const int NO_GROUP_ID = 999;\n private UserRepository $userRepository;\n\n public function __construct(UserRepository $userRepository)\n {\n $this->userRepository = $userRepository;\n }\n\n public function shouldApplyQueries(): bool\n {\n return count($this->getValue()) > 0;\n }\n\n public function getQueries(): FilterDefinitionQueryCollection\n {\n $userIds = $this->getValue();\n\n return FilterDefinitionQueryCollection::make([\n FilterDefinitionQuery::instance()\n ->setQuery(new Query\\Terms('coachingFeedbacks.coach.id_string', $userIds))\n ->setPath('coachingFeedbacks.coach', 'coachingFeedbacks'),\n ]);\n }\n\n public function toArray(): array\n {\n return [\n 'id' => 'coaching-feedback-user-filter',\n 'label' => 'Coach',\n 'helpText' => 'The person who completed the Coaching Framework',\n 'placeholder' => 'Search coaches',\n 'inputType' => InputTypeEnum::DROPDOWN_MULTIPLE,\n 'queryParam' => 'coaching_feedback_coach_id',\n 'options' => $this->getOptions(),\n 'groupLabelKey' => 'label',\n 'groupValuesKey' => 'users',\n 'optionLabelKey' => 'name',\n 'optionValueKey' => 'id',\n 'value' => $this->getValue(),\n ];\n }\n\n private function getOptions(): array\n {\n $user = $this->executedBy;\n $query = $user\n ->getTeam()\n ->users()\n ->whereNotIn(\n 'uuid',\n $this->userRepository->findInaccessibleDeactivatedUserUuids($user)\n ->map(static fn (string $uuid): string => RequiresUUID::toOptimized($uuid))\n ->all(),\n )\n ->orderBy('name');\n\n $users = $query\n ->with('group')\n ->get()\n ->reduce(\n static function (array $carry, Models\\User $user): array {\n $group = $user->getGroup();\n $groupId = $group !== null\n ? $group->getUuid()\n : self::NO_GROUP_ID;\n $groupName = $group !== null\n ? $group->getName()\n : '(NON-GROUPED)';\n\n if (! array_key_exists($groupId, $carry)) {\n $carry[$groupId] = [\n 'label' => $groupName,\n 'users' => [],\n ];\n }\n\n $carry[$groupId]['users'][] = [\n 'id' => $user->getUuid(),\n 'name' => sprintf(\n '%s%s',\n $user->getName(),\n ! $user->isStatusActive()\n ? ' (Inactive)'\n : ''\n ),\n ];\n\n return $carry;\n },\n []\n );\n\n return Collection::make($users)\n ->sortBy('label')\n ->values()\n ->toArray();\n }\n\n public function getValue(): array\n {\n if (! $this->criteria->hasCoachingFeedbackCoachUserIds()) {\n return $this->getDefaultValue();\n }\n\n return array_diff(\n $this->criteria->getCoachingFeedbackCoachUserId(),\n $this->userRepository->findInaccessibleDeactivatedUserUuids($this->executedBy)->all(),\n );\n }\n\n private function getDefaultValue(): array\n {\n return [];\n }\n\n public function getValidationRules(?string $prefix = null): array\n {\n $team = $this->executedBy->getTeam();\n\n return [\n $prefix . 'coaching_feedback_coach_id' => 'array',\n $prefix . 'coaching_feedback_coach_id.*' => 'uuid:users,team_id,' . $team->getId(),\n ];\n }\n\n public function getSortOrder(): int\n {\n return 86;\n }\n\n public function shouldBeIncluded(Team $team): bool\n {\n return $team->hasFeature(FeatureEnum::COACHING_FRAMEWORK);\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"bounds":{"left":0.011968086,"top":0.047885075,"width":0.024268618,"height":0.024740623},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
6509625738266471330
|
-8996616125002602716
|
visual_change
|
accessibility
|
NULL
|
Project: faVsco.js, menu
JY-20676-delete-report-re Project: faVsco.js, menu
JY-20676-delete-report-related-objects, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
3
16
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Tests\Feature\SavedSearches;
use Illuminate\Support\LazyCollection;
use Illuminate\Support\Str;
use Mockery\MockInterface;
use Illuminate\Database\Eloquent\Factories\Sequence;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Illuminate\Support\Facades\Event;
use Illuminate\Testing\Fluent\AssertableJson;
use Jiminny\Events\Nudges\NudgeCreated;
use Jiminny\Models\Activity\Search;
use Jiminny\Models\Activity\SearchFilter;
use Jiminny\Models\Nudge;
use Jiminny\Models\Role;
use Jiminny\Models\Team;
use Jiminny\Models\User;
use Jiminny\Repositories\ElasticActivityRepository;
use Tests\TestCase;
final class SavedSearchCRUDFeatureTest extends TestCase
{
use DatabaseTransactions;
#[\PHPUnit\Framework\Attributes\Test]
public function userCanGetAListOfSavedSearches(): void
{
$this->markTestSkipped('Needs to be fixed');
/** @var Team $team */
$team = Team::factory()->create([
'crm_id' => 1, // temporary
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'status' => User::STATUS_ACTIVE,
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create();
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
$nudges = Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->getJson(route('api.saved_search.index'))
->assertStatus(200)
->assertJson(
fn (AssertableJson $json) =>
$json->has(1)
->first(
fn ($json) =>
$json->where('id', $search->id_string)
->where('name', $search->getName())
->where('filters', ['max_customer_questions' => 5, 'min_engaging_questions' => 3])
->has('nudges', 2)
->has(
'nudges.0',
fn ($json) =>
$json->where('id', $nudges[0]->id_string)
->where('frequency', 'daily')
->where('channel', 'email')
->has('expiresAt')
)
->has(
'nudges.1',
fn ($json) =>
$json->where('id', $nudges[1]->id_string)
->where('frequency', 'weekly')
->where('channel', 'slack')
->has('expiresAt')
)
)
);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanCreateASavedSearchBasedOnActivityFilters(): void
{
$this->markTestSkipped('Needs to be fixed');
Event::fake();
$this->partialMock(ElasticActivityRepository::class, function (MockInterface $mock) {
$mock->shouldReceive('onDemandScroll')
->times(2)
->andReturn(LazyCollection::empty());
});
/** @var Team $team */
$team = Team::factory()->create([
'uuid' => Str::uuid()->toString(),
'crm_id' => 1, // temporary
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->createQuietly([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$this->apiGuardLogin($user);
$this->actingAs($user)
->postJson(route('api.saved_search.create'), [
'name' => '::searchName::',
'filters' => [
'min_duration' => 1,
'only_recorded' => 1,
],
'nudges' => [
[
'frequency' => 'daily',
'channel' => 'email',
'expiresAt' => now()->addWeek()->format('Y-m-d'),
],
[
'frequency' => 'daily',
'channel' => 'slack',
'expiresAt' => now()->addWeek()->format('Y-m-d'),
],
],
])
->assertStatus(200);
$this->assertDatabaseHas('activity_searches', [
'name' => '::searchName::',
'user_id' => $user->id,
]);
$search = $user->searches()->first();
$this->assertDatabaseHas('nudges', [
'activity_search_id' => $search->id,
'frequency' => 2,
'channel' => 2,
]);
$this->assertDatabaseHas('nudges', [
'activity_search_id' => $search->id,
'frequency' => 2,
'channel' => 4,
]);
$this->assertDatabaseHas('activity_search_filters', [
'activity_search_id' => $search->id,
'filter' => 'min_duration',
'value' => 1,
]);
$this->assertDatabaseHas('activity_search_filters', [
'activity_search_id' => $search->id,
'filter' => 'only_recorded',
'value' => 1,
]);
Event::assertDispatched(NudgeCreated::class, 2);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanUpdateASavedSearchBasedOnActivityFilters(): void
{
/** @var Team $team */
$team = Team::factory()->createQuietly([
'uuid' => Str::uuid()->toString(),
'crm_id' => 1,
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create([
'name' => 'Search Name',
]);
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->putJson(route('api.saved_search.update', $search->id_string), [
'name' => 'Updated Search Name',
])->assertOk()
->assertJson([]);
$this->assertDatabaseMissing('activity_searches', [
'name' => 'Search Name',
'user_id' => $user->id,
]);
$this->assertDatabaseHas('activity_searches', [
'name' => 'Updated Search Name',
'user_id' => $user->id,
]);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanDeleteASavedSearch(): void
{
/** @var Team $team */
$team = Team::factory()->create([
'crm_id' => 1,
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create([
'name' => 'Search Name',
]);
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->deleteJson(route('api.saved_search.delete', $search->id_string))
->assertStatus(200)
->assertJson([]);
$this->assertDatabaseMissing('activity_searches', [
'user_id' => $user->id,
]);
$this->assertDatabaseMissing('activity_search_filters', [
'activity_search_id' => $search->id,
]);
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
1
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Component\ActivitySearch\FilterDefinition;
use Illuminate\Support\Collection;
use Jiminny\Component\ActivitySearch\FilterDefinition;
use Jiminny\Component\ActivitySearch\FilterDefinitionQuery;
use Jiminny\Component\ActivitySearch\FilterDefinitionQueryCollection;
use Jiminny\Contracts\ActivitySearch\ValidatedFilterDefinitionInterface;
use Jiminny\Contracts\Repositories\UserRepository;
use Jiminny\Models;
use Jiminny\Models\Feature\FeatureEnum;
use Jiminny\Models\Team;
use Jiminny\Traits\RequiresUUID;
use Elastica\Query;
final class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefinitionInterface
{
private const int NO_GROUP_ID = 999;
private UserRepository $userRepository;
public function __construct(UserRepository $userRepository)
{
$this->userRepository = $userRepository;
}
public function shouldApplyQueries(): bool
{
return count($this->getValue()) > 0;
}
public function getQueries(): FilterDefinitionQueryCollection
{
$userIds = $this->getValue();
return FilterDefinitionQueryCollection::make([
FilterDefinitionQuery::instance()
->setQuery(new Query\Terms('coachingFeedbacks.coach.id_string', $userIds))
->setPath('coachingFeedbacks.coach', 'coachingFeedbacks'),
]);
}
public function toArray(): array
{
return [
'id' => 'coaching-feedback-user-filter',
'label' => 'Coach',
'helpText' => 'The person who completed the Coaching Framework',
'placeholder' => 'Search coaches',
'inputType' => InputTypeEnum::DROPDOWN_MULTIPLE,
'queryParam' => 'coaching_feedback_coach_id',
'options' => $this->getOptions(),
'groupLabelKey' => 'label',
'groupValuesKey' => 'users',
'optionLabelKey' => 'name',
'optionValueKey' => 'id',
'value' => $this->getValue(),
];
}
private function getOptions(): array
{
$user = $this->executedBy;
$query = $user
->getTeam()
->users()
->whereNotIn(
'uuid',
$this->userRepository->findInaccessibleDeactivatedUserUuids($user)
->map(static fn (string $uuid): string => RequiresUUID::toOptimized($uuid))
->all(),
)
->orderBy('name');
$users = $query
->with('group')
->get()
->reduce(
static function (array $carry, Models\User $user): array {
$group = $user->getGroup();
$groupId = $group !== null
? $group->getUuid()
: self::NO_GROUP_ID;
$groupName = $group !== null
? $group->getName()
: '(NON-GROUPED)';
if (! array_key_exists($groupId, $carry)) {
$carry[$groupId] = [
'label' => $groupName,
'users' => [],
];
}
$carry[$groupId]['users'][] = [
'id' => $user->getUuid(),
'name' => sprintf(
'%s%s',
$user->getName(),
! $user->isStatusActive()
? ' (Inactive)'
: ''
),
];
return $carry;
},
[]
);
return Collection::make($users)
->sortBy('label')
->values()
->toArray();
}
public function getValue(): array
{
if (! $this->criteria->hasCoachingFeedbackCoachUserIds()) {
return $this->getDefaultValue();
}
return array_diff(
$this->criteria->getCoachingFeedbackCoachUserId(),
$this->userRepository->findInaccessibleDeactivatedUserUuids($this->executedBy)->all(),
);
}
private function getDefaultValue(): array
{
return [];
}
public function getValidationRules(?string $prefix = null): array
{
$team = $this->executedBy->getTeam();
return [
$prefix . 'coaching_feedback_coach_id' => 'array',
$prefix . 'coaching_feedback_coach_id.*' => 'uuid:users,team_id,' . $team->getId(),
];
}
public function getSortOrder(): int
{
return 86;
}
public function shouldBeIncluded(Team $team): bool
{
return $team->hasFeature(FeatureEnum::COACHING_FRAMEWORK);
}
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
56388
|
1966
|
4
|
2026-05-19T08:04:56.847904+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-19/1779 /Users/lukas/.screenpipe/data/data/2026-05-19/1779177896847_m1.jpg...
|
PhpStorm
|
faVsco.js – SavedSearchCRUDFeatureTest.php
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20676-delete-report-re Project: faVsco.js, menu
JY-20676-delete-report-related-objects, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
3
16
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Tests\Feature\SavedSearches;
use Illuminate\Support\LazyCollection;
use Illuminate\Support\Str;
use Mockery\MockInterface;
use Illuminate\Database\Eloquent\Factories\Sequence;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Illuminate\Support\Facades\Event;
use Illuminate\Testing\Fluent\AssertableJson;
use Jiminny\Events\Nudges\NudgeCreated;
use Jiminny\Models\Activity\Search;
use Jiminny\Models\Activity\SearchFilter;
use Jiminny\Models\Nudge;
use Jiminny\Models\Role;
use Jiminny\Models\Team;
use Jiminny\Models\User;
use Jiminny\Repositories\ElasticActivityRepository;
use Tests\TestCase;
final class SavedSearchCRUDFeatureTest extends TestCase
{
use DatabaseTransactions;
#[\PHPUnit\Framework\Attributes\Test]
public function userCanGetAListOfSavedSearches(): void
{
$this->markTestSkipped('Needs to be fixed');
/** @var Team $team */
$team = Team::factory()->create([
'crm_id' => 1, // temporary
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'status' => User::STATUS_ACTIVE,
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create();
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
$nudges = Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->getJson(route('api.saved_search.index'))
->assertStatus(200)
->assertJson(
fn (AssertableJson $json) =>
$json->has(1)
->first(
fn ($json) =>
$json->where('id', $search->id_string)
->where('name', $search->getName())
->where('filters', ['max_customer_questions' => 5, 'min_engaging_questions' => 3])
->has('nudges', 2)
->has(
'nudges.0',
fn ($json) =>
$json->where('id', $nudges[0]->id_string)
->where('frequency', 'daily')
->where('channel', 'email')
->has('expiresAt')
)
->has(
'nudges.1',
fn ($json) =>
$json->where('id', $nudges[1]->id_string)
->where('frequency', 'weekly')
->where('channel', 'slack')
->has('expiresAt')
)
)
);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanCreateASavedSearchBasedOnActivityFilters(): void
{
$this->markTestSkipped('Needs to be fixed');
Event::fake();
$this->partialMock(ElasticActivityRepository::class, function (MockInterface $mock) {
$mock->shouldReceive('onDemandScroll')
->times(2)
->andReturn(LazyCollection::empty());
});
/** @var Team $team */
$team = Team::factory()->create([
'uuid' => Str::uuid()->toString(),
'crm_id' => 1, // temporary
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->createQuietly([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$this->apiGuardLogin($user);
$this->actingAs($user)
->postJson(route('api.saved_search.create'), [
'name' => '::searchName::',
'filters' => [
'min_duration' => 1,
'only_recorded' => 1,
],
'nudges' => [
[
'frequency' => 'daily',
'channel' => 'email',
'expiresAt' => now()->addWeek()->format('Y-m-d'),
],
[
'frequency' => 'daily',
'channel' => 'slack',
'expiresAt' => now()->addWeek()->format('Y-m-d'),
],
],
])
->assertStatus(200);
$this->assertDatabaseHas('activity_searches', [
'name' => '::searchName::',
'user_id' => $user->id,
]);
$search = $user->searches()->first();
$this->assertDatabaseHas('nudges', [
'activity_search_id' => $search->id,
'frequency' => 2,
'channel' => 2,
]);
$this->assertDatabaseHas('nudges', [
'activity_search_id' => $search->id,
'frequency' => 2,
'channel' => 4,
]);
$this->assertDatabaseHas('activity_search_filters', [
'activity_search_id' => $search->id,
'filter' => 'min_duration',
'value' => 1,
]);
$this->assertDatabaseHas('activity_search_filters', [
'activity_search_id' => $search->id,
'filter' => 'only_recorded',
'value' => 1,
]);
Event::assertDispatched(NudgeCreated::class, 2);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanUpdateASavedSearchBasedOnActivityFilters(): void
{
/** @var Team $team */
$team = Team::factory()->createQuietly([
'uuid' => Str::uuid()->toString(),
'crm_id' => 1,
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create([
'name' => 'Search Name',
]);
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->putJson(route('api.saved_search.update', $search->id_string), [
'name' => 'Updated Search Name',
])->assertOk()
->assertJson([]);
$this->assertDatabaseMissing('activity_searches', [
'name' => 'Search Name',
'user_id' => $user->id,
]);
$this->assertDatabaseHas('activity_searches', [
'name' => 'Updated Search Name',
'user_id' => $user->id,
]);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanDeleteASavedSearch(): void
{
/** @var Team $team */
$team = Team::factory()->create([
'crm_id' => 1,
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create([
'name' => 'Search Name',
]);
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->deleteJson(route('api.saved_search.delete', $search->id_string))
->assertStatus(200)
->assertJson([]);
$this->assertDatabaseMissing('activity_searches', [
'user_id' => $user->id,
]);
$this->assertDatabaseMissing('activity_search_filters', [
'activity_search_id' => $search->id,
]);
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
1
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Component\ActivitySearch\FilterDefinition;
use Illuminate\Support\Collection;
use Jiminny\Component\ActivitySearch\FilterDefinition;
use Jiminny\Component\ActivitySearch\FilterDefinitionQuery;
use Jiminny\Component\ActivitySearch\FilterDefinitionQueryCollection;
use Jiminny\Contracts\ActivitySearch\ValidatedFilterDefinitionInterface;
use Jiminny\Contracts\Repositories\UserRepository;
use Jiminny\Models;
use Jiminny\Models\Feature\FeatureEnum;
use Jiminny\Models\Team;
use Jiminny\Traits\RequiresUUID;
use Elastica\Query;
final class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefinitionInterface
{
private const int NO_GROUP_ID = 999;
private UserRepository $userRepository;
public function __construct(UserRepository $userRepository)
{
$this->userRepository = $userRepository;
}
public function shouldApplyQueries(): bool
{
return count($this->getValue()) > 0;
}
public function getQueries(): FilterDefinitionQueryCollection
{
$userIds = $this->getValue();
return FilterDefinitionQueryCollection::make([
FilterDefinitionQuery::instance()
->setQuery(new Query\Terms('coachingFeedbacks.coach.id_string', $userIds))
->setPath('coachingFeedbacks.coach', 'coachingFeedbacks'),
]);
}
public function toArray(): array
{
return [
'id' => 'coaching-feedback-user-filter',
'label' => 'Coach',
'helpText' => 'The person who completed the Coaching Framework',
'placeholder' => 'Search coaches',
'inputType' => InputTypeEnum::DROPDOWN_MULTIPLE,
'queryParam' => 'coaching_feedback_coach_id',
'options' => $this->getOptions(),
'groupLabelKey' => 'label',
'groupValuesKey' => 'users',
'optionLabelKey' => 'name',
'optionValueKey' => 'id',
'value' => $this->getValue(),
];
}
private function getOptions(): array
{
$user = $this->executedBy;
$query = $user
->getTeam()
->users()
->whereNotIn(
'uuid',
$this->userRepository->findInaccessibleDeactivatedUserUuids($user)
->map(static fn (string $uuid): string => RequiresUUID::toOptimized($uuid))
->all(),
)
->orderBy('name');
$users = $query
->with('group')
->get()
->reduce(
static function (array $carry, Models\User $user): array {
$group = $user->getGroup();
$groupId = $group !== null
? $group->getUuid()
: self::NO_GROUP_ID;
$groupName = $group !== null
? $group->getName()
: '(NON-GROUPED)';
if (! array_key_exists($groupId, $carry)) {
$carry[$groupId] = [
'label' => $groupName,
'users' => [],
];
}
$carry[$groupId]['users'][] = [
'id' => $user->getUuid(),
'name' => sprintf(
'%s%s',
$user->getName(),
! $user->isStatusActive()
? ' (Inactive)'
: ''
),
];
return $carry;
},
[]
);
return Collection::make($users)
->sortBy('label')
->values()
->toArray();
}
public function getValue(): array
{
if (! $this->criteria->hasCoachingFeedbackCoachUserIds()) {
return $this->getDefaultValue();
}
return array_diff(
$this->criteria->getCoachingFeedbackCoachUserId(),
$this->userRepository->findInaccessibleDeactivatedUserUuids($this->executedBy)->all(),
);
}
private function getDefaultValue(): array
{
return [];
}
public function getValidationRules(?string $prefix = null): array
{
$team = $this->executedBy->getTeam();
return [
$prefix . 'coaching_feedback_coach_id' => 'array',
$prefix . 'coaching_feedback_coach_id.*' => 'uuid:users,team_id,' . $team->getId(),
];
}
public function getSortOrder(): int
{
return 86;
}
public function shouldBeIncluded(Team $team): bool
{
return $team->hasFeature(FeatureEnum::COACHING_FRAMEWORK);
}
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20676-delete-report-related-objects, menu","depth":5,"on_screen":true,"help_text":"Git Branch: JY-20676-delete-report-related-objects","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceTest","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"3","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"16","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\nnamespace Tests\\Feature\\SavedSearches;\n\nuse Illuminate\\Support\\LazyCollection;\nuse Illuminate\\Support\\Str;\nuse Mockery\\MockInterface;\nuse Illuminate\\Database\\Eloquent\\Factories\\Sequence;\nuse Illuminate\\Foundation\\Testing\\DatabaseTransactions;\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\Testing\\Fluent\\AssertableJson;\nuse Jiminny\\Events\\Nudges\\NudgeCreated;\nuse Jiminny\\Models\\Activity\\Search;\nuse Jiminny\\Models\\Activity\\SearchFilter;\nuse Jiminny\\Models\\Nudge;\nuse Jiminny\\Models\\Role;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\ElasticActivityRepository;\nuse Tests\\TestCase;\n\nfinal class SavedSearchCRUDFeatureTest extends TestCase\n{\n use DatabaseTransactions;\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanGetAListOfSavedSearches(): void\n {\n $this->markTestSkipped('Needs to be fixed');\n /** @var Team $team */\n $team = Team::factory()->create([\n 'crm_id' => 1, // temporary\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'status' => User::STATUS_ACTIVE,\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create();\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n $nudges = Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->getJson(route('api.saved_search.index'))\n ->assertStatus(200)\n ->assertJson(\n fn (AssertableJson $json) =>\n $json->has(1)\n ->first(\n fn ($json) =>\n $json->where('id', $search->id_string)\n ->where('name', $search->getName())\n ->where('filters', ['max_customer_questions' => 5, 'min_engaging_questions' => 3])\n ->has('nudges', 2)\n ->has(\n 'nudges.0',\n fn ($json) =>\n $json->where('id', $nudges[0]->id_string)\n ->where('frequency', 'daily')\n ->where('channel', 'email')\n ->has('expiresAt')\n )\n ->has(\n 'nudges.1',\n fn ($json) =>\n $json->where('id', $nudges[1]->id_string)\n ->where('frequency', 'weekly')\n ->where('channel', 'slack')\n ->has('expiresAt')\n )\n )\n );\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanCreateASavedSearchBasedOnActivityFilters(): void\n {\n $this->markTestSkipped('Needs to be fixed');\n\n Event::fake();\n\n $this->partialMock(ElasticActivityRepository::class, function (MockInterface $mock) {\n $mock->shouldReceive('onDemandScroll')\n ->times(2)\n ->andReturn(LazyCollection::empty());\n });\n\n /** @var Team $team */\n $team = Team::factory()->create([\n 'uuid' => Str::uuid()->toString(),\n 'crm_id' => 1, // temporary\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->createQuietly([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->postJson(route('api.saved_search.create'), [\n 'name' => '::searchName::',\n 'filters' => [\n 'min_duration' => 1,\n 'only_recorded' => 1,\n ],\n 'nudges' => [\n [\n 'frequency' => 'daily',\n 'channel' => 'email',\n 'expiresAt' => now()->addWeek()->format('Y-m-d'),\n ],\n [\n 'frequency' => 'daily',\n 'channel' => 'slack',\n 'expiresAt' => now()->addWeek()->format('Y-m-d'),\n ],\n ],\n ])\n ->assertStatus(200);\n\n $this->assertDatabaseHas('activity_searches', [\n 'name' => '::searchName::',\n 'user_id' => $user->id,\n ]);\n\n $search = $user->searches()->first();\n\n $this->assertDatabaseHas('nudges', [\n 'activity_search_id' => $search->id,\n 'frequency' => 2,\n 'channel' => 2,\n ]);\n\n $this->assertDatabaseHas('nudges', [\n 'activity_search_id' => $search->id,\n 'frequency' => 2,\n 'channel' => 4,\n ]);\n\n $this->assertDatabaseHas('activity_search_filters', [\n 'activity_search_id' => $search->id,\n 'filter' => 'min_duration',\n 'value' => 1,\n ]);\n\n $this->assertDatabaseHas('activity_search_filters', [\n 'activity_search_id' => $search->id,\n 'filter' => 'only_recorded',\n 'value' => 1,\n ]);\n\n Event::assertDispatched(NudgeCreated::class, 2);\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanUpdateASavedSearchBasedOnActivityFilters(): void\n {\n /** @var Team $team */\n $team = Team::factory()->createQuietly([\n 'uuid' => Str::uuid()->toString(),\n 'crm_id' => 1,\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create([\n 'name' => 'Search Name',\n ]);\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->putJson(route('api.saved_search.update', $search->id_string), [\n 'name' => 'Updated Search Name',\n ])->assertOk()\n ->assertJson([]);\n\n $this->assertDatabaseMissing('activity_searches', [\n 'name' => 'Search Name',\n 'user_id' => $user->id,\n ]);\n\n $this->assertDatabaseHas('activity_searches', [\n 'name' => 'Updated Search Name',\n 'user_id' => $user->id,\n ]);\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanDeleteASavedSearch(): void\n {\n /** @var Team $team */\n $team = Team::factory()->create([\n 'crm_id' => 1,\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create([\n 'name' => 'Search Name',\n ]);\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->deleteJson(route('api.saved_search.delete', $search->id_string))\n ->assertStatus(200)\n ->assertJson([]);\n\n $this->assertDatabaseMissing('activity_searches', [\n 'user_id' => $user->id,\n ]);\n\n $this->assertDatabaseMissing('activity_search_filters', [\n 'activity_search_id' => $search->id,\n ]);\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\nnamespace Tests\\Feature\\SavedSearches;\n\nuse Illuminate\\Support\\LazyCollection;\nuse Illuminate\\Support\\Str;\nuse Mockery\\MockInterface;\nuse Illuminate\\Database\\Eloquent\\Factories\\Sequence;\nuse Illuminate\\Foundation\\Testing\\DatabaseTransactions;\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\Testing\\Fluent\\AssertableJson;\nuse Jiminny\\Events\\Nudges\\NudgeCreated;\nuse Jiminny\\Models\\Activity\\Search;\nuse Jiminny\\Models\\Activity\\SearchFilter;\nuse Jiminny\\Models\\Nudge;\nuse Jiminny\\Models\\Role;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\ElasticActivityRepository;\nuse Tests\\TestCase;\n\nfinal class SavedSearchCRUDFeatureTest extends TestCase\n{\n use DatabaseTransactions;\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanGetAListOfSavedSearches(): void\n {\n $this->markTestSkipped('Needs to be fixed');\n /** @var Team $team */\n $team = Team::factory()->create([\n 'crm_id' => 1, // temporary\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'status' => User::STATUS_ACTIVE,\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create();\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n $nudges = Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->getJson(route('api.saved_search.index'))\n ->assertStatus(200)\n ->assertJson(\n fn (AssertableJson $json) =>\n $json->has(1)\n ->first(\n fn ($json) =>\n $json->where('id', $search->id_string)\n ->where('name', $search->getName())\n ->where('filters', ['max_customer_questions' => 5, 'min_engaging_questions' => 3])\n ->has('nudges', 2)\n ->has(\n 'nudges.0',\n fn ($json) =>\n $json->where('id', $nudges[0]->id_string)\n ->where('frequency', 'daily')\n ->where('channel', 'email')\n ->has('expiresAt')\n )\n ->has(\n 'nudges.1',\n fn ($json) =>\n $json->where('id', $nudges[1]->id_string)\n ->where('frequency', 'weekly')\n ->where('channel', 'slack')\n ->has('expiresAt')\n )\n )\n );\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanCreateASavedSearchBasedOnActivityFilters(): void\n {\n $this->markTestSkipped('Needs to be fixed');\n\n Event::fake();\n\n $this->partialMock(ElasticActivityRepository::class, function (MockInterface $mock) {\n $mock->shouldReceive('onDemandScroll')\n ->times(2)\n ->andReturn(LazyCollection::empty());\n });\n\n /** @var Team $team */\n $team = Team::factory()->create([\n 'uuid' => Str::uuid()->toString(),\n 'crm_id' => 1, // temporary\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->createQuietly([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->postJson(route('api.saved_search.create'), [\n 'name' => '::searchName::',\n 'filters' => [\n 'min_duration' => 1,\n 'only_recorded' => 1,\n ],\n 'nudges' => [\n [\n 'frequency' => 'daily',\n 'channel' => 'email',\n 'expiresAt' => now()->addWeek()->format('Y-m-d'),\n ],\n [\n 'frequency' => 'daily',\n 'channel' => 'slack',\n 'expiresAt' => now()->addWeek()->format('Y-m-d'),\n ],\n ],\n ])\n ->assertStatus(200);\n\n $this->assertDatabaseHas('activity_searches', [\n 'name' => '::searchName::',\n 'user_id' => $user->id,\n ]);\n\n $search = $user->searches()->first();\n\n $this->assertDatabaseHas('nudges', [\n 'activity_search_id' => $search->id,\n 'frequency' => 2,\n 'channel' => 2,\n ]);\n\n $this->assertDatabaseHas('nudges', [\n 'activity_search_id' => $search->id,\n 'frequency' => 2,\n 'channel' => 4,\n ]);\n\n $this->assertDatabaseHas('activity_search_filters', [\n 'activity_search_id' => $search->id,\n 'filter' => 'min_duration',\n 'value' => 1,\n ]);\n\n $this->assertDatabaseHas('activity_search_filters', [\n 'activity_search_id' => $search->id,\n 'filter' => 'only_recorded',\n 'value' => 1,\n ]);\n\n Event::assertDispatched(NudgeCreated::class, 2);\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanUpdateASavedSearchBasedOnActivityFilters(): void\n {\n /** @var Team $team */\n $team = Team::factory()->createQuietly([\n 'uuid' => Str::uuid()->toString(),\n 'crm_id' => 1,\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create([\n 'name' => 'Search Name',\n ]);\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->putJson(route('api.saved_search.update', $search->id_string), [\n 'name' => 'Updated Search Name',\n ])->assertOk()\n ->assertJson([]);\n\n $this->assertDatabaseMissing('activity_searches', [\n 'name' => 'Search Name',\n 'user_id' => $user->id,\n ]);\n\n $this->assertDatabaseHas('activity_searches', [\n 'name' => 'Updated Search Name',\n 'user_id' => $user->id,\n ]);\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanDeleteASavedSearch(): void\n {\n /** @var Team $team */\n $team = Team::factory()->create([\n 'crm_id' => 1,\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create([\n 'name' => 'Search Name',\n ]);\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->deleteJson(route('api.saved_search.delete', $search->id_string))\n ->assertStatus(200)\n ->assertJson([]);\n\n $this->assertDatabaseMissing('activity_searches', [\n 'user_id' => $user->id,\n ]);\n\n $this->assertDatabaseMissing('activity_search_filters', [\n 'activity_search_id' => $search->id,\n ]);\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"1","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Component\\ActivitySearch\\FilterDefinition;\n\nuse Illuminate\\Support\\Collection;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinitionQuery;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinitionQueryCollection;\nuse Jiminny\\Contracts\\ActivitySearch\\ValidatedFilterDefinitionInterface;\nuse Jiminny\\Contracts\\Repositories\\UserRepository;\nuse Jiminny\\Models;\nuse Jiminny\\Models\\Feature\\FeatureEnum;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Traits\\RequiresUUID;\nuse Elastica\\Query;\n\nfinal class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefinitionInterface\n{\n private const int NO_GROUP_ID = 999;\n private UserRepository $userRepository;\n\n public function __construct(UserRepository $userRepository)\n {\n $this->userRepository = $userRepository;\n }\n\n public function shouldApplyQueries(): bool\n {\n return count($this->getValue()) > 0;\n }\n\n public function getQueries(): FilterDefinitionQueryCollection\n {\n $userIds = $this->getValue();\n\n return FilterDefinitionQueryCollection::make([\n FilterDefinitionQuery::instance()\n ->setQuery(new Query\\Terms('coachingFeedbacks.coach.id_string', $userIds))\n ->setPath('coachingFeedbacks.coach', 'coachingFeedbacks'),\n ]);\n }\n\n public function toArray(): array\n {\n return [\n 'id' => 'coaching-feedback-user-filter',\n 'label' => 'Coach',\n 'helpText' => 'The person who completed the Coaching Framework',\n 'placeholder' => 'Search coaches',\n 'inputType' => InputTypeEnum::DROPDOWN_MULTIPLE,\n 'queryParam' => 'coaching_feedback_coach_id',\n 'options' => $this->getOptions(),\n 'groupLabelKey' => 'label',\n 'groupValuesKey' => 'users',\n 'optionLabelKey' => 'name',\n 'optionValueKey' => 'id',\n 'value' => $this->getValue(),\n ];\n }\n\n private function getOptions(): array\n {\n $user = $this->executedBy;\n $query = $user\n ->getTeam()\n ->users()\n ->whereNotIn(\n 'uuid',\n $this->userRepository->findInaccessibleDeactivatedUserUuids($user)\n ->map(static fn (string $uuid): string => RequiresUUID::toOptimized($uuid))\n ->all(),\n )\n ->orderBy('name');\n\n $users = $query\n ->with('group')\n ->get()\n ->reduce(\n static function (array $carry, Models\\User $user): array {\n $group = $user->getGroup();\n $groupId = $group !== null\n ? $group->getUuid()\n : self::NO_GROUP_ID;\n $groupName = $group !== null\n ? $group->getName()\n : '(NON-GROUPED)';\n\n if (! array_key_exists($groupId, $carry)) {\n $carry[$groupId] = [\n 'label' => $groupName,\n 'users' => [],\n ];\n }\n\n $carry[$groupId]['users'][] = [\n 'id' => $user->getUuid(),\n 'name' => sprintf(\n '%s%s',\n $user->getName(),\n ! $user->isStatusActive()\n ? ' (Inactive)'\n : ''\n ),\n ];\n\n return $carry;\n },\n []\n );\n\n return Collection::make($users)\n ->sortBy('label')\n ->values()\n ->toArray();\n }\n\n public function getValue(): array\n {\n if (! $this->criteria->hasCoachingFeedbackCoachUserIds()) {\n return $this->getDefaultValue();\n }\n\n return array_diff(\n $this->criteria->getCoachingFeedbackCoachUserId(),\n $this->userRepository->findInaccessibleDeactivatedUserUuids($this->executedBy)->all(),\n );\n }\n\n private function getDefaultValue(): array\n {\n return [];\n }\n\n public function getValidationRules(?string $prefix = null): array\n {\n $team = $this->executedBy->getTeam();\n\n return [\n $prefix . 'coaching_feedback_coach_id' => 'array',\n $prefix . 'coaching_feedback_coach_id.*' => 'uuid:users,team_id,' . $team->getId(),\n ];\n }\n\n public function getSortOrder(): int\n {\n return 86;\n }\n\n public function shouldBeIncluded(Team $team): bool\n {\n return $team->hasFeature(FeatureEnum::COACHING_FRAMEWORK);\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Component\\ActivitySearch\\FilterDefinition;\n\nuse Illuminate\\Support\\Collection;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinitionQuery;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinitionQueryCollection;\nuse Jiminny\\Contracts\\ActivitySearch\\ValidatedFilterDefinitionInterface;\nuse Jiminny\\Contracts\\Repositories\\UserRepository;\nuse Jiminny\\Models;\nuse Jiminny\\Models\\Feature\\FeatureEnum;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Traits\\RequiresUUID;\nuse Elastica\\Query;\n\nfinal class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefinitionInterface\n{\n private const int NO_GROUP_ID = 999;\n private UserRepository $userRepository;\n\n public function __construct(UserRepository $userRepository)\n {\n $this->userRepository = $userRepository;\n }\n\n public function shouldApplyQueries(): bool\n {\n return count($this->getValue()) > 0;\n }\n\n public function getQueries(): FilterDefinitionQueryCollection\n {\n $userIds = $this->getValue();\n\n return FilterDefinitionQueryCollection::make([\n FilterDefinitionQuery::instance()\n ->setQuery(new Query\\Terms('coachingFeedbacks.coach.id_string', $userIds))\n ->setPath('coachingFeedbacks.coach', 'coachingFeedbacks'),\n ]);\n }\n\n public function toArray(): array\n {\n return [\n 'id' => 'coaching-feedback-user-filter',\n 'label' => 'Coach',\n 'helpText' => 'The person who completed the Coaching Framework',\n 'placeholder' => 'Search coaches',\n 'inputType' => InputTypeEnum::DROPDOWN_MULTIPLE,\n 'queryParam' => 'coaching_feedback_coach_id',\n 'options' => $this->getOptions(),\n 'groupLabelKey' => 'label',\n 'groupValuesKey' => 'users',\n 'optionLabelKey' => 'name',\n 'optionValueKey' => 'id',\n 'value' => $this->getValue(),\n ];\n }\n\n private function getOptions(): array\n {\n $user = $this->executedBy;\n $query = $user\n ->getTeam()\n ->users()\n ->whereNotIn(\n 'uuid',\n $this->userRepository->findInaccessibleDeactivatedUserUuids($user)\n ->map(static fn (string $uuid): string => RequiresUUID::toOptimized($uuid))\n ->all(),\n )\n ->orderBy('name');\n\n $users = $query\n ->with('group')\n ->get()\n ->reduce(\n static function (array $carry, Models\\User $user): array {\n $group = $user->getGroup();\n $groupId = $group !== null\n ? $group->getUuid()\n : self::NO_GROUP_ID;\n $groupName = $group !== null\n ? $group->getName()\n : '(NON-GROUPED)';\n\n if (! array_key_exists($groupId, $carry)) {\n $carry[$groupId] = [\n 'label' => $groupName,\n 'users' => [],\n ];\n }\n\n $carry[$groupId]['users'][] = [\n 'id' => $user->getUuid(),\n 'name' => sprintf(\n '%s%s',\n $user->getName(),\n ! $user->isStatusActive()\n ? ' (Inactive)'\n : ''\n ),\n ];\n\n return $carry;\n },\n []\n );\n\n return Collection::make($users)\n ->sortBy('label')\n ->values()\n ->toArray();\n }\n\n public function getValue(): array\n {\n if (! $this->criteria->hasCoachingFeedbackCoachUserIds()) {\n return $this->getDefaultValue();\n }\n\n return array_diff(\n $this->criteria->getCoachingFeedbackCoachUserId(),\n $this->userRepository->findInaccessibleDeactivatedUserUuids($this->executedBy)->all(),\n );\n }\n\n private function getDefaultValue(): array\n {\n return [];\n }\n\n public function getValidationRules(?string $prefix = null): array\n {\n $team = $this->executedBy->getTeam();\n\n return [\n $prefix . 'coaching_feedback_coach_id' => 'array',\n $prefix . 'coaching_feedback_coach_id.*' => 'uuid:users,team_id,' . $team->getId(),\n ];\n }\n\n public function getSortOrder(): int\n {\n return 86;\n }\n\n public function shouldBeIncluded(Team $team): bool\n {\n return $team->hasFeature(FeatureEnum::COACHING_FRAMEWORK);\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
6509625738266471330
|
-8996616125002602716
|
idle
|
accessibility
|
NULL
|
Project: faVsco.js, menu
JY-20676-delete-report-re Project: faVsco.js, menu
JY-20676-delete-report-related-objects, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
3
16
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Tests\Feature\SavedSearches;
use Illuminate\Support\LazyCollection;
use Illuminate\Support\Str;
use Mockery\MockInterface;
use Illuminate\Database\Eloquent\Factories\Sequence;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Illuminate\Support\Facades\Event;
use Illuminate\Testing\Fluent\AssertableJson;
use Jiminny\Events\Nudges\NudgeCreated;
use Jiminny\Models\Activity\Search;
use Jiminny\Models\Activity\SearchFilter;
use Jiminny\Models\Nudge;
use Jiminny\Models\Role;
use Jiminny\Models\Team;
use Jiminny\Models\User;
use Jiminny\Repositories\ElasticActivityRepository;
use Tests\TestCase;
final class SavedSearchCRUDFeatureTest extends TestCase
{
use DatabaseTransactions;
#[\PHPUnit\Framework\Attributes\Test]
public function userCanGetAListOfSavedSearches(): void
{
$this->markTestSkipped('Needs to be fixed');
/** @var Team $team */
$team = Team::factory()->create([
'crm_id' => 1, // temporary
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'status' => User::STATUS_ACTIVE,
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create();
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
$nudges = Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->getJson(route('api.saved_search.index'))
->assertStatus(200)
->assertJson(
fn (AssertableJson $json) =>
$json->has(1)
->first(
fn ($json) =>
$json->where('id', $search->id_string)
->where('name', $search->getName())
->where('filters', ['max_customer_questions' => 5, 'min_engaging_questions' => 3])
->has('nudges', 2)
->has(
'nudges.0',
fn ($json) =>
$json->where('id', $nudges[0]->id_string)
->where('frequency', 'daily')
->where('channel', 'email')
->has('expiresAt')
)
->has(
'nudges.1',
fn ($json) =>
$json->where('id', $nudges[1]->id_string)
->where('frequency', 'weekly')
->where('channel', 'slack')
->has('expiresAt')
)
)
);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanCreateASavedSearchBasedOnActivityFilters(): void
{
$this->markTestSkipped('Needs to be fixed');
Event::fake();
$this->partialMock(ElasticActivityRepository::class, function (MockInterface $mock) {
$mock->shouldReceive('onDemandScroll')
->times(2)
->andReturn(LazyCollection::empty());
});
/** @var Team $team */
$team = Team::factory()->create([
'uuid' => Str::uuid()->toString(),
'crm_id' => 1, // temporary
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->createQuietly([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$this->apiGuardLogin($user);
$this->actingAs($user)
->postJson(route('api.saved_search.create'), [
'name' => '::searchName::',
'filters' => [
'min_duration' => 1,
'only_recorded' => 1,
],
'nudges' => [
[
'frequency' => 'daily',
'channel' => 'email',
'expiresAt' => now()->addWeek()->format('Y-m-d'),
],
[
'frequency' => 'daily',
'channel' => 'slack',
'expiresAt' => now()->addWeek()->format('Y-m-d'),
],
],
])
->assertStatus(200);
$this->assertDatabaseHas('activity_searches', [
'name' => '::searchName::',
'user_id' => $user->id,
]);
$search = $user->searches()->first();
$this->assertDatabaseHas('nudges', [
'activity_search_id' => $search->id,
'frequency' => 2,
'channel' => 2,
]);
$this->assertDatabaseHas('nudges', [
'activity_search_id' => $search->id,
'frequency' => 2,
'channel' => 4,
]);
$this->assertDatabaseHas('activity_search_filters', [
'activity_search_id' => $search->id,
'filter' => 'min_duration',
'value' => 1,
]);
$this->assertDatabaseHas('activity_search_filters', [
'activity_search_id' => $search->id,
'filter' => 'only_recorded',
'value' => 1,
]);
Event::assertDispatched(NudgeCreated::class, 2);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanUpdateASavedSearchBasedOnActivityFilters(): void
{
/** @var Team $team */
$team = Team::factory()->createQuietly([
'uuid' => Str::uuid()->toString(),
'crm_id' => 1,
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create([
'name' => 'Search Name',
]);
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->putJson(route('api.saved_search.update', $search->id_string), [
'name' => 'Updated Search Name',
])->assertOk()
->assertJson([]);
$this->assertDatabaseMissing('activity_searches', [
'name' => 'Search Name',
'user_id' => $user->id,
]);
$this->assertDatabaseHas('activity_searches', [
'name' => 'Updated Search Name',
'user_id' => $user->id,
]);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanDeleteASavedSearch(): void
{
/** @var Team $team */
$team = Team::factory()->create([
'crm_id' => 1,
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create([
'name' => 'Search Name',
]);
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->deleteJson(route('api.saved_search.delete', $search->id_string))
->assertStatus(200)
->assertJson([]);
$this->assertDatabaseMissing('activity_searches', [
'user_id' => $user->id,
]);
$this->assertDatabaseMissing('activity_search_filters', [
'activity_search_id' => $search->id,
]);
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
1
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Component\ActivitySearch\FilterDefinition;
use Illuminate\Support\Collection;
use Jiminny\Component\ActivitySearch\FilterDefinition;
use Jiminny\Component\ActivitySearch\FilterDefinitionQuery;
use Jiminny\Component\ActivitySearch\FilterDefinitionQueryCollection;
use Jiminny\Contracts\ActivitySearch\ValidatedFilterDefinitionInterface;
use Jiminny\Contracts\Repositories\UserRepository;
use Jiminny\Models;
use Jiminny\Models\Feature\FeatureEnum;
use Jiminny\Models\Team;
use Jiminny\Traits\RequiresUUID;
use Elastica\Query;
final class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefinitionInterface
{
private const int NO_GROUP_ID = 999;
private UserRepository $userRepository;
public function __construct(UserRepository $userRepository)
{
$this->userRepository = $userRepository;
}
public function shouldApplyQueries(): bool
{
return count($this->getValue()) > 0;
}
public function getQueries(): FilterDefinitionQueryCollection
{
$userIds = $this->getValue();
return FilterDefinitionQueryCollection::make([
FilterDefinitionQuery::instance()
->setQuery(new Query\Terms('coachingFeedbacks.coach.id_string', $userIds))
->setPath('coachingFeedbacks.coach', 'coachingFeedbacks'),
]);
}
public function toArray(): array
{
return [
'id' => 'coaching-feedback-user-filter',
'label' => 'Coach',
'helpText' => 'The person who completed the Coaching Framework',
'placeholder' => 'Search coaches',
'inputType' => InputTypeEnum::DROPDOWN_MULTIPLE,
'queryParam' => 'coaching_feedback_coach_id',
'options' => $this->getOptions(),
'groupLabelKey' => 'label',
'groupValuesKey' => 'users',
'optionLabelKey' => 'name',
'optionValueKey' => 'id',
'value' => $this->getValue(),
];
}
private function getOptions(): array
{
$user = $this->executedBy;
$query = $user
->getTeam()
->users()
->whereNotIn(
'uuid',
$this->userRepository->findInaccessibleDeactivatedUserUuids($user)
->map(static fn (string $uuid): string => RequiresUUID::toOptimized($uuid))
->all(),
)
->orderBy('name');
$users = $query
->with('group')
->get()
->reduce(
static function (array $carry, Models\User $user): array {
$group = $user->getGroup();
$groupId = $group !== null
? $group->getUuid()
: self::NO_GROUP_ID;
$groupName = $group !== null
? $group->getName()
: '(NON-GROUPED)';
if (! array_key_exists($groupId, $carry)) {
$carry[$groupId] = [
'label' => $groupName,
'users' => [],
];
}
$carry[$groupId]['users'][] = [
'id' => $user->getUuid(),
'name' => sprintf(
'%s%s',
$user->getName(),
! $user->isStatusActive()
? ' (Inactive)'
: ''
),
];
return $carry;
},
[]
);
return Collection::make($users)
->sortBy('label')
->values()
->toArray();
}
public function getValue(): array
{
if (! $this->criteria->hasCoachingFeedbackCoachUserIds()) {
return $this->getDefaultValue();
}
return array_diff(
$this->criteria->getCoachingFeedbackCoachUserId(),
$this->userRepository->findInaccessibleDeactivatedUserUuids($this->executedBy)->all(),
);
}
private function getDefaultValue(): array
{
return [];
}
public function getValidationRules(?string $prefix = null): array
{
$team = $this->executedBy->getTeam();
return [
$prefix . 'coaching_feedback_coach_id' => 'array',
$prefix . 'coaching_feedback_coach_id.*' => 'uuid:users,team_id,' . $team->getId(),
];
}
public function getSortOrder(): int
{
return 86;
}
public function shouldBeIncluded(Team $team): bool
{
return $team->hasFeature(FeatureEnum::COACHING_FRAMEWORK);
}
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
56389
|
1966
|
5
|
2026-05-19T08:05:06.977760+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-19/1779 /Users/lukas/.screenpipe/data/data/2026-05-19/1779177906977_m1.jpg...
|
PhpStorm
|
faVsco.js – SavedSearchCRUDFeatureTest.php
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20676-delete-report-re Project: faVsco.js, menu
JY-20676-delete-report-related-objects, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
3
16
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Tests\Feature\SavedSearches;
use Illuminate\Support\LazyCollection;
use Illuminate\Support\Str;
use Mockery\MockInterface;
use Illuminate\Database\Eloquent\Factories\Sequence;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Illuminate\Support\Facades\Event;
use Illuminate\Testing\Fluent\AssertableJson;
use Jiminny\Events\Nudges\NudgeCreated;
use Jiminny\Models\Activity\Search;
use Jiminny\Models\Activity\SearchFilter;
use Jiminny\Models\Nudge;
use Jiminny\Models\Role;
use Jiminny\Models\Team;
use Jiminny\Models\User;
use Jiminny\Repositories\ElasticActivityRepository;
use Tests\TestCase;
final class SavedSearchCRUDFeatureTest extends TestCase
{
use DatabaseTransactions;
#[\PHPUnit\Framework\Attributes\Test]
public function userCanGetAListOfSavedSearches(): void
{
$this->markTestSkipped('Needs to be fixed');
/** @var Team $team */
$team = Team::factory()->create([
'crm_id' => 1, // temporary
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'status' => User::STATUS_ACTIVE,
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create();
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
$nudges = Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->getJson(route('api.saved_search.index'))
->assertStatus(200)
->assertJson(
fn (AssertableJson $json) =>
$json->has(1)
->first(
fn ($json) =>
$json->where('id', $search->id_string)
->where('name', $search->getName())
->where('filters', ['max_customer_questions' => 5, 'min_engaging_questions' => 3])
->has('nudges', 2)
->has(
'nudges.0',
fn ($json) =>
$json->where('id', $nudges[0]->id_string)
->where('frequency', 'daily')
->where('channel', 'email')
->has('expiresAt')
)
->has(
'nudges.1',
fn ($json) =>
$json->where('id', $nudges[1]->id_string)
->where('frequency', 'weekly')
->where('channel', 'slack')
->has('expiresAt')
)
)
);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanCreateASavedSearchBasedOnActivityFilters(): void
{
$this->markTestSkipped('Needs to be fixed');
Event::fake();
$this->partialMock(ElasticActivityRepository::class, function (MockInterface $mock) {
$mock->shouldReceive('onDemandScroll')
->times(2)
->andReturn(LazyCollection::empty());
});
/** @var Team $team */
$team = Team::factory()->create([
'uuid' => Str::uuid()->toString(),
'crm_id' => 1, // temporary
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->createQuietly([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$this->apiGuardLogin($user);
$this->actingAs($user)
->postJson(route('api.saved_search.create'), [
'name' => '::searchName::',
'filters' => [
'min_duration' => 1,
'only_recorded' => 1,
],
'nudges' => [
[
'frequency' => 'daily',
'channel' => 'email',
'expiresAt' => now()->addWeek()->format('Y-m-d'),
],
[
'frequency' => 'daily',
'channel' => 'slack',
'expiresAt' => now()->addWeek()->format('Y-m-d'),
],
],
])
->assertStatus(200);
$this->assertDatabaseHas('activity_searches', [
'name' => '::searchName::',
'user_id' => $user->id,
]);
$search = $user->searches()->first();
$this->assertDatabaseHas('nudges', [
'activity_search_id' => $search->id,
'frequency' => 2,
'channel' => 2,
]);
$this->assertDatabaseHas('nudges', [
'activity_search_id' => $search->id,
'frequency' => 2,
'channel' => 4,
]);
$this->assertDatabaseHas('activity_search_filters', [
'activity_search_id' => $search->id,
'filter' => 'min_duration',
'value' => 1,
]);
$this->assertDatabaseHas('activity_search_filters', [
'activity_search_id' => $search->id,
'filter' => 'only_recorded',
'value' => 1,
]);
Event::assertDispatched(NudgeCreated::class, 2);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanUpdateASavedSearchBasedOnActivityFilters(): void
{
/** @var Team $team */
$team = Team::factory()->createQuietly([
'uuid' => Str::uuid()->toString(),
'crm_id' => 1,
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create([
'name' => 'Search Name',
]);
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->putJson(route('api.saved_search.update', $search->id_string), [
'name' => 'Updated Search Name',
])->assertOk()
->assertJson([]);
$this->assertDatabaseMissing('activity_searches', [
'name' => 'Search Name',
'user_id' => $user->id,
]);
$this->assertDatabaseHas('activity_searches', [
'name' => 'Updated Search Name',
'user_id' => $user->id,
]);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanDeleteASavedSearch(): void
{
/** @var Team $team */
$team = Team::factory()->create([
'crm_id' => 1,
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create([
'name' => 'Search Name',
]);
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->deleteJson(route('api.saved_search.delete', $search->id_string))
->assertStatus(200)
->assertJson([]);
$this->assertDatabaseMissing('activity_searches', [
'user_id' => $user->id,
]);
$this->assertDatabaseMissing('activity_search_filters', [
'activity_search_id' => $search->id,
]);
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
1
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Component\ActivitySearch\FilterDefinition;
use Illuminate\Support\Collection;
use Jiminny\Component\ActivitySearch\FilterDefinition;
use Jiminny\Component\ActivitySearch\FilterDefinitionQuery;
use Jiminny\Component\ActivitySearch\FilterDefinitionQueryCollection;
use Jiminny\Contracts\ActivitySearch\ValidatedFilterDefinitionInterface;
use Jiminny\Contracts\Repositories\UserRepository;
use Jiminny\Models;
use Jiminny\Models\Feature\FeatureEnum;
use Jiminny\Models\Team;
use Jiminny\Traits\RequiresUUID;
use Elastica\Query;
final class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefinitionInterface
{
private const int NO_GROUP_ID = 999;
private UserRepository $userRepository;
public function __construct(UserRepository $userRepository)
{
$this->userRepository = $userRepository;
}
public function shouldApplyQueries(): bool
{
return count($this->getValue()) > 0;
}
public function getQueries(): FilterDefinitionQueryCollection
{
$userIds = $this->getValue();
return FilterDefinitionQueryCollection::make([
FilterDefinitionQuery::instance()
->setQuery(new Query\Terms('coachingFeedbacks.coach.id_string', $userIds))
->setPath('coachingFeedbacks.coach', 'coachingFeedbacks'),
]);
}
public function toArray(): array
{
return [
'id' => 'coaching-feedback-user-filter',
'label' => 'Coach',
'helpText' => 'The person who completed the Coaching Framework',
'placeholder' => 'Search coaches',
'inputType' => InputTypeEnum::DROPDOWN_MULTIPLE,
'queryParam' => 'coaching_feedback_coach_id',
'options' => $this->getOptions(),
'groupLabelKey' => 'label',
'groupValuesKey' => 'users',
'optionLabelKey' => 'name',
'optionValueKey' => 'id',
'value' => $this->getValue(),
];
}
private function getOptions(): array
{
$user = $this->executedBy;
$query = $user
->getTeam()
->users()
->whereNotIn(
'uuid',
$this->userRepository->findInaccessibleDeactivatedUserUuids($user)
->map(static fn (string $uuid): string => RequiresUUID::toOptimized($uuid))
->all(),
)
->orderBy('name');
$users = $query
->with('group')
->get()
->reduce(
static function (array $carry, Models\User $user): array {
$group = $user->getGroup();
$groupId = $group !== null
? $group->getUuid()
: self::NO_GROUP_ID;
$groupName = $group !== null
? $group->getName()
: '(NON-GROUPED)';
if (! array_key_exists($groupId, $carry)) {
$carry[$groupId] = [
'label' => $groupName,
'users' => [],
];
}
$carry[$groupId]['users'][] = [
'id' => $user->getUuid(),
'name' => sprintf(
'%s%s',
$user->getName(),
! $user->isStatusActive()
? ' (Inactive)'
: ''
),
];
return $carry;
},
[]
);
return Collection::make($users)
->sortBy('label')
->values()
->toArray();
}
public function getValue(): array
{
if (! $this->criteria->hasCoachingFeedbackCoachUserIds()) {
return $this->getDefaultValue();
}
return array_diff(
$this->criteria->getCoachingFeedbackCoachUserId(),
$this->userRepository->findInaccessibleDeactivatedUserUuids($this->executedBy)->all(),
);
}
private function getDefaultValue(): array
{
return [];
}
public function getValidationRules(?string $prefix = null): array
{
$team = $this->executedBy->getTeam();
return [
$prefix . 'coaching_feedback_coach_id' => 'array',
$prefix . 'coaching_feedback_coach_id.*' => 'uuid:users,team_id,' . $team->getId(),
];
}
public function getSortOrder(): int
{
return 86;
}
public function shouldBeIncluded(Team $team): bool
{
return $team->hasFeature(FeatureEnum::COACHING_FRAMEWORK);
}
}
Project
Project
New File or Directory…...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20676-delete-report-related-objects, menu","depth":5,"on_screen":true,"help_text":"Git Branch: JY-20676-delete-report-related-objects","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceTest","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"3","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"16","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\nnamespace Tests\\Feature\\SavedSearches;\n\nuse Illuminate\\Support\\LazyCollection;\nuse Illuminate\\Support\\Str;\nuse Mockery\\MockInterface;\nuse Illuminate\\Database\\Eloquent\\Factories\\Sequence;\nuse Illuminate\\Foundation\\Testing\\DatabaseTransactions;\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\Testing\\Fluent\\AssertableJson;\nuse Jiminny\\Events\\Nudges\\NudgeCreated;\nuse Jiminny\\Models\\Activity\\Search;\nuse Jiminny\\Models\\Activity\\SearchFilter;\nuse Jiminny\\Models\\Nudge;\nuse Jiminny\\Models\\Role;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\ElasticActivityRepository;\nuse Tests\\TestCase;\n\nfinal class SavedSearchCRUDFeatureTest extends TestCase\n{\n use DatabaseTransactions;\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanGetAListOfSavedSearches(): void\n {\n $this->markTestSkipped('Needs to be fixed');\n /** @var Team $team */\n $team = Team::factory()->create([\n 'crm_id' => 1, // temporary\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'status' => User::STATUS_ACTIVE,\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create();\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n $nudges = Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->getJson(route('api.saved_search.index'))\n ->assertStatus(200)\n ->assertJson(\n fn (AssertableJson $json) =>\n $json->has(1)\n ->first(\n fn ($json) =>\n $json->where('id', $search->id_string)\n ->where('name', $search->getName())\n ->where('filters', ['max_customer_questions' => 5, 'min_engaging_questions' => 3])\n ->has('nudges', 2)\n ->has(\n 'nudges.0',\n fn ($json) =>\n $json->where('id', $nudges[0]->id_string)\n ->where('frequency', 'daily')\n ->where('channel', 'email')\n ->has('expiresAt')\n )\n ->has(\n 'nudges.1',\n fn ($json) =>\n $json->where('id', $nudges[1]->id_string)\n ->where('frequency', 'weekly')\n ->where('channel', 'slack')\n ->has('expiresAt')\n )\n )\n );\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanCreateASavedSearchBasedOnActivityFilters(): void\n {\n $this->markTestSkipped('Needs to be fixed');\n\n Event::fake();\n\n $this->partialMock(ElasticActivityRepository::class, function (MockInterface $mock) {\n $mock->shouldReceive('onDemandScroll')\n ->times(2)\n ->andReturn(LazyCollection::empty());\n });\n\n /** @var Team $team */\n $team = Team::factory()->create([\n 'uuid' => Str::uuid()->toString(),\n 'crm_id' => 1, // temporary\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->createQuietly([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->postJson(route('api.saved_search.create'), [\n 'name' => '::searchName::',\n 'filters' => [\n 'min_duration' => 1,\n 'only_recorded' => 1,\n ],\n 'nudges' => [\n [\n 'frequency' => 'daily',\n 'channel' => 'email',\n 'expiresAt' => now()->addWeek()->format('Y-m-d'),\n ],\n [\n 'frequency' => 'daily',\n 'channel' => 'slack',\n 'expiresAt' => now()->addWeek()->format('Y-m-d'),\n ],\n ],\n ])\n ->assertStatus(200);\n\n $this->assertDatabaseHas('activity_searches', [\n 'name' => '::searchName::',\n 'user_id' => $user->id,\n ]);\n\n $search = $user->searches()->first();\n\n $this->assertDatabaseHas('nudges', [\n 'activity_search_id' => $search->id,\n 'frequency' => 2,\n 'channel' => 2,\n ]);\n\n $this->assertDatabaseHas('nudges', [\n 'activity_search_id' => $search->id,\n 'frequency' => 2,\n 'channel' => 4,\n ]);\n\n $this->assertDatabaseHas('activity_search_filters', [\n 'activity_search_id' => $search->id,\n 'filter' => 'min_duration',\n 'value' => 1,\n ]);\n\n $this->assertDatabaseHas('activity_search_filters', [\n 'activity_search_id' => $search->id,\n 'filter' => 'only_recorded',\n 'value' => 1,\n ]);\n\n Event::assertDispatched(NudgeCreated::class, 2);\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanUpdateASavedSearchBasedOnActivityFilters(): void\n {\n /** @var Team $team */\n $team = Team::factory()->createQuietly([\n 'uuid' => Str::uuid()->toString(),\n 'crm_id' => 1,\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create([\n 'name' => 'Search Name',\n ]);\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->putJson(route('api.saved_search.update', $search->id_string), [\n 'name' => 'Updated Search Name',\n ])->assertOk()\n ->assertJson([]);\n\n $this->assertDatabaseMissing('activity_searches', [\n 'name' => 'Search Name',\n 'user_id' => $user->id,\n ]);\n\n $this->assertDatabaseHas('activity_searches', [\n 'name' => 'Updated Search Name',\n 'user_id' => $user->id,\n ]);\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanDeleteASavedSearch(): void\n {\n /** @var Team $team */\n $team = Team::factory()->create([\n 'crm_id' => 1,\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create([\n 'name' => 'Search Name',\n ]);\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->deleteJson(route('api.saved_search.delete', $search->id_string))\n ->assertStatus(200)\n ->assertJson([]);\n\n $this->assertDatabaseMissing('activity_searches', [\n 'user_id' => $user->id,\n ]);\n\n $this->assertDatabaseMissing('activity_search_filters', [\n 'activity_search_id' => $search->id,\n ]);\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\nnamespace Tests\\Feature\\SavedSearches;\n\nuse Illuminate\\Support\\LazyCollection;\nuse Illuminate\\Support\\Str;\nuse Mockery\\MockInterface;\nuse Illuminate\\Database\\Eloquent\\Factories\\Sequence;\nuse Illuminate\\Foundation\\Testing\\DatabaseTransactions;\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\Testing\\Fluent\\AssertableJson;\nuse Jiminny\\Events\\Nudges\\NudgeCreated;\nuse Jiminny\\Models\\Activity\\Search;\nuse Jiminny\\Models\\Activity\\SearchFilter;\nuse Jiminny\\Models\\Nudge;\nuse Jiminny\\Models\\Role;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\ElasticActivityRepository;\nuse Tests\\TestCase;\n\nfinal class SavedSearchCRUDFeatureTest extends TestCase\n{\n use DatabaseTransactions;\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanGetAListOfSavedSearches(): void\n {\n $this->markTestSkipped('Needs to be fixed');\n /** @var Team $team */\n $team = Team::factory()->create([\n 'crm_id' => 1, // temporary\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'status' => User::STATUS_ACTIVE,\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create();\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n $nudges = Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->getJson(route('api.saved_search.index'))\n ->assertStatus(200)\n ->assertJson(\n fn (AssertableJson $json) =>\n $json->has(1)\n ->first(\n fn ($json) =>\n $json->where('id', $search->id_string)\n ->where('name', $search->getName())\n ->where('filters', ['max_customer_questions' => 5, 'min_engaging_questions' => 3])\n ->has('nudges', 2)\n ->has(\n 'nudges.0',\n fn ($json) =>\n $json->where('id', $nudges[0]->id_string)\n ->where('frequency', 'daily')\n ->where('channel', 'email')\n ->has('expiresAt')\n )\n ->has(\n 'nudges.1',\n fn ($json) =>\n $json->where('id', $nudges[1]->id_string)\n ->where('frequency', 'weekly')\n ->where('channel', 'slack')\n ->has('expiresAt')\n )\n )\n );\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanCreateASavedSearchBasedOnActivityFilters(): void\n {\n $this->markTestSkipped('Needs to be fixed');\n\n Event::fake();\n\n $this->partialMock(ElasticActivityRepository::class, function (MockInterface $mock) {\n $mock->shouldReceive('onDemandScroll')\n ->times(2)\n ->andReturn(LazyCollection::empty());\n });\n\n /** @var Team $team */\n $team = Team::factory()->create([\n 'uuid' => Str::uuid()->toString(),\n 'crm_id' => 1, // temporary\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->createQuietly([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->postJson(route('api.saved_search.create'), [\n 'name' => '::searchName::',\n 'filters' => [\n 'min_duration' => 1,\n 'only_recorded' => 1,\n ],\n 'nudges' => [\n [\n 'frequency' => 'daily',\n 'channel' => 'email',\n 'expiresAt' => now()->addWeek()->format('Y-m-d'),\n ],\n [\n 'frequency' => 'daily',\n 'channel' => 'slack',\n 'expiresAt' => now()->addWeek()->format('Y-m-d'),\n ],\n ],\n ])\n ->assertStatus(200);\n\n $this->assertDatabaseHas('activity_searches', [\n 'name' => '::searchName::',\n 'user_id' => $user->id,\n ]);\n\n $search = $user->searches()->first();\n\n $this->assertDatabaseHas('nudges', [\n 'activity_search_id' => $search->id,\n 'frequency' => 2,\n 'channel' => 2,\n ]);\n\n $this->assertDatabaseHas('nudges', [\n 'activity_search_id' => $search->id,\n 'frequency' => 2,\n 'channel' => 4,\n ]);\n\n $this->assertDatabaseHas('activity_search_filters', [\n 'activity_search_id' => $search->id,\n 'filter' => 'min_duration',\n 'value' => 1,\n ]);\n\n $this->assertDatabaseHas('activity_search_filters', [\n 'activity_search_id' => $search->id,\n 'filter' => 'only_recorded',\n 'value' => 1,\n ]);\n\n Event::assertDispatched(NudgeCreated::class, 2);\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanUpdateASavedSearchBasedOnActivityFilters(): void\n {\n /** @var Team $team */\n $team = Team::factory()->createQuietly([\n 'uuid' => Str::uuid()->toString(),\n 'crm_id' => 1,\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create([\n 'name' => 'Search Name',\n ]);\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->putJson(route('api.saved_search.update', $search->id_string), [\n 'name' => 'Updated Search Name',\n ])->assertOk()\n ->assertJson([]);\n\n $this->assertDatabaseMissing('activity_searches', [\n 'name' => 'Search Name',\n 'user_id' => $user->id,\n ]);\n\n $this->assertDatabaseHas('activity_searches', [\n 'name' => 'Updated Search Name',\n 'user_id' => $user->id,\n ]);\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanDeleteASavedSearch(): void\n {\n /** @var Team $team */\n $team = Team::factory()->create([\n 'crm_id' => 1,\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create([\n 'name' => 'Search Name',\n ]);\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->deleteJson(route('api.saved_search.delete', $search->id_string))\n ->assertStatus(200)\n ->assertJson([]);\n\n $this->assertDatabaseMissing('activity_searches', [\n 'user_id' => $user->id,\n ]);\n\n $this->assertDatabaseMissing('activity_search_filters', [\n 'activity_search_id' => $search->id,\n ]);\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"1","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Component\\ActivitySearch\\FilterDefinition;\n\nuse Illuminate\\Support\\Collection;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinitionQuery;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinitionQueryCollection;\nuse Jiminny\\Contracts\\ActivitySearch\\ValidatedFilterDefinitionInterface;\nuse Jiminny\\Contracts\\Repositories\\UserRepository;\nuse Jiminny\\Models;\nuse Jiminny\\Models\\Feature\\FeatureEnum;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Traits\\RequiresUUID;\nuse Elastica\\Query;\n\nfinal class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefinitionInterface\n{\n private const int NO_GROUP_ID = 999;\n private UserRepository $userRepository;\n\n public function __construct(UserRepository $userRepository)\n {\n $this->userRepository = $userRepository;\n }\n\n public function shouldApplyQueries(): bool\n {\n return count($this->getValue()) > 0;\n }\n\n public function getQueries(): FilterDefinitionQueryCollection\n {\n $userIds = $this->getValue();\n\n return FilterDefinitionQueryCollection::make([\n FilterDefinitionQuery::instance()\n ->setQuery(new Query\\Terms('coachingFeedbacks.coach.id_string', $userIds))\n ->setPath('coachingFeedbacks.coach', 'coachingFeedbacks'),\n ]);\n }\n\n public function toArray(): array\n {\n return [\n 'id' => 'coaching-feedback-user-filter',\n 'label' => 'Coach',\n 'helpText' => 'The person who completed the Coaching Framework',\n 'placeholder' => 'Search coaches',\n 'inputType' => InputTypeEnum::DROPDOWN_MULTIPLE,\n 'queryParam' => 'coaching_feedback_coach_id',\n 'options' => $this->getOptions(),\n 'groupLabelKey' => 'label',\n 'groupValuesKey' => 'users',\n 'optionLabelKey' => 'name',\n 'optionValueKey' => 'id',\n 'value' => $this->getValue(),\n ];\n }\n\n private function getOptions(): array\n {\n $user = $this->executedBy;\n $query = $user\n ->getTeam()\n ->users()\n ->whereNotIn(\n 'uuid',\n $this->userRepository->findInaccessibleDeactivatedUserUuids($user)\n ->map(static fn (string $uuid): string => RequiresUUID::toOptimized($uuid))\n ->all(),\n )\n ->orderBy('name');\n\n $users = $query\n ->with('group')\n ->get()\n ->reduce(\n static function (array $carry, Models\\User $user): array {\n $group = $user->getGroup();\n $groupId = $group !== null\n ? $group->getUuid()\n : self::NO_GROUP_ID;\n $groupName = $group !== null\n ? $group->getName()\n : '(NON-GROUPED)';\n\n if (! array_key_exists($groupId, $carry)) {\n $carry[$groupId] = [\n 'label' => $groupName,\n 'users' => [],\n ];\n }\n\n $carry[$groupId]['users'][] = [\n 'id' => $user->getUuid(),\n 'name' => sprintf(\n '%s%s',\n $user->getName(),\n ! $user->isStatusActive()\n ? ' (Inactive)'\n : ''\n ),\n ];\n\n return $carry;\n },\n []\n );\n\n return Collection::make($users)\n ->sortBy('label')\n ->values()\n ->toArray();\n }\n\n public function getValue(): array\n {\n if (! $this->criteria->hasCoachingFeedbackCoachUserIds()) {\n return $this->getDefaultValue();\n }\n\n return array_diff(\n $this->criteria->getCoachingFeedbackCoachUserId(),\n $this->userRepository->findInaccessibleDeactivatedUserUuids($this->executedBy)->all(),\n );\n }\n\n private function getDefaultValue(): array\n {\n return [];\n }\n\n public function getValidationRules(?string $prefix = null): array\n {\n $team = $this->executedBy->getTeam();\n\n return [\n $prefix . 'coaching_feedback_coach_id' => 'array',\n $prefix . 'coaching_feedback_coach_id.*' => 'uuid:users,team_id,' . $team->getId(),\n ];\n }\n\n public function getSortOrder(): int\n {\n return 86;\n }\n\n public function shouldBeIncluded(Team $team): bool\n {\n return $team->hasFeature(FeatureEnum::COACHING_FRAMEWORK);\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Component\\ActivitySearch\\FilterDefinition;\n\nuse Illuminate\\Support\\Collection;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinitionQuery;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinitionQueryCollection;\nuse Jiminny\\Contracts\\ActivitySearch\\ValidatedFilterDefinitionInterface;\nuse Jiminny\\Contracts\\Repositories\\UserRepository;\nuse Jiminny\\Models;\nuse Jiminny\\Models\\Feature\\FeatureEnum;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Traits\\RequiresUUID;\nuse Elastica\\Query;\n\nfinal class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefinitionInterface\n{\n private const int NO_GROUP_ID = 999;\n private UserRepository $userRepository;\n\n public function __construct(UserRepository $userRepository)\n {\n $this->userRepository = $userRepository;\n }\n\n public function shouldApplyQueries(): bool\n {\n return count($this->getValue()) > 0;\n }\n\n public function getQueries(): FilterDefinitionQueryCollection\n {\n $userIds = $this->getValue();\n\n return FilterDefinitionQueryCollection::make([\n FilterDefinitionQuery::instance()\n ->setQuery(new Query\\Terms('coachingFeedbacks.coach.id_string', $userIds))\n ->setPath('coachingFeedbacks.coach', 'coachingFeedbacks'),\n ]);\n }\n\n public function toArray(): array\n {\n return [\n 'id' => 'coaching-feedback-user-filter',\n 'label' => 'Coach',\n 'helpText' => 'The person who completed the Coaching Framework',\n 'placeholder' => 'Search coaches',\n 'inputType' => InputTypeEnum::DROPDOWN_MULTIPLE,\n 'queryParam' => 'coaching_feedback_coach_id',\n 'options' => $this->getOptions(),\n 'groupLabelKey' => 'label',\n 'groupValuesKey' => 'users',\n 'optionLabelKey' => 'name',\n 'optionValueKey' => 'id',\n 'value' => $this->getValue(),\n ];\n }\n\n private function getOptions(): array\n {\n $user = $this->executedBy;\n $query = $user\n ->getTeam()\n ->users()\n ->whereNotIn(\n 'uuid',\n $this->userRepository->findInaccessibleDeactivatedUserUuids($user)\n ->map(static fn (string $uuid): string => RequiresUUID::toOptimized($uuid))\n ->all(),\n )\n ->orderBy('name');\n\n $users = $query\n ->with('group')\n ->get()\n ->reduce(\n static function (array $carry, Models\\User $user): array {\n $group = $user->getGroup();\n $groupId = $group !== null\n ? $group->getUuid()\n : self::NO_GROUP_ID;\n $groupName = $group !== null\n ? $group->getName()\n : '(NON-GROUPED)';\n\n if (! array_key_exists($groupId, $carry)) {\n $carry[$groupId] = [\n 'label' => $groupName,\n 'users' => [],\n ];\n }\n\n $carry[$groupId]['users'][] = [\n 'id' => $user->getUuid(),\n 'name' => sprintf(\n '%s%s',\n $user->getName(),\n ! $user->isStatusActive()\n ? ' (Inactive)'\n : ''\n ),\n ];\n\n return $carry;\n },\n []\n );\n\n return Collection::make($users)\n ->sortBy('label')\n ->values()\n ->toArray();\n }\n\n public function getValue(): array\n {\n if (! $this->criteria->hasCoachingFeedbackCoachUserIds()) {\n return $this->getDefaultValue();\n }\n\n return array_diff(\n $this->criteria->getCoachingFeedbackCoachUserId(),\n $this->userRepository->findInaccessibleDeactivatedUserUuids($this->executedBy)->all(),\n );\n }\n\n private function getDefaultValue(): array\n {\n return [];\n }\n\n public function getValidationRules(?string $prefix = null): array\n {\n $team = $this->executedBy->getTeam();\n\n return [\n $prefix . 'coaching_feedback_coach_id' => 'array',\n $prefix . 'coaching_feedback_coach_id.*' => 'uuid:users,team_id,' . $team->getId(),\n ];\n }\n\n public function getSortOrder(): int\n {\n return 86;\n }\n\n public function shouldBeIncluded(Team $team): bool\n {\n return $team->hasFeature(FeatureEnum::COACHING_FRAMEWORK);\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
3827195245788680489
|
-8996616126076344540
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
JY-20676-delete-report-re Project: faVsco.js, menu
JY-20676-delete-report-related-objects, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
3
16
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Tests\Feature\SavedSearches;
use Illuminate\Support\LazyCollection;
use Illuminate\Support\Str;
use Mockery\MockInterface;
use Illuminate\Database\Eloquent\Factories\Sequence;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Illuminate\Support\Facades\Event;
use Illuminate\Testing\Fluent\AssertableJson;
use Jiminny\Events\Nudges\NudgeCreated;
use Jiminny\Models\Activity\Search;
use Jiminny\Models\Activity\SearchFilter;
use Jiminny\Models\Nudge;
use Jiminny\Models\Role;
use Jiminny\Models\Team;
use Jiminny\Models\User;
use Jiminny\Repositories\ElasticActivityRepository;
use Tests\TestCase;
final class SavedSearchCRUDFeatureTest extends TestCase
{
use DatabaseTransactions;
#[\PHPUnit\Framework\Attributes\Test]
public function userCanGetAListOfSavedSearches(): void
{
$this->markTestSkipped('Needs to be fixed');
/** @var Team $team */
$team = Team::factory()->create([
'crm_id' => 1, // temporary
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'status' => User::STATUS_ACTIVE,
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create();
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
$nudges = Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->getJson(route('api.saved_search.index'))
->assertStatus(200)
->assertJson(
fn (AssertableJson $json) =>
$json->has(1)
->first(
fn ($json) =>
$json->where('id', $search->id_string)
->where('name', $search->getName())
->where('filters', ['max_customer_questions' => 5, 'min_engaging_questions' => 3])
->has('nudges', 2)
->has(
'nudges.0',
fn ($json) =>
$json->where('id', $nudges[0]->id_string)
->where('frequency', 'daily')
->where('channel', 'email')
->has('expiresAt')
)
->has(
'nudges.1',
fn ($json) =>
$json->where('id', $nudges[1]->id_string)
->where('frequency', 'weekly')
->where('channel', 'slack')
->has('expiresAt')
)
)
);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanCreateASavedSearchBasedOnActivityFilters(): void
{
$this->markTestSkipped('Needs to be fixed');
Event::fake();
$this->partialMock(ElasticActivityRepository::class, function (MockInterface $mock) {
$mock->shouldReceive('onDemandScroll')
->times(2)
->andReturn(LazyCollection::empty());
});
/** @var Team $team */
$team = Team::factory()->create([
'uuid' => Str::uuid()->toString(),
'crm_id' => 1, // temporary
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->createQuietly([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$this->apiGuardLogin($user);
$this->actingAs($user)
->postJson(route('api.saved_search.create'), [
'name' => '::searchName::',
'filters' => [
'min_duration' => 1,
'only_recorded' => 1,
],
'nudges' => [
[
'frequency' => 'daily',
'channel' => 'email',
'expiresAt' => now()->addWeek()->format('Y-m-d'),
],
[
'frequency' => 'daily',
'channel' => 'slack',
'expiresAt' => now()->addWeek()->format('Y-m-d'),
],
],
])
->assertStatus(200);
$this->assertDatabaseHas('activity_searches', [
'name' => '::searchName::',
'user_id' => $user->id,
]);
$search = $user->searches()->first();
$this->assertDatabaseHas('nudges', [
'activity_search_id' => $search->id,
'frequency' => 2,
'channel' => 2,
]);
$this->assertDatabaseHas('nudges', [
'activity_search_id' => $search->id,
'frequency' => 2,
'channel' => 4,
]);
$this->assertDatabaseHas('activity_search_filters', [
'activity_search_id' => $search->id,
'filter' => 'min_duration',
'value' => 1,
]);
$this->assertDatabaseHas('activity_search_filters', [
'activity_search_id' => $search->id,
'filter' => 'only_recorded',
'value' => 1,
]);
Event::assertDispatched(NudgeCreated::class, 2);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanUpdateASavedSearchBasedOnActivityFilters(): void
{
/** @var Team $team */
$team = Team::factory()->createQuietly([
'uuid' => Str::uuid()->toString(),
'crm_id' => 1,
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create([
'name' => 'Search Name',
]);
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->putJson(route('api.saved_search.update', $search->id_string), [
'name' => 'Updated Search Name',
])->assertOk()
->assertJson([]);
$this->assertDatabaseMissing('activity_searches', [
'name' => 'Search Name',
'user_id' => $user->id,
]);
$this->assertDatabaseHas('activity_searches', [
'name' => 'Updated Search Name',
'user_id' => $user->id,
]);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanDeleteASavedSearch(): void
{
/** @var Team $team */
$team = Team::factory()->create([
'crm_id' => 1,
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create([
'name' => 'Search Name',
]);
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->deleteJson(route('api.saved_search.delete', $search->id_string))
->assertStatus(200)
->assertJson([]);
$this->assertDatabaseMissing('activity_searches', [
'user_id' => $user->id,
]);
$this->assertDatabaseMissing('activity_search_filters', [
'activity_search_id' => $search->id,
]);
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
1
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Component\ActivitySearch\FilterDefinition;
use Illuminate\Support\Collection;
use Jiminny\Component\ActivitySearch\FilterDefinition;
use Jiminny\Component\ActivitySearch\FilterDefinitionQuery;
use Jiminny\Component\ActivitySearch\FilterDefinitionQueryCollection;
use Jiminny\Contracts\ActivitySearch\ValidatedFilterDefinitionInterface;
use Jiminny\Contracts\Repositories\UserRepository;
use Jiminny\Models;
use Jiminny\Models\Feature\FeatureEnum;
use Jiminny\Models\Team;
use Jiminny\Traits\RequiresUUID;
use Elastica\Query;
final class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefinitionInterface
{
private const int NO_GROUP_ID = 999;
private UserRepository $userRepository;
public function __construct(UserRepository $userRepository)
{
$this->userRepository = $userRepository;
}
public function shouldApplyQueries(): bool
{
return count($this->getValue()) > 0;
}
public function getQueries(): FilterDefinitionQueryCollection
{
$userIds = $this->getValue();
return FilterDefinitionQueryCollection::make([
FilterDefinitionQuery::instance()
->setQuery(new Query\Terms('coachingFeedbacks.coach.id_string', $userIds))
->setPath('coachingFeedbacks.coach', 'coachingFeedbacks'),
]);
}
public function toArray(): array
{
return [
'id' => 'coaching-feedback-user-filter',
'label' => 'Coach',
'helpText' => 'The person who completed the Coaching Framework',
'placeholder' => 'Search coaches',
'inputType' => InputTypeEnum::DROPDOWN_MULTIPLE,
'queryParam' => 'coaching_feedback_coach_id',
'options' => $this->getOptions(),
'groupLabelKey' => 'label',
'groupValuesKey' => 'users',
'optionLabelKey' => 'name',
'optionValueKey' => 'id',
'value' => $this->getValue(),
];
}
private function getOptions(): array
{
$user = $this->executedBy;
$query = $user
->getTeam()
->users()
->whereNotIn(
'uuid',
$this->userRepository->findInaccessibleDeactivatedUserUuids($user)
->map(static fn (string $uuid): string => RequiresUUID::toOptimized($uuid))
->all(),
)
->orderBy('name');
$users = $query
->with('group')
->get()
->reduce(
static function (array $carry, Models\User $user): array {
$group = $user->getGroup();
$groupId = $group !== null
? $group->getUuid()
: self::NO_GROUP_ID;
$groupName = $group !== null
? $group->getName()
: '(NON-GROUPED)';
if (! array_key_exists($groupId, $carry)) {
$carry[$groupId] = [
'label' => $groupName,
'users' => [],
];
}
$carry[$groupId]['users'][] = [
'id' => $user->getUuid(),
'name' => sprintf(
'%s%s',
$user->getName(),
! $user->isStatusActive()
? ' (Inactive)'
: ''
),
];
return $carry;
},
[]
);
return Collection::make($users)
->sortBy('label')
->values()
->toArray();
}
public function getValue(): array
{
if (! $this->criteria->hasCoachingFeedbackCoachUserIds()) {
return $this->getDefaultValue();
}
return array_diff(
$this->criteria->getCoachingFeedbackCoachUserId(),
$this->userRepository->findInaccessibleDeactivatedUserUuids($this->executedBy)->all(),
);
}
private function getDefaultValue(): array
{
return [];
}
public function getValidationRules(?string $prefix = null): array
{
$team = $this->executedBy->getTeam();
return [
$prefix . 'coaching_feedback_coach_id' => 'array',
$prefix . 'coaching_feedback_coach_id.*' => 'uuid:users,team_id,' . $team->getId(),
];
}
public function getSortOrder(): int
{
return 86;
}
public function shouldBeIncluded(Team $team): bool
{
return $team->hasFeature(FeatureEnum::COACHING_FRAMEWORK);
}
}
Project
Project
New File or Directory…...
|
56388
|
NULL
|
NULL
|
NULL
|
|
56390
|
1967
|
6
|
2026-05-19T08:05:06.989757+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-19/1779 /Users/lukas/.screenpipe/data/data/2026-05-19/1779177906989_m2.jpg...
|
PhpStorm
|
faVsco.js – SavedSearchCRUDFeatureTest.php
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20676-delete-report-re Project: faVsco.js, menu
JY-20676-delete-report-related-objects, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
3
16
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Tests\Feature\SavedSearches;
use Illuminate\Support\LazyCollection;
use Illuminate\Support\Str;
use Mockery\MockInterface;
use Illuminate\Database\Eloquent\Factories\Sequence;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Illuminate\Support\Facades\Event;
use Illuminate\Testing\Fluent\AssertableJson;
use Jiminny\Events\Nudges\NudgeCreated;
use Jiminny\Models\Activity\Search;
use Jiminny\Models\Activity\SearchFilter;
use Jiminny\Models\Nudge;
use Jiminny\Models\Role;
use Jiminny\Models\Team;
use Jiminny\Models\User;
use Jiminny\Repositories\ElasticActivityRepository;
use Tests\TestCase;
final class SavedSearchCRUDFeatureTest extends TestCase
{
use DatabaseTransactions;
#[\PHPUnit\Framework\Attributes\Test]
public function userCanGetAListOfSavedSearches(): void
{
$this->markTestSkipped('Needs to be fixed');
/** @var Team $team */
$team = Team::factory()->create([
'crm_id' => 1, // temporary
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'status' => User::STATUS_ACTIVE,
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create();
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
$nudges = Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->getJson(route('api.saved_search.index'))
->assertStatus(200)
->assertJson(
fn (AssertableJson $json) =>
$json->has(1)
->first(
fn ($json) =>
$json->where('id', $search->id_string)
->where('name', $search->getName())
->where('filters', ['max_customer_questions' => 5, 'min_engaging_questions' => 3])
->has('nudges', 2)
->has(
'nudges.0',
fn ($json) =>
$json->where('id', $nudges[0]->id_string)
->where('frequency', 'daily')
->where('channel', 'email')
->has('expiresAt')
)
->has(
'nudges.1',
fn ($json) =>
$json->where('id', $nudges[1]->id_string)
->where('frequency', 'weekly')
->where('channel', 'slack')
->has('expiresAt')
)
)
);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanCreateASavedSearchBasedOnActivityFilters(): void
{
$this->markTestSkipped('Needs to be fixed');
Event::fake();
$this->partialMock(ElasticActivityRepository::class, function (MockInterface $mock) {
$mock->shouldReceive('onDemandScroll')
->times(2)
->andReturn(LazyCollection::empty());
});
/** @var Team $team */
$team = Team::factory()->create([
'uuid' => Str::uuid()->toString(),
'crm_id' => 1, // temporary
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->createQuietly([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$this->apiGuardLogin($user);
$this->actingAs($user)
->postJson(route('api.saved_search.create'), [
'name' => '::searchName::',
'filters' => [
'min_duration' => 1,
'only_recorded' => 1,
],
'nudges' => [
[
'frequency' => 'daily',
'channel' => 'email',
'expiresAt' => now()->addWeek()->format('Y-m-d'),
],
[
'frequency' => 'daily',
'channel' => 'slack',
'expiresAt' => now()->addWeek()->format('Y-m-d'),
],
],
])
->assertStatus(200);
$this->assertDatabaseHas('activity_searches', [
'name' => '::searchName::',
'user_id' => $user->id,
]);
$search = $user->searches()->first();
$this->assertDatabaseHas('nudges', [
'activity_search_id' => $search->id,
'frequency' => 2,
'channel' => 2,
]);
$this->assertDatabaseHas('nudges', [
'activity_search_id' => $search->id,
'frequency' => 2,
'channel' => 4,
]);
$this->assertDatabaseHas('activity_search_filters', [
'activity_search_id' => $search->id,
'filter' => 'min_duration',
'value' => 1,
]);
$this->assertDatabaseHas('activity_search_filters', [
'activity_search_id' => $search->id,
'filter' => 'only_recorded',
'value' => 1,
]);
Event::assertDispatched(NudgeCreated::class, 2);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanUpdateASavedSearchBasedOnActivityFilters(): void
{
/** @var Team $team */
$team = Team::factory()->createQuietly([
'uuid' => Str::uuid()->toString(),
'crm_id' => 1,
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create([
'name' => 'Search Name',
]);
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->putJson(route('api.saved_search.update', $search->id_string), [
'name' => 'Updated Search Name',
])->assertOk()
->assertJson([]);
$this->assertDatabaseMissing('activity_searches', [
'name' => 'Search Name',
'user_id' => $user->id,
]);
$this->assertDatabaseHas('activity_searches', [
'name' => 'Updated Search Name',
'user_id' => $user->id,
]);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanDeleteASavedSearch(): void
{
/** @var Team $team */
$team = Team::factory()->create([
'crm_id' => 1,
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create([
'name' => 'Search Name',
]);
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->deleteJson(route('api.saved_search.delete', $search->id_string))
->assertStatus(200)
->assertJson([]);
$this->assertDatabaseMissing('activity_searches', [
'user_id' => $user->id,
]);
$this->assertDatabaseMissing('activity_search_filters', [
'activity_search_id' => $search->id,
]);
}
}...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20676-delete-report-related-objects, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.098071806,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: JY-20676-delete-report-related-objects","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.8081782,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceTest","depth":6,"bounds":{"left":0.8234708,"top":0.019952115,"width":0.09208777,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"bounds":{"left":0.9155585,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest'","depth":6,"bounds":{"left":0.9268617,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"bounds":{"left":0.9381649,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"bounds":{"left":0.96609044,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"bounds":{"left":0.9773936,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"bounds":{"left":0.9886968,"top":0.019952115,"width":0.011303186,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"3","depth":4,"bounds":{"left":0.390625,"top":0.22426178,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"16","depth":4,"bounds":{"left":0.4005984,"top":0.22426178,"width":0.009640957,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.4119016,"top":0.22266561,"width":0.00731383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.4192154,"top":0.22266561,"width":0.006981383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\nnamespace Tests\\Feature\\SavedSearches;\n\nuse Illuminate\\Support\\LazyCollection;\nuse Illuminate\\Support\\Str;\nuse Mockery\\MockInterface;\nuse Illuminate\\Database\\Eloquent\\Factories\\Sequence;\nuse Illuminate\\Foundation\\Testing\\DatabaseTransactions;\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\Testing\\Fluent\\AssertableJson;\nuse Jiminny\\Events\\Nudges\\NudgeCreated;\nuse Jiminny\\Models\\Activity\\Search;\nuse Jiminny\\Models\\Activity\\SearchFilter;\nuse Jiminny\\Models\\Nudge;\nuse Jiminny\\Models\\Role;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\ElasticActivityRepository;\nuse Tests\\TestCase;\n\nfinal class SavedSearchCRUDFeatureTest extends TestCase\n{\n use DatabaseTransactions;\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanGetAListOfSavedSearches(): void\n {\n $this->markTestSkipped('Needs to be fixed');\n /** @var Team $team */\n $team = Team::factory()->create([\n 'crm_id' => 1, // temporary\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'status' => User::STATUS_ACTIVE,\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create();\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n $nudges = Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->getJson(route('api.saved_search.index'))\n ->assertStatus(200)\n ->assertJson(\n fn (AssertableJson $json) =>\n $json->has(1)\n ->first(\n fn ($json) =>\n $json->where('id', $search->id_string)\n ->where('name', $search->getName())\n ->where('filters', ['max_customer_questions' => 5, 'min_engaging_questions' => 3])\n ->has('nudges', 2)\n ->has(\n 'nudges.0',\n fn ($json) =>\n $json->where('id', $nudges[0]->id_string)\n ->where('frequency', 'daily')\n ->where('channel', 'email')\n ->has('expiresAt')\n )\n ->has(\n 'nudges.1',\n fn ($json) =>\n $json->where('id', $nudges[1]->id_string)\n ->where('frequency', 'weekly')\n ->where('channel', 'slack')\n ->has('expiresAt')\n )\n )\n );\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanCreateASavedSearchBasedOnActivityFilters(): void\n {\n $this->markTestSkipped('Needs to be fixed');\n\n Event::fake();\n\n $this->partialMock(ElasticActivityRepository::class, function (MockInterface $mock) {\n $mock->shouldReceive('onDemandScroll')\n ->times(2)\n ->andReturn(LazyCollection::empty());\n });\n\n /** @var Team $team */\n $team = Team::factory()->create([\n 'uuid' => Str::uuid()->toString(),\n 'crm_id' => 1, // temporary\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->createQuietly([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->postJson(route('api.saved_search.create'), [\n 'name' => '::searchName::',\n 'filters' => [\n 'min_duration' => 1,\n 'only_recorded' => 1,\n ],\n 'nudges' => [\n [\n 'frequency' => 'daily',\n 'channel' => 'email',\n 'expiresAt' => now()->addWeek()->format('Y-m-d'),\n ],\n [\n 'frequency' => 'daily',\n 'channel' => 'slack',\n 'expiresAt' => now()->addWeek()->format('Y-m-d'),\n ],\n ],\n ])\n ->assertStatus(200);\n\n $this->assertDatabaseHas('activity_searches', [\n 'name' => '::searchName::',\n 'user_id' => $user->id,\n ]);\n\n $search = $user->searches()->first();\n\n $this->assertDatabaseHas('nudges', [\n 'activity_search_id' => $search->id,\n 'frequency' => 2,\n 'channel' => 2,\n ]);\n\n $this->assertDatabaseHas('nudges', [\n 'activity_search_id' => $search->id,\n 'frequency' => 2,\n 'channel' => 4,\n ]);\n\n $this->assertDatabaseHas('activity_search_filters', [\n 'activity_search_id' => $search->id,\n 'filter' => 'min_duration',\n 'value' => 1,\n ]);\n\n $this->assertDatabaseHas('activity_search_filters', [\n 'activity_search_id' => $search->id,\n 'filter' => 'only_recorded',\n 'value' => 1,\n ]);\n\n Event::assertDispatched(NudgeCreated::class, 2);\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanUpdateASavedSearchBasedOnActivityFilters(): void\n {\n /** @var Team $team */\n $team = Team::factory()->createQuietly([\n 'uuid' => Str::uuid()->toString(),\n 'crm_id' => 1,\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create([\n 'name' => 'Search Name',\n ]);\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->putJson(route('api.saved_search.update', $search->id_string), [\n 'name' => 'Updated Search Name',\n ])->assertOk()\n ->assertJson([]);\n\n $this->assertDatabaseMissing('activity_searches', [\n 'name' => 'Search Name',\n 'user_id' => $user->id,\n ]);\n\n $this->assertDatabaseHas('activity_searches', [\n 'name' => 'Updated Search Name',\n 'user_id' => $user->id,\n ]);\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanDeleteASavedSearch(): void\n {\n /** @var Team $team */\n $team = Team::factory()->create([\n 'crm_id' => 1,\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create([\n 'name' => 'Search Name',\n ]);\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->deleteJson(route('api.saved_search.delete', $search->id_string))\n ->assertStatus(200)\n ->assertJson([]);\n\n $this->assertDatabaseMissing('activity_searches', [\n 'user_id' => $user->id,\n ]);\n\n $this->assertDatabaseMissing('activity_search_filters', [\n 'activity_search_id' => $search->id,\n ]);\n }\n}","depth":4,"bounds":{"left":0.15990691,"top":0.0,"width":0.2662899,"height":0.49162012},"on_screen":true,"value":"<?php\n\nnamespace Tests\\Feature\\SavedSearches;\n\nuse Illuminate\\Support\\LazyCollection;\nuse Illuminate\\Support\\Str;\nuse Mockery\\MockInterface;\nuse Illuminate\\Database\\Eloquent\\Factories\\Sequence;\nuse Illuminate\\Foundation\\Testing\\DatabaseTransactions;\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\Testing\\Fluent\\AssertableJson;\nuse Jiminny\\Events\\Nudges\\NudgeCreated;\nuse Jiminny\\Models\\Activity\\Search;\nuse Jiminny\\Models\\Activity\\SearchFilter;\nuse Jiminny\\Models\\Nudge;\nuse Jiminny\\Models\\Role;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\ElasticActivityRepository;\nuse Tests\\TestCase;\n\nfinal class SavedSearchCRUDFeatureTest extends TestCase\n{\n use DatabaseTransactions;\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanGetAListOfSavedSearches(): void\n {\n $this->markTestSkipped('Needs to be fixed');\n /** @var Team $team */\n $team = Team::factory()->create([\n 'crm_id' => 1, // temporary\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'status' => User::STATUS_ACTIVE,\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create();\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n $nudges = Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->getJson(route('api.saved_search.index'))\n ->assertStatus(200)\n ->assertJson(\n fn (AssertableJson $json) =>\n $json->has(1)\n ->first(\n fn ($json) =>\n $json->where('id', $search->id_string)\n ->where('name', $search->getName())\n ->where('filters', ['max_customer_questions' => 5, 'min_engaging_questions' => 3])\n ->has('nudges', 2)\n ->has(\n 'nudges.0',\n fn ($json) =>\n $json->where('id', $nudges[0]->id_string)\n ->where('frequency', 'daily')\n ->where('channel', 'email')\n ->has('expiresAt')\n )\n ->has(\n 'nudges.1',\n fn ($json) =>\n $json->where('id', $nudges[1]->id_string)\n ->where('frequency', 'weekly')\n ->where('channel', 'slack')\n ->has('expiresAt')\n )\n )\n );\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanCreateASavedSearchBasedOnActivityFilters(): void\n {\n $this->markTestSkipped('Needs to be fixed');\n\n Event::fake();\n\n $this->partialMock(ElasticActivityRepository::class, function (MockInterface $mock) {\n $mock->shouldReceive('onDemandScroll')\n ->times(2)\n ->andReturn(LazyCollection::empty());\n });\n\n /** @var Team $team */\n $team = Team::factory()->create([\n 'uuid' => Str::uuid()->toString(),\n 'crm_id' => 1, // temporary\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->createQuietly([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->postJson(route('api.saved_search.create'), [\n 'name' => '::searchName::',\n 'filters' => [\n 'min_duration' => 1,\n 'only_recorded' => 1,\n ],\n 'nudges' => [\n [\n 'frequency' => 'daily',\n 'channel' => 'email',\n 'expiresAt' => now()->addWeek()->format('Y-m-d'),\n ],\n [\n 'frequency' => 'daily',\n 'channel' => 'slack',\n 'expiresAt' => now()->addWeek()->format('Y-m-d'),\n ],\n ],\n ])\n ->assertStatus(200);\n\n $this->assertDatabaseHas('activity_searches', [\n 'name' => '::searchName::',\n 'user_id' => $user->id,\n ]);\n\n $search = $user->searches()->first();\n\n $this->assertDatabaseHas('nudges', [\n 'activity_search_id' => $search->id,\n 'frequency' => 2,\n 'channel' => 2,\n ]);\n\n $this->assertDatabaseHas('nudges', [\n 'activity_search_id' => $search->id,\n 'frequency' => 2,\n 'channel' => 4,\n ]);\n\n $this->assertDatabaseHas('activity_search_filters', [\n 'activity_search_id' => $search->id,\n 'filter' => 'min_duration',\n 'value' => 1,\n ]);\n\n $this->assertDatabaseHas('activity_search_filters', [\n 'activity_search_id' => $search->id,\n 'filter' => 'only_recorded',\n 'value' => 1,\n ]);\n\n Event::assertDispatched(NudgeCreated::class, 2);\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanUpdateASavedSearchBasedOnActivityFilters(): void\n {\n /** @var Team $team */\n $team = Team::factory()->createQuietly([\n 'uuid' => Str::uuid()->toString(),\n 'crm_id' => 1,\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create([\n 'name' => 'Search Name',\n ]);\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->putJson(route('api.saved_search.update', $search->id_string), [\n 'name' => 'Updated Search Name',\n ])->assertOk()\n ->assertJson([]);\n\n $this->assertDatabaseMissing('activity_searches', [\n 'name' => 'Search Name',\n 'user_id' => $user->id,\n ]);\n\n $this->assertDatabaseHas('activity_searches', [\n 'name' => 'Updated Search Name',\n 'user_id' => $user->id,\n ]);\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanDeleteASavedSearch(): void\n {\n /** @var Team $team */\n $team = Team::factory()->create([\n 'crm_id' => 1,\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create([\n 'name' => 'Search Name',\n ]);\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->deleteJson(route('api.saved_search.delete', $search->id_string))\n ->assertStatus(200)\n ->assertJson([]);\n\n $this->assertDatabaseMissing('activity_searches', [\n 'user_id' => $user->id,\n ]);\n\n $this->assertDatabaseMissing('activity_search_filters', [\n 'activity_search_id' => $search->id,\n ]);\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
1356238323261734672
|
-8996598804339809755
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
JY-20676-delete-report-re Project: faVsco.js, menu
JY-20676-delete-report-related-objects, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
3
16
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Tests\Feature\SavedSearches;
use Illuminate\Support\LazyCollection;
use Illuminate\Support\Str;
use Mockery\MockInterface;
use Illuminate\Database\Eloquent\Factories\Sequence;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Illuminate\Support\Facades\Event;
use Illuminate\Testing\Fluent\AssertableJson;
use Jiminny\Events\Nudges\NudgeCreated;
use Jiminny\Models\Activity\Search;
use Jiminny\Models\Activity\SearchFilter;
use Jiminny\Models\Nudge;
use Jiminny\Models\Role;
use Jiminny\Models\Team;
use Jiminny\Models\User;
use Jiminny\Repositories\ElasticActivityRepository;
use Tests\TestCase;
final class SavedSearchCRUDFeatureTest extends TestCase
{
use DatabaseTransactions;
#[\PHPUnit\Framework\Attributes\Test]
public function userCanGetAListOfSavedSearches(): void
{
$this->markTestSkipped('Needs to be fixed');
/** @var Team $team */
$team = Team::factory()->create([
'crm_id' => 1, // temporary
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'status' => User::STATUS_ACTIVE,
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create();
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
$nudges = Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->getJson(route('api.saved_search.index'))
->assertStatus(200)
->assertJson(
fn (AssertableJson $json) =>
$json->has(1)
->first(
fn ($json) =>
$json->where('id', $search->id_string)
->where('name', $search->getName())
->where('filters', ['max_customer_questions' => 5, 'min_engaging_questions' => 3])
->has('nudges', 2)
->has(
'nudges.0',
fn ($json) =>
$json->where('id', $nudges[0]->id_string)
->where('frequency', 'daily')
->where('channel', 'email')
->has('expiresAt')
)
->has(
'nudges.1',
fn ($json) =>
$json->where('id', $nudges[1]->id_string)
->where('frequency', 'weekly')
->where('channel', 'slack')
->has('expiresAt')
)
)
);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanCreateASavedSearchBasedOnActivityFilters(): void
{
$this->markTestSkipped('Needs to be fixed');
Event::fake();
$this->partialMock(ElasticActivityRepository::class, function (MockInterface $mock) {
$mock->shouldReceive('onDemandScroll')
->times(2)
->andReturn(LazyCollection::empty());
});
/** @var Team $team */
$team = Team::factory()->create([
'uuid' => Str::uuid()->toString(),
'crm_id' => 1, // temporary
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->createQuietly([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$this->apiGuardLogin($user);
$this->actingAs($user)
->postJson(route('api.saved_search.create'), [
'name' => '::searchName::',
'filters' => [
'min_duration' => 1,
'only_recorded' => 1,
],
'nudges' => [
[
'frequency' => 'daily',
'channel' => 'email',
'expiresAt' => now()->addWeek()->format('Y-m-d'),
],
[
'frequency' => 'daily',
'channel' => 'slack',
'expiresAt' => now()->addWeek()->format('Y-m-d'),
],
],
])
->assertStatus(200);
$this->assertDatabaseHas('activity_searches', [
'name' => '::searchName::',
'user_id' => $user->id,
]);
$search = $user->searches()->first();
$this->assertDatabaseHas('nudges', [
'activity_search_id' => $search->id,
'frequency' => 2,
'channel' => 2,
]);
$this->assertDatabaseHas('nudges', [
'activity_search_id' => $search->id,
'frequency' => 2,
'channel' => 4,
]);
$this->assertDatabaseHas('activity_search_filters', [
'activity_search_id' => $search->id,
'filter' => 'min_duration',
'value' => 1,
]);
$this->assertDatabaseHas('activity_search_filters', [
'activity_search_id' => $search->id,
'filter' => 'only_recorded',
'value' => 1,
]);
Event::assertDispatched(NudgeCreated::class, 2);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanUpdateASavedSearchBasedOnActivityFilters(): void
{
/** @var Team $team */
$team = Team::factory()->createQuietly([
'uuid' => Str::uuid()->toString(),
'crm_id' => 1,
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create([
'name' => 'Search Name',
]);
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->putJson(route('api.saved_search.update', $search->id_string), [
'name' => 'Updated Search Name',
])->assertOk()
->assertJson([]);
$this->assertDatabaseMissing('activity_searches', [
'name' => 'Search Name',
'user_id' => $user->id,
]);
$this->assertDatabaseHas('activity_searches', [
'name' => 'Updated Search Name',
'user_id' => $user->id,
]);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanDeleteASavedSearch(): void
{
/** @var Team $team */
$team = Team::factory()->create([
'crm_id' => 1,
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create([
'name' => 'Search Name',
]);
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->deleteJson(route('api.saved_search.delete', $search->id_string))
->assertStatus(200)
->assertJson([]);
$this->assertDatabaseMissing('activity_searches', [
'user_id' => $user->id,
]);
$this->assertDatabaseMissing('activity_search_filters', [
'activity_search_id' => $search->id,
]);
}
}...
|
56387
|
NULL
|
NULL
|
NULL
|
|
56393
|
1967
|
7
|
2026-05-19T08:05:07.829118+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-19/1779 /Users/lukas/.screenpipe/data/data/2026-05-19/1779177907829_m2.jpg...
|
PhpStorm
|
faVsco.js – SavedSearchCRUDFeatureTest.php
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhostormProiectINavicareCodeKeractorTOOISFV faVsco PhostormProiectINavicareCodeKeractorTOOISFV faVsco.js?9 JY-20676-delete-report-related-objectsC) AutomatedReport.onp© AskAnythingPromptServiceTest.php= laravel.log4 SF jiminny@localhost]4 HS_local [jiminny@localhost]& console [PROD]# console [euy- ActivtvaskAnvihind est.ono© SavedSearchCRUDFeatureTest.php X© AskAnythingPromptDto.phpA console [STAGING]© CoachingFeedbackCoachUserln.php Xe) -xooricontro||erRateLimit est.onoC) FakeProphetClient.ohv> _ Midd ewareRequestsl Interactionsa InvitationsIHlobsIn ListenersD Mcp© BaseService.phpfinal class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefini~C SoftPhoneManager.phpC) RoleAttr.png© ScimProvisioning.php() ListenerRoleCannotHaveAdminOrMa() RoleAttrTest.php29 6tpublic function shouldApplyQueries: bool{...}ListenerRoleCannotHaveAdminOrManagerPermissionRule.phpC)Activity/Close/Service.php© Activity/RingCentral/Service.php34 6t >public function getQueries: FilterDefinitionQueryCollection{...}© SyncActivity.php© Crm/Close/Service.php(C) TextMessaqingService.phpfinal class SavedSearchCRUDFeatureTest extends TestCaseA3416 ^ v45 6toublic function toArravo: arrav..."194 D >public function userCanUpdateASavedSearchBasedOnActivityFilters: void{...}M NotificationsD OrganizationSettingsW rlayllstsD Policies( RepositoriesC RulesC SavedSearchesSavedSearchCRUDFeatureTest.php› C Search_ serviceProviders1 usaad257 D >#Phrun1c rramework Accribuces lescpublic function userCanDeleteASavedSearch: void{...}private function getOptions(): array(...}118public function getValue: arrayt...- 1311 usage8 files 400-7 )=131135136 €t>private function getDefaultValue: arrayt...Ask anvthina (4D1public function getValidationRules(?string $prefix = null): arrayf...}+ <> Code Claude Opus 4.7 MediumConsole XLoo Xv Changes 16 files=.env.local appActivityController.php app/Http/Controllers/APl© AskAnythingPrompt.php app/Models/AskAnything© AskAnvthinaPromptDto.php app/Component/AskAnvthina/Dtos© AskAnvthinaPromptService.php app/Component/AskAnvthina@ AskAnvthinaPromptServiceTest.php tests/Unit/Component/AskAnvthinaSide-by-side viewerDo not ignore5604af40 app/Http/Controllers/API/ActivityController.phpX Ba |?Current versionpublic function deleteActivitySearch(Request Srequest, Search $search): JsonResponsepublic function deleteActivitySearch(Request Srequest, Search $search): JsonResponseSthis-sauthonize("deletel Scpanch)-Sthis-sauthonize("deletel Sceanch)C) AskJiminnvRevortsController.ono aoo/Htto/Controlllers/APVN2// Orpan any AutomatedReports that use this searciC) Constants.ono apo/Comoonent/SClMISsearch->automatedReports->withTrashed->update(['activity_search_id' => null]):@ CoreUser.php app/DTO/SCIMIAAD/ResponseC) CoreUserRequest.ono aoo/DTO/SCIMIAAD/[EMAIL] apn/Console/Commandsphp loadina.nho confial@ ScimProvisionina.nhn ann/Comnonent/SCIM// Delete filters and the search itself// Disable andany AutomatedReports that use this searchSsearch->automatedReports->withTrashed->update(['activity_search_id' => null,letatuci = folcossearch-rilters->delete/I Delete filters and the search itself(C) Search.oho aon/Models/ActivitvlSsearch->filters->deleteO:@) SoftPhoneManager.ohn ann/Comnonent/Twilio/Conference/ConferenceManadSsearch->deleteo© TextMessagingService.php app/Services/TelephonyUInvorcionod Ciloc 12 filoc• suppont Dally • In 3n 0om100% 5• Tue 19 May 11:05:07U AskJiminnyReportActivityServiceTest vCascadeAsk Jiminny Report M+0 ..mocd → null, "status → Talsel3. loggle validationrtsController.php: 126-169 — In toggleStatus(), when enabled=true and the report is an Ask Jiminnyreport, returns 422 lt elther activity search 1d or ask anything prompt 1d is nult . Disabling is always allowed.4. TestsAskAnythingPromptServiceTest.php - Updated two existing update() mock expectations to match the new payload ( ['aPer your rules i did not add unit tests for the controller. The existing SavedSearchCRUDFeatureTest covers the searchdelete tlow: backend service test covers promot delete pavload.* Reject allAccent all•01.1ditterenceloc for other lanquades (todav 10-00)WN Windsurf Toams 214-1UTF.8Po 4 spaces...
|
NULL
|
-6279436345858547285
|
NULL
|
click
|
ocr
|
NULL
|
PhostormProiectINavicareCodeKeractorTOOISFV faVsco PhostormProiectINavicareCodeKeractorTOOISFV faVsco.js?9 JY-20676-delete-report-related-objectsC) AutomatedReport.onp© AskAnythingPromptServiceTest.php= laravel.log4 SF jiminny@localhost]4 HS_local [jiminny@localhost]& console [PROD]# console [euy- ActivtvaskAnvihind est.ono© SavedSearchCRUDFeatureTest.php X© AskAnythingPromptDto.phpA console [STAGING]© CoachingFeedbackCoachUserln.php Xe) -xooricontro||erRateLimit est.onoC) FakeProphetClient.ohv> _ Midd ewareRequestsl Interactionsa InvitationsIHlobsIn ListenersD Mcp© BaseService.phpfinal class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefini~C SoftPhoneManager.phpC) RoleAttr.png© ScimProvisioning.php() ListenerRoleCannotHaveAdminOrMa() RoleAttrTest.php29 6tpublic function shouldApplyQueries: bool{...}ListenerRoleCannotHaveAdminOrManagerPermissionRule.phpC)Activity/Close/Service.php© Activity/RingCentral/Service.php34 6t >public function getQueries: FilterDefinitionQueryCollection{...}© SyncActivity.php© Crm/Close/Service.php(C) TextMessaqingService.phpfinal class SavedSearchCRUDFeatureTest extends TestCaseA3416 ^ v45 6toublic function toArravo: arrav..."194 D >public function userCanUpdateASavedSearchBasedOnActivityFilters: void{...}M NotificationsD OrganizationSettingsW rlayllstsD Policies( RepositoriesC RulesC SavedSearchesSavedSearchCRUDFeatureTest.php› C Search_ serviceProviders1 usaad257 D >#Phrun1c rramework Accribuces lescpublic function userCanDeleteASavedSearch: void{...}private function getOptions(): array(...}118public function getValue: arrayt...- 1311 usage8 files 400-7 )=131135136 €t>private function getDefaultValue: arrayt...Ask anvthina (4D1public function getValidationRules(?string $prefix = null): arrayf...}+ <> Code Claude Opus 4.7 MediumConsole XLoo Xv Changes 16 files=.env.local appActivityController.php app/Http/Controllers/APl© AskAnythingPrompt.php app/Models/AskAnything© AskAnvthinaPromptDto.php app/Component/AskAnvthina/Dtos© AskAnvthinaPromptService.php app/Component/AskAnvthina@ AskAnvthinaPromptServiceTest.php tests/Unit/Component/AskAnvthinaSide-by-side viewerDo not ignore5604af40 app/Http/Controllers/API/ActivityController.phpX Ba |?Current versionpublic function deleteActivitySearch(Request Srequest, Search $search): JsonResponsepublic function deleteActivitySearch(Request Srequest, Search $search): JsonResponseSthis-sauthonize("deletel Scpanch)-Sthis-sauthonize("deletel Sceanch)C) AskJiminnvRevortsController.ono aoo/Htto/Controlllers/APVN2// Orpan any AutomatedReports that use this searciC) Constants.ono apo/Comoonent/SClMISsearch->automatedReports->withTrashed->update(['activity_search_id' => null]):@ CoreUser.php app/DTO/SCIMIAAD/ResponseC) CoreUserRequest.ono aoo/DTO/SCIMIAAD/[EMAIL] apn/Console/Commandsphp loadina.nho confial@ ScimProvisionina.nhn ann/Comnonent/SCIM// Delete filters and the search itself// Disable andany AutomatedReports that use this searchSsearch->automatedReports->withTrashed->update(['activity_search_id' => null,letatuci = folcossearch-rilters->delete/I Delete filters and the search itself(C) Search.oho aon/Models/ActivitvlSsearch->filters->deleteO:@) SoftPhoneManager.ohn ann/Comnonent/Twilio/Conference/ConferenceManadSsearch->deleteo© TextMessagingService.php app/Services/TelephonyUInvorcionod Ciloc 12 filoc• suppont Dally • In 3n 0om100% 5• Tue 19 May 11:05:07U AskJiminnyReportActivityServiceTest vCascadeAsk Jiminny Report M+0 ..mocd → null, "status → Talsel3. loggle validationrtsController.php: 126-169 — In toggleStatus(), when enabled=true and the report is an Ask Jiminnyreport, returns 422 lt elther activity search 1d or ask anything prompt 1d is nult . Disabling is always allowed.4. TestsAskAnythingPromptServiceTest.php - Updated two existing update() mock expectations to match the new payload ( ['aPer your rules i did not add unit tests for the controller. The existing SavedSearchCRUDFeatureTest covers the searchdelete tlow: backend service test covers promot delete pavload.* Reject allAccent all•01.1ditterenceloc for other lanquades (todav 10-00)WN Windsurf Toams 214-1UTF.8Po 4 spaces...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
56391
|
1966
|
6
|
2026-05-19T08:05:07.853282+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-19/1779 /Users/lukas/.screenpipe/data/data/2026-05-19/1779177907853_m1.jpg...
|
PhpStorm
|
faVsco.js – SavedSearchCRUDFeatureTest.php
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
SlackFileEditViewGoHistoryWindowHelpAPPDOCKER• ₴1D SlackFileEditViewGoHistoryWindowHelpAPPDOCKER• ₴1DEV (-zsh)₴82app/Jobs/Crm/MatchActivityCrmData.phpapp/Jobs/Middleware/HandleHubspotRateLimit.phpAPP (-zst47++++++p42++++++*app/Mcp/Servers/JiminnyServer.phpapp/Mcp/Tools/GetMeTool.php157++++++•app/Models/Feature/FeatureEnum.phpapp/Services/Activity/HubSpot/ProviderResolver.php+-app/Services/Activity/HubSpot/ProviderResolverInterface.phpapp/Services/Activity/HubSpot/Providers/Provider.phpapp/Services/Activity/HubSpot/Providers/ProviderKixie.php+-app/Services/Activity/HubSpot/Providers/Provider0rum.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilio.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilioFlex.phpapp/Services/Activity/HubSpot/Service.phpapp/Services/Crm/Hubspot/Client.phpapp/Services/Crm/Hubspot/HubspotClientInterface.phpapp/Services/Crm/Hubspot/Pagination/HubspotPaginationService.phpapp/Services/Crm/Hubspot/Pagination/PaginationState.phpdatabase/migrations/2026_05_13_124153_create_mcp_feature_flag.phptests/Feature/Mcp/GetMeToolFeatureTest.phptests/Feature/Mcp/ListCallsToolFeatureTest.phptests/Feature/Mcp/McpTestHelpersTrait.phptests/Unit/Component/ES/ChunkSizeTest.phptests/Unit/Component/ES/Processor/DT0s/SelectionListTest.phptests/Unit/Component/ES/Processor/TargetEntitiesSelectorTest.phptests/Unit/Component/MeetingBot/Service/ParticipantMatcherTest.phptests/Unit/Exceptions/RateLimitExceptionTest.phptests/Unit/Jobs/Crm/MatchActivityCrmDataTest.phptests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phptests/Unit/Services/Activity/HubSpot/ServiceTest.phptests/Unit/Services/Crm/Hubspot/ClientTest.phptests/Unit/Services/Crm/Hubspot/Pagination/HubspotPaginationServiceTest.php97++++++-132++++++•15++++++21++++--2+-25++++++.140++++++-2+-19++++++50++++++-27++++++139++++++-6856++++++-+-151++++++-109++++++-250++++++-283++++++=37 files changed, 1587 insertions(+), 344 deletions(-)create mode 100644 app/Component/ES/ChunkSize.phpcreate mode 100644 app/Jobs/Middleware/HandleHubspotRateLimit.phpcreate mode 100644 app/Mcp/Tools/GetMeTool.phpcreate mode 100644 database/migrations/2026_05_13_124153_create_mcp_feature_flag.phpcreate mode 100644 tests/Feature/Mcp/GetMeToolFeatureTest.phpcreate mode 100644 tests/Unit/Component/ES/ChunkSizeTest.phpcreate mode 100644 tests/Unit/Exceptions/RateLimitExceptionTest.phpcreate mode 100644 tests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phplukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pullAlready up to date.lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20676-delete-reSwitched to a new branch 'JY-20676-delete-report-related-objects'lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20676-delete-report-related-obEDHomeDMsActivityFilesLaterMoreJiminny ...# Jiminny-Dg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of_jimi...• Direct messages€. Vasil VasilevP.. Nikolay Yankov%. Galya Dimitrova L. Aneliya Angelovaão Stefka StoyanovaStoyan Tomovd Todor Stamatov "Kd. Mario GeorgievNikolay Ivanovdo James Graham2 Stoyan TanevRo Steliyan GeorgievLukas Kovalik y…..AppsJira CloudToastSupport Daily - in 3 h 55 m100% <7Tue 19 May 11:05:07Describe what you are looking for# the_people_of jimi...8 426 0• MessagesQ Files+Stefka Stoyanov:Today ~Hі Eteam,I wanted to share that our Lead Developer llianKyuchukov has decided to move on from Jiminny topursue a new opportunity. While we're really sad tosee them go, we're also excited for him and thisnext chapter in his professional journey.llian's last working day will be 14 July, so we stillhave some time together before then. Over thecoming weeks, please make the most of hisknowledge, experience, and context so we canensure a smooth transition across the team.It's hard to overstate the impact llian has had here- from shaping the product and solving toughproblems to supporting teammates and helpingbuild the product we have today. We re incrediblygrateful for everything he contributed over this 2years he was with & engineering team.Just wanted to share the news openly witheveryone and say a huge thanks to llian foreverything so far. Vou Please join me in wishing himall the very best for what comes next.We start looking for a Full-Stack Software Engineer,so if you know anyone you believe will fit, pleasecontact me or Mira directly A687Message #the_people_of_jiminny+...
|
NULL
|
-3195253849953379698
|
NULL
|
click
|
ocr
|
NULL
|
SlackFileEditViewGoHistoryWindowHelpAPPDOCKER• ₴1D SlackFileEditViewGoHistoryWindowHelpAPPDOCKER• ₴1DEV (-zsh)₴82app/Jobs/Crm/MatchActivityCrmData.phpapp/Jobs/Middleware/HandleHubspotRateLimit.phpAPP (-zst47++++++p42++++++*app/Mcp/Servers/JiminnyServer.phpapp/Mcp/Tools/GetMeTool.php157++++++•app/Models/Feature/FeatureEnum.phpapp/Services/Activity/HubSpot/ProviderResolver.php+-app/Services/Activity/HubSpot/ProviderResolverInterface.phpapp/Services/Activity/HubSpot/Providers/Provider.phpapp/Services/Activity/HubSpot/Providers/ProviderKixie.php+-app/Services/Activity/HubSpot/Providers/Provider0rum.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilio.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilioFlex.phpapp/Services/Activity/HubSpot/Service.phpapp/Services/Crm/Hubspot/Client.phpapp/Services/Crm/Hubspot/HubspotClientInterface.phpapp/Services/Crm/Hubspot/Pagination/HubspotPaginationService.phpapp/Services/Crm/Hubspot/Pagination/PaginationState.phpdatabase/migrations/2026_05_13_124153_create_mcp_feature_flag.phptests/Feature/Mcp/GetMeToolFeatureTest.phptests/Feature/Mcp/ListCallsToolFeatureTest.phptests/Feature/Mcp/McpTestHelpersTrait.phptests/Unit/Component/ES/ChunkSizeTest.phptests/Unit/Component/ES/Processor/DT0s/SelectionListTest.phptests/Unit/Component/ES/Processor/TargetEntitiesSelectorTest.phptests/Unit/Component/MeetingBot/Service/ParticipantMatcherTest.phptests/Unit/Exceptions/RateLimitExceptionTest.phptests/Unit/Jobs/Crm/MatchActivityCrmDataTest.phptests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phptests/Unit/Services/Activity/HubSpot/ServiceTest.phptests/Unit/Services/Crm/Hubspot/ClientTest.phptests/Unit/Services/Crm/Hubspot/Pagination/HubspotPaginationServiceTest.php97++++++-132++++++•15++++++21++++--2+-25++++++.140++++++-2+-19++++++50++++++-27++++++139++++++-6856++++++-+-151++++++-109++++++-250++++++-283++++++=37 files changed, 1587 insertions(+), 344 deletions(-)create mode 100644 app/Component/ES/ChunkSize.phpcreate mode 100644 app/Jobs/Middleware/HandleHubspotRateLimit.phpcreate mode 100644 app/Mcp/Tools/GetMeTool.phpcreate mode 100644 database/migrations/2026_05_13_124153_create_mcp_feature_flag.phpcreate mode 100644 tests/Feature/Mcp/GetMeToolFeatureTest.phpcreate mode 100644 tests/Unit/Component/ES/ChunkSizeTest.phpcreate mode 100644 tests/Unit/Exceptions/RateLimitExceptionTest.phpcreate mode 100644 tests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phplukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pullAlready up to date.lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20676-delete-reSwitched to a new branch 'JY-20676-delete-report-related-objects'lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20676-delete-report-related-obEDHomeDMsActivityFilesLaterMoreJiminny ...# Jiminny-Dg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of_jimi...• Direct messages€. Vasil VasilevP.. Nikolay Yankov%. Galya Dimitrova L. Aneliya Angelovaão Stefka StoyanovaStoyan Tomovd Todor Stamatov "Kd. Mario GeorgievNikolay Ivanovdo James Graham2 Stoyan TanevRo Steliyan GeorgievLukas Kovalik y…..AppsJira CloudToastSupport Daily - in 3 h 55 m100% <7Tue 19 May 11:05:07Describe what you are looking for# the_people_of jimi...8 426 0• MessagesQ Files+Stefka Stoyanov:Today ~Hі Eteam,I wanted to share that our Lead Developer llianKyuchukov has decided to move on from Jiminny topursue a new opportunity. While we're really sad tosee them go, we're also excited for him and thisnext chapter in his professional journey.llian's last working day will be 14 July, so we stillhave some time together before then. Over thecoming weeks, please make the most of hisknowledge, experience, and context so we canensure a smooth transition across the team.It's hard to overstate the impact llian has had here- from shaping the product and solving toughproblems to supporting teammates and helpingbuild the product we have today. We re incrediblygrateful for everything he contributed over this 2years he was with & engineering team.Just wanted to share the news openly witheveryone and say a huge thanks to llian foreverything so far. Vou Please join me in wishing himall the very best for what comes next.We start looking for a Full-Stack Software Engineer,so if you know anyone you believe will fit, pleasecontact me or Mira directly A687Message #the_people_of_jiminny+...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
56392
|
1966
|
7
|
2026-05-19T08:05:09.381279+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-19/1779 /Users/lukas/.screenpipe/data/data/2026-05-19/1779177909381_m1.jpg...
|
PhpStorm
|
faVsco.js – SavedSearchCRUDFeatureTest.php
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20676-delete-report-re Project: faVsco.js, menu
JY-20676-delete-report-related-objects, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
3
16
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Tests\Feature\SavedSearches;
use Illuminate\Support\LazyCollection;
use Illuminate\Support\Str;
use Mockery\MockInterface;
use Illuminate\Database\Eloquent\Factories\Sequence;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Illuminate\Support\Facades\Event;
use Illuminate\Testing\Fluent\AssertableJson;
use Jiminny\Events\Nudges\NudgeCreated;
use Jiminny\Models\Activity\Search;
use Jiminny\Models\Activity\SearchFilter;
use Jiminny\Models\Nudge;
use Jiminny\Models\Role;
use Jiminny\Models\Team;
use Jiminny\Models\User;
use Jiminny\Repositories\ElasticActivityRepository;
use Tests\TestCase;
final class SavedSearchCRUDFeatureTest extends TestCase
{
use DatabaseTransactions;
#[\PHPUnit\Framework\Attributes\Test]
public function userCanGetAListOfSavedSearches(): void
{
$this->markTestSkipped('Needs to be fixed');
/** @var Team $team */
$team = Team::factory()->create([
'crm_id' => 1, // temporary
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'status' => User::STATUS_ACTIVE,
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create();
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
$nudges = Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->getJson(route('api.saved_search.index'))
->assertStatus(200)
->assertJson(
fn (AssertableJson $json) =>
$json->has(1)
->first(
fn ($json) =>
$json->where('id', $search->id_string)
->where('name', $search->getName())
->where('filters', ['max_customer_questions' => 5, 'min_engaging_questions' => 3])
->has('nudges', 2)
->has(
'nudges.0',
fn ($json) =>
$json->where('id', $nudges[0]->id_string)
->where('frequency', 'daily')
->where('channel', 'email')
->has('expiresAt')
)
->has(
'nudges.1',
fn ($json) =>
$json->where('id', $nudges[1]->id_string)
->where('frequency', 'weekly')
->where('channel', 'slack')
->has('expiresAt')
)
)
);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanCreateASavedSearchBasedOnActivityFilters(): void
{
$this->markTestSkipped('Needs to be fixed');
Event::fake();
$this->partialMock(ElasticActivityRepository::class, function (MockInterface $mock) {
$mock->shouldReceive('onDemandScroll')
->times(2)
->andReturn(LazyCollection::empty());
});
/** @var Team $team */
$team = Team::factory()->create([
'uuid' => Str::uuid()->toString(),
'crm_id' => 1, // temporary
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->createQuietly([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$this->apiGuardLogin($user);
$this->actingAs($user)
->postJson(route('api.saved_search.create'), [
'name' => '::searchName::',
'filters' => [
'min_duration' => 1,
'only_recorded' => 1,
],
'nudges' => [
[
'frequency' => 'daily',
'channel' => 'email',
'expiresAt' => now()->addWeek()->format('Y-m-d'),
],
[
'frequency' => 'daily',
'channel' => 'slack',
'expiresAt' => now()->addWeek()->format('Y-m-d'),
],
],
])
->assertStatus(200);
$this->assertDatabaseHas('activity_searches', [
'name' => '::searchName::',
'user_id' => $user->id,
]);
$search = $user->searches()->first();
$this->assertDatabaseHas('nudges', [
'activity_search_id' => $search->id,
'frequency' => 2,
'channel' => 2,
]);
$this->assertDatabaseHas('nudges', [
'activity_search_id' => $search->id,
'frequency' => 2,
'channel' => 4,
]);
$this->assertDatabaseHas('activity_search_filters', [
'activity_search_id' => $search->id,
'filter' => 'min_duration',
'value' => 1,
]);
$this->assertDatabaseHas('activity_search_filters', [
'activity_search_id' => $search->id,
'filter' => 'only_recorded',
'value' => 1,
]);
Event::assertDispatched(NudgeCreated::class, 2);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanUpdateASavedSearchBasedOnActivityFilters(): void
{
/** @var Team $team */
$team = Team::factory()->createQuietly([
'uuid' => Str::uuid()->toString(),
'crm_id' => 1,
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create([
'name' => 'Search Name',
]);
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->putJson(route('api.saved_search.update', $search->id_string), [
'name' => 'Updated Search Name',
])->assertOk()
->assertJson([]);
$this->assertDatabaseMissing('activity_searches', [
'name' => 'Search Name',
'user_id' => $user->id,
]);
$this->assertDatabaseHas('activity_searches', [
'name' => 'Updated Search Name',
'user_id' => $user->id,
]);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanDeleteASavedSearch(): void
{
/** @var Team $team */
$team = Team::factory()->create([
'crm_id' => 1,
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create([
'name' => 'Search Name',
]);
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->deleteJson(route('api.saved_search.delete', $search->id_string))
->assertStatus(200)
->assertJson([]);
$this->assertDatabaseMissing('activity_searches', [
'user_id' => $user->id,
]);
$this->assertDatabaseMissing('activity_search_filters', [
'activity_search_id' => $search->id,
]);
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
1
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Component\ActivitySearch\FilterDefinition;
use Illuminate\Support\Collection;
use Jiminny\Component\ActivitySearch\FilterDefinition;
use Jiminny\Component\ActivitySearch\FilterDefinitionQuery;
use Jiminny\Component\ActivitySearch\FilterDefinitionQueryCollection;
use Jiminny\Contracts\ActivitySearch\ValidatedFilterDefinitionInterface;
use Jiminny\Contracts\Repositories\UserRepository;
use Jiminny\Models;
use Jiminny\Models\Feature\FeatureEnum;
use Jiminny\Models\Team;
use Jiminny\Traits\RequiresUUID;
use Elastica\Query;
final class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefinitionInterface
{
private const int NO_GROUP_ID = 999;
private UserRepository $userRepository;
public function __construct(UserRepository $userRepository)
{
$this->userRepository = $userRepository;
}
public function shouldApplyQueries(): bool
{
return count($this->getValue()) > 0;
}
public function getQueries(): FilterDefinitionQueryCollection
{
$userIds = $this->getValue();
return FilterDefinitionQueryCollection::make([
FilterDefinitionQuery::instance()
->setQuery(new Query\Terms('coachingFeedbacks.coach.id_string', $userIds))
->setPath('coachingFeedbacks.coach', 'coachingFeedbacks'),
]);
}
public function toArray(): array
{
return [
'id' => 'coaching-feedback-user-filter',
'label' => 'Coach',
'helpText' => 'The person who completed the Coaching Framework',
'placeholder' => 'Search coaches',
'inputType' => InputTypeEnum::DROPDOWN_MULTIPLE,
'queryParam' => 'coaching_feedback_coach_id',
'options' => $this->getOptions(),
'groupLabelKey' => 'label',
'groupValuesKey' => 'users',
'optionLabelKey' => 'name',
'optionValueKey' => 'id',
'value' => $this->getValue(),
];
}
private function getOptions(): array
{
$user = $this->executedBy;
$query = $user
->getTeam()
->users()
->whereNotIn(
'uuid',
$this->userRepository->findInaccessibleDeactivatedUserUuids($user)
->map(static fn (string $uuid): string => RequiresUUID::toOptimized($uuid))
->all(),
)
->orderBy('name');
$users = $query
->with('group')
->get()
->reduce(
static function (array $carry, Models\User $user): array {
$group = $user->getGroup();
$groupId = $group !== null
? $group->getUuid()
: self::NO_GROUP_ID;
$groupName = $group !== null
? $group->getName()
: '(NON-GROUPED)';
if (! array_key_exists($groupId, $carry)) {
$carry[$groupId] = [
'label' => $groupName,
'users' => [],
];
}
$carry[$groupId]['users'][] = [
'id' => $user->getUuid(),
'name' => sprintf(
'%s%s',
$user->getName(),
! $user->isStatusActive()
? ' (Inactive)'
: ''
),
];
return $carry;
},
[]
);
return Collection::make($users)
->sortBy('label')
->values()
->toArray();
}
public function getValue(): array
{
if (! $this->criteria->hasCoachingFeedbackCoachUserIds()) {
return $this->getDefaultValue();
}
return array_diff(
$this->criteria->getCoachingFeedbackCoachUserId(),
$this->userRepository->findInaccessibleDeactivatedUserUuids($this->executedBy)->all(),
);
}
private function getDefaultValue(): array
{
return [];
}
public function getValidationRules(?string $prefix = null): array
{
$team = $this->executedBy->getTeam();
return [
$prefix . 'coaching_feedback_coach_id' => 'array',
$prefix . 'coaching_feedback_coach_id.*' => 'uuid:users,team_id,' . $team->getId(),
];
}
public function getSortOrder(): int
{
return 86;
}
public function shouldBeIncluded(Team $team): bool
{
return $team->hasFeature(FeatureEnum::COACHING_FRAMEWORK);
}
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20676-delete-report-related-objects, menu","depth":5,"on_screen":true,"help_text":"Git Branch: JY-20676-delete-report-related-objects","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceTest","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"3","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.016666668,"height":0.02111111},"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"16","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.02013889,"height":0.02111111},"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\nnamespace Tests\\Feature\\SavedSearches;\n\nuse Illuminate\\Support\\LazyCollection;\nuse Illuminate\\Support\\Str;\nuse Mockery\\MockInterface;\nuse Illuminate\\Database\\Eloquent\\Factories\\Sequence;\nuse Illuminate\\Foundation\\Testing\\DatabaseTransactions;\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\Testing\\Fluent\\AssertableJson;\nuse Jiminny\\Events\\Nudges\\NudgeCreated;\nuse Jiminny\\Models\\Activity\\Search;\nuse Jiminny\\Models\\Activity\\SearchFilter;\nuse Jiminny\\Models\\Nudge;\nuse Jiminny\\Models\\Role;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\ElasticActivityRepository;\nuse Tests\\TestCase;\n\nfinal class SavedSearchCRUDFeatureTest extends TestCase\n{\n use DatabaseTransactions;\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanGetAListOfSavedSearches(): void\n {\n $this->markTestSkipped('Needs to be fixed');\n /** @var Team $team */\n $team = Team::factory()->create([\n 'crm_id' => 1, // temporary\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'status' => User::STATUS_ACTIVE,\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create();\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n $nudges = Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->getJson(route('api.saved_search.index'))\n ->assertStatus(200)\n ->assertJson(\n fn (AssertableJson $json) =>\n $json->has(1)\n ->first(\n fn ($json) =>\n $json->where('id', $search->id_string)\n ->where('name', $search->getName())\n ->where('filters', ['max_customer_questions' => 5, 'min_engaging_questions' => 3])\n ->has('nudges', 2)\n ->has(\n 'nudges.0',\n fn ($json) =>\n $json->where('id', $nudges[0]->id_string)\n ->where('frequency', 'daily')\n ->where('channel', 'email')\n ->has('expiresAt')\n )\n ->has(\n 'nudges.1',\n fn ($json) =>\n $json->where('id', $nudges[1]->id_string)\n ->where('frequency', 'weekly')\n ->where('channel', 'slack')\n ->has('expiresAt')\n )\n )\n );\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanCreateASavedSearchBasedOnActivityFilters(): void\n {\n $this->markTestSkipped('Needs to be fixed');\n\n Event::fake();\n\n $this->partialMock(ElasticActivityRepository::class, function (MockInterface $mock) {\n $mock->shouldReceive('onDemandScroll')\n ->times(2)\n ->andReturn(LazyCollection::empty());\n });\n\n /** @var Team $team */\n $team = Team::factory()->create([\n 'uuid' => Str::uuid()->toString(),\n 'crm_id' => 1, // temporary\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->createQuietly([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->postJson(route('api.saved_search.create'), [\n 'name' => '::searchName::',\n 'filters' => [\n 'min_duration' => 1,\n 'only_recorded' => 1,\n ],\n 'nudges' => [\n [\n 'frequency' => 'daily',\n 'channel' => 'email',\n 'expiresAt' => now()->addWeek()->format('Y-m-d'),\n ],\n [\n 'frequency' => 'daily',\n 'channel' => 'slack',\n 'expiresAt' => now()->addWeek()->format('Y-m-d'),\n ],\n ],\n ])\n ->assertStatus(200);\n\n $this->assertDatabaseHas('activity_searches', [\n 'name' => '::searchName::',\n 'user_id' => $user->id,\n ]);\n\n $search = $user->searches()->first();\n\n $this->assertDatabaseHas('nudges', [\n 'activity_search_id' => $search->id,\n 'frequency' => 2,\n 'channel' => 2,\n ]);\n\n $this->assertDatabaseHas('nudges', [\n 'activity_search_id' => $search->id,\n 'frequency' => 2,\n 'channel' => 4,\n ]);\n\n $this->assertDatabaseHas('activity_search_filters', [\n 'activity_search_id' => $search->id,\n 'filter' => 'min_duration',\n 'value' => 1,\n ]);\n\n $this->assertDatabaseHas('activity_search_filters', [\n 'activity_search_id' => $search->id,\n 'filter' => 'only_recorded',\n 'value' => 1,\n ]);\n\n Event::assertDispatched(NudgeCreated::class, 2);\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanUpdateASavedSearchBasedOnActivityFilters(): void\n {\n /** @var Team $team */\n $team = Team::factory()->createQuietly([\n 'uuid' => Str::uuid()->toString(),\n 'crm_id' => 1,\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create([\n 'name' => 'Search Name',\n ]);\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->putJson(route('api.saved_search.update', $search->id_string), [\n 'name' => 'Updated Search Name',\n ])->assertOk()\n ->assertJson([]);\n\n $this->assertDatabaseMissing('activity_searches', [\n 'name' => 'Search Name',\n 'user_id' => $user->id,\n ]);\n\n $this->assertDatabaseHas('activity_searches', [\n 'name' => 'Updated Search Name',\n 'user_id' => $user->id,\n ]);\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanDeleteASavedSearch(): void\n {\n /** @var Team $team */\n $team = Team::factory()->create([\n 'crm_id' => 1,\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create([\n 'name' => 'Search Name',\n ]);\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->deleteJson(route('api.saved_search.delete', $search->id_string))\n ->assertStatus(200)\n ->assertJson([]);\n\n $this->assertDatabaseMissing('activity_searches', [\n 'user_id' => $user->id,\n ]);\n\n $this->assertDatabaseMissing('activity_search_filters', [\n 'activity_search_id' => $search->id,\n ]);\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\nnamespace Tests\\Feature\\SavedSearches;\n\nuse Illuminate\\Support\\LazyCollection;\nuse Illuminate\\Support\\Str;\nuse Mockery\\MockInterface;\nuse Illuminate\\Database\\Eloquent\\Factories\\Sequence;\nuse Illuminate\\Foundation\\Testing\\DatabaseTransactions;\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\Testing\\Fluent\\AssertableJson;\nuse Jiminny\\Events\\Nudges\\NudgeCreated;\nuse Jiminny\\Models\\Activity\\Search;\nuse Jiminny\\Models\\Activity\\SearchFilter;\nuse Jiminny\\Models\\Nudge;\nuse Jiminny\\Models\\Role;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\ElasticActivityRepository;\nuse Tests\\TestCase;\n\nfinal class SavedSearchCRUDFeatureTest extends TestCase\n{\n use DatabaseTransactions;\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanGetAListOfSavedSearches(): void\n {\n $this->markTestSkipped('Needs to be fixed');\n /** @var Team $team */\n $team = Team::factory()->create([\n 'crm_id' => 1, // temporary\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'status' => User::STATUS_ACTIVE,\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create();\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n $nudges = Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->getJson(route('api.saved_search.index'))\n ->assertStatus(200)\n ->assertJson(\n fn (AssertableJson $json) =>\n $json->has(1)\n ->first(\n fn ($json) =>\n $json->where('id', $search->id_string)\n ->where('name', $search->getName())\n ->where('filters', ['max_customer_questions' => 5, 'min_engaging_questions' => 3])\n ->has('nudges', 2)\n ->has(\n 'nudges.0',\n fn ($json) =>\n $json->where('id', $nudges[0]->id_string)\n ->where('frequency', 'daily')\n ->where('channel', 'email')\n ->has('expiresAt')\n )\n ->has(\n 'nudges.1',\n fn ($json) =>\n $json->where('id', $nudges[1]->id_string)\n ->where('frequency', 'weekly')\n ->where('channel', 'slack')\n ->has('expiresAt')\n )\n )\n );\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanCreateASavedSearchBasedOnActivityFilters(): void\n {\n $this->markTestSkipped('Needs to be fixed');\n\n Event::fake();\n\n $this->partialMock(ElasticActivityRepository::class, function (MockInterface $mock) {\n $mock->shouldReceive('onDemandScroll')\n ->times(2)\n ->andReturn(LazyCollection::empty());\n });\n\n /** @var Team $team */\n $team = Team::factory()->create([\n 'uuid' => Str::uuid()->toString(),\n 'crm_id' => 1, // temporary\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->createQuietly([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->postJson(route('api.saved_search.create'), [\n 'name' => '::searchName::',\n 'filters' => [\n 'min_duration' => 1,\n 'only_recorded' => 1,\n ],\n 'nudges' => [\n [\n 'frequency' => 'daily',\n 'channel' => 'email',\n 'expiresAt' => now()->addWeek()->format('Y-m-d'),\n ],\n [\n 'frequency' => 'daily',\n 'channel' => 'slack',\n 'expiresAt' => now()->addWeek()->format('Y-m-d'),\n ],\n ],\n ])\n ->assertStatus(200);\n\n $this->assertDatabaseHas('activity_searches', [\n 'name' => '::searchName::',\n 'user_id' => $user->id,\n ]);\n\n $search = $user->searches()->first();\n\n $this->assertDatabaseHas('nudges', [\n 'activity_search_id' => $search->id,\n 'frequency' => 2,\n 'channel' => 2,\n ]);\n\n $this->assertDatabaseHas('nudges', [\n 'activity_search_id' => $search->id,\n 'frequency' => 2,\n 'channel' => 4,\n ]);\n\n $this->assertDatabaseHas('activity_search_filters', [\n 'activity_search_id' => $search->id,\n 'filter' => 'min_duration',\n 'value' => 1,\n ]);\n\n $this->assertDatabaseHas('activity_search_filters', [\n 'activity_search_id' => $search->id,\n 'filter' => 'only_recorded',\n 'value' => 1,\n ]);\n\n Event::assertDispatched(NudgeCreated::class, 2);\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanUpdateASavedSearchBasedOnActivityFilters(): void\n {\n /** @var Team $team */\n $team = Team::factory()->createQuietly([\n 'uuid' => Str::uuid()->toString(),\n 'crm_id' => 1,\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create([\n 'name' => 'Search Name',\n ]);\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->putJson(route('api.saved_search.update', $search->id_string), [\n 'name' => 'Updated Search Name',\n ])->assertOk()\n ->assertJson([]);\n\n $this->assertDatabaseMissing('activity_searches', [\n 'name' => 'Search Name',\n 'user_id' => $user->id,\n ]);\n\n $this->assertDatabaseHas('activity_searches', [\n 'name' => 'Updated Search Name',\n 'user_id' => $user->id,\n ]);\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanDeleteASavedSearch(): void\n {\n /** @var Team $team */\n $team = Team::factory()->create([\n 'crm_id' => 1,\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create([\n 'name' => 'Search Name',\n ]);\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->deleteJson(route('api.saved_search.delete', $search->id_string))\n ->assertStatus(200)\n ->assertJson([]);\n\n $this->assertDatabaseMissing('activity_searches', [\n 'user_id' => $user->id,\n ]);\n\n $this->assertDatabaseMissing('activity_search_filters', [\n 'activity_search_id' => $search->id,\n ]);\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"1","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Component\\ActivitySearch\\FilterDefinition;\n\nuse Illuminate\\Support\\Collection;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinitionQuery;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinitionQueryCollection;\nuse Jiminny\\Contracts\\ActivitySearch\\ValidatedFilterDefinitionInterface;\nuse Jiminny\\Contracts\\Repositories\\UserRepository;\nuse Jiminny\\Models;\nuse Jiminny\\Models\\Feature\\FeatureEnum;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Traits\\RequiresUUID;\nuse Elastica\\Query;\n\nfinal class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefinitionInterface\n{\n private const int NO_GROUP_ID = 999;\n private UserRepository $userRepository;\n\n public function __construct(UserRepository $userRepository)\n {\n $this->userRepository = $userRepository;\n }\n\n public function shouldApplyQueries(): bool\n {\n return count($this->getValue()) > 0;\n }\n\n public function getQueries(): FilterDefinitionQueryCollection\n {\n $userIds = $this->getValue();\n\n return FilterDefinitionQueryCollection::make([\n FilterDefinitionQuery::instance()\n ->setQuery(new Query\\Terms('coachingFeedbacks.coach.id_string', $userIds))\n ->setPath('coachingFeedbacks.coach', 'coachingFeedbacks'),\n ]);\n }\n\n public function toArray(): array\n {\n return [\n 'id' => 'coaching-feedback-user-filter',\n 'label' => 'Coach',\n 'helpText' => 'The person who completed the Coaching Framework',\n 'placeholder' => 'Search coaches',\n 'inputType' => InputTypeEnum::DROPDOWN_MULTIPLE,\n 'queryParam' => 'coaching_feedback_coach_id',\n 'options' => $this->getOptions(),\n 'groupLabelKey' => 'label',\n 'groupValuesKey' => 'users',\n 'optionLabelKey' => 'name',\n 'optionValueKey' => 'id',\n 'value' => $this->getValue(),\n ];\n }\n\n private function getOptions(): array\n {\n $user = $this->executedBy;\n $query = $user\n ->getTeam()\n ->users()\n ->whereNotIn(\n 'uuid',\n $this->userRepository->findInaccessibleDeactivatedUserUuids($user)\n ->map(static fn (string $uuid): string => RequiresUUID::toOptimized($uuid))\n ->all(),\n )\n ->orderBy('name');\n\n $users = $query\n ->with('group')\n ->get()\n ->reduce(\n static function (array $carry, Models\\User $user): array {\n $group = $user->getGroup();\n $groupId = $group !== null\n ? $group->getUuid()\n : self::NO_GROUP_ID;\n $groupName = $group !== null\n ? $group->getName()\n : '(NON-GROUPED)';\n\n if (! array_key_exists($groupId, $carry)) {\n $carry[$groupId] = [\n 'label' => $groupName,\n 'users' => [],\n ];\n }\n\n $carry[$groupId]['users'][] = [\n 'id' => $user->getUuid(),\n 'name' => sprintf(\n '%s%s',\n $user->getName(),\n ! $user->isStatusActive()\n ? ' (Inactive)'\n : ''\n ),\n ];\n\n return $carry;\n },\n []\n );\n\n return Collection::make($users)\n ->sortBy('label')\n ->values()\n ->toArray();\n }\n\n public function getValue(): array\n {\n if (! $this->criteria->hasCoachingFeedbackCoachUserIds()) {\n return $this->getDefaultValue();\n }\n\n return array_diff(\n $this->criteria->getCoachingFeedbackCoachUserId(),\n $this->userRepository->findInaccessibleDeactivatedUserUuids($this->executedBy)->all(),\n );\n }\n\n private function getDefaultValue(): array\n {\n return [];\n }\n\n public function getValidationRules(?string $prefix = null): array\n {\n $team = $this->executedBy->getTeam();\n\n return [\n $prefix . 'coaching_feedback_coach_id' => 'array',\n $prefix . 'coaching_feedback_coach_id.*' => 'uuid:users,team_id,' . $team->getId(),\n ];\n }\n\n public function getSortOrder(): int\n {\n return 86;\n }\n\n public function shouldBeIncluded(Team $team): bool\n {\n return $team->hasFeature(FeatureEnum::COACHING_FRAMEWORK);\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Component\\ActivitySearch\\FilterDefinition;\n\nuse Illuminate\\Support\\Collection;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinitionQuery;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinitionQueryCollection;\nuse Jiminny\\Contracts\\ActivitySearch\\ValidatedFilterDefinitionInterface;\nuse Jiminny\\Contracts\\Repositories\\UserRepository;\nuse Jiminny\\Models;\nuse Jiminny\\Models\\Feature\\FeatureEnum;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Traits\\RequiresUUID;\nuse Elastica\\Query;\n\nfinal class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefinitionInterface\n{\n private const int NO_GROUP_ID = 999;\n private UserRepository $userRepository;\n\n public function __construct(UserRepository $userRepository)\n {\n $this->userRepository = $userRepository;\n }\n\n public function shouldApplyQueries(): bool\n {\n return count($this->getValue()) > 0;\n }\n\n public function getQueries(): FilterDefinitionQueryCollection\n {\n $userIds = $this->getValue();\n\n return FilterDefinitionQueryCollection::make([\n FilterDefinitionQuery::instance()\n ->setQuery(new Query\\Terms('coachingFeedbacks.coach.id_string', $userIds))\n ->setPath('coachingFeedbacks.coach', 'coachingFeedbacks'),\n ]);\n }\n\n public function toArray(): array\n {\n return [\n 'id' => 'coaching-feedback-user-filter',\n 'label' => 'Coach',\n 'helpText' => 'The person who completed the Coaching Framework',\n 'placeholder' => 'Search coaches',\n 'inputType' => InputTypeEnum::DROPDOWN_MULTIPLE,\n 'queryParam' => 'coaching_feedback_coach_id',\n 'options' => $this->getOptions(),\n 'groupLabelKey' => 'label',\n 'groupValuesKey' => 'users',\n 'optionLabelKey' => 'name',\n 'optionValueKey' => 'id',\n 'value' => $this->getValue(),\n ];\n }\n\n private function getOptions(): array\n {\n $user = $this->executedBy;\n $query = $user\n ->getTeam()\n ->users()\n ->whereNotIn(\n 'uuid',\n $this->userRepository->findInaccessibleDeactivatedUserUuids($user)\n ->map(static fn (string $uuid): string => RequiresUUID::toOptimized($uuid))\n ->all(),\n )\n ->orderBy('name');\n\n $users = $query\n ->with('group')\n ->get()\n ->reduce(\n static function (array $carry, Models\\User $user): array {\n $group = $user->getGroup();\n $groupId = $group !== null\n ? $group->getUuid()\n : self::NO_GROUP_ID;\n $groupName = $group !== null\n ? $group->getName()\n : '(NON-GROUPED)';\n\n if (! array_key_exists($groupId, $carry)) {\n $carry[$groupId] = [\n 'label' => $groupName,\n 'users' => [],\n ];\n }\n\n $carry[$groupId]['users'][] = [\n 'id' => $user->getUuid(),\n 'name' => sprintf(\n '%s%s',\n $user->getName(),\n ! $user->isStatusActive()\n ? ' (Inactive)'\n : ''\n ),\n ];\n\n return $carry;\n },\n []\n );\n\n return Collection::make($users)\n ->sortBy('label')\n ->values()\n ->toArray();\n }\n\n public function getValue(): array\n {\n if (! $this->criteria->hasCoachingFeedbackCoachUserIds()) {\n return $this->getDefaultValue();\n }\n\n return array_diff(\n $this->criteria->getCoachingFeedbackCoachUserId(),\n $this->userRepository->findInaccessibleDeactivatedUserUuids($this->executedBy)->all(),\n );\n }\n\n private function getDefaultValue(): array\n {\n return [];\n }\n\n public function getValidationRules(?string $prefix = null): array\n {\n $team = $this->executedBy->getTeam();\n\n return [\n $prefix . 'coaching_feedback_coach_id' => 'array',\n $prefix . 'coaching_feedback_coach_id.*' => 'uuid:users,team_id,' . $team->getId(),\n ];\n }\n\n public function getSortOrder(): int\n {\n return 86;\n }\n\n public function shouldBeIncluded(Team $team): bool\n {\n return $team->hasFeature(FeatureEnum::COACHING_FRAMEWORK);\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
6509625738266471330
|
-8996616125002602716
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
JY-20676-delete-report-re Project: faVsco.js, menu
JY-20676-delete-report-related-objects, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
3
16
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Tests\Feature\SavedSearches;
use Illuminate\Support\LazyCollection;
use Illuminate\Support\Str;
use Mockery\MockInterface;
use Illuminate\Database\Eloquent\Factories\Sequence;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Illuminate\Support\Facades\Event;
use Illuminate\Testing\Fluent\AssertableJson;
use Jiminny\Events\Nudges\NudgeCreated;
use Jiminny\Models\Activity\Search;
use Jiminny\Models\Activity\SearchFilter;
use Jiminny\Models\Nudge;
use Jiminny\Models\Role;
use Jiminny\Models\Team;
use Jiminny\Models\User;
use Jiminny\Repositories\ElasticActivityRepository;
use Tests\TestCase;
final class SavedSearchCRUDFeatureTest extends TestCase
{
use DatabaseTransactions;
#[\PHPUnit\Framework\Attributes\Test]
public function userCanGetAListOfSavedSearches(): void
{
$this->markTestSkipped('Needs to be fixed');
/** @var Team $team */
$team = Team::factory()->create([
'crm_id' => 1, // temporary
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'status' => User::STATUS_ACTIVE,
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create();
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
$nudges = Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->getJson(route('api.saved_search.index'))
->assertStatus(200)
->assertJson(
fn (AssertableJson $json) =>
$json->has(1)
->first(
fn ($json) =>
$json->where('id', $search->id_string)
->where('name', $search->getName())
->where('filters', ['max_customer_questions' => 5, 'min_engaging_questions' => 3])
->has('nudges', 2)
->has(
'nudges.0',
fn ($json) =>
$json->where('id', $nudges[0]->id_string)
->where('frequency', 'daily')
->where('channel', 'email')
->has('expiresAt')
)
->has(
'nudges.1',
fn ($json) =>
$json->where('id', $nudges[1]->id_string)
->where('frequency', 'weekly')
->where('channel', 'slack')
->has('expiresAt')
)
)
);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanCreateASavedSearchBasedOnActivityFilters(): void
{
$this->markTestSkipped('Needs to be fixed');
Event::fake();
$this->partialMock(ElasticActivityRepository::class, function (MockInterface $mock) {
$mock->shouldReceive('onDemandScroll')
->times(2)
->andReturn(LazyCollection::empty());
});
/** @var Team $team */
$team = Team::factory()->create([
'uuid' => Str::uuid()->toString(),
'crm_id' => 1, // temporary
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->createQuietly([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$this->apiGuardLogin($user);
$this->actingAs($user)
->postJson(route('api.saved_search.create'), [
'name' => '::searchName::',
'filters' => [
'min_duration' => 1,
'only_recorded' => 1,
],
'nudges' => [
[
'frequency' => 'daily',
'channel' => 'email',
'expiresAt' => now()->addWeek()->format('Y-m-d'),
],
[
'frequency' => 'daily',
'channel' => 'slack',
'expiresAt' => now()->addWeek()->format('Y-m-d'),
],
],
])
->assertStatus(200);
$this->assertDatabaseHas('activity_searches', [
'name' => '::searchName::',
'user_id' => $user->id,
]);
$search = $user->searches()->first();
$this->assertDatabaseHas('nudges', [
'activity_search_id' => $search->id,
'frequency' => 2,
'channel' => 2,
]);
$this->assertDatabaseHas('nudges', [
'activity_search_id' => $search->id,
'frequency' => 2,
'channel' => 4,
]);
$this->assertDatabaseHas('activity_search_filters', [
'activity_search_id' => $search->id,
'filter' => 'min_duration',
'value' => 1,
]);
$this->assertDatabaseHas('activity_search_filters', [
'activity_search_id' => $search->id,
'filter' => 'only_recorded',
'value' => 1,
]);
Event::assertDispatched(NudgeCreated::class, 2);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanUpdateASavedSearchBasedOnActivityFilters(): void
{
/** @var Team $team */
$team = Team::factory()->createQuietly([
'uuid' => Str::uuid()->toString(),
'crm_id' => 1,
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create([
'name' => 'Search Name',
]);
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->putJson(route('api.saved_search.update', $search->id_string), [
'name' => 'Updated Search Name',
])->assertOk()
->assertJson([]);
$this->assertDatabaseMissing('activity_searches', [
'name' => 'Search Name',
'user_id' => $user->id,
]);
$this->assertDatabaseHas('activity_searches', [
'name' => 'Updated Search Name',
'user_id' => $user->id,
]);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanDeleteASavedSearch(): void
{
/** @var Team $team */
$team = Team::factory()->create([
'crm_id' => 1,
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create([
'name' => 'Search Name',
]);
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->deleteJson(route('api.saved_search.delete', $search->id_string))
->assertStatus(200)
->assertJson([]);
$this->assertDatabaseMissing('activity_searches', [
'user_id' => $user->id,
]);
$this->assertDatabaseMissing('activity_search_filters', [
'activity_search_id' => $search->id,
]);
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
1
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Component\ActivitySearch\FilterDefinition;
use Illuminate\Support\Collection;
use Jiminny\Component\ActivitySearch\FilterDefinition;
use Jiminny\Component\ActivitySearch\FilterDefinitionQuery;
use Jiminny\Component\ActivitySearch\FilterDefinitionQueryCollection;
use Jiminny\Contracts\ActivitySearch\ValidatedFilterDefinitionInterface;
use Jiminny\Contracts\Repositories\UserRepository;
use Jiminny\Models;
use Jiminny\Models\Feature\FeatureEnum;
use Jiminny\Models\Team;
use Jiminny\Traits\RequiresUUID;
use Elastica\Query;
final class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefinitionInterface
{
private const int NO_GROUP_ID = 999;
private UserRepository $userRepository;
public function __construct(UserRepository $userRepository)
{
$this->userRepository = $userRepository;
}
public function shouldApplyQueries(): bool
{
return count($this->getValue()) > 0;
}
public function getQueries(): FilterDefinitionQueryCollection
{
$userIds = $this->getValue();
return FilterDefinitionQueryCollection::make([
FilterDefinitionQuery::instance()
->setQuery(new Query\Terms('coachingFeedbacks.coach.id_string', $userIds))
->setPath('coachingFeedbacks.coach', 'coachingFeedbacks'),
]);
}
public function toArray(): array
{
return [
'id' => 'coaching-feedback-user-filter',
'label' => 'Coach',
'helpText' => 'The person who completed the Coaching Framework',
'placeholder' => 'Search coaches',
'inputType' => InputTypeEnum::DROPDOWN_MULTIPLE,
'queryParam' => 'coaching_feedback_coach_id',
'options' => $this->getOptions(),
'groupLabelKey' => 'label',
'groupValuesKey' => 'users',
'optionLabelKey' => 'name',
'optionValueKey' => 'id',
'value' => $this->getValue(),
];
}
private function getOptions(): array
{
$user = $this->executedBy;
$query = $user
->getTeam()
->users()
->whereNotIn(
'uuid',
$this->userRepository->findInaccessibleDeactivatedUserUuids($user)
->map(static fn (string $uuid): string => RequiresUUID::toOptimized($uuid))
->all(),
)
->orderBy('name');
$users = $query
->with('group')
->get()
->reduce(
static function (array $carry, Models\User $user): array {
$group = $user->getGroup();
$groupId = $group !== null
? $group->getUuid()
: self::NO_GROUP_ID;
$groupName = $group !== null
? $group->getName()
: '(NON-GROUPED)';
if (! array_key_exists($groupId, $carry)) {
$carry[$groupId] = [
'label' => $groupName,
'users' => [],
];
}
$carry[$groupId]['users'][] = [
'id' => $user->getUuid(),
'name' => sprintf(
'%s%s',
$user->getName(),
! $user->isStatusActive()
? ' (Inactive)'
: ''
),
];
return $carry;
},
[]
);
return Collection::make($users)
->sortBy('label')
->values()
->toArray();
}
public function getValue(): array
{
if (! $this->criteria->hasCoachingFeedbackCoachUserIds()) {
return $this->getDefaultValue();
}
return array_diff(
$this->criteria->getCoachingFeedbackCoachUserId(),
$this->userRepository->findInaccessibleDeactivatedUserUuids($this->executedBy)->all(),
);
}
private function getDefaultValue(): array
{
return [];
}
public function getValidationRules(?string $prefix = null): array
{
$team = $this->executedBy->getTeam();
return [
$prefix . 'coaching_feedback_coach_id' => 'array',
$prefix . 'coaching_feedback_coach_id.*' => 'uuid:users,team_id,' . $team->getId(),
];
}
public function getSortOrder(): int
{
return 86;
}
public function shouldBeIncluded(Team $team): bool
{
return $team->hasFeature(FeatureEnum::COACHING_FRAMEWORK);
}
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
56391
|
NULL
|
NULL
|
NULL
|
|
56394
|
1967
|
8
|
2026-05-19T08:05:10.109116+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-19/1779 /Users/lukas/.screenpipe/data/data/2026-05-19/1779177910109_m2.jpg...
|
PhpStorm
|
faVsco.js – SavedSearchCRUDFeatureTest.php
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20676-delete-report-re Project: faVsco.js, menu
JY-20676-delete-report-related-objects, menu
Start Listening for PHP Debug Connections...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20676-delete-report-related-objects, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.098071806,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: JY-20676-delete-report-related-objects","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.8081782,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-6966022010367698874
|
-564708849257816637
|
visual_change
|
hybrid
|
NULL
|
Project: faVsco.js, menu
JY-20676-delete-report-re Project: faVsco.js, menu
JY-20676-delete-report-related-objects, menu
Start Listening for PHP Debug Connections
PhostormProiectVIewINavicareCodeKeractorTOOISFV faVsco.js?9 JY-20676-delete-report-related-objectsC) AutomatedReport.onp© AskAnythingPromptServiceTest.php= custom.log= laravel.log4 SF jiminny@localhost]4 HS_local [jiminny@localhost]& console [PROD]# console [euy- ActivtvaskAnvihind est.ono© SavedSearchCRUDFeatureTest.php X© AskAnythingPromptDto.phpA console [STAGING]© CoachingFeedbackCoachUserln.php Xe) -xooricontro||erRateLimit est.onoC) FakeProphetClient.ohv> _ Midd ewareRequestsl Interactions© BaseService.phpfinal class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefini~C SoftPhoneManager.phpC) RoleAttr.png© ScimProvisioning.php() ListenerRoleCanr() RoleAttrTest.php29 6tpublic function shouldApplyQueries: bool{...}a InvitationsIHlobsIn ListenersD McpN ModelsiM NotificationsListenerRoleCannotHaveAdminOrManagerPermissionRule.php© Activity/Close/Service.php© Activity/RingCentral/Service.php34 6tpublic function getQueries: FilterDefinitionQueryCollection{...}© SyncActivity.php© Crm/Close/Service.php(C) TextMessaqingService.phpfinal class SavedSearchCRUDFeatureTest extends TestCaseA3 416 A V45 6tpublic function toArrav@): arravs..?194 D >public function userCanUpdateASavedSearchBasedOnActivityFilters: void{...}1usagelD OrganizationSettingsW rlayllstsD Policies( RepositoriesC RulesC SavedSearchesSavedSearchCRUDFeatureTest.php› C Search_ serviceProviders257 D >#Phrun1c rramework Accribuces lescpublic function userCanDeleteASavedSearch: void{...}private function getOptions(): array(...}118public function getValue: arrayt...- 1311 usage=131135136 €t>private function getDefaultValue(): arrayf...}public function getValidationRules(?string $prefix = null): arrayf...}ConsoleLoo Xv Changes 16 filesE.env.local app© ActivityController.php app/Http/Controllers/API@ AskAnythingPrompt.php app/Models/AskAnythingDo not ignoreHighlight words"8 5604af40 app/Component/AskAnyt|Current versionpublic AskAnythingPromptTarget $target,nuhlie Dstrina CownenTd = null.C) ASKAnvihinaPromotDto.ono apo/e© AskAnvthinaPromptService.php app/Component/AskAnvthing@ AskAnvthinaPromptServiceTest.php tests/Unit/Component/AskAnvthinapublic ?array $shareUsers = nullpublic ?array $shareGroups = null,C)AskJiminnvRenortsController.oho apo/Htto/Controllers/APIV2public AskAnythingPromptTarget $target,public ?string $ownerId = null,public ?array $shareUsers = null,public ?array $shareGroups = null,nublic hool ShacRenonts = falcex <eC) Constants, ono aoo/Comoonent/SClMI@ CoreUser.php app/DTO/SCIMIAAD/ResponseC) CoreUserRequest.ono ano/DTO/SCIMIAAD/[EMAIL] apn/Console/Commandsphp loadina.nho confial@ ScimProvisionina.nhn ann/Comnonent/SCIM'id' => Sthis->idulcle => schis-oclcle(C) Search.oho aon/Models/Activitvl'content' => Sthis-›content@) SoftPhoneManager.ohn ann/Comnonent/Twilio/Conference/ConferenceManad'target' => sthis->target->namel'id' = Sthis->id'title' => Sthis-›title'content' => Sthis-›content'target' => Sthis-›target-›name© TextMessagingService.php app/Services/TelephonyUInvorcionod Ciloc 12 filocif (Sthis->ownerId !== null) {Scatalownen 1d' = sthls->ownerild:if ($this->ownerId |== null) {Sdatal 'ownen id'] = Sthis->ownerld:loc for other lanquades (todav 10-00)• suppont Dally • In 3n 0om100% 5• Tue 19 May 11:05:09AskJiminnyReportActivityServiceTest vCascadeAsk Jiminny Report M+0..mocd → null, "status → Talsel3. loggle validationrtsController.php: 126-169 - In toggleStatus(), when enabled=true and the report is an Ask Jiminnyreport, returns 422 lt elther activity search 1d or ask anything prompt 1d is nult . Disabling is always allowed.4. TestsAskAnythingPromptServiceTest.php - Updated two existing update() mock expectations to match the new payload ( ['aPer your rules i did not add unit tests for the controller. The existing SavedSearchCRUDFeatureTest covers the searchdelete tlow: backend service test covers promot delete pavload.Ask anvthina (4D1+ <> Code Claude Opus 4.7 Medium* Reject allAccent alli•01.2 differencesWN Windsurf Toams 214-1UTF.8|Po 4 spaces...
|
56393
|
NULL
|
NULL
|
NULL
|
|
56395
|
1967
|
9
|
2026-05-19T08:05:11.174848+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-19/1779 /Users/lukas/.screenpipe/data/data/2026-05-19/1779177911174_m2.jpg...
|
PhpStorm
|
faVsco.js – SavedSearchCRUDFeatureTest.php
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20676-delete-report-re Project: faVsco.js, menu
JY-20676-delete-report-related-objects, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
3
16
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Tests\Feature\SavedSearches;
use Illuminate\Support\LazyCollection;
use Illuminate\Support\Str;
use Mockery\MockInterface;
use Illuminate\Database\Eloquent\Factories\Sequence;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Illuminate\Support\Facades\Event;
use Illuminate\Testing\Fluent\AssertableJson;
use Jiminny\Events\Nudges\NudgeCreated;
use Jiminny\Models\Activity\Search;
use Jiminny\Models\Activity\SearchFilter;
use Jiminny\Models\Nudge;
use Jiminny\Models\Role;
use Jiminny\Models\Team;
use Jiminny\Models\User;
use Jiminny\Repositories\ElasticActivityRepository;
use Tests\TestCase;
final class SavedSearchCRUDFeatureTest extends TestCase
{
use DatabaseTransactions;
#[\PHPUnit\Framework\Attributes\Test]
public function userCanGetAListOfSavedSearches(): void
{
$this->markTestSkipped('Needs to be fixed');
/** @var Team $team */
$team = Team::factory()->create([
'crm_id' => 1, // temporary
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'status' => User::STATUS_ACTIVE,
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create();
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
$nudges = Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->getJson(route('api.saved_search.index'))
->assertStatus(200)
->assertJson(
fn (AssertableJson $json) =>
$json->has(1)
->first(
fn ($json) =>
$json->where('id', $search->id_string)
->where('name', $search->getName())
->where('filters', ['max_customer_questions' => 5, 'min_engaging_questions' => 3])
->has('nudges', 2)
->has(
'nudges.0',
fn ($json) =>
$json->where('id', $nudges[0]->id_string)
->where('frequency', 'daily')
->where('channel', 'email')
->has('expiresAt')
)
->has(
'nudges.1',
fn ($json) =>
$json->where('id', $nudges[1]->id_string)
->where('frequency', 'weekly')
->where('channel', 'slack')
->has('expiresAt')
)
)
);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanCreateASavedSearchBasedOnActivityFilters(): void
{
$this->markTestSkipped('Needs to be fixed');
Event::fake();
$this->partialMock(ElasticActivityRepository::class, function (MockInterface $mock) {
$mock->shouldReceive('onDemandScroll')
->times(2)
->andReturn(LazyCollection::empty());
});
/** @var Team $team */
$team = Team::factory()->create([
'uuid' => Str::uuid()->toString(),
'crm_id' => 1, // temporary
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->createQuietly([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$this->apiGuardLogin($user);
$this->actingAs($user)
->postJson(route('api.saved_search.create'), [
'name' => '::searchName::',
'filters' => [
'min_duration' => 1,
'only_recorded' => 1,
],
'nudges' => [
[
'frequency' => 'daily',
'channel' => 'email',
'expiresAt' => now()->addWeek()->format('Y-m-d'),
],
[
'frequency' => 'daily',
'channel' => 'slack',
'expiresAt' => now()->addWeek()->format('Y-m-d'),
],
],
])
->assertStatus(200);
$this->assertDatabaseHas('activity_searches', [
'name' => '::searchName::',
'user_id' => $user->id,
]);
$search = $user->searches()->first();
$this->assertDatabaseHas('nudges', [
'activity_search_id' => $search->id,
'frequency' => 2,
'channel' => 2,
]);
$this->assertDatabaseHas('nudges', [
'activity_search_id' => $search->id,
'frequency' => 2,
'channel' => 4,
]);
$this->assertDatabaseHas('activity_search_filters', [
'activity_search_id' => $search->id,
'filter' => 'min_duration',
'value' => 1,
]);
$this->assertDatabaseHas('activity_search_filters', [
'activity_search_id' => $search->id,
'filter' => 'only_recorded',
'value' => 1,
]);
Event::assertDispatched(NudgeCreated::class, 2);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanUpdateASavedSearchBasedOnActivityFilters(): void
{
/** @var Team $team */
$team = Team::factory()->createQuietly([
'uuid' => Str::uuid()->toString(),
'crm_id' => 1,
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create([
'name' => 'Search Name',
]);
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->putJson(route('api.saved_search.update', $search->id_string), [
'name' => 'Updated Search Name',
])->assertOk()
->assertJson([]);
$this->assertDatabaseMissing('activity_searches', [
'name' => 'Search Name',
'user_id' => $user->id,
]);
$this->assertDatabaseHas('activity_searches', [
'name' => 'Updated Search Name',
'user_id' => $user->id,
]);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanDeleteASavedSearch(): void
{
/** @var Team $team */
$team = Team::factory()->create([
'crm_id' => 1,
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create([
'name' => 'Search Name',
]);
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->deleteJson(route('api.saved_search.delete', $search->id_string))
->assertStatus(200)
->assertJson([]);
$this->assertDatabaseMissing('activity_searches', [
'user_id' => $user->id,
]);
$this->assertDatabaseMissing('activity_search_filters', [
'activity_search_id' => $search->id,
]);
}
}...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20676-delete-report-related-objects, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.098071806,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: JY-20676-delete-report-related-objects","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.8081782,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceTest","depth":6,"bounds":{"left":0.8234708,"top":0.019952115,"width":0.09208777,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"bounds":{"left":0.9155585,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest'","depth":6,"bounds":{"left":0.9268617,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"bounds":{"left":0.9381649,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"bounds":{"left":0.96609044,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"bounds":{"left":0.9773936,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"bounds":{"left":0.9886968,"top":0.019952115,"width":0.011303186,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"3","depth":4,"bounds":{"left":0.390625,"top":0.22426178,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"16","depth":4,"bounds":{"left":0.4005984,"top":0.22426178,"width":0.009640957,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.4119016,"top":0.22266561,"width":0.00731383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.4192154,"top":0.22266561,"width":0.006981383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\nnamespace Tests\\Feature\\SavedSearches;\n\nuse Illuminate\\Support\\LazyCollection;\nuse Illuminate\\Support\\Str;\nuse Mockery\\MockInterface;\nuse Illuminate\\Database\\Eloquent\\Factories\\Sequence;\nuse Illuminate\\Foundation\\Testing\\DatabaseTransactions;\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\Testing\\Fluent\\AssertableJson;\nuse Jiminny\\Events\\Nudges\\NudgeCreated;\nuse Jiminny\\Models\\Activity\\Search;\nuse Jiminny\\Models\\Activity\\SearchFilter;\nuse Jiminny\\Models\\Nudge;\nuse Jiminny\\Models\\Role;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\ElasticActivityRepository;\nuse Tests\\TestCase;\n\nfinal class SavedSearchCRUDFeatureTest extends TestCase\n{\n use DatabaseTransactions;\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanGetAListOfSavedSearches(): void\n {\n $this->markTestSkipped('Needs to be fixed');\n /** @var Team $team */\n $team = Team::factory()->create([\n 'crm_id' => 1, // temporary\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'status' => User::STATUS_ACTIVE,\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create();\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n $nudges = Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->getJson(route('api.saved_search.index'))\n ->assertStatus(200)\n ->assertJson(\n fn (AssertableJson $json) =>\n $json->has(1)\n ->first(\n fn ($json) =>\n $json->where('id', $search->id_string)\n ->where('name', $search->getName())\n ->where('filters', ['max_customer_questions' => 5, 'min_engaging_questions' => 3])\n ->has('nudges', 2)\n ->has(\n 'nudges.0',\n fn ($json) =>\n $json->where('id', $nudges[0]->id_string)\n ->where('frequency', 'daily')\n ->where('channel', 'email')\n ->has('expiresAt')\n )\n ->has(\n 'nudges.1',\n fn ($json) =>\n $json->where('id', $nudges[1]->id_string)\n ->where('frequency', 'weekly')\n ->where('channel', 'slack')\n ->has('expiresAt')\n )\n )\n );\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanCreateASavedSearchBasedOnActivityFilters(): void\n {\n $this->markTestSkipped('Needs to be fixed');\n\n Event::fake();\n\n $this->partialMock(ElasticActivityRepository::class, function (MockInterface $mock) {\n $mock->shouldReceive('onDemandScroll')\n ->times(2)\n ->andReturn(LazyCollection::empty());\n });\n\n /** @var Team $team */\n $team = Team::factory()->create([\n 'uuid' => Str::uuid()->toString(),\n 'crm_id' => 1, // temporary\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->createQuietly([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->postJson(route('api.saved_search.create'), [\n 'name' => '::searchName::',\n 'filters' => [\n 'min_duration' => 1,\n 'only_recorded' => 1,\n ],\n 'nudges' => [\n [\n 'frequency' => 'daily',\n 'channel' => 'email',\n 'expiresAt' => now()->addWeek()->format('Y-m-d'),\n ],\n [\n 'frequency' => 'daily',\n 'channel' => 'slack',\n 'expiresAt' => now()->addWeek()->format('Y-m-d'),\n ],\n ],\n ])\n ->assertStatus(200);\n\n $this->assertDatabaseHas('activity_searches', [\n 'name' => '::searchName::',\n 'user_id' => $user->id,\n ]);\n\n $search = $user->searches()->first();\n\n $this->assertDatabaseHas('nudges', [\n 'activity_search_id' => $search->id,\n 'frequency' => 2,\n 'channel' => 2,\n ]);\n\n $this->assertDatabaseHas('nudges', [\n 'activity_search_id' => $search->id,\n 'frequency' => 2,\n 'channel' => 4,\n ]);\n\n $this->assertDatabaseHas('activity_search_filters', [\n 'activity_search_id' => $search->id,\n 'filter' => 'min_duration',\n 'value' => 1,\n ]);\n\n $this->assertDatabaseHas('activity_search_filters', [\n 'activity_search_id' => $search->id,\n 'filter' => 'only_recorded',\n 'value' => 1,\n ]);\n\n Event::assertDispatched(NudgeCreated::class, 2);\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanUpdateASavedSearchBasedOnActivityFilters(): void\n {\n /** @var Team $team */\n $team = Team::factory()->createQuietly([\n 'uuid' => Str::uuid()->toString(),\n 'crm_id' => 1,\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create([\n 'name' => 'Search Name',\n ]);\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->putJson(route('api.saved_search.update', $search->id_string), [\n 'name' => 'Updated Search Name',\n ])->assertOk()\n ->assertJson([]);\n\n $this->assertDatabaseMissing('activity_searches', [\n 'name' => 'Search Name',\n 'user_id' => $user->id,\n ]);\n\n $this->assertDatabaseHas('activity_searches', [\n 'name' => 'Updated Search Name',\n 'user_id' => $user->id,\n ]);\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanDeleteASavedSearch(): void\n {\n /** @var Team $team */\n $team = Team::factory()->create([\n 'crm_id' => 1,\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create([\n 'name' => 'Search Name',\n ]);\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->deleteJson(route('api.saved_search.delete', $search->id_string))\n ->assertStatus(200)\n ->assertJson([]);\n\n $this->assertDatabaseMissing('activity_searches', [\n 'user_id' => $user->id,\n ]);\n\n $this->assertDatabaseMissing('activity_search_filters', [\n 'activity_search_id' => $search->id,\n ]);\n }\n}","depth":4,"bounds":{"left":0.15990691,"top":0.0,"width":0.2662899,"height":0.49162012},"on_screen":true,"value":"<?php\n\nnamespace Tests\\Feature\\SavedSearches;\n\nuse Illuminate\\Support\\LazyCollection;\nuse Illuminate\\Support\\Str;\nuse Mockery\\MockInterface;\nuse Illuminate\\Database\\Eloquent\\Factories\\Sequence;\nuse Illuminate\\Foundation\\Testing\\DatabaseTransactions;\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\Testing\\Fluent\\AssertableJson;\nuse Jiminny\\Events\\Nudges\\NudgeCreated;\nuse Jiminny\\Models\\Activity\\Search;\nuse Jiminny\\Models\\Activity\\SearchFilter;\nuse Jiminny\\Models\\Nudge;\nuse Jiminny\\Models\\Role;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\ElasticActivityRepository;\nuse Tests\\TestCase;\n\nfinal class SavedSearchCRUDFeatureTest extends TestCase\n{\n use DatabaseTransactions;\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanGetAListOfSavedSearches(): void\n {\n $this->markTestSkipped('Needs to be fixed');\n /** @var Team $team */\n $team = Team::factory()->create([\n 'crm_id' => 1, // temporary\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'status' => User::STATUS_ACTIVE,\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create();\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n $nudges = Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->getJson(route('api.saved_search.index'))\n ->assertStatus(200)\n ->assertJson(\n fn (AssertableJson $json) =>\n $json->has(1)\n ->first(\n fn ($json) =>\n $json->where('id', $search->id_string)\n ->where('name', $search->getName())\n ->where('filters', ['max_customer_questions' => 5, 'min_engaging_questions' => 3])\n ->has('nudges', 2)\n ->has(\n 'nudges.0',\n fn ($json) =>\n $json->where('id', $nudges[0]->id_string)\n ->where('frequency', 'daily')\n ->where('channel', 'email')\n ->has('expiresAt')\n )\n ->has(\n 'nudges.1',\n fn ($json) =>\n $json->where('id', $nudges[1]->id_string)\n ->where('frequency', 'weekly')\n ->where('channel', 'slack')\n ->has('expiresAt')\n )\n )\n );\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanCreateASavedSearchBasedOnActivityFilters(): void\n {\n $this->markTestSkipped('Needs to be fixed');\n\n Event::fake();\n\n $this->partialMock(ElasticActivityRepository::class, function (MockInterface $mock) {\n $mock->shouldReceive('onDemandScroll')\n ->times(2)\n ->andReturn(LazyCollection::empty());\n });\n\n /** @var Team $team */\n $team = Team::factory()->create([\n 'uuid' => Str::uuid()->toString(),\n 'crm_id' => 1, // temporary\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->createQuietly([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->postJson(route('api.saved_search.create'), [\n 'name' => '::searchName::',\n 'filters' => [\n 'min_duration' => 1,\n 'only_recorded' => 1,\n ],\n 'nudges' => [\n [\n 'frequency' => 'daily',\n 'channel' => 'email',\n 'expiresAt' => now()->addWeek()->format('Y-m-d'),\n ],\n [\n 'frequency' => 'daily',\n 'channel' => 'slack',\n 'expiresAt' => now()->addWeek()->format('Y-m-d'),\n ],\n ],\n ])\n ->assertStatus(200);\n\n $this->assertDatabaseHas('activity_searches', [\n 'name' => '::searchName::',\n 'user_id' => $user->id,\n ]);\n\n $search = $user->searches()->first();\n\n $this->assertDatabaseHas('nudges', [\n 'activity_search_id' => $search->id,\n 'frequency' => 2,\n 'channel' => 2,\n ]);\n\n $this->assertDatabaseHas('nudges', [\n 'activity_search_id' => $search->id,\n 'frequency' => 2,\n 'channel' => 4,\n ]);\n\n $this->assertDatabaseHas('activity_search_filters', [\n 'activity_search_id' => $search->id,\n 'filter' => 'min_duration',\n 'value' => 1,\n ]);\n\n $this->assertDatabaseHas('activity_search_filters', [\n 'activity_search_id' => $search->id,\n 'filter' => 'only_recorded',\n 'value' => 1,\n ]);\n\n Event::assertDispatched(NudgeCreated::class, 2);\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanUpdateASavedSearchBasedOnActivityFilters(): void\n {\n /** @var Team $team */\n $team = Team::factory()->createQuietly([\n 'uuid' => Str::uuid()->toString(),\n 'crm_id' => 1,\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create([\n 'name' => 'Search Name',\n ]);\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->putJson(route('api.saved_search.update', $search->id_string), [\n 'name' => 'Updated Search Name',\n ])->assertOk()\n ->assertJson([]);\n\n $this->assertDatabaseMissing('activity_searches', [\n 'name' => 'Search Name',\n 'user_id' => $user->id,\n ]);\n\n $this->assertDatabaseHas('activity_searches', [\n 'name' => 'Updated Search Name',\n 'user_id' => $user->id,\n ]);\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanDeleteASavedSearch(): void\n {\n /** @var Team $team */\n $team = Team::factory()->create([\n 'crm_id' => 1,\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create([\n 'name' => 'Search Name',\n ]);\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->deleteJson(route('api.saved_search.delete', $search->id_string))\n ->assertStatus(200)\n ->assertJson([]);\n\n $this->assertDatabaseMissing('activity_searches', [\n 'user_id' => $user->id,\n ]);\n\n $this->assertDatabaseMissing('activity_search_filters', [\n 'activity_search_id' => $search->id,\n ]);\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
1356238323261734672
|
-8996598804339809755
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
JY-20676-delete-report-re Project: faVsco.js, menu
JY-20676-delete-report-related-objects, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
3
16
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Tests\Feature\SavedSearches;
use Illuminate\Support\LazyCollection;
use Illuminate\Support\Str;
use Mockery\MockInterface;
use Illuminate\Database\Eloquent\Factories\Sequence;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Illuminate\Support\Facades\Event;
use Illuminate\Testing\Fluent\AssertableJson;
use Jiminny\Events\Nudges\NudgeCreated;
use Jiminny\Models\Activity\Search;
use Jiminny\Models\Activity\SearchFilter;
use Jiminny\Models\Nudge;
use Jiminny\Models\Role;
use Jiminny\Models\Team;
use Jiminny\Models\User;
use Jiminny\Repositories\ElasticActivityRepository;
use Tests\TestCase;
final class SavedSearchCRUDFeatureTest extends TestCase
{
use DatabaseTransactions;
#[\PHPUnit\Framework\Attributes\Test]
public function userCanGetAListOfSavedSearches(): void
{
$this->markTestSkipped('Needs to be fixed');
/** @var Team $team */
$team = Team::factory()->create([
'crm_id' => 1, // temporary
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'status' => User::STATUS_ACTIVE,
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create();
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
$nudges = Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->getJson(route('api.saved_search.index'))
->assertStatus(200)
->assertJson(
fn (AssertableJson $json) =>
$json->has(1)
->first(
fn ($json) =>
$json->where('id', $search->id_string)
->where('name', $search->getName())
->where('filters', ['max_customer_questions' => 5, 'min_engaging_questions' => 3])
->has('nudges', 2)
->has(
'nudges.0',
fn ($json) =>
$json->where('id', $nudges[0]->id_string)
->where('frequency', 'daily')
->where('channel', 'email')
->has('expiresAt')
)
->has(
'nudges.1',
fn ($json) =>
$json->where('id', $nudges[1]->id_string)
->where('frequency', 'weekly')
->where('channel', 'slack')
->has('expiresAt')
)
)
);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanCreateASavedSearchBasedOnActivityFilters(): void
{
$this->markTestSkipped('Needs to be fixed');
Event::fake();
$this->partialMock(ElasticActivityRepository::class, function (MockInterface $mock) {
$mock->shouldReceive('onDemandScroll')
->times(2)
->andReturn(LazyCollection::empty());
});
/** @var Team $team */
$team = Team::factory()->create([
'uuid' => Str::uuid()->toString(),
'crm_id' => 1, // temporary
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->createQuietly([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$this->apiGuardLogin($user);
$this->actingAs($user)
->postJson(route('api.saved_search.create'), [
'name' => '::searchName::',
'filters' => [
'min_duration' => 1,
'only_recorded' => 1,
],
'nudges' => [
[
'frequency' => 'daily',
'channel' => 'email',
'expiresAt' => now()->addWeek()->format('Y-m-d'),
],
[
'frequency' => 'daily',
'channel' => 'slack',
'expiresAt' => now()->addWeek()->format('Y-m-d'),
],
],
])
->assertStatus(200);
$this->assertDatabaseHas('activity_searches', [
'name' => '::searchName::',
'user_id' => $user->id,
]);
$search = $user->searches()->first();
$this->assertDatabaseHas('nudges', [
'activity_search_id' => $search->id,
'frequency' => 2,
'channel' => 2,
]);
$this->assertDatabaseHas('nudges', [
'activity_search_id' => $search->id,
'frequency' => 2,
'channel' => 4,
]);
$this->assertDatabaseHas('activity_search_filters', [
'activity_search_id' => $search->id,
'filter' => 'min_duration',
'value' => 1,
]);
$this->assertDatabaseHas('activity_search_filters', [
'activity_search_id' => $search->id,
'filter' => 'only_recorded',
'value' => 1,
]);
Event::assertDispatched(NudgeCreated::class, 2);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanUpdateASavedSearchBasedOnActivityFilters(): void
{
/** @var Team $team */
$team = Team::factory()->createQuietly([
'uuid' => Str::uuid()->toString(),
'crm_id' => 1,
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create([
'name' => 'Search Name',
]);
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->putJson(route('api.saved_search.update', $search->id_string), [
'name' => 'Updated Search Name',
])->assertOk()
->assertJson([]);
$this->assertDatabaseMissing('activity_searches', [
'name' => 'Search Name',
'user_id' => $user->id,
]);
$this->assertDatabaseHas('activity_searches', [
'name' => 'Updated Search Name',
'user_id' => $user->id,
]);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanDeleteASavedSearch(): void
{
/** @var Team $team */
$team = Team::factory()->create([
'crm_id' => 1,
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create([
'name' => 'Search Name',
]);
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->deleteJson(route('api.saved_search.delete', $search->id_string))
->assertStatus(200)
->assertJson([]);
$this->assertDatabaseMissing('activity_searches', [
'user_id' => $user->id,
]);
$this->assertDatabaseMissing('activity_search_filters', [
'activity_search_id' => $search->id,
]);
}
}...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
56397
|
1967
|
10
|
2026-05-19T08:05:12.086085+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-19/1779 /Users/lukas/.screenpipe/data/data/2026-05-19/1779177912086_m2.jpg...
|
PhpStorm
|
faVsco.js – SavedSearchCRUDFeatureTest.php
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20676-delete-report-re Project: faVsco.js, menu
JY-20676-delete-report-related-objects, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20676-delete-report-related-objects, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.098071806,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: JY-20676-delete-report-related-objects","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.8081782,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceTest","depth":6,"bounds":{"left":0.8234708,"top":0.019952115,"width":0.09208777,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"bounds":{"left":0.9155585,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest'","depth":6,"bounds":{"left":0.9268617,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"bounds":{"left":0.9381649,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"bounds":{"left":0.96609044,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"bounds":{"left":0.9773936,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"bounds":{"left":0.9886968,"top":0.019952115,"width":0.011303186,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-4701279590415171657
|
-8204420343923494970
|
click
|
hybrid
|
NULL
|
Project: faVsco.js, menu
JY-20676-delete-report-re Project: faVsco.js, menu
JY-20676-delete-report-related-objects, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
PhostormProiectINavicarecodeLaravelKeractorTOOIS• suppont Dally • In 3n 0om100% 5• Tue 19 May 11:05:11FV faVsco.js?9 JY-20676-delete-report-related-objectsAskJiminnyReportActivityServiceTest vC) AutomatedReport.onp© AskAnythingPromptServiceTest.php= laravel.log4 SF jiminny@localhost]4 HS_local [jiminny@localhost]& console [PROD]# console [euyx <eCascade- ActivtvaskAnvihind est.ono© SavedSearchCRUDFeatureTest.php Xe) -xooricontro||erRateLimit est.onoC) FakeProphetClient.ohv> _ Midd ewareRequestsAsKAnywingPromptuto.pnp© BaseService.phpC) RoleAttr.png© ScimProvisioning.php() ListenerRoleCar() RoleAttrTest.phpListenerRoleCannotHaveAdminOrManagerPermissionRule.phpC)Activity/Close/Service.php© Activity/RingCentral/Service.phpA console [STAGING]© CoachingFeedbackCoachUserln.php Xfinal class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefini~Ask Jiminny Report Mmocd → null, "status → Talsel3. loggle validation+0 ..public function shouldApplyQueries: boolf...}rtsController.php: 126-169 — In toggleStatus(), when enabled=true and the report is an Ask Jiminnyreport, returns 422 lt elther activity search 1d or ask anything prompt 1d is nult . Disabling is always allowed.a InvitationsIHlobsIn ListenersD Mcp29 6t34 0 >4. Testspublic function getQueries: FilterDefinitionOueryCollection{...}© SyncActivity.php© Crm/Close/Service.php(C) TextMessaqingService.phpfinal class SavedSearchCRUDFeatureTest extends TestCaseAskAnythingPromptServiceTest.php - Updated two existing update() mock expectations to match the new payload ( ['aA3416 ^ v45 6tpublic function toArrav@): arravf...?194 D >public function userCanUpdateASavedSearchBasedOnActivityFilters: void{...}Per your rules i did not add unit tests for the controller. The existing SavedSearchCRUDFeatureTest covers the searchdelete tlow: backend service test covers promot delete pavload.M Notificationsm oraanizationsettingsW rlayllstsD Policies( RepositoriesC RulesC SavedSearchesSavedSearchCRUDFeatureTest.php› C Search_ serviceProviders1usagel257 D >#Phrun1c rramework Accribuces lescpublic function userCanDeleteASavedSearch: void{...}private function getOptions(): array(...}!!"public function getValue: arrayt...1 usageprivate function getDefaultValue: arrayt...135136 >Ask anvthina (4D1public function getValidationRules(?string $prefix = null): arrayf...}+ <> Code Claude Opus 4.7 MediumConsoleLoo XChanges 16 tilesE.env.local app© ActivityController.php app/Http/Controllers/API© AskAnythingPrompt.php app/Models/AskAnything@ AskAnvthinaPromptDto.php app/Component/AskAnvthina/DtosC)AskAnvthinaPromotService.ono@ AskAnvthinaPromptServiceTest.pho tests/Unit/Component/AskAnvthinaDo not ignoreHighlight wordsy8 5604af40 app/Component/AskAnything/AskAnythingPromptService.phpCurrent versionnent AskAnvthina > AskAnvthinaPromotService > aet(iStardetSownerUuid,Sshareuser'sStaroet.SownerUuid,$shareUsers,SshareGroupsC) AskJiminnvRevortsController.ono aoo/Htto/Controlllers/APVN2Sprompt->has_reports,C) Constants, ono aoo/Comoonent/SClMIC) CoreUser.oho aoo/DT0/SCIMIAAD/ResoonselC) CoreUserRequest.ono aoo/DTO/SCIMIAAD/Requestrecurn [EMAIL] apn/Console/Commandsphp loadina.nho confial@ ScimProvisionina.nhn ann/Comnonent/SCIM(C) Search.oho aon/Models/Activitvl@) SoftPhoneManager.nhn ann/Comnonent/Twilio/Conference/ConferenceManadtargetSuser-›getUuido.SshareUsersUuidsSshareGroupsUulds© TextMessagingService.php app/Services/TelephonyUInvorcionod Ciloc 12 filocreturn $promptDtos:(Jiminny|Component\AskAnything > AskAnythingPromptService › create() ~StargetSuser->getUuidoSshareUsersUuids$shareGroupsUuids,Sprompt->has reportsSnewPromot->aetTargetolSsharelsersUuids.SnewPromot->getTaraetolSuser->getUuidO.SsharelsersUuidsSnewPrompt->has reports,* Reject allAccent alli•01.4 difterencesnublic function deletedHunsnoll without affectina the dictionarios for other lanquades (todav 10-00)WN Windsurf Toams 214-1UTF.8io 4 spaces...
|
56395
|
NULL
|
NULL
|
NULL
|
|
56396
|
1966
|
8
|
2026-05-19T08:05:12.112553+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-19/1779 /Users/lukas/.screenpipe/data/data/2026-05-19/1779177912112_m1.jpg...
|
PhpStorm
|
faVsco.js – SavedSearchCRUDFeatureTest.php
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20676-delete-report-re Project: faVsco.js, menu
JY-20676-delete-report-related-objects, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20676-delete-report-related-objects, menu","depth":5,"on_screen":true,"help_text":"Git Branch: JY-20676-delete-report-related-objects","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceTest","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-396245491663569035
|
-8634514108303561274
|
click
|
hybrid
|
NULL
|
Project: faVsco.js, menu
JY-20676-delete-report-re Project: faVsco.js, menu
JY-20676-delete-report-related-objects, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
SlackFileEditViewGoHistoryWindowHelpAPPDOCKER• ₴1DEV (-zsh)₴82app/Jobs/Crm/MatchActivityCrmData.phpapp/Jobs/Middleware/HandleHubspotRateLimit.phpAPP (-zst47++++++p42++++++*app/Mcp/Servers/JiminnyServer.phpapp/Mcp/Tools/GetMeTool.php157++++++•app/Models/Feature/FeatureEnum.phpapp/Services/Activity/HubSpot/ProviderResolver.php+-app/Services/Activity/HubSpot/ProviderResolverInterface.phpapp/Services/Activity/HubSpot/Providers/Provider.phpapp/Services/Activity/HubSpot/Providers/ProviderKixie.php+-app/Services/Activity/HubSpot/Providers/Provider0rum.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilio.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilioFlex.phpapp/Services/Activity/HubSpot/Service.phpapp/Services/Crm/Hubspot/Client.phpapp/Services/Crm/Hubspot/HubspotClientInterface.phpapp/Services/Crm/Hubspot/Pagination/HubspotPaginationService.phpapp/Services/Crm/Hubspot/Pagination/PaginationState.phpdatabase/migrations/2026_05_13_124153_create_mcp_feature_flag.phptests/Feature/Mcp/GetMeToolFeatureTest.phptests/Feature/Mcp/ListCallsToolFeatureTest.phptests/Feature/Mcp/McpTestHelpersTrait.phptests/Unit/Component/ES/ChunkSizeTest.phptests/Unit/Component/ES/Processor/DT0s/SelectionListTest.phptests/Unit/Component/ES/Processor/TargetEntitiesSelectorTest.phptests/Unit/Component/MeetingBot/Service/ParticipantMatcherTest.phptests/Unit/Exceptions/RateLimitExceptionTest.phptests/Unit/Jobs/Crm/MatchActivityCrmDataTest.phptests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phptests/Unit/Services/Activity/HubSpot/ServiceTest.phptests/Unit/Services/Crm/Hubspot/ClientTest.phptests/Unit/Services/Crm/Hubspot/Pagination/HubspotPaginationServiceTest.php97++++++-132++++++•15++++++21++++--2+-25++++++.140++++++-2+-19++++++50++++++-27++++++139++++++-6856++++++-+-151++++++-109++++++-250++++++-283++++++=37 files changed, 1587 insertions(+), 344 deletions(-)create mode 100644 app/Component/ES/ChunkSize.phpcreate mode 100644 app/Jobs/Middleware/HandleHubspotRateLimit.phpcreate mode 100644 app/Mcp/Tools/GetMeTool.phpcreate mode 100644 database/migrations/2026_05_13_124153_create_mcp_feature_flag.phpcreate mode 100644 tests/Feature/Mcp/GetMeToolFeatureTest.phpcreate mode 100644 tests/Unit/Component/ES/ChunkSizeTest.phpcreate mode 100644 tests/Unit/Exceptions/RateLimitExceptionTest.phpcreate mode 100644 tests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phplukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pullAlready up to date.lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20676-delete-reSwitched to a new branch 'JY-20676-delete-report-related-objects'lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20676-delete-report-related-obEDHomeDMsActivityFilesLaterMoreJiminny ...# Jiminny-Dg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of_jimi...• Direct messages€. Vasil VasilevP.. Nikolay Yankov%. Galya Dimitrova L. Aneliya Angelovaão Stefka StoyanovaStoyan Tomovd Todor Stamatov "Kd. Mario GeorgievNikolay Ivanovdo James Graham2 Stoyan TanevRo Steliyan GeorgievLukas Kovalik y…..AppsJira CloudToastSupport Daily - in 3 h 55 m100% <7Tue 19 May 11:05:12Describe what you are looking for# the_people_of jimi...8 426 0• MessagesQ Files+Stefka Stoyanov:Today ~Hі Eteam,I wanted to share that our Lead Developer llianKyuchukov has decided to move on from Jiminny topursue a new opportunity. While we're really sad tosee them go, we're also excited for him and thisnext chapter in his professional journey.llian's last working day will be 14 July, so we stillhave some time together before then. Over thecoming weeks, please make the most of hisknowledge, experience, and context so we canensure a smooth transition across the team.It's hard to overstate the impact llian has had here- from shaping the product and solving toughproblems to supporting teammates and helpingbuild the product we have today. We re incrediblygrateful for everything he contributed over this 2years he was with & engineering team.Just wanted to share the news openly witheveryone and say a huge thanks to llian foreverything so far. Vou Please join me in wishing himall the very best for what comes next.We start looking for a Full-Stack Software Engineer,so if you know anyone you believe will fit, pleasecontact me or Mira directly A687Message #the_people_of_jiminny+...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
56398
|
1966
|
9
|
2026-05-19T08:05:13.717063+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-19/1779 /Users/lukas/.screenpipe/data/data/2026-05-19/1779177913717_m1.jpg...
|
PhpStorm
|
faVsco.js – SavedSearchCRUDFeatureTest.php
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20676-delete-report-re Project: faVsco.js, menu
JY-20676-delete-report-related-objects, menu...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20676-delete-report-related-objects, menu","depth":5,"on_screen":true,"help_text":"Git Branch: JY-20676-delete-report-related-objects","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
1961873295031593158
|
-1483003541378331465
|
click
|
hybrid
|
NULL
|
Project: faVsco.js, menu
JY-20676-delete-report-re Project: faVsco.js, menu
JY-20676-delete-report-related-objects, menu
SlackFileEditViewGoHistoryWindowHelpAPPDOCKER• ₴1DEV (-zsh)₴82app/Jobs/Crm/MatchActivityCrmData.phpapp/Jobs/Middleware/HandleHubspotRateLimit.phpAPP (-zst47++++++p42++++++*app/Mcp/Servers/JiminnyServer.phpapp/Mcp/Tools/GetMeTool.php157++++++•app/Models/Feature/FeatureEnum.phpapp/Services/Activity/HubSpot/ProviderResolver.php+-app/Services/Activity/HubSpot/ProviderResolverInterface.phpapp/Services/Activity/HubSpot/Providers/Provider.phpapp/Services/Activity/HubSpot/Providers/ProviderKixie.php+-app/Services/Activity/HubSpot/Providers/Provider0rum.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilio.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilioFlex.phpapp/Services/Activity/HubSpot/Service.phpapp/Services/Crm/Hubspot/Client.phpapp/Services/Crm/Hubspot/HubspotClientInterface.phpapp/Services/Crm/Hubspot/Pagination/HubspotPaginationService.phpapp/Services/Crm/Hubspot/Pagination/PaginationState.phpdatabase/migrations/2026_05_13_124153_create_mcp_feature_flag.phptests/Feature/Mcp/GetMeToolFeatureTest.phptests/Feature/Mcp/ListCallsToolFeatureTest.phptests/Feature/Mcp/McpTestHelpersTrait.phptests/Unit/Component/ES/ChunkSizeTest.phptests/Unit/Component/ES/Processor/DT0s/SelectionListTest.phptests/Unit/Component/ES/Processor/TargetEntitiesSelectorTest.phptests/Unit/Component/MeetingBot/Service/ParticipantMatcherTest.phptests/Unit/Exceptions/RateLimitExceptionTest.phptests/Unit/Jobs/Crm/MatchActivityCrmDataTest.phptests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phptests/Unit/Services/Activity/HubSpot/ServiceTest.phptests/Unit/Services/Crm/Hubspot/ClientTest.phptests/Unit/Services/Crm/Hubspot/Pagination/HubspotPaginationServiceTest.php97++++++-132++++++•15++++++21++++--2+-25++++++.140++++++-2+-19++++++50++++++-27++++++139++++++-6856++++++-+-151++++++-109++++++-250++++++-283++++++=37 files changed, 1587 insertions(+), 344 deletions(-)create mode 100644 app/Component/ES/ChunkSize.phpcreate mode 100644 app/Jobs/Middleware/HandleHubspotRateLimit.phpcreate mode 100644 app/Mcp/Tools/GetMeTool.phpcreate mode 100644 database/migrations/2026_05_13_124153_create_mcp_feature_flag.phpcreate mode 100644 tests/Feature/Mcp/GetMeToolFeatureTest.phpcreate mode 100644 tests/Unit/Component/ES/ChunkSizeTest.phpcreate mode 100644 tests/Unit/Exceptions/RateLimitExceptionTest.phpcreate mode 100644 tests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phplukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pullAlready up to date.lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20676-delete-reSwitched to a new branch 'JY-20676-delete-report-related-objects'lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20676-delete-report-related-obEDHomeDMsActivityFilesLaterMoreJiminny ...# Jiminny-Dg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi...• Direct messages€. Vasil VasilevP. Nikolay Yankov%. Galya Dimitrova L. Aneliya Angelovaão Stefka StoyanovaStoyan Tomovd Todor Stamatov "Kd. Mario GeorgievNikolay Ivanovdo James Graham2 Stoyan TanevRo Steliyan GeorgievLukas Kovalik y…..AppsJira CloudToastSupport Daily - in 3 h 55 m100% <7Tue 19 May 11:05:13Describe what you are looking for# the_people_of jimi...8 426 0• Messages@ Files+Stefka Stoyanov:Today ~Hі Eteam,I wanted to share that our Lead Developer llianKyuchukov has decided to move on from Jiminny topursue a new opportunity. While we're really sad tosee them go, we're also excited for him and thisnext chapter in his professional journey.llian's last working day will be 14 July, so we stillhave some time together before then. Over thecoming weeks, please make the most of hisknowledge, experience, and context so we canensure a smooth transition across the team.It's hard to overstate the impact llian has had here- from shaping the product and solving toughproblems to supporting teammates and helpingbuild the product we have today. We re incrediblygrateful for everything he contributed over this 2years he was with & engineering team.Just wanted to share the news openly witheveryone and say a huge thanks to llian foreverything so far. Vou Please join me in wishing himall the very best for what comes next.We start looking for a Full-Stack Software Engineer,so if you know anyone you believe will fit, pleasecontact me or Mira directly A® 42Message #the_people_of_jiminny+...
|
56396
|
NULL
|
NULL
|
NULL
|
|
56400
|
1967
|
11
|
2026-05-19T08:05:17.556155+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-19/1779 /Users/lukas/.screenpipe/data/data/2026-05-19/1779177917556_m2.jpg...
|
PhpStorm
|
faVsco.js – SavedSearchCRUDFeatureTest.php
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20676-delete-report-re Project: faVsco.js, menu
JY-20676-delete-report-related-objects, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20676-delete-report-related-objects, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.098071806,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: JY-20676-delete-report-related-objects","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.8081782,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceTest","depth":6,"bounds":{"left":0.8234708,"top":0.019952115,"width":0.09208777,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"bounds":{"left":0.9155585,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest'","depth":6,"bounds":{"left":0.9268617,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"bounds":{"left":0.9381649,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"bounds":{"left":0.96609044,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-396245491663569035
|
-8634514108303561274
|
click
|
hybrid
|
NULL
|
Project: faVsco.js, menu
JY-20676-delete-report-re Project: faVsco.js, menu
JY-20676-delete-report-related-objects, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
PhostormFV faVsco.js~ProjectViewavigateCode%9 JY-20676-delete-report-related-objectsKeractorTOOISWindow• suppont Dally • In 3n 0omU AskJiminnyReportActivityServiceTest~100% 5&• Tue 19 May 11:05:17ActivityAskAnythingTest.phpe) -xooricontro||erRateLimit est.onoC) FakeProphetClient.ohv> _ Midd eware> O RequestsInteractionsInvitationsJobs• ListenersD Mcp• Models• NotificationsOrganizationSettingsO PlaylistsD Policies• RepositoriesD RulesD SavedSearchesC SavedSearchCRUDFeatureTest.php> D Search›_ serviceProviders© AutomatedReport.phpC SavedSearchCRUDFeatureTest.php x]ASKAnythingPromptservice.ongC SoftPhoneManager.php() ListenerRoleCannotHaveAdminOrMaListenerRoleCannotHaveAdminOrManagerPermissionRule.phpC) Activity/Close/Service.php© AskAnythingPromptServiceTest.php© AskAnythingPromptDto.php© BaseService.php© ScimProvisioning.phpE RoleAttrTest.php© Activity/RingCentral/Service.php© SyncActivity.php© Crm/Close/Service.php© TextMessagingService.phpfinal class SavedSearchCRUDFeatureTest extends TestCase194 D >public function userCanUpdateASavedSearchBasedOnActivityFilters(): voidf..}E custom.logE laravel.log4 SF [jiminny@localhost]A HS_Jocal [jiminny@localhost]A console [PROD]# console [euyA console [STAGING]© CoachingFeedbackCoachUserin.phpxfinal class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefini vpubLic tunccion conscructuserkeposicory suserkeposicorvor...CascadeAsk Jiminny Report Mmocd → null, "status → Talsel3. loggle validation+0 ..29 0 >public function shouldApplyQueries(): boolf...}rtsController.php: 126-169 - In toggleStatus(), when enabled=true and the report is an Ask Jiminnyreport, returns 422 lt elther activity search 1d or ask anything prompt id is nult. Disabling is always allowed.4. Tests34 0 >public function getQueries: FilterDefinitionQueryCollection{...}AskAnythingPromptServiceTest.php - Updated two existing update() mock expectations to match the new payload ( ['aA3 A16 A V45 € >public function toArray(): array{...}Per your rules I did not add unit tests for the controller. The existing SavedSearchCRUDFeatureTest covers the searchdelete tlow: backend service test covers promot delete pavload.1 usage257 D >#Phrun1c rramework Accribuces lescpublic function userCanDeleteASavedSearch(): void{...,private function getOptions(): arrayf...}public function getValue(): arrayf...}130=131136 €>lusageprivate function getDefaultValve(): arrayf..}public function getValidationRules(?string $prefix = null): arrayf..}8 files +90 -7>Ask anything (XAL)+ <>Code Claude Opus 4.7 Medium®Reject allAccept allConsole XLooXv Changes 16 filesE.env.local app© ActivityController.php app/Http/Controllers/API© AskAnythingPrompt.php app/Models/AskAnything© AskAnvthinaPromptDto.php app/Component/AskAnvthina/Dtos© AskAnythingPromptService.php app/Component/AskAnything@ AskAnvthinaPromptServiceTest.php tests/Unit/Component/AskAnvthina© AskJiminnyReportsController.php app/Http/Controllers/API/N2C) Constants,ono ao© CoreUser.php app/DTO/SCIM/AAD/ResponseC) CoreUserRequest.ono ano/DTO/SCIMIAAD/Request© JiminnyDebugCommand.php app/Console/Commandsphp logging.php config© ScimProvisioning.php app/Component/SCIM(C) Search.oho aon/Models/ActivitvlSoftPhoneManager.php app/Component/Twilio/Conference/ConferenceManag© TextMessagingService.php app/Services/Telephony> Unversioned Files 13 filesDo not ignoreHighlight words"X Ba |?3 ditterences85604af40 app/Component/SCIM/Constants.phppublic const META_ENTERPRISE_SCHEMA = 'urn:ietf:params: scim: schemas: extension:enterprise:2.0:User':public const META_DEPARTMENT = 'department';public const META_META = 'meta';Current versionpublic const META META = 'meta';public const USER_PATCH_ATTR_PRIMARY_EMAIL = 'emails[type eq "work"] .value' ;public const USER_PATCH_ATTR_SECONDARY_EMAIL = 'emails[type eq "home"] . value';public const USER_PATCH_ATTR_PHONE_NUMBER = 'phoneNumbers[type eq "work"] .value' ;public const USER_PATCH_ATTR_PHONE_NUMBER_MOBILE = 'phoneNumbers[type eq "mobile"]. value';public const USER PATCH ATTR PRIMARY. EMAIL = 'emails[type eq "work"] .value' ;public const USER PATCH ATTR SECONDARY. EMAIL = 'emails[type eq "home"] . value';public const USER PATCH.ATTR_ PHONE_NUMBER = 'phoneNumbers[type eq "work"] .value' ;public const USER PATCH.ATTR_ PHONE_NUMBER MOBILE = 'phoneNumbers[type eq "mobile"] . value':public const USER PATCH ATTR_ROLES = 'roles';public const USER_SUPPORTED_PATCH_ATTRIBUTES_MUTATORS = [self::USER_PATCH_ATTR_TITLE => Mutators\Attributes\User\TitLeAttr: :class,seLt:USER PATCH ATIR ACIVE E> Mutatons Attributes User ActiveAttr::classpublic const USER SUPPORTED PATCH ATTRIBUTES MUTATORS = [selt::USERPATCH ATTRTITLE = Mutators Attributes User T1tLeAttr::classself: :USER_PATCH_ATTR_ACTIVE => Mutators\Attributes\User\ActiveAttr: :class,self::USER PATCH ATTR PRIMARY EMAIL => Mutators Attributes User Primarvemai Attr::class)self::USER_PATCH_ATTR_SECONDARY_EMAIL => Mutators\Attributes \User\SecondaryEmailAttr: :class,self::USER PATCH ATTR PHONE NUMBER => Mutators Attributes User PhoneNumberPrimarvAttr::class..self::USER_PATCH_ATTR_PHONE_NUMBER_MOBILE => Mutators\Attributes\User\PhoneNumberSecondaryAttr::class,self: :USER_PATCH_ATTR_PRIMARY_EMAIL => Mutators\Attributes\User\PrimaryEmailAttr::class,self::USER PATCH ATTR SECONDARY EMAIL => Mutators Attributes User Secondarvemai Attr::class.self::USER_PATCH_ATTR_PHONE_NUMBER => Mutators \Attributes \User\PhoneNumberPrimaryAttr::class,self::USER_PATCH_ATTR_PHONE_NUMBER_MOBILE => Mutators\Attributes\User\PhoneNumberSecondaryAttr::class,self: :USER_PATCH_ATTR_ROLES => Mutators\Attributes\User\RoleAttr::class,public const FILTER_OPERATOR_EQ = 'eq';public const FILTER, OPERATOR.EQ = 'eq';The Huncnell nluain hac họ.naries for other lanquades (todav 10-00)WN Windsurf Toams 214-1UTF.8f?4 spaces...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
56399
|
1966
|
10
|
2026-05-19T08:05:17.580168+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-19/1779 /Users/lukas/.screenpipe/data/data/2026-05-19/1779177917580_m1.jpg...
|
PhpStorm
|
faVsco.js – SavedSearchCRUDFeatureTest.php
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20676-delete-report-re Project: faVsco.js, menu
JY-20676-delete-report-related-objects, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20676-delete-report-related-objects, menu","depth":5,"on_screen":true,"help_text":"Git Branch: JY-20676-delete-report-related-objects","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceTest","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-396245491663569035
|
-8634514108303561274
|
click
|
hybrid
|
NULL
|
Project: faVsco.js, menu
JY-20676-delete-report-re Project: faVsco.js, menu
JY-20676-delete-report-related-objects, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
SlackFileEditViewGoHistoryWindowHelpAPPDOCKER• ₴1DEV (-zsh)₴82app/Jobs/Crm/MatchActivityCrmData.phpapp/Jobs/Middleware/HandleHubspotRateLimit.phpAPP (-zst47++++++p42++++++*app/Mcp/Servers/JiminnyServer.phpapp/Mcp/Tools/GetMeTool.php157++++++•app/Models/Feature/FeatureEnum.phpapp/Services/Activity/HubSpot/ProviderResolver.php+-app/Services/Activity/HubSpot/ProviderResolverInterface.phpapp/Services/Activity/HubSpot/Providers/Provider.phpapp/Services/Activity/HubSpot/Providers/ProviderKixie.php+-app/Services/Activity/HubSpot/Providers/Provider0rum.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilio.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilioFlex.phpapp/Services/Activity/HubSpot/Service.phpapp/Services/Crm/Hubspot/Client.phpapp/Services/Crm/Hubspot/HubspotClientInterface.phpapp/Services/Crm/Hubspot/Pagination/HubspotPaginationService.phpapp/Services/Crm/Hubspot/Pagination/PaginationState.phpdatabase/migrations/2026_05_13_124153_create_mcp_feature_flag.phptests/Feature/Mcp/GetMeToolFeatureTest.phptests/Feature/Mcp/ListCallsToolFeatureTest.phptests/Feature/Mcp/McpTestHelpersTrait.phptests/Unit/Component/ES/ChunkSizeTest.phptests/Unit/Component/ES/Processor/DT0s/SelectionListTest.phptests/Unit/Component/ES/Processor/TargetEntitiesSelectorTest.phptests/Unit/Component/MeetingBot/Service/ParticipantMatcherTest.phptests/Unit/Exceptions/RateLimitExceptionTest.phptests/Unit/Jobs/Crm/MatchActivityCrmDataTest.phptests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phptests/Unit/Services/Activity/HubSpot/ServiceTest.phptests/Unit/Services/Crm/Hubspot/ClientTest.phptests/Unit/Services/Crm/Hubspot/Pagination/HubspotPaginationServiceTest.php97++++++-132++++++•15++++++21++++--2+-25++++++.140++++++-2+-19++++++50++++++-27++++++139++++++-6856++++++-+-151++++++-109++++++-250++++++-283++++++=37 files changed, 1587 insertions(+), 344 deletions(-)create mode 100644 app/Component/ES/ChunkSize.phpcreate mode 100644 app/Jobs/Middleware/HandleHubspotRateLimit.phpcreate mode 100644 app/Mcp/Tools/GetMeTool.phpcreate mode 100644 database/migrations/2026_05_13_124153_create_mcp_feature_flag.phpcreate mode 100644 tests/Feature/Mcp/GetMeToolFeatureTest.phpcreate mode 100644 tests/Unit/Component/ES/ChunkSizeTest.phpcreate mode 100644 tests/Unit/Exceptions/RateLimitExceptionTest.phpcreate mode 100644 tests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phplukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pullAlready up to date.lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20676-delete-reSwitched to a new branch 'JY-20676-delete-report-related-objects'lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20676-delete-report-related-obEDHomeDMsActivityFilesLaterMoreJiminny ...# Jiminny-Dg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi...• Direct messages€. Vasil VasilevP. Nikolay Yankov%. Galya Dimitrova L. Aneliya Angelovaão Stefka StoyanovaStoyan Tomovd Todor Stamatov "Kd. Mario GeorgievNikolay Ivanovdo James Graham2 Stoyan TanevRo Steliyan GeorgievLukas Kovalik y…..AppsJira CloudToastSupport Daily - in 3 h 55 m100% <7Tue 19 May 11:05:17Describe what you are looking for# the_people_of jimi...8 426 0• Messages@ Files+Stefka Stoyanov:Today ~Hі Eteam,I wanted to share that our Lead Developer llianKyuchukov has decided to move on from Jiminny topursue a new opportunity. While we're really sad tosee them go, we're also excited for him and thisnext chapter in his professional journey.llian's last working day will be 14 July, so we stillhave some time together before then. Over thecoming weeks, please make the most of hisknowledge, experience, and context so we canensure a smooth transition across the team.It's hard to overstate the impact llian has had here- from shaping the product and solving toughproblems to supporting teammates and helpingbuild the product we have today. We re incrediblygrateful for everything he contributed over this 2years he was with & engineering team.Just wanted to share the news openly witheveryone and say a huge thanks to llian foreverything so far. Vou Please join me in wishing himall the very best for what comes next.We start looking for a Full-Stack Software Engineer,so if you know anyone you believe will fit, pleasecontact me or Mira directly A® 4887Message #the_people_of_jiminny+...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
56401
|
1966
|
11
|
2026-05-19T08:05:20.879903+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-19/1779 /Users/lukas/.screenpipe/data/data/2026-05-19/1779177920879_m1.jpg...
|
PhpStorm
|
faVsco.js – SavedSearchCRUDFeatureTest.php
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
SlackFileEditViewGoHistoryWindowHelpAPPDOCKER• ₴1D SlackFileEditViewGoHistoryWindowHelpAPPDOCKER• ₴1DEV (-zsh)₴82app/Jobs/Crm/MatchActivityCrmData.phpapp/Jobs/Middleware/HandleHubspotRateLimit.phpAPP (-zst47++++++p42++++++*app/Mcp/Servers/JiminnyServer.phpapp/Mcp/Tools/GetMeTool.php157++++++•app/Models/Feature/FeatureEnum.phpapp/Services/Activity/HubSpot/ProviderResolver.php+-app/Services/Activity/HubSpot/ProviderResolverInterface.phpapp/Services/Activity/HubSpot/Providers/Provider.phpapp/Services/Activity/HubSpot/Providers/ProviderKixie.php+-app/Services/Activity/HubSpot/Providers/Provider0rum.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilio.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilioFlex.phpapp/Services/Activity/HubSpot/Service.phpapp/Services/Crm/Hubspot/Client.phpapp/Services/Crm/Hubspot/HubspotClientInterface.phpapp/Services/Crm/Hubspot/Pagination/HubspotPaginationService.phpapp/Services/Crm/Hubspot/Pagination/PaginationState.phpdatabase/migrations/2026_05_13_124153_create_mcp_feature_flag.phptests/Feature/Mcp/GetMeToolFeatureTest.phptests/Feature/Mcp/ListCallsToolFeatureTest.phptests/Feature/Mcp/McpTestHelpersTrait.phptests/Unit/Component/ES/ChunkSizeTest.phptests/Unit/Component/ES/Processor/DT0s/SelectionListTest.phptests/Unit/Component/ES/Processor/TargetEntitiesSelectorTest.phptests/Unit/Component/MeetingBot/Service/ParticipantMatcherTest.phptests/Unit/Exceptions/RateLimitExceptionTest.phptests/Unit/Jobs/Crm/MatchActivityCrmDataTest.phptests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phptests/Unit/Services/Activity/HubSpot/ServiceTest.phptests/Unit/Services/Crm/Hubspot/ClientTest.phptests/Unit/Services/Crm/Hubspot/Pagination/HubspotPaginationServiceTest.php97++++++-132++++++•15++++++21++++--2+-25++++++.140++++++-2+-19++++++50++++++-27++++++139++++++-6856++++++-+-151++++++-109++++++-250++++++-283++++++=37 files changed, 1587 insertions(+), 344 deletions(-)create mode 100644 app/Component/ES/ChunkSize.phpcreate mode 100644 app/Jobs/Middleware/HandleHubspotRateLimit.phpcreate mode 100644 app/Mcp/Tools/GetMeTool.phpcreate mode 100644 database/migrations/2026_05_13_124153_create_mcp_feature_flag.phpcreate mode 100644 tests/Feature/Mcp/GetMeToolFeatureTest.phpcreate mode 100644 tests/Unit/Component/ES/ChunkSizeTest.phpcreate mode 100644 tests/Unit/Exceptions/RateLimitExceptionTest.phpcreate mode 100644 tests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phplukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pullAlready up to date.lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20676-delete-reSwitched to a new branch 'JY-20676-delete-report-related-objects'lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20676-delete-report-related-obEDHomeDMsActivityFilesLaterMoreJiminny ...# Jiminny-Dg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi...• Direct messages€. Vasil VasilevP. Nikolay Yankov%. Galya Dimitrova L. Aneliya Angelovaão Stefka StoyanovaStoyan Tomovd Todor Stamatov "Kd. Mario GeorgievNikolay Ivanovdo James Graham2 Stoyan TanevRo Steliyan GeorgievLukas Kovalik y…..AppsJira CloudToastSupport Daily - in 3 h 55 m100% <7Tue 19 May 11:05:20Describe what you are looking for# the_people_of jimi...8 426 0• MessagesQ Files+Stefka Stoyanov:Today ~Hі Eteam,I wanted to share that our Lead Developer llianKyuchukov has decided to move on from Jiminny topursue a new opportunity. While we're really sad tosee them go, we're also excited for him and thisnext chapter in his professional journey.llian's last working day will be 14 July, so we stillhave some time together before then. Over thecoming weeks, please make the most of hisknowledge, experience, and context so we canensure a smooth transition across the team.It's hard to overstate the impact llian has had here- from shaping the product and solving toughproblems to supporting teammates and helpingbuild the product we have today. We re incrediblygrateful for everything he contributed over this 2years he was with & engineering team.Just wanted to share the news openly witheveryone and say a huge thanks to llian foreverything so far. Vou Please join me in wishing himall the very best for what comes next.We start looking for a Full-Stack Software Engineer,so if you know anyone you believe will fit, pleasecontact me or Mira directly A687Message #the_people_of_jiminny+...
|
NULL
|
-4716540470967220371
|
NULL
|
click
|
ocr
|
NULL
|
SlackFileEditViewGoHistoryWindowHelpAPPDOCKER• ₴1D SlackFileEditViewGoHistoryWindowHelpAPPDOCKER• ₴1DEV (-zsh)₴82app/Jobs/Crm/MatchActivityCrmData.phpapp/Jobs/Middleware/HandleHubspotRateLimit.phpAPP (-zst47++++++p42++++++*app/Mcp/Servers/JiminnyServer.phpapp/Mcp/Tools/GetMeTool.php157++++++•app/Models/Feature/FeatureEnum.phpapp/Services/Activity/HubSpot/ProviderResolver.php+-app/Services/Activity/HubSpot/ProviderResolverInterface.phpapp/Services/Activity/HubSpot/Providers/Provider.phpapp/Services/Activity/HubSpot/Providers/ProviderKixie.php+-app/Services/Activity/HubSpot/Providers/Provider0rum.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilio.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilioFlex.phpapp/Services/Activity/HubSpot/Service.phpapp/Services/Crm/Hubspot/Client.phpapp/Services/Crm/Hubspot/HubspotClientInterface.phpapp/Services/Crm/Hubspot/Pagination/HubspotPaginationService.phpapp/Services/Crm/Hubspot/Pagination/PaginationState.phpdatabase/migrations/2026_05_13_124153_create_mcp_feature_flag.phptests/Feature/Mcp/GetMeToolFeatureTest.phptests/Feature/Mcp/ListCallsToolFeatureTest.phptests/Feature/Mcp/McpTestHelpersTrait.phptests/Unit/Component/ES/ChunkSizeTest.phptests/Unit/Component/ES/Processor/DT0s/SelectionListTest.phptests/Unit/Component/ES/Processor/TargetEntitiesSelectorTest.phptests/Unit/Component/MeetingBot/Service/ParticipantMatcherTest.phptests/Unit/Exceptions/RateLimitExceptionTest.phptests/Unit/Jobs/Crm/MatchActivityCrmDataTest.phptests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phptests/Unit/Services/Activity/HubSpot/ServiceTest.phptests/Unit/Services/Crm/Hubspot/ClientTest.phptests/Unit/Services/Crm/Hubspot/Pagination/HubspotPaginationServiceTest.php97++++++-132++++++•15++++++21++++--2+-25++++++.140++++++-2+-19++++++50++++++-27++++++139++++++-6856++++++-+-151++++++-109++++++-250++++++-283++++++=37 files changed, 1587 insertions(+), 344 deletions(-)create mode 100644 app/Component/ES/ChunkSize.phpcreate mode 100644 app/Jobs/Middleware/HandleHubspotRateLimit.phpcreate mode 100644 app/Mcp/Tools/GetMeTool.phpcreate mode 100644 database/migrations/2026_05_13_124153_create_mcp_feature_flag.phpcreate mode 100644 tests/Feature/Mcp/GetMeToolFeatureTest.phpcreate mode 100644 tests/Unit/Component/ES/ChunkSizeTest.phpcreate mode 100644 tests/Unit/Exceptions/RateLimitExceptionTest.phpcreate mode 100644 tests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phplukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pullAlready up to date.lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20676-delete-reSwitched to a new branch 'JY-20676-delete-report-related-objects'lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20676-delete-report-related-obEDHomeDMsActivityFilesLaterMoreJiminny ...# Jiminny-Dg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi...• Direct messages€. Vasil VasilevP. Nikolay Yankov%. Galya Dimitrova L. Aneliya Angelovaão Stefka StoyanovaStoyan Tomovd Todor Stamatov "Kd. Mario GeorgievNikolay Ivanovdo James Graham2 Stoyan TanevRo Steliyan GeorgievLukas Kovalik y…..AppsJira CloudToastSupport Daily - in 3 h 55 m100% <7Tue 19 May 11:05:20Describe what you are looking for# the_people_of jimi...8 426 0• MessagesQ Files+Stefka Stoyanov:Today ~Hі Eteam,I wanted to share that our Lead Developer llianKyuchukov has decided to move on from Jiminny topursue a new opportunity. While we're really sad tosee them go, we're also excited for him and thisnext chapter in his professional journey.llian's last working day will be 14 July, so we stillhave some time together before then. Over thecoming weeks, please make the most of hisknowledge, experience, and context so we canensure a smooth transition across the team.It's hard to overstate the impact llian has had here- from shaping the product and solving toughproblems to supporting teammates and helpingbuild the product we have today. We re incrediblygrateful for everything he contributed over this 2years he was with & engineering team.Just wanted to share the news openly witheveryone and say a huge thanks to llian foreverything so far. Vou Please join me in wishing himall the very best for what comes next.We start looking for a Full-Stack Software Engineer,so if you know anyone you believe will fit, pleasecontact me or Mira directly A687Message #the_people_of_jiminny+...
|
56399
|
NULL
|
NULL
|
NULL
|
|
56402
|
1967
|
12
|
2026-05-19T08:05:22.184773+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-19/1779 /Users/lukas/.screenpipe/data/data/2026-05-19/1779177922184_m2.jpg...
|
PhpStorm
|
faVsco.js – SavedSearchCRUDFeatureTest.php
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhostormINavicareCodeKeractorlooIsFV faVsco.js?9 J PhostormINavicareCodeKeractorlooIsFV faVsco.js?9 JY-20676-delete-report-related-objectsProiectC) AutomatedReport.onp© AskAnythingPromptServiceTest.php- ActivtvaskAnvihind est.ono© SavedSearchCRUDFeatureTest.php X© AskAnythingPromptDto.phpe) -xooricontro||erRateLimit est.onoC) FakeProphetClient.ohv© BaseService.php> _ Midd ewareC SoftPhoneManager.phpC) RoleAttr.png© ScimProvisioning.phpRequests() ListenerRoleCanr() RoleAttrTest.phpInteractionsa InvitationsListenerRoleCannotHaveAdminOrManagerPermissionRule.phpC)Activity/Close/Service.php© Activity/RingCentral/Service.phpIHlohsIn Listeners© SyncActivity.php© Crm/Close/Service.php(C) TextMessaqingService.phpD McpN Modelsifinal class SavedSearchCRUDFeatureTest extends TestCase194 D >public function userCanUpdateASavedSearchBasedOnActivityFilters: void{...}M NotificationsOrganizationSettingsW rlayllstsD Policies( RepositoriesC RulesC SavedSearchesSavedSearchCRUDFeatureTest.php› C Search257 D >#Phrun1c rramework Accribuces lescpublic function userCanDeleteASavedSearch: void{...}›_ serviceProvidersLocal ChangesConsole XLoo Xv Changes 16 files+ → @ Side-by-side viewer -Do not ignoreHighlight words 158 5604af40 app/Comp© ActivityController.php app/Http/Controllers/APIc)AsKAnythingPrompt.php app/Models/AsKAnythinguse Jiminny Models Role:c) ASKAnvihinaPromotbto,ono apo/comoonent/AskAnvihino/Dros© AskAnythingPromptService.php app/Component/AskAnythingC)AskAnvthinaPromotServiceTest.oho tests/Unit/Comoonent/AskAnvthinal© AskJiminnvReportsController.php app/Htto/Controllers/API/V2use liminnv Model c Team:use Jiminny Models\User;use liminnv Senvices IlsenSenvice.use Sentry:C) Constants.ono aoo/Comoonent/SClMI@ CoreUser.pho app/DTO/SCIMIAAD/Responseclass ScimProvisioningC) CoreUserRequest.ono ano/DTO/SCIMIAAD/[EMAIL] apn/Console/Commandspublic function _construct(private readonly Dispatcher SeventDispatcherphp logging.php config@ ScimProvisionina.phnapn/Comnonent/SCIMorivace readonly userservice suserserviceC) Search.nho aon/Models/Activitvprivate readonly RoleChangeLogger SroleChangeLogger@ SoftPhoneManader.nhn ann/Comnonent/Twilio/Conference/ConferenceManad© TextMessagingService.php app/Services/Telephony• LInvorcionod Ciloc 12 filocpublic function validateUserIdInput(Sid. Team Steam): boolT'email' => Sdto->qetEmailPrimaryWorkO],SuserUodateDatalif (! SnewUser->roles()->exists()) {Snewliser->addRole User: ROLE ANALYSTO:/** @var Role Srole */Snole = Role• •quenvo->whenedr'namel => Isen: •ROI F ANAI VSTID->finctinCailo•e Hunsnell nluain hac heonolv uninctall Huncnoll without affectina the dictionarios for other lanquadec (todav 10-00)= custom.log= laravel.log4 SF jiminny@localhost]4 HS_local [jiminny@localhost]& console [PROD]# console [euyA console [STAGING]© CoachingFeedbackCoachUserln.php Xfinal class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefini~pubLic tunccion conscruct userkeposicory suserkeposicorw?...29 6tpublic function shouldApplyQueries: bool{...}34 ot>public function getQueries: FilterDefinitionQueryCollection{...}A3416 ^ v45 6tpubLic function toArrayo): arrayi...h1 usaadprivate function getOptions: arrayt...=119=130public function getValue: arrayt...=131lusageprivate function getDefaultValue: arrayt...136 >public function getValidationRules(?string $prefix = null): array{...}Current versionuse Jiminny Models Role;use liminnv Model c Teamuse Jiminny Models\User;luse liminnv Senvices IlcenSenvico•use Jiminny\Contracts\Acl \RoleRepositoryInterface:use Illuminate\Support\Facades|VaLidaton.use Jiminny Rules\DependentRolesRule;use Jiminny Rules\ListenerRoleCannotHaveAdmin0rManagerPermissionRule:use Jiminny Rules \ListenerRoleRequiresListenerFeatureRuleuse Jiminny Actions UpdateUserRolesAction:use Jiminny DTO\Roles UserRolesSyncDT0:use Sentry:class Sc1mProv1s10n1nqlpublic function -_constructorivate readonly Daspatcher seventiisoatcher.private readonly UserService $userService,orivate readonly RolechangeLogger SroleChangeLogger..orivate readonly RoleRepositoryInterface $roleRepository,orivate readoniv UodatelserRolesAction SundatelserRolesAction.nublic function validatellsenTdinnut(Sid. Team Steam• hooll• suppont Dally • In 3n 0om100% 5• Tue 19 May 11:05:21AskJiminnyReportActivityServiceTest vCascadeAsk Jiminny Report M+0 ..3. loggle validationrtsController.php: 126-169 — In toggleStatus(), when enabled=true and the report is an Ask Jiminnyreport, returns 422 lt elther activity search 1d or ask anything prompt 1d is nult . Disabling is always allowed.4. TestsAskAnythingPromptServiceTest.php - Updated two existing update() mock expectations to match the new payload ( ['aPer your rules i did not add unit tests for the controller. The existing SavedSearchCRUDFeatureTest covers the searchdelete tlow: backend service test covers promot delete pavload.* Reject allAccent alliAsk anvthina (4D14 @s Codo Chudo Onuc 17 Modium•01.4 difterencesWN Windsurf Toams 214-1UTF.8ih 4 spaces...
|
NULL
|
-6383931696294804328
|
NULL
|
visual_change
|
ocr
|
NULL
|
PhostormINavicareCodeKeractorlooIsFV faVsco.js?9 J PhostormINavicareCodeKeractorlooIsFV faVsco.js?9 JY-20676-delete-report-related-objectsProiectC) AutomatedReport.onp© AskAnythingPromptServiceTest.php- ActivtvaskAnvihind est.ono© SavedSearchCRUDFeatureTest.php X© AskAnythingPromptDto.phpe) -xooricontro||erRateLimit est.onoC) FakeProphetClient.ohv© BaseService.php> _ Midd ewareC SoftPhoneManager.phpC) RoleAttr.png© ScimProvisioning.phpRequests() ListenerRoleCanr() RoleAttrTest.phpInteractionsa InvitationsListenerRoleCannotHaveAdminOrManagerPermissionRule.phpC)Activity/Close/Service.php© Activity/RingCentral/Service.phpIHlohsIn Listeners© SyncActivity.php© Crm/Close/Service.php(C) TextMessaqingService.phpD McpN Modelsifinal class SavedSearchCRUDFeatureTest extends TestCase194 D >public function userCanUpdateASavedSearchBasedOnActivityFilters: void{...}M NotificationsOrganizationSettingsW rlayllstsD Policies( RepositoriesC RulesC SavedSearchesSavedSearchCRUDFeatureTest.php› C Search257 D >#Phrun1c rramework Accribuces lescpublic function userCanDeleteASavedSearch: void{...}›_ serviceProvidersLocal ChangesConsole XLoo Xv Changes 16 files+ → @ Side-by-side viewer -Do not ignoreHighlight words 158 5604af40 app/Comp© ActivityController.php app/Http/Controllers/APIc)AsKAnythingPrompt.php app/Models/AsKAnythinguse Jiminny Models Role:c) ASKAnvihinaPromotbto,ono apo/comoonent/AskAnvihino/Dros© AskAnythingPromptService.php app/Component/AskAnythingC)AskAnvthinaPromotServiceTest.oho tests/Unit/Comoonent/AskAnvthinal© AskJiminnvReportsController.php app/Htto/Controllers/API/V2use liminnv Model c Team:use Jiminny Models\User;use liminnv Senvices IlsenSenvice.use Sentry:C) Constants.ono aoo/Comoonent/SClMI@ CoreUser.pho app/DTO/SCIMIAAD/Responseclass ScimProvisioningC) CoreUserRequest.ono ano/DTO/SCIMIAAD/[EMAIL] apn/Console/Commandspublic function _construct(private readonly Dispatcher SeventDispatcherphp logging.php config@ ScimProvisionina.phnapn/Comnonent/SCIMorivace readonly userservice suserserviceC) Search.nho aon/Models/Activitvprivate readonly RoleChangeLogger SroleChangeLogger@ SoftPhoneManader.nhn ann/Comnonent/Twilio/Conference/ConferenceManad© TextMessagingService.php app/Services/Telephony• LInvorcionod Ciloc 12 filocpublic function validateUserIdInput(Sid. Team Steam): boolT'email' => Sdto->qetEmailPrimaryWorkO],SuserUodateDatalif (! SnewUser->roles()->exists()) {Snewliser->addRole User: ROLE ANALYSTO:/** @var Role Srole */Snole = Role• •quenvo->whenedr'namel => Isen: •ROI F ANAI VSTID->finctinCailo•e Hunsnell nluain hac heonolv uninctall Huncnoll without affectina the dictionarios for other lanquadec (todav 10-00)= custom.log= laravel.log4 SF jiminny@localhost]4 HS_local [jiminny@localhost]& console [PROD]# console [euyA console [STAGING]© CoachingFeedbackCoachUserln.php Xfinal class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefini~pubLic tunccion conscruct userkeposicory suserkeposicorw?...29 6tpublic function shouldApplyQueries: bool{...}34 ot>public function getQueries: FilterDefinitionQueryCollection{...}A3416 ^ v45 6tpubLic function toArrayo): arrayi...h1 usaadprivate function getOptions: arrayt...=119=130public function getValue: arrayt...=131lusageprivate function getDefaultValue: arrayt...136 >public function getValidationRules(?string $prefix = null): array{...}Current versionuse Jiminny Models Role;use liminnv Model c Teamuse Jiminny Models\User;luse liminnv Senvices IlcenSenvico•use Jiminny\Contracts\Acl \RoleRepositoryInterface:use Illuminate\Support\Facades|VaLidaton.use Jiminny Rules\DependentRolesRule;use Jiminny Rules\ListenerRoleCannotHaveAdmin0rManagerPermissionRule:use Jiminny Rules \ListenerRoleRequiresListenerFeatureRuleuse Jiminny Actions UpdateUserRolesAction:use Jiminny DTO\Roles UserRolesSyncDT0:use Sentry:class Sc1mProv1s10n1nqlpublic function -_constructorivate readonly Daspatcher seventiisoatcher.private readonly UserService $userService,orivate readonly RolechangeLogger SroleChangeLogger..orivate readonly RoleRepositoryInterface $roleRepository,orivate readoniv UodatelserRolesAction SundatelserRolesAction.nublic function validatellsenTdinnut(Sid. Team Steam• hooll• suppont Dally • In 3n 0om100% 5• Tue 19 May 11:05:21AskJiminnyReportActivityServiceTest vCascadeAsk Jiminny Report M+0 ..3. loggle validationrtsController.php: 126-169 — In toggleStatus(), when enabled=true and the report is an Ask Jiminnyreport, returns 422 lt elther activity search 1d or ask anything prompt 1d is nult . Disabling is always allowed.4. TestsAskAnythingPromptServiceTest.php - Updated two existing update() mock expectations to match the new payload ( ['aPer your rules i did not add unit tests for the controller. The existing SavedSearchCRUDFeatureTest covers the searchdelete tlow: backend service test covers promot delete pavload.* Reject allAccent alliAsk anvthina (4D14 @s Codo Chudo Onuc 17 Modium•01.4 difterencesWN Windsurf Toams 214-1UTF.8ih 4 spaces...
|
56400
|
NULL
|
NULL
|
NULL
|
|
56403
|
1966
|
12
|
2026-05-19T08:05:25.106379+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-19/1779 /Users/lukas/.screenpipe/data/data/2026-05-19/1779177925106_m1.jpg...
|
PhpStorm
|
faVsco.js – SavedSearchCRUDFeatureTest.php
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
SlackFileEditViewGoHistoryWindowHelpAPPDOCKER• ₴1D SlackFileEditViewGoHistoryWindowHelpAPPDOCKER• ₴1DEV (-zsh)₴82app/Jobs/Crm/MatchActivityCrmData.phpapp/Jobs/Middleware/HandleHubspotRateLimit.phpAPP (-zst47++++++p42++++++*app/Mcp/Servers/JiminnyServer.phpapp/Mcp/Tools/GetMeTool.php157++++++•app/Models/Feature/FeatureEnum.phpapp/Services/Activity/HubSpot/ProviderResolver.php+-app/Services/Activity/HubSpot/ProviderResolverInterface.phpapp/Services/Activity/HubSpot/Providers/Provider.phpapp/Services/Activity/HubSpot/Providers/ProviderKixie.php+-app/Services/Activity/HubSpot/Providers/Provider0rum.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilio.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilioFlex.phpapp/Services/Activity/HubSpot/Service.phpapp/Services/Crm/Hubspot/Client.phpapp/Services/Crm/Hubspot/HubspotClientInterface.phpapp/Services/Crm/Hubspot/Pagination/HubspotPaginationService.phpapp/Services/Crm/Hubspot/Pagination/PaginationState.phpdatabase/migrations/2026_05_13_124153_create_mcp_feature_flag.phptests/Feature/Mcp/GetMeToolFeatureTest.phptests/Feature/Mcp/ListCallsToolFeatureTest.phptests/Feature/Mcp/McpTestHelpersTrait.phptests/Unit/Component/ES/ChunkSizeTest.phptests/Unit/Component/ES/Processor/DT0s/SelectionListTest.phptests/Unit/Component/ES/Processor/TargetEntitiesSelectorTest.phptests/Unit/Component/MeetingBot/Service/ParticipantMatcherTest.phptests/Unit/Exceptions/RateLimitExceptionTest.phptests/Unit/Jobs/Crm/MatchActivityCrmDataTest.phptests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phptests/Unit/Services/Activity/HubSpot/ServiceTest.phptests/Unit/Services/Crm/Hubspot/ClientTest.phptests/Unit/Services/Crm/Hubspot/Pagination/HubspotPaginationServiceTest.php97++++++-132++++++•15++++++21++++--2+-25++++++.140++++++-2+-19++++++50++++++-27++++++139++++++-6856++++++-+-151++++++-109++++++-250++++++-283++++++=37 files changed, 1587 insertions(+), 344 deletions(-)create mode 100644 app/Component/ES/ChunkSize.phpcreate mode 100644 app/Jobs/Middleware/HandleHubspotRateLimit.phpcreate mode 100644 app/Mcp/Tools/GetMeTool.phpcreate mode 100644 database/migrations/2026_05_13_124153_create_mcp_feature_flag.phpcreate mode 100644 tests/Feature/Mcp/GetMeToolFeatureTest.phpcreate mode 100644 tests/Unit/Component/ES/ChunkSizeTest.phpcreate mode 100644 tests/Unit/Exceptions/RateLimitExceptionTest.phpcreate mode 100644 tests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phplukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pullAlready up to date.lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20676-delete-reSwitched to a new branch 'JY-20676-delete-report-related-objects'lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20676-delete-report-related-obEDHomeDMsActivityFilesLaterMoreJiminny ...# Jiminny-Dg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi...• Direct messages€. Vasil VasilevP. Nikolay Yankov%. Galya Dimitrova L. Aneliya Angelovaão Stefka StoyanovaStoyan Tomovd Todor Stamatov "Kd. Mario GeorgievNikolay Ivanovdo James Graham2 Stoyan TanevRo Steliyan GeorgievLukas Kovalik y…..AppsJira CloudToastSupport Daily - in 3 h 55 m100% <7Tue 19 May 11:05:25Describe what you are looking for# the_people_of jimi...8 426 0• Messages@ Files+Stefka Stoyanov:Today ~Hі Eteam,I wanted to share that our Lead Developer llianKyuchukov has decided to move on from Jiminny topursue a new opportunity. While we're really sad tosee them go, we're also excited for him and thisnext chapter in his professional journey.llian's last working day will be 14 July, so we stillhave some time together before then. Over thecoming weeks, please make the most of hisknowledge, experience, and context so we canensure a smooth transition across the team.It's hard to overstate the impact llian has had here- from shaping the product and solving toughproblems to supporting teammates and helpingbuild the product we have today. We re incrediblygrateful for everything he contributed over this 2years he was with & engineering team.Just wanted to share the news openly witheveryone and say a huge thanks to llian foreverything so far. Vou Please join me in wishing himall the very best for what comes next.We start looking for a Full-Stack Software Engineer,so if you know anyone you believe will fit, pleasecontact me or Mira directly A687Message #the_people_of_jiminny+...
|
NULL
|
6985653923973758564
|
NULL
|
click
|
ocr
|
NULL
|
SlackFileEditViewGoHistoryWindowHelpAPPDOCKER• ₴1D SlackFileEditViewGoHistoryWindowHelpAPPDOCKER• ₴1DEV (-zsh)₴82app/Jobs/Crm/MatchActivityCrmData.phpapp/Jobs/Middleware/HandleHubspotRateLimit.phpAPP (-zst47++++++p42++++++*app/Mcp/Servers/JiminnyServer.phpapp/Mcp/Tools/GetMeTool.php157++++++•app/Models/Feature/FeatureEnum.phpapp/Services/Activity/HubSpot/ProviderResolver.php+-app/Services/Activity/HubSpot/ProviderResolverInterface.phpapp/Services/Activity/HubSpot/Providers/Provider.phpapp/Services/Activity/HubSpot/Providers/ProviderKixie.php+-app/Services/Activity/HubSpot/Providers/Provider0rum.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilio.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilioFlex.phpapp/Services/Activity/HubSpot/Service.phpapp/Services/Crm/Hubspot/Client.phpapp/Services/Crm/Hubspot/HubspotClientInterface.phpapp/Services/Crm/Hubspot/Pagination/HubspotPaginationService.phpapp/Services/Crm/Hubspot/Pagination/PaginationState.phpdatabase/migrations/2026_05_13_124153_create_mcp_feature_flag.phptests/Feature/Mcp/GetMeToolFeatureTest.phptests/Feature/Mcp/ListCallsToolFeatureTest.phptests/Feature/Mcp/McpTestHelpersTrait.phptests/Unit/Component/ES/ChunkSizeTest.phptests/Unit/Component/ES/Processor/DT0s/SelectionListTest.phptests/Unit/Component/ES/Processor/TargetEntitiesSelectorTest.phptests/Unit/Component/MeetingBot/Service/ParticipantMatcherTest.phptests/Unit/Exceptions/RateLimitExceptionTest.phptests/Unit/Jobs/Crm/MatchActivityCrmDataTest.phptests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phptests/Unit/Services/Activity/HubSpot/ServiceTest.phptests/Unit/Services/Crm/Hubspot/ClientTest.phptests/Unit/Services/Crm/Hubspot/Pagination/HubspotPaginationServiceTest.php97++++++-132++++++•15++++++21++++--2+-25++++++.140++++++-2+-19++++++50++++++-27++++++139++++++-6856++++++-+-151++++++-109++++++-250++++++-283++++++=37 files changed, 1587 insertions(+), 344 deletions(-)create mode 100644 app/Component/ES/ChunkSize.phpcreate mode 100644 app/Jobs/Middleware/HandleHubspotRateLimit.phpcreate mode 100644 app/Mcp/Tools/GetMeTool.phpcreate mode 100644 database/migrations/2026_05_13_124153_create_mcp_feature_flag.phpcreate mode 100644 tests/Feature/Mcp/GetMeToolFeatureTest.phpcreate mode 100644 tests/Unit/Component/ES/ChunkSizeTest.phpcreate mode 100644 tests/Unit/Exceptions/RateLimitExceptionTest.phpcreate mode 100644 tests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phplukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pullAlready up to date.lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20676-delete-reSwitched to a new branch 'JY-20676-delete-report-related-objects'lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20676-delete-report-related-obEDHomeDMsActivityFilesLaterMoreJiminny ...# Jiminny-Dg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi...• Direct messages€. Vasil VasilevP. Nikolay Yankov%. Galya Dimitrova L. Aneliya Angelovaão Stefka StoyanovaStoyan Tomovd Todor Stamatov "Kd. Mario GeorgievNikolay Ivanovdo James Graham2 Stoyan TanevRo Steliyan GeorgievLukas Kovalik y…..AppsJira CloudToastSupport Daily - in 3 h 55 m100% <7Tue 19 May 11:05:25Describe what you are looking for# the_people_of jimi...8 426 0• Messages@ Files+Stefka Stoyanov:Today ~Hі Eteam,I wanted to share that our Lead Developer llianKyuchukov has decided to move on from Jiminny topursue a new opportunity. While we're really sad tosee them go, we're also excited for him and thisnext chapter in his professional journey.llian's last working day will be 14 July, so we stillhave some time together before then. Over thecoming weeks, please make the most of hisknowledge, experience, and context so we canensure a smooth transition across the team.It's hard to overstate the impact llian has had here- from shaping the product and solving toughproblems to supporting teammates and helpingbuild the product we have today. We re incrediblygrateful for everything he contributed over this 2years he was with & engineering team.Just wanted to share the news openly witheveryone and say a huge thanks to llian foreverything so far. Vou Please join me in wishing himall the very best for what comes next.We start looking for a Full-Stack Software Engineer,so if you know anyone you believe will fit, pleasecontact me or Mira directly A687Message #the_people_of_jiminny+...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
56404
|
1967
|
13
|
2026-05-19T08:05:25.774950+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-19/1779 /Users/lukas/.screenpipe/data/data/2026-05-19/1779177925774_m2.jpg...
|
PhpStorm
|
faVsco.js – SavedSearchCRUDFeatureTest.php
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20676-delete-report-re Project: faVsco.js, menu
JY-20676-delete-report-related-objects, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20676-delete-report-related-objects, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.098071806,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: JY-20676-delete-report-related-objects","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.8081782,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceTest","depth":6,"bounds":{"left":0.8234708,"top":0.019952115,"width":0.09208777,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"bounds":{"left":0.9155585,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest'","depth":6,"bounds":{"left":0.9268617,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"bounds":{"left":0.9381649,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"bounds":{"left":0.96609044,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"bounds":{"left":0.9773936,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
5803414936471392232
|
-8636765907853005370
|
visual_change
|
hybrid
|
NULL
|
Project: faVsco.js, menu
JY-20676-delete-report-re Project: faVsco.js, menu
JY-20676-delete-report-related-objects, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
PhostormProiect vVIewINavicareCodeKeractorTOOISWindowFV faVsco.js?9 JY-20676-delete-report-related-objectsC) AutomatedReport.onp= laravel.log4 SF jiminny@localhost]4 HS_local [jiminny@localhost]& console [PROD]# console [euy- ActivtvaskAnvihind est.ono© SavedSearchCRUDFeatureTest.php XA console [STAGING]© CoachingFeedbackCoachUserln.php Xe) -xooricontro||erRateLimit est.onoC) FakeProphetClient.ohv> _ Midd ewareRequestsInteractionsInvitationsIHlobsIn ListenersD McpN ModelsiM Notificationsm oraanizationsettingsW rlayllstsD Policies( RepositoriesC RulesC SavedSearchesSavedSearchCRUDFeatureTest.php› C Search›_ serviceProvidersC SoftPhoneManager.php() ListenerRoleCannotHaveAdminOrMa© AskAnythingPromptServiceTest.php© AskAnythingPromptDto.php© BaseService.phpC) RoleAttr.png© ScimProvisioning.php() RoleAttrTest.phpfinal class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefini~29 6tpublic function shouldApplyQueries: boolf...}ListenerRoleCannotHaveAdminOrManagerPermissionRule.phpC)Activity/Close/Service.php© Activity/RingCentral/Service.php34 6t >public function getQueries: FilterDefinitionQueryCollection{...}© SyncActivity.php© Crm/Close/Service.php(C) TextMessaqingService.phpfinal class SavedSearchCRUDFeatureTest extends TestCaseA3416 ^ v45 6touolic function toArravo: arrav...?194 D >public function userCanUpdateASavedSearchBasedOnActivityFilters: void{...}1 usage257 D >#Phrun1c rramework Accribuces lescpublic function userCanDeleteASavedSearch: void{...}private function getOptions: arrayt...=119=130=131136 >public function getValue: arrayt...lusageprivate function getDefaultValue: arrayt...Ask anvthina (4D1public function getValidationRules(?string $prefix = null): array{...}4 @s Codo Chudo Onuc 17 ModiumLocal ChandesConsole XLooX• Changes 16 files.E .env.local appActivityController.php app/Http/Controllers/API© AskAnythingPrompt.php app/Models/AskAnything© AskAnvthingPromptDto.pho app/Component/AskAnvthina/Dtos© AskAnvthinaPromptService.php app/Component/AskAnvthinaSide-bv-side viewerDo not ignore8 5604af40 app/Services/Telephony/TextMessagingService.phpXIIKLOCurrent versionuse Jiminny Models PlavbookCatedory:use liminnv Model c Team:use Jiminny Models\User;use liminnv Senvicos ActivitvSenvico•use Jiminny Models\PlaybookCategory:use liminnv Model c Toam•use Jiminny Models\User;use liminnv Senvices ActivitvSenvice.© AskAnythingPromptServiceTest.php tests/Unit/Component/AskAnything© AskJiminnvReportsController.phv app/Htto/Controllers/API/N2use Jiminny\Services\Crm\CachedCrmServiceDecorator:use Jiminny\Services \Activity\Crm0wnerResolver:(C) Constants.ono aoo/Comoonent/SClM@ CoreUser.pho app/DTO/SCIMIAAD/Responseuse Jiminny\Services\Crm \ProviderRegistry:use Jiminny\Services\Crm\CachedCrmServiceDecorator:use Twilio\Exceptions\ConfigurationException;use Jiminny|Services\Crm\ProviderRegistry:(C) CoreUserRequest.ono ano/DTO/SCIMIAAD/Requestuse Twilio\Exceptions\TwilioException:use Twilio\Exceptions\ConfigurationException;@.liminnvDebuaCommand.ohn apo/Console/Commandsuse Twilio Exceptions \TwilioException:php loadina.nho confiaA Lliminnvl Servicae Telenhonv > TeytMeccaainaService > buildA ctivitv/)©ScimProvisioning.php app/Component/SCIMSteam = Suser->qetTeamO:(C) Search.nho ano/Models/ActivitviSteam = suser->qetteamor@ SoftPhoneManader.nhn app/Comnonent/Twilio/Conference/ConferenceMan:try© TextMessagingService.php app/Services/Telephony• UInvorcionod Ciloc 12 filodScrmService = Sth1s->prov1derReq1stry->qet(Steam->crm->provider)try{ScrmResolver = app(CrmownerResolver::class.if (! Suser->isCrmRequired@) {ScrmService->setuser(steam->cerowneron:}else {anteorationAdman' => suser'providerSlug' => $team->getCrmConfiguration()->getProviderName(),ScrmService->setUser(Suser)if (Scustomerid)$catch Throwable Sthrowabille) 4ScrmService = Sthis->providerReaistrv->aet(Steam->crm->provider).Ouery the CRM for full details of this customerIsleadl Saccount Sonnontunitv. Scontact. Sctaae. SermCountrvlodel =SernSenvice-snanceReconds(ScustomenTd.SohiectTvne)-if@ Suser->isCrmReauiredon<SennSenvice-scetlicen(Steam->aetOwnerd)} else {afely uninstall Hunspell without affecting the dictionaries for other languages. (today 10:00)• suppont Dally • In 3n 0om100% 5• Tue 19 May 11:05:25AskJiminnyReportActivityServiceTest vCascadeAsk Jiminny Report M+0 ..3. loggle validationrtsController.php: 126-169 — In toggleStatus(), when enabled=true and the report is an Ask Jiminnyreport, returns 422 lt elther activity search 1d or ask anything prompt 1d is nult . Disabling is always allowed.4. TestsAskAnythingPromptServiceTest.php - Updated two existing update() mock expectations to match the new payload ( ['aPer your rules i did not add unit tests for the controller. The existing SavedSearchCRUDFeatureTest covers the search* Reject allAccent alli•01.6 ditterencesWN Windsurf Teamsio 4 spaces...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
56405
|
1967
|
14
|
2026-05-19T08:05:28.784727+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-19/1779 /Users/lukas/.screenpipe/data/data/2026-05-19/1779177928784_m2.jpg...
|
PhpStorm
|
faVsco.js – SavedSearchCRUDFeatureTest.php
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20676-delete-report-re Project: faVsco.js, menu
JY-20676-delete-report-related-objects, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
3
16
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Tests\Feature\SavedSearches;
use Illuminate\Support\LazyCollection;
use Illuminate\Support\Str;
use Mockery\MockInterface;
use Illuminate\Database\Eloquent\Factories\Sequence;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Illuminate\Support\Facades\Event;
use Illuminate\Testing\Fluent\AssertableJson;
use Jiminny\Events\Nudges\NudgeCreated;
use Jiminny\Models\Activity\Search;
use Jiminny\Models\Activity\SearchFilter;
use Jiminny\Models\Nudge;
use Jiminny\Models\Role;
use Jiminny\Models\Team;
use Jiminny\Models\User;
use Jiminny\Repositories\ElasticActivityRepository;
use Tests\TestCase;
final class SavedSearchCRUDFeatureTest extends TestCase
{
use DatabaseTransactions;
#[\PHPUnit\Framework\Attributes\Test]
public function userCanGetAListOfSavedSearches(): void
{
$this->markTestSkipped('Needs to be fixed');
/** @var Team $team */
$team = Team::factory()->create([
'crm_id' => 1, // temporary
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'status' => User::STATUS_ACTIVE,
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create();
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
$nudges = Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->getJson(route('api.saved_search.index'))
->assertStatus(200)
->assertJson(
fn (AssertableJson $json) =>
$json->has(1)
->first(
fn ($json) =>
$json->where('id', $search->id_string)
->where('name', $search->getName())
->where('filters', ['max_customer_questions' => 5, 'min_engaging_questions' => 3])
->has('nudges', 2)
->has(
'nudges.0',
fn ($json) =>
$json->where('id', $nudges[0]->id_string)
->where('frequency', 'daily')
->where('channel', 'email')
->has('expiresAt')
)
->has(
'nudges.1',
fn ($json) =>
$json->where('id', $nudges[1]->id_string)
->where('frequency', 'weekly')
->where('channel', 'slack')
->has('expiresAt')
)
)
);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanCreateASavedSearchBasedOnActivityFilters(): void
{
$this->markTestSkipped('Needs to be fixed');
Event::fake();
$this->partialMock(ElasticActivityRepository::class, function (MockInterface $mock) {
$mock->shouldReceive('onDemandScroll')
->times(2)
->andReturn(LazyCollection::empty());
});
/** @var Team $team */
$team = Team::factory()->create([
'uuid' => Str::uuid()->toString(),
'crm_id' => 1, // temporary
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->createQuietly([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$this->apiGuardLogin($user);
$this->actingAs($user)
->postJson(route('api.saved_search.create'), [
'name' => '::searchName::',
'filters' => [
'min_duration' => 1,
'only_recorded' => 1,
],
'nudges' => [
[
'frequency' => 'daily',
'channel' => 'email',
'expiresAt' => now()->addWeek()->format('Y-m-d'),
],
[
'frequency' => 'daily',
'channel' => 'slack',
'expiresAt' => now()->addWeek()->format('Y-m-d'),
],
],
])
->assertStatus(200);
$this->assertDatabaseHas('activity_searches', [
'name' => '::searchName::',
'user_id' => $user->id,
]);
$search = $user->searches()->first();
$this->assertDatabaseHas('nudges', [
'activity_search_id' => $search->id,
'frequency' => 2,
'channel' => 2,
]);
$this->assertDatabaseHas('nudges', [
'activity_search_id' => $search->id,
'frequency' => 2,
'channel' => 4,
]);
$this->assertDatabaseHas('activity_search_filters', [
'activity_search_id' => $search->id,
'filter' => 'min_duration',
'value' => 1,
]);
$this->assertDatabaseHas('activity_search_filters', [
'activity_search_id' => $search->id,
'filter' => 'only_recorded',
'value' => 1,
]);
Event::assertDispatched(NudgeCreated::class, 2);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanUpdateASavedSearchBasedOnActivityFilters(): void
{
/** @var Team $team */
$team = Team::factory()->createQuietly([
'uuid' => Str::uuid()->toString(),
'crm_id' => 1,
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create([
'name' => 'Search Name',
]);
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->putJson(route('api.saved_search.update', $search->id_string), [
'name' => 'Updated Search Name',
])->assertOk()
->assertJson([]);
$this->assertDatabaseMissing('activity_searches', [
'name' => 'Search Name',
'user_id' => $user->id,
]);
$this->assertDatabaseHas('activity_searches', [
'name' => 'Updated Search Name',
'user_id' => $user->id,
]);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanDeleteASavedSearch(): void
{
/** @var Team $team */
$team = Team::factory()->create([
'crm_id' => 1,
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create([
'name' => 'Search Name',
]);
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->deleteJson(route('api.saved_search.delete', $search->id_string))
->assertStatus(200)
->assertJson([]);
$this->assertDatabaseMissing('activity_searches', [
'user_id' => $user->id,
]);
$this->assertDatabaseMissing('activity_search_filters', [
'activity_search_id' => $search->id,
]);
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
1
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Component\ActivitySearch\FilterDefinition;
use Illuminate\Support\Collection;
use Jiminny\Component\ActivitySearch\FilterDefinition;
use Jiminny\Component\ActivitySearch\FilterDefinitionQuery;
use Jiminny\Component\ActivitySearch\FilterDefinitionQueryCollection;
use Jiminny\Contracts\ActivitySearch\ValidatedFilterDefinitionInterface;
use Jiminny\Contracts\Repositories\UserRepository;
use Jiminny\Models;
use Jiminny\Models\Feature\FeatureEnum;
use Jiminny\Models\Team;
use Jiminny\Traits\RequiresUUID;
use Elastica\Query;
final class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefinitionInterface
{
private const int NO_GROUP_ID = 999;
private UserRepository $userRepository;
public function __construct(UserRepository $userRepository)
{
$this->userRepository = $userRepository;
}
public function shouldApplyQueries(): bool
{
return count($this->getValue()) > 0;
}
public function getQueries(): FilterDefinitionQueryCollection
{
$userIds = $this->getValue();
return FilterDefinitionQueryCollection::make([
FilterDefinitionQuery::instance()
->setQuery(new Query\Terms('coachingFeedbacks.coach.id_string', $userIds))
->setPath('coachingFeedbacks.coach', 'coachingFeedbacks'),
]);
}
public function toArray(): array
{
return [
'id' => 'coaching-feedback-user-filter',
'label' => 'Coach',
'helpText' => 'The person who completed the Coaching Framework',
'placeholder' => 'Search coaches',
'inputType' => InputTypeEnum::DROPDOWN_MULTIPLE,
'queryParam' => 'coaching_feedback_coach_id',
'options' => $this->getOptions(),
'groupLabelKey' => 'label',
'groupValuesKey' => 'users',
'optionLabelKey' => 'name',
'optionValueKey' => 'id',
'value' => $this->getValue(),
];
}
private function getOptions(): array
{
$user = $this->executedBy;
$query = $user
->getTeam()
->users()
->whereNotIn(
'uuid',
$this->userRepository->findInaccessibleDeactivatedUserUuids($user)
->map(static fn (string $uuid): string => RequiresUUID::toOptimized($uuid))
->all(),
)
->orderBy('name');
$users = $query
->with('group')
->get()
->reduce(
static function (array $carry, Models\User $user): array {
$group = $user->getGroup();
$groupId = $group !== null
? $group->getUuid()
: self::NO_GROUP_ID;
$groupName = $group !== null
? $group->getName()
: '(NON-GROUPED)';
if (! array_key_exists($groupId, $carry)) {
$carry[$groupId] = [
'label' => $groupName,
'users' => [],
];
}
$carry[$groupId]['users'][] = [
'id' => $user->getUuid(),
'name' => sprintf(
'%s%s',
$user->getName(),
! $user->isStatusActive()
? ' (Inactive)'
: ''
),
];
return $carry;
},
[]
);
return Collection::make($users)
->sortBy('label')
->values()
->toArray();
}
public function getValue(): array
{
if (! $this->criteria->hasCoachingFeedbackCoachUserIds()) {
return $this->getDefaultValue();
}
return array_diff(
$this->criteria->getCoachingFeedbackCoachUserId(),
$this->userRepository->findInaccessibleDeactivatedUserUuids($this->executedBy)->all(),
);
}
private function getDefaultValue(): array
{
return [];
}
public function getValidationRules(?string $prefix = null): array
{
$team = $this->executedBy->getTeam();
return [
$prefix . 'coaching_feedback_coach_id' => 'array',
$prefix . 'coaching_feedback_coach_id.*' => 'uuid:users,team_id,' . $team->getId(),
];
}
public function getSortOrder(): int
{
return 86;
}
public function shouldBeIncluded(Team $team): bool
{
return $team->hasFeature(FeatureEnum::COACHING_FRAMEWORK);
}
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20676-delete-report-related-objects, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.098071806,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: JY-20676-delete-report-related-objects","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.8081782,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceTest","depth":6,"bounds":{"left":0.8234708,"top":0.019952115,"width":0.09208777,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"bounds":{"left":0.9155585,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest'","depth":6,"bounds":{"left":0.9268617,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"bounds":{"left":0.9381649,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"bounds":{"left":0.96609044,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"bounds":{"left":0.9773936,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"bounds":{"left":0.9886968,"top":0.019952115,"width":0.011303186,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"3","depth":4,"bounds":{"left":0.390625,"top":0.22426178,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"16","depth":4,"bounds":{"left":0.4005984,"top":0.22426178,"width":0.009640957,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.4119016,"top":0.22266561,"width":0.00731383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.4192154,"top":0.22266561,"width":0.006981383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\nnamespace Tests\\Feature\\SavedSearches;\n\nuse Illuminate\\Support\\LazyCollection;\nuse Illuminate\\Support\\Str;\nuse Mockery\\MockInterface;\nuse Illuminate\\Database\\Eloquent\\Factories\\Sequence;\nuse Illuminate\\Foundation\\Testing\\DatabaseTransactions;\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\Testing\\Fluent\\AssertableJson;\nuse Jiminny\\Events\\Nudges\\NudgeCreated;\nuse Jiminny\\Models\\Activity\\Search;\nuse Jiminny\\Models\\Activity\\SearchFilter;\nuse Jiminny\\Models\\Nudge;\nuse Jiminny\\Models\\Role;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\ElasticActivityRepository;\nuse Tests\\TestCase;\n\nfinal class SavedSearchCRUDFeatureTest extends TestCase\n{\n use DatabaseTransactions;\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanGetAListOfSavedSearches(): void\n {\n $this->markTestSkipped('Needs to be fixed');\n /** @var Team $team */\n $team = Team::factory()->create([\n 'crm_id' => 1, // temporary\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'status' => User::STATUS_ACTIVE,\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create();\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n $nudges = Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->getJson(route('api.saved_search.index'))\n ->assertStatus(200)\n ->assertJson(\n fn (AssertableJson $json) =>\n $json->has(1)\n ->first(\n fn ($json) =>\n $json->where('id', $search->id_string)\n ->where('name', $search->getName())\n ->where('filters', ['max_customer_questions' => 5, 'min_engaging_questions' => 3])\n ->has('nudges', 2)\n ->has(\n 'nudges.0',\n fn ($json) =>\n $json->where('id', $nudges[0]->id_string)\n ->where('frequency', 'daily')\n ->where('channel', 'email')\n ->has('expiresAt')\n )\n ->has(\n 'nudges.1',\n fn ($json) =>\n $json->where('id', $nudges[1]->id_string)\n ->where('frequency', 'weekly')\n ->where('channel', 'slack')\n ->has('expiresAt')\n )\n )\n );\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanCreateASavedSearchBasedOnActivityFilters(): void\n {\n $this->markTestSkipped('Needs to be fixed');\n\n Event::fake();\n\n $this->partialMock(ElasticActivityRepository::class, function (MockInterface $mock) {\n $mock->shouldReceive('onDemandScroll')\n ->times(2)\n ->andReturn(LazyCollection::empty());\n });\n\n /** @var Team $team */\n $team = Team::factory()->create([\n 'uuid' => Str::uuid()->toString(),\n 'crm_id' => 1, // temporary\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->createQuietly([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->postJson(route('api.saved_search.create'), [\n 'name' => '::searchName::',\n 'filters' => [\n 'min_duration' => 1,\n 'only_recorded' => 1,\n ],\n 'nudges' => [\n [\n 'frequency' => 'daily',\n 'channel' => 'email',\n 'expiresAt' => now()->addWeek()->format('Y-m-d'),\n ],\n [\n 'frequency' => 'daily',\n 'channel' => 'slack',\n 'expiresAt' => now()->addWeek()->format('Y-m-d'),\n ],\n ],\n ])\n ->assertStatus(200);\n\n $this->assertDatabaseHas('activity_searches', [\n 'name' => '::searchName::',\n 'user_id' => $user->id,\n ]);\n\n $search = $user->searches()->first();\n\n $this->assertDatabaseHas('nudges', [\n 'activity_search_id' => $search->id,\n 'frequency' => 2,\n 'channel' => 2,\n ]);\n\n $this->assertDatabaseHas('nudges', [\n 'activity_search_id' => $search->id,\n 'frequency' => 2,\n 'channel' => 4,\n ]);\n\n $this->assertDatabaseHas('activity_search_filters', [\n 'activity_search_id' => $search->id,\n 'filter' => 'min_duration',\n 'value' => 1,\n ]);\n\n $this->assertDatabaseHas('activity_search_filters', [\n 'activity_search_id' => $search->id,\n 'filter' => 'only_recorded',\n 'value' => 1,\n ]);\n\n Event::assertDispatched(NudgeCreated::class, 2);\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanUpdateASavedSearchBasedOnActivityFilters(): void\n {\n /** @var Team $team */\n $team = Team::factory()->createQuietly([\n 'uuid' => Str::uuid()->toString(),\n 'crm_id' => 1,\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create([\n 'name' => 'Search Name',\n ]);\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->putJson(route('api.saved_search.update', $search->id_string), [\n 'name' => 'Updated Search Name',\n ])->assertOk()\n ->assertJson([]);\n\n $this->assertDatabaseMissing('activity_searches', [\n 'name' => 'Search Name',\n 'user_id' => $user->id,\n ]);\n\n $this->assertDatabaseHas('activity_searches', [\n 'name' => 'Updated Search Name',\n 'user_id' => $user->id,\n ]);\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanDeleteASavedSearch(): void\n {\n /** @var Team $team */\n $team = Team::factory()->create([\n 'crm_id' => 1,\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create([\n 'name' => 'Search Name',\n ]);\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->deleteJson(route('api.saved_search.delete', $search->id_string))\n ->assertStatus(200)\n ->assertJson([]);\n\n $this->assertDatabaseMissing('activity_searches', [\n 'user_id' => $user->id,\n ]);\n\n $this->assertDatabaseMissing('activity_search_filters', [\n 'activity_search_id' => $search->id,\n ]);\n }\n}","depth":4,"bounds":{"left":0.15990691,"top":0.0,"width":0.2662899,"height":0.49162012},"on_screen":true,"value":"<?php\n\nnamespace Tests\\Feature\\SavedSearches;\n\nuse Illuminate\\Support\\LazyCollection;\nuse Illuminate\\Support\\Str;\nuse Mockery\\MockInterface;\nuse Illuminate\\Database\\Eloquent\\Factories\\Sequence;\nuse Illuminate\\Foundation\\Testing\\DatabaseTransactions;\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\Testing\\Fluent\\AssertableJson;\nuse Jiminny\\Events\\Nudges\\NudgeCreated;\nuse Jiminny\\Models\\Activity\\Search;\nuse Jiminny\\Models\\Activity\\SearchFilter;\nuse Jiminny\\Models\\Nudge;\nuse Jiminny\\Models\\Role;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\ElasticActivityRepository;\nuse Tests\\TestCase;\n\nfinal class SavedSearchCRUDFeatureTest extends TestCase\n{\n use DatabaseTransactions;\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanGetAListOfSavedSearches(): void\n {\n $this->markTestSkipped('Needs to be fixed');\n /** @var Team $team */\n $team = Team::factory()->create([\n 'crm_id' => 1, // temporary\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'status' => User::STATUS_ACTIVE,\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create();\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n $nudges = Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->getJson(route('api.saved_search.index'))\n ->assertStatus(200)\n ->assertJson(\n fn (AssertableJson $json) =>\n $json->has(1)\n ->first(\n fn ($json) =>\n $json->where('id', $search->id_string)\n ->where('name', $search->getName())\n ->where('filters', ['max_customer_questions' => 5, 'min_engaging_questions' => 3])\n ->has('nudges', 2)\n ->has(\n 'nudges.0',\n fn ($json) =>\n $json->where('id', $nudges[0]->id_string)\n ->where('frequency', 'daily')\n ->where('channel', 'email')\n ->has('expiresAt')\n )\n ->has(\n 'nudges.1',\n fn ($json) =>\n $json->where('id', $nudges[1]->id_string)\n ->where('frequency', 'weekly')\n ->where('channel', 'slack')\n ->has('expiresAt')\n )\n )\n );\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanCreateASavedSearchBasedOnActivityFilters(): void\n {\n $this->markTestSkipped('Needs to be fixed');\n\n Event::fake();\n\n $this->partialMock(ElasticActivityRepository::class, function (MockInterface $mock) {\n $mock->shouldReceive('onDemandScroll')\n ->times(2)\n ->andReturn(LazyCollection::empty());\n });\n\n /** @var Team $team */\n $team = Team::factory()->create([\n 'uuid' => Str::uuid()->toString(),\n 'crm_id' => 1, // temporary\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->createQuietly([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->postJson(route('api.saved_search.create'), [\n 'name' => '::searchName::',\n 'filters' => [\n 'min_duration' => 1,\n 'only_recorded' => 1,\n ],\n 'nudges' => [\n [\n 'frequency' => 'daily',\n 'channel' => 'email',\n 'expiresAt' => now()->addWeek()->format('Y-m-d'),\n ],\n [\n 'frequency' => 'daily',\n 'channel' => 'slack',\n 'expiresAt' => now()->addWeek()->format('Y-m-d'),\n ],\n ],\n ])\n ->assertStatus(200);\n\n $this->assertDatabaseHas('activity_searches', [\n 'name' => '::searchName::',\n 'user_id' => $user->id,\n ]);\n\n $search = $user->searches()->first();\n\n $this->assertDatabaseHas('nudges', [\n 'activity_search_id' => $search->id,\n 'frequency' => 2,\n 'channel' => 2,\n ]);\n\n $this->assertDatabaseHas('nudges', [\n 'activity_search_id' => $search->id,\n 'frequency' => 2,\n 'channel' => 4,\n ]);\n\n $this->assertDatabaseHas('activity_search_filters', [\n 'activity_search_id' => $search->id,\n 'filter' => 'min_duration',\n 'value' => 1,\n ]);\n\n $this->assertDatabaseHas('activity_search_filters', [\n 'activity_search_id' => $search->id,\n 'filter' => 'only_recorded',\n 'value' => 1,\n ]);\n\n Event::assertDispatched(NudgeCreated::class, 2);\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanUpdateASavedSearchBasedOnActivityFilters(): void\n {\n /** @var Team $team */\n $team = Team::factory()->createQuietly([\n 'uuid' => Str::uuid()->toString(),\n 'crm_id' => 1,\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create([\n 'name' => 'Search Name',\n ]);\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->putJson(route('api.saved_search.update', $search->id_string), [\n 'name' => 'Updated Search Name',\n ])->assertOk()\n ->assertJson([]);\n\n $this->assertDatabaseMissing('activity_searches', [\n 'name' => 'Search Name',\n 'user_id' => $user->id,\n ]);\n\n $this->assertDatabaseHas('activity_searches', [\n 'name' => 'Updated Search Name',\n 'user_id' => $user->id,\n ]);\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanDeleteASavedSearch(): void\n {\n /** @var Team $team */\n $team = Team::factory()->create([\n 'crm_id' => 1,\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create([\n 'name' => 'Search Name',\n ]);\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->deleteJson(route('api.saved_search.delete', $search->id_string))\n ->assertStatus(200)\n ->assertJson([]);\n\n $this->assertDatabaseMissing('activity_searches', [\n 'user_id' => $user->id,\n ]);\n\n $this->assertDatabaseMissing('activity_search_filters', [\n 'activity_search_id' => $search->id,\n ]);\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"1","depth":4,"bounds":{"left":0.7124335,"top":0.10055866,"width":0.00731383,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.72140956,"top":0.09896249,"width":0.00731383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.7287234,"top":0.09896249,"width":0.006981383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Component\\ActivitySearch\\FilterDefinition;\n\nuse Illuminate\\Support\\Collection;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinitionQuery;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinitionQueryCollection;\nuse Jiminny\\Contracts\\ActivitySearch\\ValidatedFilterDefinitionInterface;\nuse Jiminny\\Contracts\\Repositories\\UserRepository;\nuse Jiminny\\Models;\nuse Jiminny\\Models\\Feature\\FeatureEnum;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Traits\\RequiresUUID;\nuse Elastica\\Query;\n\nfinal class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefinitionInterface\n{\n private const int NO_GROUP_ID = 999;\n private UserRepository $userRepository;\n\n public function __construct(UserRepository $userRepository)\n {\n $this->userRepository = $userRepository;\n }\n\n public function shouldApplyQueries(): bool\n {\n return count($this->getValue()) > 0;\n }\n\n public function getQueries(): FilterDefinitionQueryCollection\n {\n $userIds = $this->getValue();\n\n return FilterDefinitionQueryCollection::make([\n FilterDefinitionQuery::instance()\n ->setQuery(new Query\\Terms('coachingFeedbacks.coach.id_string', $userIds))\n ->setPath('coachingFeedbacks.coach', 'coachingFeedbacks'),\n ]);\n }\n\n public function toArray(): array\n {\n return [\n 'id' => 'coaching-feedback-user-filter',\n 'label' => 'Coach',\n 'helpText' => 'The person who completed the Coaching Framework',\n 'placeholder' => 'Search coaches',\n 'inputType' => InputTypeEnum::DROPDOWN_MULTIPLE,\n 'queryParam' => 'coaching_feedback_coach_id',\n 'options' => $this->getOptions(),\n 'groupLabelKey' => 'label',\n 'groupValuesKey' => 'users',\n 'optionLabelKey' => 'name',\n 'optionValueKey' => 'id',\n 'value' => $this->getValue(),\n ];\n }\n\n private function getOptions(): array\n {\n $user = $this->executedBy;\n $query = $user\n ->getTeam()\n ->users()\n ->whereNotIn(\n 'uuid',\n $this->userRepository->findInaccessibleDeactivatedUserUuids($user)\n ->map(static fn (string $uuid): string => RequiresUUID::toOptimized($uuid))\n ->all(),\n )\n ->orderBy('name');\n\n $users = $query\n ->with('group')\n ->get()\n ->reduce(\n static function (array $carry, Models\\User $user): array {\n $group = $user->getGroup();\n $groupId = $group !== null\n ? $group->getUuid()\n : self::NO_GROUP_ID;\n $groupName = $group !== null\n ? $group->getName()\n : '(NON-GROUPED)';\n\n if (! array_key_exists($groupId, $carry)) {\n $carry[$groupId] = [\n 'label' => $groupName,\n 'users' => [],\n ];\n }\n\n $carry[$groupId]['users'][] = [\n 'id' => $user->getUuid(),\n 'name' => sprintf(\n '%s%s',\n $user->getName(),\n ! $user->isStatusActive()\n ? ' (Inactive)'\n : ''\n ),\n ];\n\n return $carry;\n },\n []\n );\n\n return Collection::make($users)\n ->sortBy('label')\n ->values()\n ->toArray();\n }\n\n public function getValue(): array\n {\n if (! $this->criteria->hasCoachingFeedbackCoachUserIds()) {\n return $this->getDefaultValue();\n }\n\n return array_diff(\n $this->criteria->getCoachingFeedbackCoachUserId(),\n $this->userRepository->findInaccessibleDeactivatedUserUuids($this->executedBy)->all(),\n );\n }\n\n private function getDefaultValue(): array\n {\n return [];\n }\n\n public function getValidationRules(?string $prefix = null): array\n {\n $team = $this->executedBy->getTeam();\n\n return [\n $prefix . 'coaching_feedback_coach_id' => 'array',\n $prefix . 'coaching_feedback_coach_id.*' => 'uuid:users,team_id,' . $team->getId(),\n ];\n }\n\n public function getSortOrder(): int\n {\n return 86;\n }\n\n public function shouldBeIncluded(Team $team): bool\n {\n return $team->hasFeature(FeatureEnum::COACHING_FRAMEWORK);\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Component\\ActivitySearch\\FilterDefinition;\n\nuse Illuminate\\Support\\Collection;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinitionQuery;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinitionQueryCollection;\nuse Jiminny\\Contracts\\ActivitySearch\\ValidatedFilterDefinitionInterface;\nuse Jiminny\\Contracts\\Repositories\\UserRepository;\nuse Jiminny\\Models;\nuse Jiminny\\Models\\Feature\\FeatureEnum;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Traits\\RequiresUUID;\nuse Elastica\\Query;\n\nfinal class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefinitionInterface\n{\n private const int NO_GROUP_ID = 999;\n private UserRepository $userRepository;\n\n public function __construct(UserRepository $userRepository)\n {\n $this->userRepository = $userRepository;\n }\n\n public function shouldApplyQueries(): bool\n {\n return count($this->getValue()) > 0;\n }\n\n public function getQueries(): FilterDefinitionQueryCollection\n {\n $userIds = $this->getValue();\n\n return FilterDefinitionQueryCollection::make([\n FilterDefinitionQuery::instance()\n ->setQuery(new Query\\Terms('coachingFeedbacks.coach.id_string', $userIds))\n ->setPath('coachingFeedbacks.coach', 'coachingFeedbacks'),\n ]);\n }\n\n public function toArray(): array\n {\n return [\n 'id' => 'coaching-feedback-user-filter',\n 'label' => 'Coach',\n 'helpText' => 'The person who completed the Coaching Framework',\n 'placeholder' => 'Search coaches',\n 'inputType' => InputTypeEnum::DROPDOWN_MULTIPLE,\n 'queryParam' => 'coaching_feedback_coach_id',\n 'options' => $this->getOptions(),\n 'groupLabelKey' => 'label',\n 'groupValuesKey' => 'users',\n 'optionLabelKey' => 'name',\n 'optionValueKey' => 'id',\n 'value' => $this->getValue(),\n ];\n }\n\n private function getOptions(): array\n {\n $user = $this->executedBy;\n $query = $user\n ->getTeam()\n ->users()\n ->whereNotIn(\n 'uuid',\n $this->userRepository->findInaccessibleDeactivatedUserUuids($user)\n ->map(static fn (string $uuid): string => RequiresUUID::toOptimized($uuid))\n ->all(),\n )\n ->orderBy('name');\n\n $users = $query\n ->with('group')\n ->get()\n ->reduce(\n static function (array $carry, Models\\User $user): array {\n $group = $user->getGroup();\n $groupId = $group !== null\n ? $group->getUuid()\n : self::NO_GROUP_ID;\n $groupName = $group !== null\n ? $group->getName()\n : '(NON-GROUPED)';\n\n if (! array_key_exists($groupId, $carry)) {\n $carry[$groupId] = [\n 'label' => $groupName,\n 'users' => [],\n ];\n }\n\n $carry[$groupId]['users'][] = [\n 'id' => $user->getUuid(),\n 'name' => sprintf(\n '%s%s',\n $user->getName(),\n ! $user->isStatusActive()\n ? ' (Inactive)'\n : ''\n ),\n ];\n\n return $carry;\n },\n []\n );\n\n return Collection::make($users)\n ->sortBy('label')\n ->values()\n ->toArray();\n }\n\n public function getValue(): array\n {\n if (! $this->criteria->hasCoachingFeedbackCoachUserIds()) {\n return $this->getDefaultValue();\n }\n\n return array_diff(\n $this->criteria->getCoachingFeedbackCoachUserId(),\n $this->userRepository->findInaccessibleDeactivatedUserUuids($this->executedBy)->all(),\n );\n }\n\n private function getDefaultValue(): array\n {\n return [];\n }\n\n public function getValidationRules(?string $prefix = null): array\n {\n $team = $this->executedBy->getTeam();\n\n return [\n $prefix . 'coaching_feedback_coach_id' => 'array',\n $prefix . 'coaching_feedback_coach_id.*' => 'uuid:users,team_id,' . $team->getId(),\n ];\n }\n\n public function getSortOrder(): int\n {\n return 86;\n }\n\n public function shouldBeIncluded(Team $team): bool\n {\n return $team->hasFeature(FeatureEnum::COACHING_FRAMEWORK);\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"bounds":{"left":0.011968086,"top":0.047885075,"width":0.024268618,"height":0.024740623},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
6509625738266471330
|
-8996616125002602716
|
visual_change
|
accessibility
|
NULL
|
Project: faVsco.js, menu
JY-20676-delete-report-re Project: faVsco.js, menu
JY-20676-delete-report-related-objects, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
3
16
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Tests\Feature\SavedSearches;
use Illuminate\Support\LazyCollection;
use Illuminate\Support\Str;
use Mockery\MockInterface;
use Illuminate\Database\Eloquent\Factories\Sequence;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Illuminate\Support\Facades\Event;
use Illuminate\Testing\Fluent\AssertableJson;
use Jiminny\Events\Nudges\NudgeCreated;
use Jiminny\Models\Activity\Search;
use Jiminny\Models\Activity\SearchFilter;
use Jiminny\Models\Nudge;
use Jiminny\Models\Role;
use Jiminny\Models\Team;
use Jiminny\Models\User;
use Jiminny\Repositories\ElasticActivityRepository;
use Tests\TestCase;
final class SavedSearchCRUDFeatureTest extends TestCase
{
use DatabaseTransactions;
#[\PHPUnit\Framework\Attributes\Test]
public function userCanGetAListOfSavedSearches(): void
{
$this->markTestSkipped('Needs to be fixed');
/** @var Team $team */
$team = Team::factory()->create([
'crm_id' => 1, // temporary
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'status' => User::STATUS_ACTIVE,
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create();
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
$nudges = Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->getJson(route('api.saved_search.index'))
->assertStatus(200)
->assertJson(
fn (AssertableJson $json) =>
$json->has(1)
->first(
fn ($json) =>
$json->where('id', $search->id_string)
->where('name', $search->getName())
->where('filters', ['max_customer_questions' => 5, 'min_engaging_questions' => 3])
->has('nudges', 2)
->has(
'nudges.0',
fn ($json) =>
$json->where('id', $nudges[0]->id_string)
->where('frequency', 'daily')
->where('channel', 'email')
->has('expiresAt')
)
->has(
'nudges.1',
fn ($json) =>
$json->where('id', $nudges[1]->id_string)
->where('frequency', 'weekly')
->where('channel', 'slack')
->has('expiresAt')
)
)
);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanCreateASavedSearchBasedOnActivityFilters(): void
{
$this->markTestSkipped('Needs to be fixed');
Event::fake();
$this->partialMock(ElasticActivityRepository::class, function (MockInterface $mock) {
$mock->shouldReceive('onDemandScroll')
->times(2)
->andReturn(LazyCollection::empty());
});
/** @var Team $team */
$team = Team::factory()->create([
'uuid' => Str::uuid()->toString(),
'crm_id' => 1, // temporary
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->createQuietly([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$this->apiGuardLogin($user);
$this->actingAs($user)
->postJson(route('api.saved_search.create'), [
'name' => '::searchName::',
'filters' => [
'min_duration' => 1,
'only_recorded' => 1,
],
'nudges' => [
[
'frequency' => 'daily',
'channel' => 'email',
'expiresAt' => now()->addWeek()->format('Y-m-d'),
],
[
'frequency' => 'daily',
'channel' => 'slack',
'expiresAt' => now()->addWeek()->format('Y-m-d'),
],
],
])
->assertStatus(200);
$this->assertDatabaseHas('activity_searches', [
'name' => '::searchName::',
'user_id' => $user->id,
]);
$search = $user->searches()->first();
$this->assertDatabaseHas('nudges', [
'activity_search_id' => $search->id,
'frequency' => 2,
'channel' => 2,
]);
$this->assertDatabaseHas('nudges', [
'activity_search_id' => $search->id,
'frequency' => 2,
'channel' => 4,
]);
$this->assertDatabaseHas('activity_search_filters', [
'activity_search_id' => $search->id,
'filter' => 'min_duration',
'value' => 1,
]);
$this->assertDatabaseHas('activity_search_filters', [
'activity_search_id' => $search->id,
'filter' => 'only_recorded',
'value' => 1,
]);
Event::assertDispatched(NudgeCreated::class, 2);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanUpdateASavedSearchBasedOnActivityFilters(): void
{
/** @var Team $team */
$team = Team::factory()->createQuietly([
'uuid' => Str::uuid()->toString(),
'crm_id' => 1,
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create([
'name' => 'Search Name',
]);
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->putJson(route('api.saved_search.update', $search->id_string), [
'name' => 'Updated Search Name',
])->assertOk()
->assertJson([]);
$this->assertDatabaseMissing('activity_searches', [
'name' => 'Search Name',
'user_id' => $user->id,
]);
$this->assertDatabaseHas('activity_searches', [
'name' => 'Updated Search Name',
'user_id' => $user->id,
]);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanDeleteASavedSearch(): void
{
/** @var Team $team */
$team = Team::factory()->create([
'crm_id' => 1,
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create([
'name' => 'Search Name',
]);
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->deleteJson(route('api.saved_search.delete', $search->id_string))
->assertStatus(200)
->assertJson([]);
$this->assertDatabaseMissing('activity_searches', [
'user_id' => $user->id,
]);
$this->assertDatabaseMissing('activity_search_filters', [
'activity_search_id' => $search->id,
]);
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
1
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Component\ActivitySearch\FilterDefinition;
use Illuminate\Support\Collection;
use Jiminny\Component\ActivitySearch\FilterDefinition;
use Jiminny\Component\ActivitySearch\FilterDefinitionQuery;
use Jiminny\Component\ActivitySearch\FilterDefinitionQueryCollection;
use Jiminny\Contracts\ActivitySearch\ValidatedFilterDefinitionInterface;
use Jiminny\Contracts\Repositories\UserRepository;
use Jiminny\Models;
use Jiminny\Models\Feature\FeatureEnum;
use Jiminny\Models\Team;
use Jiminny\Traits\RequiresUUID;
use Elastica\Query;
final class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefinitionInterface
{
private const int NO_GROUP_ID = 999;
private UserRepository $userRepository;
public function __construct(UserRepository $userRepository)
{
$this->userRepository = $userRepository;
}
public function shouldApplyQueries(): bool
{
return count($this->getValue()) > 0;
}
public function getQueries(): FilterDefinitionQueryCollection
{
$userIds = $this->getValue();
return FilterDefinitionQueryCollection::make([
FilterDefinitionQuery::instance()
->setQuery(new Query\Terms('coachingFeedbacks.coach.id_string', $userIds))
->setPath('coachingFeedbacks.coach', 'coachingFeedbacks'),
]);
}
public function toArray(): array
{
return [
'id' => 'coaching-feedback-user-filter',
'label' => 'Coach',
'helpText' => 'The person who completed the Coaching Framework',
'placeholder' => 'Search coaches',
'inputType' => InputTypeEnum::DROPDOWN_MULTIPLE,
'queryParam' => 'coaching_feedback_coach_id',
'options' => $this->getOptions(),
'groupLabelKey' => 'label',
'groupValuesKey' => 'users',
'optionLabelKey' => 'name',
'optionValueKey' => 'id',
'value' => $this->getValue(),
];
}
private function getOptions(): array
{
$user = $this->executedBy;
$query = $user
->getTeam()
->users()
->whereNotIn(
'uuid',
$this->userRepository->findInaccessibleDeactivatedUserUuids($user)
->map(static fn (string $uuid): string => RequiresUUID::toOptimized($uuid))
->all(),
)
->orderBy('name');
$users = $query
->with('group')
->get()
->reduce(
static function (array $carry, Models\User $user): array {
$group = $user->getGroup();
$groupId = $group !== null
? $group->getUuid()
: self::NO_GROUP_ID;
$groupName = $group !== null
? $group->getName()
: '(NON-GROUPED)';
if (! array_key_exists($groupId, $carry)) {
$carry[$groupId] = [
'label' => $groupName,
'users' => [],
];
}
$carry[$groupId]['users'][] = [
'id' => $user->getUuid(),
'name' => sprintf(
'%s%s',
$user->getName(),
! $user->isStatusActive()
? ' (Inactive)'
: ''
),
];
return $carry;
},
[]
);
return Collection::make($users)
->sortBy('label')
->values()
->toArray();
}
public function getValue(): array
{
if (! $this->criteria->hasCoachingFeedbackCoachUserIds()) {
return $this->getDefaultValue();
}
return array_diff(
$this->criteria->getCoachingFeedbackCoachUserId(),
$this->userRepository->findInaccessibleDeactivatedUserUuids($this->executedBy)->all(),
);
}
private function getDefaultValue(): array
{
return [];
}
public function getValidationRules(?string $prefix = null): array
{
$team = $this->executedBy->getTeam();
return [
$prefix . 'coaching_feedback_coach_id' => 'array',
$prefix . 'coaching_feedback_coach_id.*' => 'uuid:users,team_id,' . $team->getId(),
];
}
public function getSortOrder(): int
{
return 86;
}
public function shouldBeIncluded(Team $team): bool
{
return $team->hasFeature(FeatureEnum::COACHING_FRAMEWORK);
}
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
56404
|
NULL
|
NULL
|
NULL
|
|
56407
|
1967
|
15
|
2026-05-19T08:05:29.690839+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-19/1779 /Users/lukas/.screenpipe/data/data/2026-05-19/1779177929690_m2.jpg...
|
PhpStorm
|
faVsco.js – SavedSearchCRUDFeatureTest.php
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20676-delete-report-re Project: faVsco.js, menu
JY-20676-delete-report-related-objects, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
3
16
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Tests\Feature\SavedSearches;
use Illuminate\Support\LazyCollection;
use Illuminate\Support\Str;
use Mockery\MockInterface;
use Illuminate\Database\Eloquent\Factories\Sequence;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Illuminate\Support\Facades\Event;
use Illuminate\Testing\Fluent\AssertableJson;
use Jiminny\Events\Nudges\NudgeCreated;
use Jiminny\Models\Activity\Search;
use Jiminny\Models\Activity\SearchFilter;
use Jiminny\Models\Nudge;
use Jiminny\Models\Role;
use Jiminny\Models\Team;
use Jiminny\Models\User;
use Jiminny\Repositories\ElasticActivityRepository;
use Tests\TestCase;
final class SavedSearchCRUDFeatureTest extends TestCase
{
use DatabaseTransactions;
#[\PHPUnit\Framework\Attributes\Test]
public function userCanGetAListOfSavedSearches(): void
{
$this->markTestSkipped('Needs to be fixed');
/** @var Team $team */
$team = Team::factory()->create([
'crm_id' => 1, // temporary
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'status' => User::STATUS_ACTIVE,
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create();
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
$nudges = Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->getJson(route('api.saved_search.index'))
->assertStatus(200)
->assertJson(
fn (AssertableJson $json) =>
$json->has(1)
->first(
fn ($json) =>
$json->where('id', $search->id_string)
->where('name', $search->getName())
->where('filters', ['max_customer_questions' => 5, 'min_engaging_questions' => 3])
->has('nudges', 2)
->has(
'nudges.0',
fn ($json) =>
$json->where('id', $nudges[0]->id_string)
->where('frequency', 'daily')
->where('channel', 'email')
->has('expiresAt')
)
->has(
'nudges.1',
fn ($json) =>
$json->where('id', $nudges[1]->id_string)
->where('frequency', 'weekly')
->where('channel', 'slack')
->has('expiresAt')
)
)
);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanCreateASavedSearchBasedOnActivityFilters(): void
{
$this->markTestSkipped('Needs to be fixed');
Event::fake();
$this->partialMock(ElasticActivityRepository::class, function (MockInterface $mock) {
$mock->shouldReceive('onDemandScroll')
->times(2)
->andReturn(LazyCollection::empty());
});
/** @var Team $team */
$team = Team::factory()->create([
'uuid' => Str::uuid()->toString(),
'crm_id' => 1, // temporary
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->createQuietly([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$this->apiGuardLogin($user);
$this->actingAs($user)
->postJson(route('api.saved_search.create'), [
'name' => '::searchName::',
'filters' => [
'min_duration' => 1,
'only_recorded' => 1,
],
'nudges' => [
[
'frequency' => 'daily',
'channel' => 'email',
'expiresAt' => now()->addWeek()->format('Y-m-d'),
],
[
'frequency' => 'daily',
'channel' => 'slack',
'expiresAt' => now()->addWeek()->format('Y-m-d'),
],
],
])
->assertStatus(200);
$this->assertDatabaseHas('activity_searches', [
'name' => '::searchName::',
'user_id' => $user->id,
]);
$search = $user->searches()->first();
$this->assertDatabaseHas('nudges', [
'activity_search_id' => $search->id,
'frequency' => 2,
'channel' => 2,
]);
$this->assertDatabaseHas('nudges', [
'activity_search_id' => $search->id,
'frequency' => 2,
'channel' => 4,
]);
$this->assertDatabaseHas('activity_search_filters', [
'activity_search_id' => $search->id,
'filter' => 'min_duration',
'value' => 1,
]);
$this->assertDatabaseHas('activity_search_filters', [
'activity_search_id' => $search->id,
'filter' => 'only_recorded',
'value' => 1,
]);
Event::assertDispatched(NudgeCreated::class, 2);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanUpdateASavedSearchBasedOnActivityFilters(): void
{
/** @var Team $team */
$team = Team::factory()->createQuietly([
'uuid' => Str::uuid()->toString(),
'crm_id' => 1,
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create([
'name' => 'Search Name',
]);
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->putJson(route('api.saved_search.update', $search->id_string), [
'name' => 'Updated Search Name',
])->assertOk()
->assertJson([]);
$this->assertDatabaseMissing('activity_searches', [
'name' => 'Search Name',
'user_id' => $user->id,
]);
$this->assertDatabaseHas('activity_searches', [
'name' => 'Updated Search Name',
'user_id' => $user->id,
]);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanDeleteASavedSearch(): void
{
/** @var Team $team */
$team = Team::factory()->create([
'crm_id' => 1,
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create([
'name' => 'Search Name',
]);
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->deleteJson(route('api.saved_search.delete', $search->id_string))
->assertStatus(200)
->assertJson([]);
$this->assertDatabaseMissing('activity_searches', [
'user_id' => $user->id,
]);
$this->assertDatabaseMissing('activity_search_filters', [
'activity_search_id' => $search->id,
]);
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
1
Previous Highlighted Error
Next Highlighted Error...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20676-delete-report-related-objects, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.098071806,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: JY-20676-delete-report-related-objects","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.8081782,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceTest","depth":6,"bounds":{"left":0.8234708,"top":0.019952115,"width":0.09208777,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"bounds":{"left":0.9155585,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest'","depth":6,"bounds":{"left":0.9268617,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"bounds":{"left":0.9381649,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"bounds":{"left":0.96609044,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"bounds":{"left":0.9773936,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"bounds":{"left":0.9886968,"top":0.019952115,"width":0.011303186,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"3","depth":4,"bounds":{"left":0.390625,"top":0.22426178,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"16","depth":4,"bounds":{"left":0.4005984,"top":0.22426178,"width":0.009640957,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.4119016,"top":0.22266561,"width":0.00731383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.4192154,"top":0.22266561,"width":0.006981383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\nnamespace Tests\\Feature\\SavedSearches;\n\nuse Illuminate\\Support\\LazyCollection;\nuse Illuminate\\Support\\Str;\nuse Mockery\\MockInterface;\nuse Illuminate\\Database\\Eloquent\\Factories\\Sequence;\nuse Illuminate\\Foundation\\Testing\\DatabaseTransactions;\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\Testing\\Fluent\\AssertableJson;\nuse Jiminny\\Events\\Nudges\\NudgeCreated;\nuse Jiminny\\Models\\Activity\\Search;\nuse Jiminny\\Models\\Activity\\SearchFilter;\nuse Jiminny\\Models\\Nudge;\nuse Jiminny\\Models\\Role;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\ElasticActivityRepository;\nuse Tests\\TestCase;\n\nfinal class SavedSearchCRUDFeatureTest extends TestCase\n{\n use DatabaseTransactions;\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanGetAListOfSavedSearches(): void\n {\n $this->markTestSkipped('Needs to be fixed');\n /** @var Team $team */\n $team = Team::factory()->create([\n 'crm_id' => 1, // temporary\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'status' => User::STATUS_ACTIVE,\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create();\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n $nudges = Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->getJson(route('api.saved_search.index'))\n ->assertStatus(200)\n ->assertJson(\n fn (AssertableJson $json) =>\n $json->has(1)\n ->first(\n fn ($json) =>\n $json->where('id', $search->id_string)\n ->where('name', $search->getName())\n ->where('filters', ['max_customer_questions' => 5, 'min_engaging_questions' => 3])\n ->has('nudges', 2)\n ->has(\n 'nudges.0',\n fn ($json) =>\n $json->where('id', $nudges[0]->id_string)\n ->where('frequency', 'daily')\n ->where('channel', 'email')\n ->has('expiresAt')\n )\n ->has(\n 'nudges.1',\n fn ($json) =>\n $json->where('id', $nudges[1]->id_string)\n ->where('frequency', 'weekly')\n ->where('channel', 'slack')\n ->has('expiresAt')\n )\n )\n );\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanCreateASavedSearchBasedOnActivityFilters(): void\n {\n $this->markTestSkipped('Needs to be fixed');\n\n Event::fake();\n\n $this->partialMock(ElasticActivityRepository::class, function (MockInterface $mock) {\n $mock->shouldReceive('onDemandScroll')\n ->times(2)\n ->andReturn(LazyCollection::empty());\n });\n\n /** @var Team $team */\n $team = Team::factory()->create([\n 'uuid' => Str::uuid()->toString(),\n 'crm_id' => 1, // temporary\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->createQuietly([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->postJson(route('api.saved_search.create'), [\n 'name' => '::searchName::',\n 'filters' => [\n 'min_duration' => 1,\n 'only_recorded' => 1,\n ],\n 'nudges' => [\n [\n 'frequency' => 'daily',\n 'channel' => 'email',\n 'expiresAt' => now()->addWeek()->format('Y-m-d'),\n ],\n [\n 'frequency' => 'daily',\n 'channel' => 'slack',\n 'expiresAt' => now()->addWeek()->format('Y-m-d'),\n ],\n ],\n ])\n ->assertStatus(200);\n\n $this->assertDatabaseHas('activity_searches', [\n 'name' => '::searchName::',\n 'user_id' => $user->id,\n ]);\n\n $search = $user->searches()->first();\n\n $this->assertDatabaseHas('nudges', [\n 'activity_search_id' => $search->id,\n 'frequency' => 2,\n 'channel' => 2,\n ]);\n\n $this->assertDatabaseHas('nudges', [\n 'activity_search_id' => $search->id,\n 'frequency' => 2,\n 'channel' => 4,\n ]);\n\n $this->assertDatabaseHas('activity_search_filters', [\n 'activity_search_id' => $search->id,\n 'filter' => 'min_duration',\n 'value' => 1,\n ]);\n\n $this->assertDatabaseHas('activity_search_filters', [\n 'activity_search_id' => $search->id,\n 'filter' => 'only_recorded',\n 'value' => 1,\n ]);\n\n Event::assertDispatched(NudgeCreated::class, 2);\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanUpdateASavedSearchBasedOnActivityFilters(): void\n {\n /** @var Team $team */\n $team = Team::factory()->createQuietly([\n 'uuid' => Str::uuid()->toString(),\n 'crm_id' => 1,\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create([\n 'name' => 'Search Name',\n ]);\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->putJson(route('api.saved_search.update', $search->id_string), [\n 'name' => 'Updated Search Name',\n ])->assertOk()\n ->assertJson([]);\n\n $this->assertDatabaseMissing('activity_searches', [\n 'name' => 'Search Name',\n 'user_id' => $user->id,\n ]);\n\n $this->assertDatabaseHas('activity_searches', [\n 'name' => 'Updated Search Name',\n 'user_id' => $user->id,\n ]);\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanDeleteASavedSearch(): void\n {\n /** @var Team $team */\n $team = Team::factory()->create([\n 'crm_id' => 1,\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create([\n 'name' => 'Search Name',\n ]);\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->deleteJson(route('api.saved_search.delete', $search->id_string))\n ->assertStatus(200)\n ->assertJson([]);\n\n $this->assertDatabaseMissing('activity_searches', [\n 'user_id' => $user->id,\n ]);\n\n $this->assertDatabaseMissing('activity_search_filters', [\n 'activity_search_id' => $search->id,\n ]);\n }\n}","depth":4,"bounds":{"left":0.15990691,"top":0.0,"width":0.2662899,"height":0.49162012},"on_screen":true,"value":"<?php\n\nnamespace Tests\\Feature\\SavedSearches;\n\nuse Illuminate\\Support\\LazyCollection;\nuse Illuminate\\Support\\Str;\nuse Mockery\\MockInterface;\nuse Illuminate\\Database\\Eloquent\\Factories\\Sequence;\nuse Illuminate\\Foundation\\Testing\\DatabaseTransactions;\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\Testing\\Fluent\\AssertableJson;\nuse Jiminny\\Events\\Nudges\\NudgeCreated;\nuse Jiminny\\Models\\Activity\\Search;\nuse Jiminny\\Models\\Activity\\SearchFilter;\nuse Jiminny\\Models\\Nudge;\nuse Jiminny\\Models\\Role;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\ElasticActivityRepository;\nuse Tests\\TestCase;\n\nfinal class SavedSearchCRUDFeatureTest extends TestCase\n{\n use DatabaseTransactions;\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanGetAListOfSavedSearches(): void\n {\n $this->markTestSkipped('Needs to be fixed');\n /** @var Team $team */\n $team = Team::factory()->create([\n 'crm_id' => 1, // temporary\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'status' => User::STATUS_ACTIVE,\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create();\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n $nudges = Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->getJson(route('api.saved_search.index'))\n ->assertStatus(200)\n ->assertJson(\n fn (AssertableJson $json) =>\n $json->has(1)\n ->first(\n fn ($json) =>\n $json->where('id', $search->id_string)\n ->where('name', $search->getName())\n ->where('filters', ['max_customer_questions' => 5, 'min_engaging_questions' => 3])\n ->has('nudges', 2)\n ->has(\n 'nudges.0',\n fn ($json) =>\n $json->where('id', $nudges[0]->id_string)\n ->where('frequency', 'daily')\n ->where('channel', 'email')\n ->has('expiresAt')\n )\n ->has(\n 'nudges.1',\n fn ($json) =>\n $json->where('id', $nudges[1]->id_string)\n ->where('frequency', 'weekly')\n ->where('channel', 'slack')\n ->has('expiresAt')\n )\n )\n );\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanCreateASavedSearchBasedOnActivityFilters(): void\n {\n $this->markTestSkipped('Needs to be fixed');\n\n Event::fake();\n\n $this->partialMock(ElasticActivityRepository::class, function (MockInterface $mock) {\n $mock->shouldReceive('onDemandScroll')\n ->times(2)\n ->andReturn(LazyCollection::empty());\n });\n\n /** @var Team $team */\n $team = Team::factory()->create([\n 'uuid' => Str::uuid()->toString(),\n 'crm_id' => 1, // temporary\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->createQuietly([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->postJson(route('api.saved_search.create'), [\n 'name' => '::searchName::',\n 'filters' => [\n 'min_duration' => 1,\n 'only_recorded' => 1,\n ],\n 'nudges' => [\n [\n 'frequency' => 'daily',\n 'channel' => 'email',\n 'expiresAt' => now()->addWeek()->format('Y-m-d'),\n ],\n [\n 'frequency' => 'daily',\n 'channel' => 'slack',\n 'expiresAt' => now()->addWeek()->format('Y-m-d'),\n ],\n ],\n ])\n ->assertStatus(200);\n\n $this->assertDatabaseHas('activity_searches', [\n 'name' => '::searchName::',\n 'user_id' => $user->id,\n ]);\n\n $search = $user->searches()->first();\n\n $this->assertDatabaseHas('nudges', [\n 'activity_search_id' => $search->id,\n 'frequency' => 2,\n 'channel' => 2,\n ]);\n\n $this->assertDatabaseHas('nudges', [\n 'activity_search_id' => $search->id,\n 'frequency' => 2,\n 'channel' => 4,\n ]);\n\n $this->assertDatabaseHas('activity_search_filters', [\n 'activity_search_id' => $search->id,\n 'filter' => 'min_duration',\n 'value' => 1,\n ]);\n\n $this->assertDatabaseHas('activity_search_filters', [\n 'activity_search_id' => $search->id,\n 'filter' => 'only_recorded',\n 'value' => 1,\n ]);\n\n Event::assertDispatched(NudgeCreated::class, 2);\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanUpdateASavedSearchBasedOnActivityFilters(): void\n {\n /** @var Team $team */\n $team = Team::factory()->createQuietly([\n 'uuid' => Str::uuid()->toString(),\n 'crm_id' => 1,\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create([\n 'name' => 'Search Name',\n ]);\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->putJson(route('api.saved_search.update', $search->id_string), [\n 'name' => 'Updated Search Name',\n ])->assertOk()\n ->assertJson([]);\n\n $this->assertDatabaseMissing('activity_searches', [\n 'name' => 'Search Name',\n 'user_id' => $user->id,\n ]);\n\n $this->assertDatabaseHas('activity_searches', [\n 'name' => 'Updated Search Name',\n 'user_id' => $user->id,\n ]);\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanDeleteASavedSearch(): void\n {\n /** @var Team $team */\n $team = Team::factory()->create([\n 'crm_id' => 1,\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create([\n 'name' => 'Search Name',\n ]);\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->deleteJson(route('api.saved_search.delete', $search->id_string))\n ->assertStatus(200)\n ->assertJson([]);\n\n $this->assertDatabaseMissing('activity_searches', [\n 'user_id' => $user->id,\n ]);\n\n $this->assertDatabaseMissing('activity_search_filters', [\n 'activity_search_id' => $search->id,\n ]);\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"1","depth":4,"bounds":{"left":0.7124335,"top":0.10055866,"width":0.00731383,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.72140956,"top":0.09896249,"width":0.00731383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.7287234,"top":0.09896249,"width":0.006981383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-8334616115047382362
|
-9140749176787754460
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
JY-20676-delete-report-re Project: faVsco.js, menu
JY-20676-delete-report-related-objects, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
3
16
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Tests\Feature\SavedSearches;
use Illuminate\Support\LazyCollection;
use Illuminate\Support\Str;
use Mockery\MockInterface;
use Illuminate\Database\Eloquent\Factories\Sequence;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Illuminate\Support\Facades\Event;
use Illuminate\Testing\Fluent\AssertableJson;
use Jiminny\Events\Nudges\NudgeCreated;
use Jiminny\Models\Activity\Search;
use Jiminny\Models\Activity\SearchFilter;
use Jiminny\Models\Nudge;
use Jiminny\Models\Role;
use Jiminny\Models\Team;
use Jiminny\Models\User;
use Jiminny\Repositories\ElasticActivityRepository;
use Tests\TestCase;
final class SavedSearchCRUDFeatureTest extends TestCase
{
use DatabaseTransactions;
#[\PHPUnit\Framework\Attributes\Test]
public function userCanGetAListOfSavedSearches(): void
{
$this->markTestSkipped('Needs to be fixed');
/** @var Team $team */
$team = Team::factory()->create([
'crm_id' => 1, // temporary
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'status' => User::STATUS_ACTIVE,
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create();
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
$nudges = Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->getJson(route('api.saved_search.index'))
->assertStatus(200)
->assertJson(
fn (AssertableJson $json) =>
$json->has(1)
->first(
fn ($json) =>
$json->where('id', $search->id_string)
->where('name', $search->getName())
->where('filters', ['max_customer_questions' => 5, 'min_engaging_questions' => 3])
->has('nudges', 2)
->has(
'nudges.0',
fn ($json) =>
$json->where('id', $nudges[0]->id_string)
->where('frequency', 'daily')
->where('channel', 'email')
->has('expiresAt')
)
->has(
'nudges.1',
fn ($json) =>
$json->where('id', $nudges[1]->id_string)
->where('frequency', 'weekly')
->where('channel', 'slack')
->has('expiresAt')
)
)
);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanCreateASavedSearchBasedOnActivityFilters(): void
{
$this->markTestSkipped('Needs to be fixed');
Event::fake();
$this->partialMock(ElasticActivityRepository::class, function (MockInterface $mock) {
$mock->shouldReceive('onDemandScroll')
->times(2)
->andReturn(LazyCollection::empty());
});
/** @var Team $team */
$team = Team::factory()->create([
'uuid' => Str::uuid()->toString(),
'crm_id' => 1, // temporary
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->createQuietly([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$this->apiGuardLogin($user);
$this->actingAs($user)
->postJson(route('api.saved_search.create'), [
'name' => '::searchName::',
'filters' => [
'min_duration' => 1,
'only_recorded' => 1,
],
'nudges' => [
[
'frequency' => 'daily',
'channel' => 'email',
'expiresAt' => now()->addWeek()->format('Y-m-d'),
],
[
'frequency' => 'daily',
'channel' => 'slack',
'expiresAt' => now()->addWeek()->format('Y-m-d'),
],
],
])
->assertStatus(200);
$this->assertDatabaseHas('activity_searches', [
'name' => '::searchName::',
'user_id' => $user->id,
]);
$search = $user->searches()->first();
$this->assertDatabaseHas('nudges', [
'activity_search_id' => $search->id,
'frequency' => 2,
'channel' => 2,
]);
$this->assertDatabaseHas('nudges', [
'activity_search_id' => $search->id,
'frequency' => 2,
'channel' => 4,
]);
$this->assertDatabaseHas('activity_search_filters', [
'activity_search_id' => $search->id,
'filter' => 'min_duration',
'value' => 1,
]);
$this->assertDatabaseHas('activity_search_filters', [
'activity_search_id' => $search->id,
'filter' => 'only_recorded',
'value' => 1,
]);
Event::assertDispatched(NudgeCreated::class, 2);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanUpdateASavedSearchBasedOnActivityFilters(): void
{
/** @var Team $team */
$team = Team::factory()->createQuietly([
'uuid' => Str::uuid()->toString(),
'crm_id' => 1,
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create([
'name' => 'Search Name',
]);
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->putJson(route('api.saved_search.update', $search->id_string), [
'name' => 'Updated Search Name',
])->assertOk()
->assertJson([]);
$this->assertDatabaseMissing('activity_searches', [
'name' => 'Search Name',
'user_id' => $user->id,
]);
$this->assertDatabaseHas('activity_searches', [
'name' => 'Updated Search Name',
'user_id' => $user->id,
]);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanDeleteASavedSearch(): void
{
/** @var Team $team */
$team = Team::factory()->create([
'crm_id' => 1,
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create([
'name' => 'Search Name',
]);
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->deleteJson(route('api.saved_search.delete', $search->id_string))
->assertStatus(200)
->assertJson([]);
$this->assertDatabaseMissing('activity_searches', [
'user_id' => $user->id,
]);
$this->assertDatabaseMissing('activity_search_filters', [
'activity_search_id' => $search->id,
]);
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
1
Previous Highlighted Error
Next Highlighted Error...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
56406
|
1966
|
13
|
2026-05-19T08:05:29.716379+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-19/1779 /Users/lukas/.screenpipe/data/data/2026-05-19/1779177929716_m1.jpg...
|
PhpStorm
|
faVsco.js – SavedSearchCRUDFeatureTest.php
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20676-delete-report-re Project: faVsco.js, menu
JY-20676-delete-report-related-objects, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
3
16
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Tests\Feature\SavedSearches;
use Illuminate\Support\LazyCollection;
use Illuminate\Support\Str;
use Mockery\MockInterface;
use Illuminate\Database\Eloquent\Factories\Sequence;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Illuminate\Support\Facades\Event;
use Illuminate\Testing\Fluent\AssertableJson;
use Jiminny\Events\Nudges\NudgeCreated;
use Jiminny\Models\Activity\Search;
use Jiminny\Models\Activity\SearchFilter;
use Jiminny\Models\Nudge;
use Jiminny\Models\Role;
use Jiminny\Models\Team;
use Jiminny\Models\User;
use Jiminny\Repositories\ElasticActivityRepository;
use Tests\TestCase;
final class SavedSearchCRUDFeatureTest extends TestCase
{
use DatabaseTransactions;
#[\PHPUnit\Framework\Attributes\Test]
public function userCanGetAListOfSavedSearches(): void
{
$this->markTestSkipped('Needs to be fixed');
/** @var Team $team */
$team = Team::factory()->create([
'crm_id' => 1, // temporary
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'status' => User::STATUS_ACTIVE,
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create();
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
$nudges = Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->getJson(route('api.saved_search.index'))
->assertStatus(200)
->assertJson(
fn (AssertableJson $json) =>
$json->has(1)
->first(
fn ($json) =>
$json->where('id', $search->id_string)
->where('name', $search->getName())
->where('filters', ['max_customer_questions' => 5, 'min_engaging_questions' => 3])
->has('nudges', 2)
->has(
'nudges.0',
fn ($json) =>
$json->where('id', $nudges[0]->id_string)
->where('frequency', 'daily')
->where('channel', 'email')
->has('expiresAt')
)
->has(
'nudges.1',
fn ($json) =>
$json->where('id', $nudges[1]->id_string)
->where('frequency', 'weekly')
->where('channel', 'slack')
->has('expiresAt')
)
)
);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanCreateASavedSearchBasedOnActivityFilters(): void
{
$this->markTestSkipped('Needs to be fixed');
Event::fake();
$this->partialMock(ElasticActivityRepository::class, function (MockInterface $mock) {
$mock->shouldReceive('onDemandScroll')
->times(2)
->andReturn(LazyCollection::empty());
});
/** @var Team $team */
$team = Team::factory()->create([
'uuid' => Str::uuid()->toString(),
'crm_id' => 1, // temporary
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->createQuietly([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$this->apiGuardLogin($user);
$this->actingAs($user)
->postJson(route('api.saved_search.create'), [
'name' => '::searchName::',
'filters' => [
'min_duration' => 1,
'only_recorded' => 1,
],
'nudges' => [
[
'frequency' => 'daily',
'channel' => 'email',
'expiresAt' => now()->addWeek()->format('Y-m-d'),
],
[
'frequency' => 'daily',
'channel' => 'slack',
'expiresAt' => now()->addWeek()->format('Y-m-d'),
],
],
])
->assertStatus(200);
$this->assertDatabaseHas('activity_searches', [
'name' => '::searchName::',
'user_id' => $user->id,
]);
$search = $user->searches()->first();
$this->assertDatabaseHas('nudges', [
'activity_search_id' => $search->id,
'frequency' => 2,
'channel' => 2,
]);
$this->assertDatabaseHas('nudges', [
'activity_search_id' => $search->id,
'frequency' => 2,
'channel' => 4,
]);
$this->assertDatabaseHas('activity_search_filters', [
'activity_search_id' => $search->id,
'filter' => 'min_duration',
'value' => 1,
]);
$this->assertDatabaseHas('activity_search_filters', [
'activity_search_id' => $search->id,
'filter' => 'only_recorded',
'value' => 1,
]);
Event::assertDispatched(NudgeCreated::class, 2);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanUpdateASavedSearchBasedOnActivityFilters(): void
{
/** @var Team $team */
$team = Team::factory()->createQuietly([
'uuid' => Str::uuid()->toString(),
'crm_id' => 1,
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create([
'name' => 'Search Name',
]);
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->putJson(route('api.saved_search.update', $search->id_string), [
'name' => 'Updated Search Name',
])->assertOk()
->assertJson([]);
$this->assertDatabaseMissing('activity_searches', [
'name' => 'Search Name',
'user_id' => $user->id,
]);
$this->assertDatabaseHas('activity_searches', [
'name' => 'Updated Search Name',
'user_id' => $user->id,
]);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanDeleteASavedSearch(): void
{
/** @var Team $team */
$team = Team::factory()->create([
'crm_id' => 1,
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create([
'name' => 'Search Name',
]);
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->deleteJson(route('api.saved_search.delete', $search->id_string))
->assertStatus(200)
->assertJson([]);
$this->assertDatabaseMissing('activity_searches', [
'user_id' => $user->id,
]);
$this->assertDatabaseMissing('activity_search_filters', [
'activity_search_id' => $search->id,
]);
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
1
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Component\ActivitySearch\FilterDefinition;
use Illuminate\Support\Collection;
use Jiminny\Component\ActivitySearch\FilterDefinition;
use Jiminny\Component\ActivitySearch\FilterDefinitionQuery;
use Jiminny\Component\ActivitySearch\FilterDefinitionQueryCollection;
use Jiminny\Contracts\ActivitySearch\ValidatedFilterDefinitionInterface;
use Jiminny\Contracts\Repositories\UserRepository;
use Jiminny\Models;
use Jiminny\Models\Feature\FeatureEnum;
use Jiminny\Models\Team;
use Jiminny\Traits\RequiresUUID;
use Elastica\Query;
final class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefinitionInterface
{
private const int NO_GROUP_ID = 999;
private UserRepository $userRepository;
public function __construct(UserRepository $userRepository)
{
$this->userRepository = $userRepository;
}
public function shouldApplyQueries(): bool
{
return count($this->getValue()) > 0;
}
public function getQueries(): FilterDefinitionQueryCollection
{
$userIds = $this->getValue();
return FilterDefinitionQueryCollection::make([
FilterDefinitionQuery::instance()
->setQuery(new Query\Terms('coachingFeedbacks.coach.id_string', $userIds))
->setPath('coachingFeedbacks.coach', 'coachingFeedbacks'),
]);
}
public function toArray(): array
{
return [
'id' => 'coaching-feedback-user-filter',
'label' => 'Coach',
'helpText' => 'The person who completed the Coaching Framework',
'placeholder' => 'Search coaches',
'inputType' => InputTypeEnum::DROPDOWN_MULTIPLE,
'queryParam' => 'coaching_feedback_coach_id',
'options' => $this->getOptions(),
'groupLabelKey' => 'label',
'groupValuesKey' => 'users',
'optionLabelKey' => 'name',
'optionValueKey' => 'id',
'value' => $this->getValue(),
];
}
private function getOptions(): array
{
$user = $this->executedBy;
$query = $user
->getTeam()
->users()
->whereNotIn(
'uuid',
$this->userRepository->findInaccessibleDeactivatedUserUuids($user)
->map(static fn (string $uuid): string => RequiresUUID::toOptimized($uuid))
->all(),
)
->orderBy('name');
$users = $query
->with('group')
->get()
->reduce(
static function (array $carry, Models\User $user): array {
$group = $user->getGroup();
$groupId = $group !== null
? $group->getUuid()
: self::NO_GROUP_ID;
$groupName = $group !== null
? $group->getName()
: '(NON-GROUPED)';
if (! array_key_exists($groupId, $carry)) {
$carry[$groupId] = [
'label' => $groupName,
'users' => [],
];
}
$carry[$groupId]['users'][] = [
'id' => $user->getUuid(),
'name' => sprintf(
'%s%s',
$user->getName(),
! $user->isStatusActive()
? ' (Inactive)'
: ''
),
];
return $carry;
},
[]
);
return Collection::make($users)
->sortBy('label')
->values()
->toArray();
}
public function getValue(): array
{
if (! $this->criteria->hasCoachingFeedbackCoachUserIds()) {
return $this->getDefaultValue();
}
return array_diff(
$this->criteria->getCoachingFeedbackCoachUserId(),
$this->userRepository->findInaccessibleDeactivatedUserUuids($this->executedBy)->all(),
);
}
private function getDefaultValue(): array
{
return [];
}
public function getValidationRules(?string $prefix = null): array
{
$team = $this->executedBy->getTeam();
return [
$prefix . 'coaching_feedback_coach_id' => 'array',
$prefix . 'coaching_feedback_coach_id.*' => 'uuid:users,team_id,' . $team->getId(),
];
}
public function getSortOrder(): int
{
return 86;
}
public function shouldBeIncluded(Team $team): bool
{
return $team->hasFeature(FeatureEnum::COACHING_FRAMEWORK);
}
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20676-delete-report-related-objects, menu","depth":5,"on_screen":true,"help_text":"Git Branch: JY-20676-delete-report-related-objects","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceTest","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"3","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"16","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\nnamespace Tests\\Feature\\SavedSearches;\n\nuse Illuminate\\Support\\LazyCollection;\nuse Illuminate\\Support\\Str;\nuse Mockery\\MockInterface;\nuse Illuminate\\Database\\Eloquent\\Factories\\Sequence;\nuse Illuminate\\Foundation\\Testing\\DatabaseTransactions;\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\Testing\\Fluent\\AssertableJson;\nuse Jiminny\\Events\\Nudges\\NudgeCreated;\nuse Jiminny\\Models\\Activity\\Search;\nuse Jiminny\\Models\\Activity\\SearchFilter;\nuse Jiminny\\Models\\Nudge;\nuse Jiminny\\Models\\Role;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\ElasticActivityRepository;\nuse Tests\\TestCase;\n\nfinal class SavedSearchCRUDFeatureTest extends TestCase\n{\n use DatabaseTransactions;\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanGetAListOfSavedSearches(): void\n {\n $this->markTestSkipped('Needs to be fixed');\n /** @var Team $team */\n $team = Team::factory()->create([\n 'crm_id' => 1, // temporary\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'status' => User::STATUS_ACTIVE,\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create();\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n $nudges = Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->getJson(route('api.saved_search.index'))\n ->assertStatus(200)\n ->assertJson(\n fn (AssertableJson $json) =>\n $json->has(1)\n ->first(\n fn ($json) =>\n $json->where('id', $search->id_string)\n ->where('name', $search->getName())\n ->where('filters', ['max_customer_questions' => 5, 'min_engaging_questions' => 3])\n ->has('nudges', 2)\n ->has(\n 'nudges.0',\n fn ($json) =>\n $json->where('id', $nudges[0]->id_string)\n ->where('frequency', 'daily')\n ->where('channel', 'email')\n ->has('expiresAt')\n )\n ->has(\n 'nudges.1',\n fn ($json) =>\n $json->where('id', $nudges[1]->id_string)\n ->where('frequency', 'weekly')\n ->where('channel', 'slack')\n ->has('expiresAt')\n )\n )\n );\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanCreateASavedSearchBasedOnActivityFilters(): void\n {\n $this->markTestSkipped('Needs to be fixed');\n\n Event::fake();\n\n $this->partialMock(ElasticActivityRepository::class, function (MockInterface $mock) {\n $mock->shouldReceive('onDemandScroll')\n ->times(2)\n ->andReturn(LazyCollection::empty());\n });\n\n /** @var Team $team */\n $team = Team::factory()->create([\n 'uuid' => Str::uuid()->toString(),\n 'crm_id' => 1, // temporary\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->createQuietly([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->postJson(route('api.saved_search.create'), [\n 'name' => '::searchName::',\n 'filters' => [\n 'min_duration' => 1,\n 'only_recorded' => 1,\n ],\n 'nudges' => [\n [\n 'frequency' => 'daily',\n 'channel' => 'email',\n 'expiresAt' => now()->addWeek()->format('Y-m-d'),\n ],\n [\n 'frequency' => 'daily',\n 'channel' => 'slack',\n 'expiresAt' => now()->addWeek()->format('Y-m-d'),\n ],\n ],\n ])\n ->assertStatus(200);\n\n $this->assertDatabaseHas('activity_searches', [\n 'name' => '::searchName::',\n 'user_id' => $user->id,\n ]);\n\n $search = $user->searches()->first();\n\n $this->assertDatabaseHas('nudges', [\n 'activity_search_id' => $search->id,\n 'frequency' => 2,\n 'channel' => 2,\n ]);\n\n $this->assertDatabaseHas('nudges', [\n 'activity_search_id' => $search->id,\n 'frequency' => 2,\n 'channel' => 4,\n ]);\n\n $this->assertDatabaseHas('activity_search_filters', [\n 'activity_search_id' => $search->id,\n 'filter' => 'min_duration',\n 'value' => 1,\n ]);\n\n $this->assertDatabaseHas('activity_search_filters', [\n 'activity_search_id' => $search->id,\n 'filter' => 'only_recorded',\n 'value' => 1,\n ]);\n\n Event::assertDispatched(NudgeCreated::class, 2);\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanUpdateASavedSearchBasedOnActivityFilters(): void\n {\n /** @var Team $team */\n $team = Team::factory()->createQuietly([\n 'uuid' => Str::uuid()->toString(),\n 'crm_id' => 1,\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create([\n 'name' => 'Search Name',\n ]);\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->putJson(route('api.saved_search.update', $search->id_string), [\n 'name' => 'Updated Search Name',\n ])->assertOk()\n ->assertJson([]);\n\n $this->assertDatabaseMissing('activity_searches', [\n 'name' => 'Search Name',\n 'user_id' => $user->id,\n ]);\n\n $this->assertDatabaseHas('activity_searches', [\n 'name' => 'Updated Search Name',\n 'user_id' => $user->id,\n ]);\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanDeleteASavedSearch(): void\n {\n /** @var Team $team */\n $team = Team::factory()->create([\n 'crm_id' => 1,\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create([\n 'name' => 'Search Name',\n ]);\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->deleteJson(route('api.saved_search.delete', $search->id_string))\n ->assertStatus(200)\n ->assertJson([]);\n\n $this->assertDatabaseMissing('activity_searches', [\n 'user_id' => $user->id,\n ]);\n\n $this->assertDatabaseMissing('activity_search_filters', [\n 'activity_search_id' => $search->id,\n ]);\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\nnamespace Tests\\Feature\\SavedSearches;\n\nuse Illuminate\\Support\\LazyCollection;\nuse Illuminate\\Support\\Str;\nuse Mockery\\MockInterface;\nuse Illuminate\\Database\\Eloquent\\Factories\\Sequence;\nuse Illuminate\\Foundation\\Testing\\DatabaseTransactions;\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\Testing\\Fluent\\AssertableJson;\nuse Jiminny\\Events\\Nudges\\NudgeCreated;\nuse Jiminny\\Models\\Activity\\Search;\nuse Jiminny\\Models\\Activity\\SearchFilter;\nuse Jiminny\\Models\\Nudge;\nuse Jiminny\\Models\\Role;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\ElasticActivityRepository;\nuse Tests\\TestCase;\n\nfinal class SavedSearchCRUDFeatureTest extends TestCase\n{\n use DatabaseTransactions;\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanGetAListOfSavedSearches(): void\n {\n $this->markTestSkipped('Needs to be fixed');\n /** @var Team $team */\n $team = Team::factory()->create([\n 'crm_id' => 1, // temporary\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'status' => User::STATUS_ACTIVE,\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create();\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n $nudges = Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->getJson(route('api.saved_search.index'))\n ->assertStatus(200)\n ->assertJson(\n fn (AssertableJson $json) =>\n $json->has(1)\n ->first(\n fn ($json) =>\n $json->where('id', $search->id_string)\n ->where('name', $search->getName())\n ->where('filters', ['max_customer_questions' => 5, 'min_engaging_questions' => 3])\n ->has('nudges', 2)\n ->has(\n 'nudges.0',\n fn ($json) =>\n $json->where('id', $nudges[0]->id_string)\n ->where('frequency', 'daily')\n ->where('channel', 'email')\n ->has('expiresAt')\n )\n ->has(\n 'nudges.1',\n fn ($json) =>\n $json->where('id', $nudges[1]->id_string)\n ->where('frequency', 'weekly')\n ->where('channel', 'slack')\n ->has('expiresAt')\n )\n )\n );\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanCreateASavedSearchBasedOnActivityFilters(): void\n {\n $this->markTestSkipped('Needs to be fixed');\n\n Event::fake();\n\n $this->partialMock(ElasticActivityRepository::class, function (MockInterface $mock) {\n $mock->shouldReceive('onDemandScroll')\n ->times(2)\n ->andReturn(LazyCollection::empty());\n });\n\n /** @var Team $team */\n $team = Team::factory()->create([\n 'uuid' => Str::uuid()->toString(),\n 'crm_id' => 1, // temporary\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->createQuietly([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->postJson(route('api.saved_search.create'), [\n 'name' => '::searchName::',\n 'filters' => [\n 'min_duration' => 1,\n 'only_recorded' => 1,\n ],\n 'nudges' => [\n [\n 'frequency' => 'daily',\n 'channel' => 'email',\n 'expiresAt' => now()->addWeek()->format('Y-m-d'),\n ],\n [\n 'frequency' => 'daily',\n 'channel' => 'slack',\n 'expiresAt' => now()->addWeek()->format('Y-m-d'),\n ],\n ],\n ])\n ->assertStatus(200);\n\n $this->assertDatabaseHas('activity_searches', [\n 'name' => '::searchName::',\n 'user_id' => $user->id,\n ]);\n\n $search = $user->searches()->first();\n\n $this->assertDatabaseHas('nudges', [\n 'activity_search_id' => $search->id,\n 'frequency' => 2,\n 'channel' => 2,\n ]);\n\n $this->assertDatabaseHas('nudges', [\n 'activity_search_id' => $search->id,\n 'frequency' => 2,\n 'channel' => 4,\n ]);\n\n $this->assertDatabaseHas('activity_search_filters', [\n 'activity_search_id' => $search->id,\n 'filter' => 'min_duration',\n 'value' => 1,\n ]);\n\n $this->assertDatabaseHas('activity_search_filters', [\n 'activity_search_id' => $search->id,\n 'filter' => 'only_recorded',\n 'value' => 1,\n ]);\n\n Event::assertDispatched(NudgeCreated::class, 2);\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanUpdateASavedSearchBasedOnActivityFilters(): void\n {\n /** @var Team $team */\n $team = Team::factory()->createQuietly([\n 'uuid' => Str::uuid()->toString(),\n 'crm_id' => 1,\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create([\n 'name' => 'Search Name',\n ]);\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->putJson(route('api.saved_search.update', $search->id_string), [\n 'name' => 'Updated Search Name',\n ])->assertOk()\n ->assertJson([]);\n\n $this->assertDatabaseMissing('activity_searches', [\n 'name' => 'Search Name',\n 'user_id' => $user->id,\n ]);\n\n $this->assertDatabaseHas('activity_searches', [\n 'name' => 'Updated Search Name',\n 'user_id' => $user->id,\n ]);\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanDeleteASavedSearch(): void\n {\n /** @var Team $team */\n $team = Team::factory()->create([\n 'crm_id' => 1,\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create([\n 'name' => 'Search Name',\n ]);\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->deleteJson(route('api.saved_search.delete', $search->id_string))\n ->assertStatus(200)\n ->assertJson([]);\n\n $this->assertDatabaseMissing('activity_searches', [\n 'user_id' => $user->id,\n ]);\n\n $this->assertDatabaseMissing('activity_search_filters', [\n 'activity_search_id' => $search->id,\n ]);\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"1","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Component\\ActivitySearch\\FilterDefinition;\n\nuse Illuminate\\Support\\Collection;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinitionQuery;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinitionQueryCollection;\nuse Jiminny\\Contracts\\ActivitySearch\\ValidatedFilterDefinitionInterface;\nuse Jiminny\\Contracts\\Repositories\\UserRepository;\nuse Jiminny\\Models;\nuse Jiminny\\Models\\Feature\\FeatureEnum;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Traits\\RequiresUUID;\nuse Elastica\\Query;\n\nfinal class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefinitionInterface\n{\n private const int NO_GROUP_ID = 999;\n private UserRepository $userRepository;\n\n public function __construct(UserRepository $userRepository)\n {\n $this->userRepository = $userRepository;\n }\n\n public function shouldApplyQueries(): bool\n {\n return count($this->getValue()) > 0;\n }\n\n public function getQueries(): FilterDefinitionQueryCollection\n {\n $userIds = $this->getValue();\n\n return FilterDefinitionQueryCollection::make([\n FilterDefinitionQuery::instance()\n ->setQuery(new Query\\Terms('coachingFeedbacks.coach.id_string', $userIds))\n ->setPath('coachingFeedbacks.coach', 'coachingFeedbacks'),\n ]);\n }\n\n public function toArray(): array\n {\n return [\n 'id' => 'coaching-feedback-user-filter',\n 'label' => 'Coach',\n 'helpText' => 'The person who completed the Coaching Framework',\n 'placeholder' => 'Search coaches',\n 'inputType' => InputTypeEnum::DROPDOWN_MULTIPLE,\n 'queryParam' => 'coaching_feedback_coach_id',\n 'options' => $this->getOptions(),\n 'groupLabelKey' => 'label',\n 'groupValuesKey' => 'users',\n 'optionLabelKey' => 'name',\n 'optionValueKey' => 'id',\n 'value' => $this->getValue(),\n ];\n }\n\n private function getOptions(): array\n {\n $user = $this->executedBy;\n $query = $user\n ->getTeam()\n ->users()\n ->whereNotIn(\n 'uuid',\n $this->userRepository->findInaccessibleDeactivatedUserUuids($user)\n ->map(static fn (string $uuid): string => RequiresUUID::toOptimized($uuid))\n ->all(),\n )\n ->orderBy('name');\n\n $users = $query\n ->with('group')\n ->get()\n ->reduce(\n static function (array $carry, Models\\User $user): array {\n $group = $user->getGroup();\n $groupId = $group !== null\n ? $group->getUuid()\n : self::NO_GROUP_ID;\n $groupName = $group !== null\n ? $group->getName()\n : '(NON-GROUPED)';\n\n if (! array_key_exists($groupId, $carry)) {\n $carry[$groupId] = [\n 'label' => $groupName,\n 'users' => [],\n ];\n }\n\n $carry[$groupId]['users'][] = [\n 'id' => $user->getUuid(),\n 'name' => sprintf(\n '%s%s',\n $user->getName(),\n ! $user->isStatusActive()\n ? ' (Inactive)'\n : ''\n ),\n ];\n\n return $carry;\n },\n []\n );\n\n return Collection::make($users)\n ->sortBy('label')\n ->values()\n ->toArray();\n }\n\n public function getValue(): array\n {\n if (! $this->criteria->hasCoachingFeedbackCoachUserIds()) {\n return $this->getDefaultValue();\n }\n\n return array_diff(\n $this->criteria->getCoachingFeedbackCoachUserId(),\n $this->userRepository->findInaccessibleDeactivatedUserUuids($this->executedBy)->all(),\n );\n }\n\n private function getDefaultValue(): array\n {\n return [];\n }\n\n public function getValidationRules(?string $prefix = null): array\n {\n $team = $this->executedBy->getTeam();\n\n return [\n $prefix . 'coaching_feedback_coach_id' => 'array',\n $prefix . 'coaching_feedback_coach_id.*' => 'uuid:users,team_id,' . $team->getId(),\n ];\n }\n\n public function getSortOrder(): int\n {\n return 86;\n }\n\n public function shouldBeIncluded(Team $team): bool\n {\n return $team->hasFeature(FeatureEnum::COACHING_FRAMEWORK);\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Component\\ActivitySearch\\FilterDefinition;\n\nuse Illuminate\\Support\\Collection;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinitionQuery;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinitionQueryCollection;\nuse Jiminny\\Contracts\\ActivitySearch\\ValidatedFilterDefinitionInterface;\nuse Jiminny\\Contracts\\Repositories\\UserRepository;\nuse Jiminny\\Models;\nuse Jiminny\\Models\\Feature\\FeatureEnum;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Traits\\RequiresUUID;\nuse Elastica\\Query;\n\nfinal class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefinitionInterface\n{\n private const int NO_GROUP_ID = 999;\n private UserRepository $userRepository;\n\n public function __construct(UserRepository $userRepository)\n {\n $this->userRepository = $userRepository;\n }\n\n public function shouldApplyQueries(): bool\n {\n return count($this->getValue()) > 0;\n }\n\n public function getQueries(): FilterDefinitionQueryCollection\n {\n $userIds = $this->getValue();\n\n return FilterDefinitionQueryCollection::make([\n FilterDefinitionQuery::instance()\n ->setQuery(new Query\\Terms('coachingFeedbacks.coach.id_string', $userIds))\n ->setPath('coachingFeedbacks.coach', 'coachingFeedbacks'),\n ]);\n }\n\n public function toArray(): array\n {\n return [\n 'id' => 'coaching-feedback-user-filter',\n 'label' => 'Coach',\n 'helpText' => 'The person who completed the Coaching Framework',\n 'placeholder' => 'Search coaches',\n 'inputType' => InputTypeEnum::DROPDOWN_MULTIPLE,\n 'queryParam' => 'coaching_feedback_coach_id',\n 'options' => $this->getOptions(),\n 'groupLabelKey' => 'label',\n 'groupValuesKey' => 'users',\n 'optionLabelKey' => 'name',\n 'optionValueKey' => 'id',\n 'value' => $this->getValue(),\n ];\n }\n\n private function getOptions(): array\n {\n $user = $this->executedBy;\n $query = $user\n ->getTeam()\n ->users()\n ->whereNotIn(\n 'uuid',\n $this->userRepository->findInaccessibleDeactivatedUserUuids($user)\n ->map(static fn (string $uuid): string => RequiresUUID::toOptimized($uuid))\n ->all(),\n )\n ->orderBy('name');\n\n $users = $query\n ->with('group')\n ->get()\n ->reduce(\n static function (array $carry, Models\\User $user): array {\n $group = $user->getGroup();\n $groupId = $group !== null\n ? $group->getUuid()\n : self::NO_GROUP_ID;\n $groupName = $group !== null\n ? $group->getName()\n : '(NON-GROUPED)';\n\n if (! array_key_exists($groupId, $carry)) {\n $carry[$groupId] = [\n 'label' => $groupName,\n 'users' => [],\n ];\n }\n\n $carry[$groupId]['users'][] = [\n 'id' => $user->getUuid(),\n 'name' => sprintf(\n '%s%s',\n $user->getName(),\n ! $user->isStatusActive()\n ? ' (Inactive)'\n : ''\n ),\n ];\n\n return $carry;\n },\n []\n );\n\n return Collection::make($users)\n ->sortBy('label')\n ->values()\n ->toArray();\n }\n\n public function getValue(): array\n {\n if (! $this->criteria->hasCoachingFeedbackCoachUserIds()) {\n return $this->getDefaultValue();\n }\n\n return array_diff(\n $this->criteria->getCoachingFeedbackCoachUserId(),\n $this->userRepository->findInaccessibleDeactivatedUserUuids($this->executedBy)->all(),\n );\n }\n\n private function getDefaultValue(): array\n {\n return [];\n }\n\n public function getValidationRules(?string $prefix = null): array\n {\n $team = $this->executedBy->getTeam();\n\n return [\n $prefix . 'coaching_feedback_coach_id' => 'array',\n $prefix . 'coaching_feedback_coach_id.*' => 'uuid:users,team_id,' . $team->getId(),\n ];\n }\n\n public function getSortOrder(): int\n {\n return 86;\n }\n\n public function shouldBeIncluded(Team $team): bool\n {\n return $team->hasFeature(FeatureEnum::COACHING_FRAMEWORK);\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
6509625738266471330
|
-8996616125002602716
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
JY-20676-delete-report-re Project: faVsco.js, menu
JY-20676-delete-report-related-objects, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
3
16
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Tests\Feature\SavedSearches;
use Illuminate\Support\LazyCollection;
use Illuminate\Support\Str;
use Mockery\MockInterface;
use Illuminate\Database\Eloquent\Factories\Sequence;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Illuminate\Support\Facades\Event;
use Illuminate\Testing\Fluent\AssertableJson;
use Jiminny\Events\Nudges\NudgeCreated;
use Jiminny\Models\Activity\Search;
use Jiminny\Models\Activity\SearchFilter;
use Jiminny\Models\Nudge;
use Jiminny\Models\Role;
use Jiminny\Models\Team;
use Jiminny\Models\User;
use Jiminny\Repositories\ElasticActivityRepository;
use Tests\TestCase;
final class SavedSearchCRUDFeatureTest extends TestCase
{
use DatabaseTransactions;
#[\PHPUnit\Framework\Attributes\Test]
public function userCanGetAListOfSavedSearches(): void
{
$this->markTestSkipped('Needs to be fixed');
/** @var Team $team */
$team = Team::factory()->create([
'crm_id' => 1, // temporary
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'status' => User::STATUS_ACTIVE,
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create();
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
$nudges = Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->getJson(route('api.saved_search.index'))
->assertStatus(200)
->assertJson(
fn (AssertableJson $json) =>
$json->has(1)
->first(
fn ($json) =>
$json->where('id', $search->id_string)
->where('name', $search->getName())
->where('filters', ['max_customer_questions' => 5, 'min_engaging_questions' => 3])
->has('nudges', 2)
->has(
'nudges.0',
fn ($json) =>
$json->where('id', $nudges[0]->id_string)
->where('frequency', 'daily')
->where('channel', 'email')
->has('expiresAt')
)
->has(
'nudges.1',
fn ($json) =>
$json->where('id', $nudges[1]->id_string)
->where('frequency', 'weekly')
->where('channel', 'slack')
->has('expiresAt')
)
)
);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanCreateASavedSearchBasedOnActivityFilters(): void
{
$this->markTestSkipped('Needs to be fixed');
Event::fake();
$this->partialMock(ElasticActivityRepository::class, function (MockInterface $mock) {
$mock->shouldReceive('onDemandScroll')
->times(2)
->andReturn(LazyCollection::empty());
});
/** @var Team $team */
$team = Team::factory()->create([
'uuid' => Str::uuid()->toString(),
'crm_id' => 1, // temporary
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->createQuietly([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$this->apiGuardLogin($user);
$this->actingAs($user)
->postJson(route('api.saved_search.create'), [
'name' => '::searchName::',
'filters' => [
'min_duration' => 1,
'only_recorded' => 1,
],
'nudges' => [
[
'frequency' => 'daily',
'channel' => 'email',
'expiresAt' => now()->addWeek()->format('Y-m-d'),
],
[
'frequency' => 'daily',
'channel' => 'slack',
'expiresAt' => now()->addWeek()->format('Y-m-d'),
],
],
])
->assertStatus(200);
$this->assertDatabaseHas('activity_searches', [
'name' => '::searchName::',
'user_id' => $user->id,
]);
$search = $user->searches()->first();
$this->assertDatabaseHas('nudges', [
'activity_search_id' => $search->id,
'frequency' => 2,
'channel' => 2,
]);
$this->assertDatabaseHas('nudges', [
'activity_search_id' => $search->id,
'frequency' => 2,
'channel' => 4,
]);
$this->assertDatabaseHas('activity_search_filters', [
'activity_search_id' => $search->id,
'filter' => 'min_duration',
'value' => 1,
]);
$this->assertDatabaseHas('activity_search_filters', [
'activity_search_id' => $search->id,
'filter' => 'only_recorded',
'value' => 1,
]);
Event::assertDispatched(NudgeCreated::class, 2);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanUpdateASavedSearchBasedOnActivityFilters(): void
{
/** @var Team $team */
$team = Team::factory()->createQuietly([
'uuid' => Str::uuid()->toString(),
'crm_id' => 1,
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create([
'name' => 'Search Name',
]);
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->putJson(route('api.saved_search.update', $search->id_string), [
'name' => 'Updated Search Name',
])->assertOk()
->assertJson([]);
$this->assertDatabaseMissing('activity_searches', [
'name' => 'Search Name',
'user_id' => $user->id,
]);
$this->assertDatabaseHas('activity_searches', [
'name' => 'Updated Search Name',
'user_id' => $user->id,
]);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanDeleteASavedSearch(): void
{
/** @var Team $team */
$team = Team::factory()->create([
'crm_id' => 1,
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create([
'name' => 'Search Name',
]);
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->deleteJson(route('api.saved_search.delete', $search->id_string))
->assertStatus(200)
->assertJson([]);
$this->assertDatabaseMissing('activity_searches', [
'user_id' => $user->id,
]);
$this->assertDatabaseMissing('activity_search_filters', [
'activity_search_id' => $search->id,
]);
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
1
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Component\ActivitySearch\FilterDefinition;
use Illuminate\Support\Collection;
use Jiminny\Component\ActivitySearch\FilterDefinition;
use Jiminny\Component\ActivitySearch\FilterDefinitionQuery;
use Jiminny\Component\ActivitySearch\FilterDefinitionQueryCollection;
use Jiminny\Contracts\ActivitySearch\ValidatedFilterDefinitionInterface;
use Jiminny\Contracts\Repositories\UserRepository;
use Jiminny\Models;
use Jiminny\Models\Feature\FeatureEnum;
use Jiminny\Models\Team;
use Jiminny\Traits\RequiresUUID;
use Elastica\Query;
final class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefinitionInterface
{
private const int NO_GROUP_ID = 999;
private UserRepository $userRepository;
public function __construct(UserRepository $userRepository)
{
$this->userRepository = $userRepository;
}
public function shouldApplyQueries(): bool
{
return count($this->getValue()) > 0;
}
public function getQueries(): FilterDefinitionQueryCollection
{
$userIds = $this->getValue();
return FilterDefinitionQueryCollection::make([
FilterDefinitionQuery::instance()
->setQuery(new Query\Terms('coachingFeedbacks.coach.id_string', $userIds))
->setPath('coachingFeedbacks.coach', 'coachingFeedbacks'),
]);
}
public function toArray(): array
{
return [
'id' => 'coaching-feedback-user-filter',
'label' => 'Coach',
'helpText' => 'The person who completed the Coaching Framework',
'placeholder' => 'Search coaches',
'inputType' => InputTypeEnum::DROPDOWN_MULTIPLE,
'queryParam' => 'coaching_feedback_coach_id',
'options' => $this->getOptions(),
'groupLabelKey' => 'label',
'groupValuesKey' => 'users',
'optionLabelKey' => 'name',
'optionValueKey' => 'id',
'value' => $this->getValue(),
];
}
private function getOptions(): array
{
$user = $this->executedBy;
$query = $user
->getTeam()
->users()
->whereNotIn(
'uuid',
$this->userRepository->findInaccessibleDeactivatedUserUuids($user)
->map(static fn (string $uuid): string => RequiresUUID::toOptimized($uuid))
->all(),
)
->orderBy('name');
$users = $query
->with('group')
->get()
->reduce(
static function (array $carry, Models\User $user): array {
$group = $user->getGroup();
$groupId = $group !== null
? $group->getUuid()
: self::NO_GROUP_ID;
$groupName = $group !== null
? $group->getName()
: '(NON-GROUPED)';
if (! array_key_exists($groupId, $carry)) {
$carry[$groupId] = [
'label' => $groupName,
'users' => [],
];
}
$carry[$groupId]['users'][] = [
'id' => $user->getUuid(),
'name' => sprintf(
'%s%s',
$user->getName(),
! $user->isStatusActive()
? ' (Inactive)'
: ''
),
];
return $carry;
},
[]
);
return Collection::make($users)
->sortBy('label')
->values()
->toArray();
}
public function getValue(): array
{
if (! $this->criteria->hasCoachingFeedbackCoachUserIds()) {
return $this->getDefaultValue();
}
return array_diff(
$this->criteria->getCoachingFeedbackCoachUserId(),
$this->userRepository->findInaccessibleDeactivatedUserUuids($this->executedBy)->all(),
);
}
private function getDefaultValue(): array
{
return [];
}
public function getValidationRules(?string $prefix = null): array
{
$team = $this->executedBy->getTeam();
return [
$prefix . 'coaching_feedback_coach_id' => 'array',
$prefix . 'coaching_feedback_coach_id.*' => 'uuid:users,team_id,' . $team->getId(),
];
}
public function getSortOrder(): int
{
return 86;
}
public function shouldBeIncluded(Team $team): bool
{
return $team->hasFeature(FeatureEnum::COACHING_FRAMEWORK);
}
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
56403
|
NULL
|
NULL
|
NULL
|
|
56408
|
1967
|
16
|
2026-05-19T08:05:31.833889+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-19/1779 /Users/lukas/.screenpipe/data/data/2026-05-19/1779177931833_m2.jpg...
|
PhpStorm
|
Shelve Changes
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Diff
Changelist:
Changelist:
Changes
Show Diff
Rol Diff
Changelist:
Changelist:
Changes
Show Diff
Rollback...
Refresh
Group By
Expand All
Collapse All
16 files, folder partially checked
app 13 files, folder partially checked
Component 5 files, folder partially checked
AskAnything 2 files, folder not checked
SCIM 2 files, folder not checked
Twilio/Conference/ConferenceManager 1 file, folder checked
SoftPhoneManager.php, final class checked...
|
[{"role":"AXStaticText","text& [{"role":"AXStaticText","text":"Diff","depth":1,"bounds":{"left":0.25531915,"top":0.39185953,"width":0.013962766,"height":0.013567438},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Changelist:","depth":1,"bounds":{"left":0.51329786,"top":0.15802075,"width":0.022938829,"height":0.027134877},"on_screen":true,"role_description":"text"},{"role":"AXPopUpButton","text":"Changelist:","depth":1,"bounds":{"left":0.5375665,"top":0.15802075,"width":0.042220745,"height":0.027134877},"on_screen":true,"role_description":"pop up button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Changes","depth":6,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Show Diff","depth":2,"bounds":{"left":0.25664893,"top":0.16201118,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Rollback...","depth":2,"bounds":{"left":0.26529256,"top":0.16201118,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Refresh","depth":2,"bounds":{"left":0.27393618,"top":0.16201118,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Group By","depth":2,"bounds":{"left":0.28490692,"top":0.16201118,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand All","depth":2,"bounds":{"left":0.49268618,"top":0.16201118,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":2,"bounds":{"left":0.5013298,"top":0.16201118,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"16 files, folder partially checked","depth":4,"bounds":{"left":0.26462767,"top":0.0981644,"width":0.032579787,"height":0.017557861},"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"app 13 files, folder partially checked","depth":5,"bounds":{"left":0.27094415,"top":0.11572227,"width":0.040226065,"height":0.017557861},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Component 5 files, folder partially checked","depth":6,"bounds":{"left":0.27726063,"top":0.13328013,"width":0.05418883,"height":0.017557861},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"AskAnything 2 files, folder not checked","depth":7,"bounds":{"left":0.2835771,"top":0.15083799,"width":0.05618351,"height":0.017557861},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"SCIM 2 files, folder not checked","depth":7,"bounds":{"left":0.2835771,"top":0.16839585,"width":0.041223403,"height":0.017557861},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Twilio/Conference/ConferenceManager 1 file, folder checked","depth":7,"bounds":{"left":0.2835771,"top":0.1859537,"width":0.10837766,"height":0.017557861},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"SoftPhoneManager.php, final class checked","depth":8,"bounds":{"left":0.28989363,"top":0.20351157,"width":0.064494684,"height":0.017557861},"on_screen":true,"role_description":"text"}]...
|
5929782213944595202
|
5467418402357195851
|
visual_change
|
accessibility
|
NULL
|
Diff
Changelist:
Changelist:
Changes
Show Diff
Rol Diff
Changelist:
Changelist:
Changes
Show Diff
Rollback...
Refresh
Group By
Expand All
Collapse All
16 files, folder partially checked
app 13 files, folder partially checked
Component 5 files, folder partially checked
AskAnything 2 files, folder not checked
SCIM 2 files, folder not checked
Twilio/Conference/ConferenceManager 1 file, folder checked
SoftPhoneManager.php, final class checked...
|
56407
|
NULL
|
NULL
|
NULL
|
|
56409
|
1966
|
14
|
2026-05-19T08:05:49.059176+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-19/1779 /Users/lukas/.screenpipe/data/data/2026-05-19/1779177949059_m1.jpg...
|
PhpStorm
|
Shelve Changes
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
SlackFileEditViewGoHistoryWindowHelpAPPDOCKER• ₴1D SlackFileEditViewGoHistoryWindowHelpAPPDOCKER• ₴1DEV (-zsh)₴82app/Jobs/Crm/MatchActivityCrmData.phpapp/Jobs/Middleware/HandleHubspotRateLimit.phpAPP (-zst47++++++p42++++++*app/Mcp/Servers/JiminnyServer.phpapp/Mcp/Tools/GetMeTool.php157++++++•app/Models/Feature/FeatureEnum.phpapp/Services/Activity/HubSpot/ProviderResolver.php+-app/Services/Activity/HubSpot/ProviderResolverInterface.phpapp/Services/Activity/HubSpot/Providers/Provider.phpapp/Services/Activity/HubSpot/Providers/ProviderKixie.php+-app/Services/Activity/HubSpot/Providers/Provider0rum.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilio.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilioFlex.phpapp/Services/Activity/HubSpot/Service.phpapp/Services/Crm/Hubspot/Client.phpapp/Services/Crm/Hubspot/HubspotClientInterface.phpapp/Services/Crm/Hubspot/Pagination/HubspotPaginationService.phpapp/Services/Crm/Hubspot/Pagination/PaginationState.phpdatabase/migrations/2026_05_13_124153_create_mcp_feature_flag.phptests/Feature/Mcp/GetMeToolFeatureTest.phptests/Feature/Mcp/ListCallsToolFeatureTest.phptests/Feature/Mcp/McpTestHelpersTrait.phptests/Unit/Component/ES/ChunkSizeTest.phptests/Unit/Component/ES/Processor/DT0s/SelectionListTest.phptests/Unit/Component/ES/Processor/TargetEntitiesSelectorTest.phptests/Unit/Component/MeetingBot/Service/ParticipantMatcherTest.phptests/Unit/Exceptions/RateLimitExceptionTest.phptests/Unit/Jobs/Crm/MatchActivityCrmDataTest.phptests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phptests/Unit/Services/Activity/HubSpot/ServiceTest.phptests/Unit/Services/Crm/Hubspot/ClientTest.phptests/Unit/Services/Crm/Hubspot/Pagination/HubspotPaginationServiceTest.php97++++++-132++++++•15++++++21++++--2+-25++++++.140++++++-2+-19++++++50++++++-27++++++139++++++-6856++++++-+-151++++++-109++++++-250++++++-283++++++=37 files changed, 1587 insertions(+), 344 deletions(-)create mode 100644 app/Component/ES/ChunkSize.phpcreate mode 100644 app/Jobs/Middleware/HandleHubspotRateLimit.phpcreate mode 100644 app/Mcp/Tools/GetMeTool.phpcreate mode 100644 database/migrations/2026_05_13_124153_create_mcp_feature_flag.phpcreate mode 100644 tests/Feature/Mcp/GetMeToolFeatureTest.phpcreate mode 100644 tests/Unit/Component/ES/ChunkSizeTest.phpcreate mode 100644 tests/Unit/Exceptions/RateLimitExceptionTest.phpcreate mode 100644 tests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phplukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pullAlready up to date.lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20676-delete-reSwitched to a new branch 'JY-20676-delete-report-related-objects'lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20676-delete-report-related-obEDHomeDMsActivityFilesLaterMoreJiminny ...# Jiminny-Dg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi...• Direct messages€. Vasil VasilevP. Nikolay Yankov%. Galya Dimitrova L. Aneliya Angelovaão Stefka StoyanovaStoyan Tomovd Todor Stamatov "Kd. Mario GeorgievNikolay Ivanovdo James Graham2 Stoyan TanevRo Steliyan GeorgievLukas Kovalik y…..AppsJira CloudToastSupport Daily - in 3 h 55 m100% <7Tue 19 May 11:05:48Describe what you are looking for# the_people_of jimi...8 426 0• MessagesQ Files+Stefka Stoyanov:Today ~Hі Eteam,I wanted to share that our Lead Developer llianKyuchukov has decided to move on from Jiminny topursue a new opportunity. While we're really sad tosee them go, we're also excited for him and thisnext chapter in his professional journey.llian's last working day will be 14 July, so we stillhave some time together before then. Over thecoming weeks, please make the most of hisknowledge, experience, and context so we canensure a smooth transition across the team.It's hard to overstate the impact llian has had here- from shaping the product and solving toughproblems to supporting teammates and helpingbuild the product we have today. We re incrediblygrateful for everything he contributed over this 2years he was with & engineering team.Just wanted to share the news openly witheveryone and say a huge thanks to llian foreverything so far. Vou Please join me in wishing himall the very best for what comes next.We start looking for a Full-Stack Software Engineer,so if you know anyone you believe will fit, pleasecontact me or Mira directly A687Message #the_people_of_jiminny+...
|
NULL
|
2599194227253515331
|
NULL
|
click
|
ocr
|
NULL
|
SlackFileEditViewGoHistoryWindowHelpAPPDOCKER• ₴1D SlackFileEditViewGoHistoryWindowHelpAPPDOCKER• ₴1DEV (-zsh)₴82app/Jobs/Crm/MatchActivityCrmData.phpapp/Jobs/Middleware/HandleHubspotRateLimit.phpAPP (-zst47++++++p42++++++*app/Mcp/Servers/JiminnyServer.phpapp/Mcp/Tools/GetMeTool.php157++++++•app/Models/Feature/FeatureEnum.phpapp/Services/Activity/HubSpot/ProviderResolver.php+-app/Services/Activity/HubSpot/ProviderResolverInterface.phpapp/Services/Activity/HubSpot/Providers/Provider.phpapp/Services/Activity/HubSpot/Providers/ProviderKixie.php+-app/Services/Activity/HubSpot/Providers/Provider0rum.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilio.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilioFlex.phpapp/Services/Activity/HubSpot/Service.phpapp/Services/Crm/Hubspot/Client.phpapp/Services/Crm/Hubspot/HubspotClientInterface.phpapp/Services/Crm/Hubspot/Pagination/HubspotPaginationService.phpapp/Services/Crm/Hubspot/Pagination/PaginationState.phpdatabase/migrations/2026_05_13_124153_create_mcp_feature_flag.phptests/Feature/Mcp/GetMeToolFeatureTest.phptests/Feature/Mcp/ListCallsToolFeatureTest.phptests/Feature/Mcp/McpTestHelpersTrait.phptests/Unit/Component/ES/ChunkSizeTest.phptests/Unit/Component/ES/Processor/DT0s/SelectionListTest.phptests/Unit/Component/ES/Processor/TargetEntitiesSelectorTest.phptests/Unit/Component/MeetingBot/Service/ParticipantMatcherTest.phptests/Unit/Exceptions/RateLimitExceptionTest.phptests/Unit/Jobs/Crm/MatchActivityCrmDataTest.phptests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phptests/Unit/Services/Activity/HubSpot/ServiceTest.phptests/Unit/Services/Crm/Hubspot/ClientTest.phptests/Unit/Services/Crm/Hubspot/Pagination/HubspotPaginationServiceTest.php97++++++-132++++++•15++++++21++++--2+-25++++++.140++++++-2+-19++++++50++++++-27++++++139++++++-6856++++++-+-151++++++-109++++++-250++++++-283++++++=37 files changed, 1587 insertions(+), 344 deletions(-)create mode 100644 app/Component/ES/ChunkSize.phpcreate mode 100644 app/Jobs/Middleware/HandleHubspotRateLimit.phpcreate mode 100644 app/Mcp/Tools/GetMeTool.phpcreate mode 100644 database/migrations/2026_05_13_124153_create_mcp_feature_flag.phpcreate mode 100644 tests/Feature/Mcp/GetMeToolFeatureTest.phpcreate mode 100644 tests/Unit/Component/ES/ChunkSizeTest.phpcreate mode 100644 tests/Unit/Exceptions/RateLimitExceptionTest.phpcreate mode 100644 tests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phplukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pullAlready up to date.lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20676-delete-reSwitched to a new branch 'JY-20676-delete-report-related-objects'lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20676-delete-report-related-obEDHomeDMsActivityFilesLaterMoreJiminny ...# Jiminny-Dg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi...• Direct messages€. Vasil VasilevP. Nikolay Yankov%. Galya Dimitrova L. Aneliya Angelovaão Stefka StoyanovaStoyan Tomovd Todor Stamatov "Kd. Mario GeorgievNikolay Ivanovdo James Graham2 Stoyan TanevRo Steliyan GeorgievLukas Kovalik y…..AppsJira CloudToastSupport Daily - in 3 h 55 m100% <7Tue 19 May 11:05:48Describe what you are looking for# the_people_of jimi...8 426 0• MessagesQ Files+Stefka Stoyanov:Today ~Hі Eteam,I wanted to share that our Lead Developer llianKyuchukov has decided to move on from Jiminny topursue a new opportunity. While we're really sad tosee them go, we're also excited for him and thisnext chapter in his professional journey.llian's last working day will be 14 July, so we stillhave some time together before then. Over thecoming weeks, please make the most of hisknowledge, experience, and context so we canensure a smooth transition across the team.It's hard to overstate the impact llian has had here- from shaping the product and solving toughproblems to supporting teammates and helpingbuild the product we have today. We re incrediblygrateful for everything he contributed over this 2years he was with & engineering team.Just wanted to share the news openly witheveryone and say a huge thanks to llian foreverything so far. Vou Please join me in wishing himall the very best for what comes next.We start looking for a Full-Stack Software Engineer,so if you know anyone you believe will fit, pleasecontact me or Mira directly A687Message #the_people_of_jiminny+...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
56410
|
1967
|
17
|
2026-05-19T08:05:49.078858+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-19/1779 /Users/lukas/.screenpipe/data/data/2026-05-19/1779177949078_m2.jpg...
|
PhpStorm
|
Shelve Changes
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhostormVIewINavicareCodeLaravelKeractorTOOISWindo PhostormVIewINavicareCodeLaravelKeractorTOOISWindowrTavsco.s°9 JY-20676-delete-roledeyC) AutomatedReport.onp- ActivtvaskAnvihind est.onoc SavedSearchCRUDreaturelest.onp ~e) -xooricontro||erRateLimit est.onoC) FakeProphetClient.ohv> _ Midd ewareRequests() ListenerRoleCannotHaveAdrInteractionsa InvitationsListenerRoleCannotHaveAdminOrManagerPermissionRIHlobsIn Listeners© SyncActivity.php© Crm/Close/Service.phpD McpN Modelsifinal class SavedSearchCRUDFeaturell194 D >public function userCanUpdateASM Notificationsm oraanizationsettingsD PlaylistsD Policies( RepositoriesC RulesC SavedSearches@ SavedSearchCRUDFeatureTest.php› C Search257 D >#Phrun1c rramework Accribucespublic function userCanDeleteAS_ serviceProvidersLocal ChandesConsole XLooX• Changes 16 files.E .env.local appActivityController.php app/Http/Controllers/API© AskAnythingPrompt.php app/Models/AskAnything© AskAnvthingPromptDto.pho app/Component/AskAnvthina/Dtos© AskAnvthinaPromptService.php app/Component/AskAnvthina© AskAnythingPromptServiceTest.php tests/Unit/Component/AskAnything© AskJiminnvReportsController.php app/Htto/Controllers/API/V2(C) Constants.ono aoo/Comoonent/SClM@ CoreUser.pho app/DTO/SCIMIAAD/Responsel(C) CoreUserRequest.ono ano/DTO/SCIMIAAD/[EMAIL] apo/Console/Commandsphp loadina.nho confia@ ScimProvisionina.phnapn/Comnonent/SCIM(C) Search.nho ano/Models/ActivitviC) SoftPhoneManager.nhn ann/Comnonent/Twilio/Conference/ConferenceManad© TextMessagingService.php app/Services/Telephony• UInvorcionod Ciloc 12 filod© AskAnythingPromptServiceTest.php= custom.log= laravel.log4 SF jiminny@localhost]4 HS_local [jiminny@localhost]& console [PROD]# console [euy© AskAnythingPrompt.phpAsKAnywingPromptuto.pnpA console [STAGING]© CoachingFeedbackCoachUserln.php X© BaseService.phpfinal class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefini~Shelve ChanaesChangelist:v Twilio Conference/ConferenceManager 1 fileeryCollection{...}© SoftPhoneManager.php_ U Console/Commands 1 fileDTO/SCIMIAAD 2 files2 modifiedCommit MessageCrmownerResolverv Diftix = null): array{...}Side-by-side viewerDo notignoreHighlight worass omerences©5604af40yuse stmanny cxceptzons Logeecxcepczonuse liminnv Models.Current versioruse Jiminny \Exceptions\LogicException;use liminnv Models.8 5604af40 app/Suse Jiminny Moduse liminnv Moruse Jiminny Mocuse liminnv Seruse Jiminny Models \Participant \Connection;use Jiminny\Services ActivityService:use Jiminny\Services\Crm\CachedCrmServiceDecorator:use Jiminny (Services\Crm\ProviderRegistry:use Jiminny\Services\Telephony\TwilioClientBuilder:use Psr\Log LoggerInterface'use Jiminny Models \Participant\Connection;use Jiminny Services ActivityService:Current version21Muse Jiminhy services Acclvicy crmuwnerkesoLver.use Jiminny\Services\Crm\CachedCrmServiceDecorator:use Jiminny \Services\Crm\ProviderRegistry:use Jiminny Models\PlaybookCategory:use liminnv Model c Toam•use Jiminhy services lelepnony wiLlocLlentbuzlderuse Jiminny Models\User;use liminnv Senvices ActivitvSenvice•use Jiminny\Seruse liminnv Seruse rsrlog Loggerincerrace.Scontant = null.sstage = null.Scontact = null:use IwiL1o ExcEcancelShelve Changesuse Jiminny \Services\Activity\Crm0wnerResolver:use Jiminny\Services\Crm\CachedCrmServiceDecorator:use Jiminny|Services\Crm\ProviderRegistry:use Twilio\Exceptions\ConfigurationException;use Twilio Exceptions \TwilioException:ccaainaService & buildActivitulsceam = suser->cecleamorSteam = Suser->qetreamo:try{ScrmService = Sthis->providerRegistry-›qet(Steam->crm->provider):try{ScrmResolver = app(CrmownerResolver::class.if (! Suser->isCrmRequired@) {ScrmService->setuser(steam->cerowneron:}else {anteorationAdman' => suser'providerSlug' => $team->getCrmConfiguration()->getProviderName(),ScrmService->setUser(Suser)if (ScustomerId)$Ouery the CRM for full details of this customerIslead Saccount Sonnontunity. Scontact Sctage SermCountnvfodel = SernSenvice-snançeReconde(ScustomenTd SohiectTvne)•catch Throwable Sthrowabille) 4$crmService = $this->providerRegistry->get($team->crm->provider);if@ Suser->isCrmReauiredon<SennSenvice-scetlicen(Steam->aetOwnerd)} else {SenmSenvice->cetlisen(Susen)ut affectina the dictionarios for other lanquades (todav 10-001• suppont Dally • In 3n 0om100% 5• Tue 19 May 11:05:49CascadeAsk Jiminny Report M+0 ..3. loggle validationrtsController.php: 126-169 — In toggleStatus(), when enabled=true and the report is an Ask Jiminnyreport, returns 422 lt elther activity search 1d or ask anything prompt 1d is nult . Disabling is always allowed.4. TestsAskAnythingPromptServiceTest.php - Updated two existing update() mock expectations to match the new payload ( ['aPer your rules i did not add unit tests for the controller. The existing SavedSearchCRUDFeatureTest covers the search* Reject allAccent allAsk anvthina (4D14 @s Codo Chudo Onuc 17 Modium•01.6 ditterencesPo 4 spaces...
|
NULL
|
3270462728078436114
|
NULL
|
click
|
ocr
|
NULL
|
PhostormVIewINavicareCodeLaravelKeractorTOOISWindo PhostormVIewINavicareCodeLaravelKeractorTOOISWindowrTavsco.s°9 JY-20676-delete-roledeyC) AutomatedReport.onp- ActivtvaskAnvihind est.onoc SavedSearchCRUDreaturelest.onp ~e) -xooricontro||erRateLimit est.onoC) FakeProphetClient.ohv> _ Midd ewareRequests() ListenerRoleCannotHaveAdrInteractionsa InvitationsListenerRoleCannotHaveAdminOrManagerPermissionRIHlobsIn Listeners© SyncActivity.php© Crm/Close/Service.phpD McpN Modelsifinal class SavedSearchCRUDFeaturell194 D >public function userCanUpdateASM Notificationsm oraanizationsettingsD PlaylistsD Policies( RepositoriesC RulesC SavedSearches@ SavedSearchCRUDFeatureTest.php› C Search257 D >#Phrun1c rramework Accribucespublic function userCanDeleteAS_ serviceProvidersLocal ChandesConsole XLooX• Changes 16 files.E .env.local appActivityController.php app/Http/Controllers/API© AskAnythingPrompt.php app/Models/AskAnything© AskAnvthingPromptDto.pho app/Component/AskAnvthina/Dtos© AskAnvthinaPromptService.php app/Component/AskAnvthina© AskAnythingPromptServiceTest.php tests/Unit/Component/AskAnything© AskJiminnvReportsController.php app/Htto/Controllers/API/V2(C) Constants.ono aoo/Comoonent/SClM@ CoreUser.pho app/DTO/SCIMIAAD/Responsel(C) CoreUserRequest.ono ano/DTO/SCIMIAAD/[EMAIL] apo/Console/Commandsphp loadina.nho confia@ ScimProvisionina.phnapn/Comnonent/SCIM(C) Search.nho ano/Models/ActivitviC) SoftPhoneManager.nhn ann/Comnonent/Twilio/Conference/ConferenceManad© TextMessagingService.php app/Services/Telephony• UInvorcionod Ciloc 12 filod© AskAnythingPromptServiceTest.php= custom.log= laravel.log4 SF jiminny@localhost]4 HS_local [jiminny@localhost]& console [PROD]# console [euy© AskAnythingPrompt.phpAsKAnywingPromptuto.pnpA console [STAGING]© CoachingFeedbackCoachUserln.php X© BaseService.phpfinal class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefini~Shelve ChanaesChangelist:v Twilio Conference/ConferenceManager 1 fileeryCollection{...}© SoftPhoneManager.php_ U Console/Commands 1 fileDTO/SCIMIAAD 2 files2 modifiedCommit MessageCrmownerResolverv Diftix = null): array{...}Side-by-side viewerDo notignoreHighlight worass omerences©5604af40yuse stmanny cxceptzons Logeecxcepczonuse liminnv Models.Current versioruse Jiminny \Exceptions\LogicException;use liminnv Models.8 5604af40 app/Suse Jiminny Moduse liminnv Moruse Jiminny Mocuse liminnv Seruse Jiminny Models \Participant \Connection;use Jiminny\Services ActivityService:use Jiminny\Services\Crm\CachedCrmServiceDecorator:use Jiminny (Services\Crm\ProviderRegistry:use Jiminny\Services\Telephony\TwilioClientBuilder:use Psr\Log LoggerInterface'use Jiminny Models \Participant\Connection;use Jiminny Services ActivityService:Current version21Muse Jiminhy services Acclvicy crmuwnerkesoLver.use Jiminny\Services\Crm\CachedCrmServiceDecorator:use Jiminny \Services\Crm\ProviderRegistry:use Jiminny Models\PlaybookCategory:use liminnv Model c Toam•use Jiminhy services lelepnony wiLlocLlentbuzlderuse Jiminny Models\User;use liminnv Senvices ActivitvSenvice•use Jiminny\Seruse liminnv Seruse rsrlog Loggerincerrace.Scontant = null.sstage = null.Scontact = null:use IwiL1o ExcEcancelShelve Changesuse Jiminny \Services\Activity\Crm0wnerResolver:use Jiminny\Services\Crm\CachedCrmServiceDecorator:use Jiminny|Services\Crm\ProviderRegistry:use Twilio\Exceptions\ConfigurationException;use Twilio Exceptions \TwilioException:ccaainaService & buildActivitulsceam = suser->cecleamorSteam = Suser->qetreamo:try{ScrmService = Sthis->providerRegistry-›qet(Steam->crm->provider):try{ScrmResolver = app(CrmownerResolver::class.if (! Suser->isCrmRequired@) {ScrmService->setuser(steam->cerowneron:}else {anteorationAdman' => suser'providerSlug' => $team->getCrmConfiguration()->getProviderName(),ScrmService->setUser(Suser)if (ScustomerId)$Ouery the CRM for full details of this customerIslead Saccount Sonnontunity. Scontact Sctage SermCountnvfodel = SernSenvice-snançeReconde(ScustomenTd SohiectTvne)•catch Throwable Sthrowabille) 4$crmService = $this->providerRegistry->get($team->crm->provider);if@ Suser->isCrmReauiredon<SennSenvice-scetlicen(Steam->aetOwnerd)} else {SenmSenvice->cetlisen(Susen)ut affectina the dictionarios for other lanquades (todav 10-001• suppont Dally • In 3n 0om100% 5• Tue 19 May 11:05:49CascadeAsk Jiminny Report M+0 ..3. loggle validationrtsController.php: 126-169 — In toggleStatus(), when enabled=true and the report is an Ask Jiminnyreport, returns 422 lt elther activity search 1d or ask anything prompt 1d is nult . Disabling is always allowed.4. TestsAskAnythingPromptServiceTest.php - Updated two existing update() mock expectations to match the new payload ( ['aPer your rules i did not add unit tests for the controller. The existing SavedSearchCRUDFeatureTest covers the search* Reject allAccent allAsk anvthina (4D14 @s Codo Chudo Onuc 17 Modium•01.6 ditterencesPo 4 spaces...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
56413
|
1967
|
18
|
2026-05-19T08:05:52.564490+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-19/1779 /Users/lukas/.screenpipe/data/data/2026-05-19/1779177952564_m2.jpg...
|
PhpStorm
|
faVsco.js – SavedSearchCRUDFeatureTest.php
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhostormVIeWINavicareCodeLaravelWindowFV faVsco.js PhostormVIeWINavicareCodeLaravelWindowFV faVsco.js°9 JY-20676-delete-report-related-objectsProiect(C) AutomatedReport.onp© AskAnythingPromptServiceTest.php- ActivtvaskAnvihind est.ono'c SavedSearchCRUDreaturelest.onp ~© AskAnythingPromptDto.phpe) -xooricontro||erRateLimit est.onoC)FakeProphetClient.oho© AskAnythingPromptService.php© BaseService.php> _ Midd eware4) SoftPhoneManager.phpC) RoleAttr.png© ScimProvisioning.php• _ Requests)© CoreUser.phd() ListenerRoleCar() RoleAttrTest.phpInteractionsInvitationsListenerRoleCannotHaveAdminOrManagerPermissionRule.phpActivity/Close/Service.php©) Activity/RinqCentral/Service.phpIHlobsIn Listeners© SyncActivity.php© Crm/Close/Service.php(C) TextMessaqingService.phpD Mcpfinal class SavedSearchCRUDFeatureTest extends TestCase194 D >public function userCanUpdateASavedSearchBasedOnActivityFilters: void{...}M NotificationsD OrganizationSettingsW rlayllsts257 D >#[\PHPUnit\Framework\Attributes\Test]public function userCanDeleteASavedSearch: void{...}_ Pollcles( RepositoriesM PulosC SavedSearchesSavedSearchCRUDFeatureTest.php› C Search0 ServiceProvidersLocal ChandesConsole XLooX= custom.log= laravel.log« SF jiminny@localhost]4 HS_local [jiminny@localhost]& console [PROD]& console [EU]A console [STAGING)© CoachingFeedbackCoachUserln.php Xfinal class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefinim29 đ:34 6t >A3 A16 ^ v45 6t>118119-136135136 €t>public function construct(UserRepository SuserRepository){...}public function shouldApplyQueries: boolf...}public function getQueries: FilterDefinitionQueryCollection{...}public function toArrav@): arravs..?1usaaeprivate function getOptions(): array(...}public function getValue(): arrayf...1 usageprivate function getDefaultValue(): arrayf...}public function getValidationRules(?string $prefix = null): arrayf...}"suppont Dally • In 3n 0om100% 5• Tue 19 May 11:05:52AskJiminnyReportActivityServiceTest vCascadeAsk Jiminny Report M+0 ..mocd → null, "status → Talsel3. loggle validationenabled=true and the report is an Ask Jiminnyreport, returns 422 lt elther activity search 1d or ask anything prompt 1d is nult . Disabling is always allowed.4. TestsAskAnythingPromptServiceTest.php - Updated two existing update() mock expectations to match the new payload ( ['aPer your rules i did not add unit tests for the controller. The existing SavedSearchCRUDFeatureTest covers the searchdelete tlow: backend service test covers promot delete pavload.8 files 400-7 )Ask anvthing (*4D+ <> Code Claude Opus 4.7 Medium* Reject allAccept allNothina to chowaries for other languages. (today 10:00)W Windsurf Teams 314:1 UTF-8 P 4 spaces...
|
NULL
|
-3920068525392978573
|
NULL
|
click
|
ocr
|
NULL
|
PhostormVIeWINavicareCodeLaravelWindowFV faVsco.js PhostormVIeWINavicareCodeLaravelWindowFV faVsco.js°9 JY-20676-delete-report-related-objectsProiect(C) AutomatedReport.onp© AskAnythingPromptServiceTest.php- ActivtvaskAnvihind est.ono'c SavedSearchCRUDreaturelest.onp ~© AskAnythingPromptDto.phpe) -xooricontro||erRateLimit est.onoC)FakeProphetClient.oho© AskAnythingPromptService.php© BaseService.php> _ Midd eware4) SoftPhoneManager.phpC) RoleAttr.png© ScimProvisioning.php• _ Requests)© CoreUser.phd() ListenerRoleCar() RoleAttrTest.phpInteractionsInvitationsListenerRoleCannotHaveAdminOrManagerPermissionRule.phpActivity/Close/Service.php©) Activity/RinqCentral/Service.phpIHlobsIn Listeners© SyncActivity.php© Crm/Close/Service.php(C) TextMessaqingService.phpD Mcpfinal class SavedSearchCRUDFeatureTest extends TestCase194 D >public function userCanUpdateASavedSearchBasedOnActivityFilters: void{...}M NotificationsD OrganizationSettingsW rlayllsts257 D >#[\PHPUnit\Framework\Attributes\Test]public function userCanDeleteASavedSearch: void{...}_ Pollcles( RepositoriesM PulosC SavedSearchesSavedSearchCRUDFeatureTest.php› C Search0 ServiceProvidersLocal ChandesConsole XLooX= custom.log= laravel.log« SF jiminny@localhost]4 HS_local [jiminny@localhost]& console [PROD]& console [EU]A console [STAGING)© CoachingFeedbackCoachUserln.php Xfinal class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefinim29 đ:34 6t >A3 A16 ^ v45 6t>118119-136135136 €t>public function construct(UserRepository SuserRepository){...}public function shouldApplyQueries: boolf...}public function getQueries: FilterDefinitionQueryCollection{...}public function toArrav@): arravs..?1usaaeprivate function getOptions(): array(...}public function getValue(): arrayf...1 usageprivate function getDefaultValue(): arrayf...}public function getValidationRules(?string $prefix = null): arrayf...}"suppont Dally • In 3n 0om100% 5• Tue 19 May 11:05:52AskJiminnyReportActivityServiceTest vCascadeAsk Jiminny Report M+0 ..mocd → null, "status → Talsel3. loggle validationenabled=true and the report is an Ask Jiminnyreport, returns 422 lt elther activity search 1d or ask anything prompt 1d is nult . Disabling is always allowed.4. TestsAskAnythingPromptServiceTest.php - Updated two existing update() mock expectations to match the new payload ( ['aPer your rules i did not add unit tests for the controller. The existing SavedSearchCRUDFeatureTest covers the searchdelete tlow: backend service test covers promot delete pavload.8 files 400-7 )Ask anvthing (*4D+ <> Code Claude Opus 4.7 Medium* Reject allAccept allNothina to chowaries for other languages. (today 10:00)W Windsurf Teams 314:1 UTF-8 P 4 spaces...
|
56410
|
NULL
|
NULL
|
NULL
|
|
56411
|
1966
|
15
|
2026-05-19T08:05:52.569306+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-19/1779 /Users/lukas/.screenpipe/data/data/2026-05-19/1779177952569_m1.jpg...
|
PhpStorm
|
faVsco.js – SavedSearchCRUDFeatureTest.php
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
SlackFileEditViewGoHistoryWindowHelpAPPDOCKER• ₴1D SlackFileEditViewGoHistoryWindowHelpAPPDOCKER• ₴1DEV (-zsh)₴82app/Jobs/Crm/MatchActivityCrmData.phpapp/Jobs/Middleware/HandleHubspotRateLimit.phpAPP (-zst47++++++p42++++++*app/Mcp/Servers/JiminnyServer.phpapp/Mcp/Tools/GetMeTool.php157++++++•app/Models/Feature/FeatureEnum.phpapp/Services/Activity/HubSpot/ProviderResolver.php+-app/Services/Activity/HubSpot/ProviderResolverInterface.phpapp/Services/Activity/HubSpot/Providers/Provider.phpapp/Services/Activity/HubSpot/Providers/ProviderKixie.php+-app/Services/Activity/HubSpot/Providers/Provider0rum.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilio.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilioFlex.phpapp/Services/Activity/HubSpot/Service.phpapp/Services/Crm/Hubspot/Client.phpapp/Services/Crm/Hubspot/HubspotClientInterface.phpapp/Services/Crm/Hubspot/Pagination/HubspotPaginationService.phpapp/Services/Crm/Hubspot/Pagination/PaginationState.phpdatabase/migrations/2026_05_13_124153_create_mcp_feature_flag.phptests/Feature/Mcp/GetMeToolFeatureTest.phptests/Feature/Mcp/ListCallsToolFeatureTest.phptests/Feature/Mcp/McpTestHelpersTrait.phptests/Unit/Component/ES/ChunkSizeTest.phptests/Unit/Component/ES/Processor/DT0s/SelectionListTest.phptests/Unit/Component/ES/Processor/TargetEntitiesSelectorTest.phptests/Unit/Component/MeetingBot/Service/ParticipantMatcherTest.phptests/Unit/Exceptions/RateLimitExceptionTest.phptests/Unit/Jobs/Crm/MatchActivityCrmDataTest.phptests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phptests/Unit/Services/Activity/HubSpot/ServiceTest.phptests/Unit/Services/Crm/Hubspot/ClientTest.phptests/Unit/Services/Crm/Hubspot/Pagination/HubspotPaginationServiceTest.php97++++++-132++++++•15++++++21++++--2+-25++++++.140++++++-2+-19++++++50++++++-27++++++139++++++-6856++++++-+-151++++++-109++++++-250++++++-283++++++=37 files changed, 1587 insertions(+), 344 deletions(-)create mode 100644 app/Component/ES/ChunkSize.phpcreate mode 100644 app/Jobs/Middleware/HandleHubspotRateLimit.phpcreate mode 100644 app/Mcp/Tools/GetMeTool.phpcreate mode 100644 database/migrations/2026_05_13_124153_create_mcp_feature_flag.phpcreate mode 100644 tests/Feature/Mcp/GetMeToolFeatureTest.phpcreate mode 100644 tests/Unit/Component/ES/ChunkSizeTest.phpcreate mode 100644 tests/Unit/Exceptions/RateLimitExceptionTest.phpcreate mode 100644 tests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phplukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pullAlready up to date.lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20676-delete-reSwitched to a new branch 'JY-20676-delete-report-related-objects'lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20676-delete-report-related-obEDHomeDMsActivityFilesLaterMoreJiminny ...# Jiminny-Dg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi...• Direct messages€. Vasil VasilevP. Nikolay Yankov%. Galya Dimitrova L. Aneliya Angelovaão Stefka StoyanovaStoyan Tomovd Todor Stamatov "Kd. Mario GeorgievNikolay Ivanovdo James Graham2 Stoyan TanevRo Steliyan GeorgievLukas Kovalik y…..AppsJira CloudToastSupport Daily - in 3 h 55 m100% CTue 19 May 11:05:52Describe what you are looking for# the_people_of jimi...8 426 0• Messages@ Files+Stefka Stoyanov:Today ~Hі Eteam,I wanted to share that our Lead Developer llianKyuchukov has decided to move on from Jiminny topursue a new opportunity. While we're really sad tosee them go, we're also excited for him and thisnext chapter in his professional journey.llian's last working day will be 14 July, so we stillhave some time together before then. Over thecoming weeks, please make the most of hisknowledge, experience, and context so we canensure a smooth transition across the team.It's hard to overstate the impact llian has had here- from shaping the product and solving toughproblems to supporting teammates and helpingbuild the product we have today. We re incrediblygrateful for everything he contributed over this 2years he was with & engineering team.Just wanted to share the news openly witheveryone and say a huge thanks to llian foreverything so far. Vou Please join me in wishing himall the very best for what comes next.We start looking for a Full-Stack Software Engineer,so if you know anyone you believe will fit, pleasecontact me or Mira directly A687Message #the_people_of_jiminny+...
|
NULL
|
892387482773252379
|
NULL
|
click
|
ocr
|
NULL
|
SlackFileEditViewGoHistoryWindowHelpAPPDOCKER• ₴1D SlackFileEditViewGoHistoryWindowHelpAPPDOCKER• ₴1DEV (-zsh)₴82app/Jobs/Crm/MatchActivityCrmData.phpapp/Jobs/Middleware/HandleHubspotRateLimit.phpAPP (-zst47++++++p42++++++*app/Mcp/Servers/JiminnyServer.phpapp/Mcp/Tools/GetMeTool.php157++++++•app/Models/Feature/FeatureEnum.phpapp/Services/Activity/HubSpot/ProviderResolver.php+-app/Services/Activity/HubSpot/ProviderResolverInterface.phpapp/Services/Activity/HubSpot/Providers/Provider.phpapp/Services/Activity/HubSpot/Providers/ProviderKixie.php+-app/Services/Activity/HubSpot/Providers/Provider0rum.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilio.phpapp/Services/Activity/HubSpot/Providers/ProviderTwilioFlex.phpapp/Services/Activity/HubSpot/Service.phpapp/Services/Crm/Hubspot/Client.phpapp/Services/Crm/Hubspot/HubspotClientInterface.phpapp/Services/Crm/Hubspot/Pagination/HubspotPaginationService.phpapp/Services/Crm/Hubspot/Pagination/PaginationState.phpdatabase/migrations/2026_05_13_124153_create_mcp_feature_flag.phptests/Feature/Mcp/GetMeToolFeatureTest.phptests/Feature/Mcp/ListCallsToolFeatureTest.phptests/Feature/Mcp/McpTestHelpersTrait.phptests/Unit/Component/ES/ChunkSizeTest.phptests/Unit/Component/ES/Processor/DT0s/SelectionListTest.phptests/Unit/Component/ES/Processor/TargetEntitiesSelectorTest.phptests/Unit/Component/MeetingBot/Service/ParticipantMatcherTest.phptests/Unit/Exceptions/RateLimitExceptionTest.phptests/Unit/Jobs/Crm/MatchActivityCrmDataTest.phptests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phptests/Unit/Services/Activity/HubSpot/ServiceTest.phptests/Unit/Services/Crm/Hubspot/ClientTest.phptests/Unit/Services/Crm/Hubspot/Pagination/HubspotPaginationServiceTest.php97++++++-132++++++•15++++++21++++--2+-25++++++.140++++++-2+-19++++++50++++++-27++++++139++++++-6856++++++-+-151++++++-109++++++-250++++++-283++++++=37 files changed, 1587 insertions(+), 344 deletions(-)create mode 100644 app/Component/ES/ChunkSize.phpcreate mode 100644 app/Jobs/Middleware/HandleHubspotRateLimit.phpcreate mode 100644 app/Mcp/Tools/GetMeTool.phpcreate mode 100644 database/migrations/2026_05_13_124153_create_mcp_feature_flag.phpcreate mode 100644 tests/Feature/Mcp/GetMeToolFeatureTest.phpcreate mode 100644 tests/Unit/Component/ES/ChunkSizeTest.phpcreate mode 100644 tests/Unit/Exceptions/RateLimitExceptionTest.phpcreate mode 100644 tests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.phplukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pullAlready up to date.lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20676-delete-reSwitched to a new branch 'JY-20676-delete-report-related-objects'lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20676-delete-report-related-obEDHomeDMsActivityFilesLaterMoreJiminny ...# Jiminny-Dg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi...• Direct messages€. Vasil VasilevP. Nikolay Yankov%. Galya Dimitrova L. Aneliya Angelovaão Stefka StoyanovaStoyan Tomovd Todor Stamatov "Kd. Mario GeorgievNikolay Ivanovdo James Graham2 Stoyan TanevRo Steliyan GeorgievLukas Kovalik y…..AppsJira CloudToastSupport Daily - in 3 h 55 m100% CTue 19 May 11:05:52Describe what you are looking for# the_people_of jimi...8 426 0• Messages@ Files+Stefka Stoyanov:Today ~Hі Eteam,I wanted to share that our Lead Developer llianKyuchukov has decided to move on from Jiminny topursue a new opportunity. While we're really sad tosee them go, we're also excited for him and thisnext chapter in his professional journey.llian's last working day will be 14 July, so we stillhave some time together before then. Over thecoming weeks, please make the most of hisknowledge, experience, and context so we canensure a smooth transition across the team.It's hard to overstate the impact llian has had here- from shaping the product and solving toughproblems to supporting teammates and helpingbuild the product we have today. We re incrediblygrateful for everything he contributed over this 2years he was with & engineering team.Just wanted to share the news openly witheveryone and say a huge thanks to llian foreverything so far. Vou Please join me in wishing himall the very best for what comes next.We start looking for a Full-Stack Software Engineer,so if you know anyone you believe will fit, pleasecontact me or Mira directly A687Message #the_people_of_jiminny+...
|
56409
|
NULL
|
NULL
|
NULL
|
|
56412
|
1966
|
16
|
2026-05-19T08:05:54.356663+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-19/1779 /Users/lukas/.screenpipe/data/data/2026-05-19/1779177954356_m1.jpg...
|
PhpStorm
|
faVsco.js – SavedSearchCRUDFeatureTest.php
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20676-delete-report-re Project: faVsco.js, menu
JY-20676-delete-report-related-objects, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
3
16
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Tests\Feature\SavedSearches;
use Illuminate\Support\LazyCollection;
use Illuminate\Support\Str;
use Mockery\MockInterface;
use Illuminate\Database\Eloquent\Factories\Sequence;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Illuminate\Support\Facades\Event;
use Illuminate\Testing\Fluent\AssertableJson;
use Jiminny\Events\Nudges\NudgeCreated;
use Jiminny\Models\Activity\Search;
use Jiminny\Models\Activity\SearchFilter;
use Jiminny\Models\Nudge;
use Jiminny\Models\Role;
use Jiminny\Models\Team;
use Jiminny\Models\User;
use Jiminny\Repositories\ElasticActivityRepository;
use Tests\TestCase;
final class SavedSearchCRUDFeatureTest extends TestCase
{
use DatabaseTransactions;
#[\PHPUnit\Framework\Attributes\Test]
public function userCanGetAListOfSavedSearches(): void
{
$this->markTestSkipped('Needs to be fixed');
/** @var Team $team */
$team = Team::factory()->create([
'crm_id' => 1, // temporary
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'status' => User::STATUS_ACTIVE,
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create();
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
$nudges = Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->getJson(route('api.saved_search.index'))
->assertStatus(200)
->assertJson(
fn (AssertableJson $json) =>
$json->has(1)
->first(
fn ($json) =>
$json->where('id', $search->id_string)
->where('name', $search->getName())
->where('filters', ['max_customer_questions' => 5, 'min_engaging_questions' => 3])
->has('nudges', 2)
->has(
'nudges.0',
fn ($json) =>
$json->where('id', $nudges[0]->id_string)
->where('frequency', 'daily')
->where('channel', 'email')
->has('expiresAt')
)
->has(
'nudges.1',
fn ($json) =>
$json->where('id', $nudges[1]->id_string)
->where('frequency', 'weekly')
->where('channel', 'slack')
->has('expiresAt')
)
)
);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanCreateASavedSearchBasedOnActivityFilters(): void
{
$this->markTestSkipped('Needs to be fixed');
Event::fake();
$this->partialMock(ElasticActivityRepository::class, function (MockInterface $mock) {
$mock->shouldReceive('onDemandScroll')
->times(2)
->andReturn(LazyCollection::empty());
});
/** @var Team $team */
$team = Team::factory()->create([
'uuid' => Str::uuid()->toString(),
'crm_id' => 1, // temporary
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->createQuietly([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$this->apiGuardLogin($user);
$this->actingAs($user)
->postJson(route('api.saved_search.create'), [
'name' => '::searchName::',
'filters' => [
'min_duration' => 1,
'only_recorded' => 1,
],
'nudges' => [
[
'frequency' => 'daily',
'channel' => 'email',
'expiresAt' => now()->addWeek()->format('Y-m-d'),
],
[
'frequency' => 'daily',
'channel' => 'slack',
'expiresAt' => now()->addWeek()->format('Y-m-d'),
],
],
])
->assertStatus(200);
$this->assertDatabaseHas('activity_searches', [
'name' => '::searchName::',
'user_id' => $user->id,
]);
$search = $user->searches()->first();
$this->assertDatabaseHas('nudges', [
'activity_search_id' => $search->id,
'frequency' => 2,
'channel' => 2,
]);
$this->assertDatabaseHas('nudges', [
'activity_search_id' => $search->id,
'frequency' => 2,
'channel' => 4,
]);
$this->assertDatabaseHas('activity_search_filters', [
'activity_search_id' => $search->id,
'filter' => 'min_duration',
'value' => 1,
]);
$this->assertDatabaseHas('activity_search_filters', [
'activity_search_id' => $search->id,
'filter' => 'only_recorded',
'value' => 1,
]);
Event::assertDispatched(NudgeCreated::class, 2);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanUpdateASavedSearchBasedOnActivityFilters(): void
{
/** @var Team $team */
$team = Team::factory()->createQuietly([
'uuid' => Str::uuid()->toString(),
'crm_id' => 1,
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create([
'name' => 'Search Name',
]);
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->putJson(route('api.saved_search.update', $search->id_string), [
'name' => 'Updated Search Name',
])->assertOk()
->assertJson([]);
$this->assertDatabaseMissing('activity_searches', [
'name' => 'Search Name',
'user_id' => $user->id,
]);
$this->assertDatabaseHas('activity_searches', [
'name' => 'Updated Search Name',
'user_id' => $user->id,
]);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanDeleteASavedSearch(): void
{
/** @var Team $team */
$team = Team::factory()->create([
'crm_id' => 1,
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create([
'name' => 'Search Name',
]);
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->deleteJson(route('api.saved_search.delete', $search->id_string))
->assertStatus(200)
->assertJson([]);
$this->assertDatabaseMissing('activity_searches', [
'user_id' => $user->id,
]);
$this->assertDatabaseMissing('activity_search_filters', [
'activity_search_id' => $search->id,
]);
}
}
Sync Changes
Hide This Notification
Code changed:...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20676-delete-report-related-objects, menu","depth":5,"on_screen":true,"help_text":"Git Branch: JY-20676-delete-report-related-objects","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceTest","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"3","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"16","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\nnamespace Tests\\Feature\\SavedSearches;\n\nuse Illuminate\\Support\\LazyCollection;\nuse Illuminate\\Support\\Str;\nuse Mockery\\MockInterface;\nuse Illuminate\\Database\\Eloquent\\Factories\\Sequence;\nuse Illuminate\\Foundation\\Testing\\DatabaseTransactions;\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\Testing\\Fluent\\AssertableJson;\nuse Jiminny\\Events\\Nudges\\NudgeCreated;\nuse Jiminny\\Models\\Activity\\Search;\nuse Jiminny\\Models\\Activity\\SearchFilter;\nuse Jiminny\\Models\\Nudge;\nuse Jiminny\\Models\\Role;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\ElasticActivityRepository;\nuse Tests\\TestCase;\n\nfinal class SavedSearchCRUDFeatureTest extends TestCase\n{\n use DatabaseTransactions;\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanGetAListOfSavedSearches(): void\n {\n $this->markTestSkipped('Needs to be fixed');\n /** @var Team $team */\n $team = Team::factory()->create([\n 'crm_id' => 1, // temporary\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'status' => User::STATUS_ACTIVE,\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create();\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n $nudges = Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->getJson(route('api.saved_search.index'))\n ->assertStatus(200)\n ->assertJson(\n fn (AssertableJson $json) =>\n $json->has(1)\n ->first(\n fn ($json) =>\n $json->where('id', $search->id_string)\n ->where('name', $search->getName())\n ->where('filters', ['max_customer_questions' => 5, 'min_engaging_questions' => 3])\n ->has('nudges', 2)\n ->has(\n 'nudges.0',\n fn ($json) =>\n $json->where('id', $nudges[0]->id_string)\n ->where('frequency', 'daily')\n ->where('channel', 'email')\n ->has('expiresAt')\n )\n ->has(\n 'nudges.1',\n fn ($json) =>\n $json->where('id', $nudges[1]->id_string)\n ->where('frequency', 'weekly')\n ->where('channel', 'slack')\n ->has('expiresAt')\n )\n )\n );\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanCreateASavedSearchBasedOnActivityFilters(): void\n {\n $this->markTestSkipped('Needs to be fixed');\n\n Event::fake();\n\n $this->partialMock(ElasticActivityRepository::class, function (MockInterface $mock) {\n $mock->shouldReceive('onDemandScroll')\n ->times(2)\n ->andReturn(LazyCollection::empty());\n });\n\n /** @var Team $team */\n $team = Team::factory()->create([\n 'uuid' => Str::uuid()->toString(),\n 'crm_id' => 1, // temporary\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->createQuietly([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->postJson(route('api.saved_search.create'), [\n 'name' => '::searchName::',\n 'filters' => [\n 'min_duration' => 1,\n 'only_recorded' => 1,\n ],\n 'nudges' => [\n [\n 'frequency' => 'daily',\n 'channel' => 'email',\n 'expiresAt' => now()->addWeek()->format('Y-m-d'),\n ],\n [\n 'frequency' => 'daily',\n 'channel' => 'slack',\n 'expiresAt' => now()->addWeek()->format('Y-m-d'),\n ],\n ],\n ])\n ->assertStatus(200);\n\n $this->assertDatabaseHas('activity_searches', [\n 'name' => '::searchName::',\n 'user_id' => $user->id,\n ]);\n\n $search = $user->searches()->first();\n\n $this->assertDatabaseHas('nudges', [\n 'activity_search_id' => $search->id,\n 'frequency' => 2,\n 'channel' => 2,\n ]);\n\n $this->assertDatabaseHas('nudges', [\n 'activity_search_id' => $search->id,\n 'frequency' => 2,\n 'channel' => 4,\n ]);\n\n $this->assertDatabaseHas('activity_search_filters', [\n 'activity_search_id' => $search->id,\n 'filter' => 'min_duration',\n 'value' => 1,\n ]);\n\n $this->assertDatabaseHas('activity_search_filters', [\n 'activity_search_id' => $search->id,\n 'filter' => 'only_recorded',\n 'value' => 1,\n ]);\n\n Event::assertDispatched(NudgeCreated::class, 2);\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanUpdateASavedSearchBasedOnActivityFilters(): void\n {\n /** @var Team $team */\n $team = Team::factory()->createQuietly([\n 'uuid' => Str::uuid()->toString(),\n 'crm_id' => 1,\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create([\n 'name' => 'Search Name',\n ]);\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->putJson(route('api.saved_search.update', $search->id_string), [\n 'name' => 'Updated Search Name',\n ])->assertOk()\n ->assertJson([]);\n\n $this->assertDatabaseMissing('activity_searches', [\n 'name' => 'Search Name',\n 'user_id' => $user->id,\n ]);\n\n $this->assertDatabaseHas('activity_searches', [\n 'name' => 'Updated Search Name',\n 'user_id' => $user->id,\n ]);\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanDeleteASavedSearch(): void\n {\n /** @var Team $team */\n $team = Team::factory()->create([\n 'crm_id' => 1,\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create([\n 'name' => 'Search Name',\n ]);\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->deleteJson(route('api.saved_search.delete', $search->id_string))\n ->assertStatus(200)\n ->assertJson([]);\n\n $this->assertDatabaseMissing('activity_searches', [\n 'user_id' => $user->id,\n ]);\n\n $this->assertDatabaseMissing('activity_search_filters', [\n 'activity_search_id' => $search->id,\n ]);\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\nnamespace Tests\\Feature\\SavedSearches;\n\nuse Illuminate\\Support\\LazyCollection;\nuse Illuminate\\Support\\Str;\nuse Mockery\\MockInterface;\nuse Illuminate\\Database\\Eloquent\\Factories\\Sequence;\nuse Illuminate\\Foundation\\Testing\\DatabaseTransactions;\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\Testing\\Fluent\\AssertableJson;\nuse Jiminny\\Events\\Nudges\\NudgeCreated;\nuse Jiminny\\Models\\Activity\\Search;\nuse Jiminny\\Models\\Activity\\SearchFilter;\nuse Jiminny\\Models\\Nudge;\nuse Jiminny\\Models\\Role;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\ElasticActivityRepository;\nuse Tests\\TestCase;\n\nfinal class SavedSearchCRUDFeatureTest extends TestCase\n{\n use DatabaseTransactions;\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanGetAListOfSavedSearches(): void\n {\n $this->markTestSkipped('Needs to be fixed');\n /** @var Team $team */\n $team = Team::factory()->create([\n 'crm_id' => 1, // temporary\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'status' => User::STATUS_ACTIVE,\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create();\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n $nudges = Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->getJson(route('api.saved_search.index'))\n ->assertStatus(200)\n ->assertJson(\n fn (AssertableJson $json) =>\n $json->has(1)\n ->first(\n fn ($json) =>\n $json->where('id', $search->id_string)\n ->where('name', $search->getName())\n ->where('filters', ['max_customer_questions' => 5, 'min_engaging_questions' => 3])\n ->has('nudges', 2)\n ->has(\n 'nudges.0',\n fn ($json) =>\n $json->where('id', $nudges[0]->id_string)\n ->where('frequency', 'daily')\n ->where('channel', 'email')\n ->has('expiresAt')\n )\n ->has(\n 'nudges.1',\n fn ($json) =>\n $json->where('id', $nudges[1]->id_string)\n ->where('frequency', 'weekly')\n ->where('channel', 'slack')\n ->has('expiresAt')\n )\n )\n );\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanCreateASavedSearchBasedOnActivityFilters(): void\n {\n $this->markTestSkipped('Needs to be fixed');\n\n Event::fake();\n\n $this->partialMock(ElasticActivityRepository::class, function (MockInterface $mock) {\n $mock->shouldReceive('onDemandScroll')\n ->times(2)\n ->andReturn(LazyCollection::empty());\n });\n\n /** @var Team $team */\n $team = Team::factory()->create([\n 'uuid' => Str::uuid()->toString(),\n 'crm_id' => 1, // temporary\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->createQuietly([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->postJson(route('api.saved_search.create'), [\n 'name' => '::searchName::',\n 'filters' => [\n 'min_duration' => 1,\n 'only_recorded' => 1,\n ],\n 'nudges' => [\n [\n 'frequency' => 'daily',\n 'channel' => 'email',\n 'expiresAt' => now()->addWeek()->format('Y-m-d'),\n ],\n [\n 'frequency' => 'daily',\n 'channel' => 'slack',\n 'expiresAt' => now()->addWeek()->format('Y-m-d'),\n ],\n ],\n ])\n ->assertStatus(200);\n\n $this->assertDatabaseHas('activity_searches', [\n 'name' => '::searchName::',\n 'user_id' => $user->id,\n ]);\n\n $search = $user->searches()->first();\n\n $this->assertDatabaseHas('nudges', [\n 'activity_search_id' => $search->id,\n 'frequency' => 2,\n 'channel' => 2,\n ]);\n\n $this->assertDatabaseHas('nudges', [\n 'activity_search_id' => $search->id,\n 'frequency' => 2,\n 'channel' => 4,\n ]);\n\n $this->assertDatabaseHas('activity_search_filters', [\n 'activity_search_id' => $search->id,\n 'filter' => 'min_duration',\n 'value' => 1,\n ]);\n\n $this->assertDatabaseHas('activity_search_filters', [\n 'activity_search_id' => $search->id,\n 'filter' => 'only_recorded',\n 'value' => 1,\n ]);\n\n Event::assertDispatched(NudgeCreated::class, 2);\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanUpdateASavedSearchBasedOnActivityFilters(): void\n {\n /** @var Team $team */\n $team = Team::factory()->createQuietly([\n 'uuid' => Str::uuid()->toString(),\n 'crm_id' => 1,\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create([\n 'name' => 'Search Name',\n ]);\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->putJson(route('api.saved_search.update', $search->id_string), [\n 'name' => 'Updated Search Name',\n ])->assertOk()\n ->assertJson([]);\n\n $this->assertDatabaseMissing('activity_searches', [\n 'name' => 'Search Name',\n 'user_id' => $user->id,\n ]);\n\n $this->assertDatabaseHas('activity_searches', [\n 'name' => 'Updated Search Name',\n 'user_id' => $user->id,\n ]);\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanDeleteASavedSearch(): void\n {\n /** @var Team $team */\n $team = Team::factory()->create([\n 'crm_id' => 1,\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create([\n 'name' => 'Search Name',\n ]);\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->deleteJson(route('api.saved_search.delete', $search->id_string))\n ->assertStatus(200)\n ->assertJson([]);\n\n $this->assertDatabaseMissing('activity_searches', [\n 'user_id' => $user->id,\n ]);\n\n $this->assertDatabaseMissing('activity_search_filters', [\n 'activity_search_id' => $search->id,\n ]);\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
6974494513498781598
|
-8996598254583995868
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
JY-20676-delete-report-re Project: faVsco.js, menu
JY-20676-delete-report-related-objects, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
3
16
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Tests\Feature\SavedSearches;
use Illuminate\Support\LazyCollection;
use Illuminate\Support\Str;
use Mockery\MockInterface;
use Illuminate\Database\Eloquent\Factories\Sequence;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Illuminate\Support\Facades\Event;
use Illuminate\Testing\Fluent\AssertableJson;
use Jiminny\Events\Nudges\NudgeCreated;
use Jiminny\Models\Activity\Search;
use Jiminny\Models\Activity\SearchFilter;
use Jiminny\Models\Nudge;
use Jiminny\Models\Role;
use Jiminny\Models\Team;
use Jiminny\Models\User;
use Jiminny\Repositories\ElasticActivityRepository;
use Tests\TestCase;
final class SavedSearchCRUDFeatureTest extends TestCase
{
use DatabaseTransactions;
#[\PHPUnit\Framework\Attributes\Test]
public function userCanGetAListOfSavedSearches(): void
{
$this->markTestSkipped('Needs to be fixed');
/** @var Team $team */
$team = Team::factory()->create([
'crm_id' => 1, // temporary
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'status' => User::STATUS_ACTIVE,
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create();
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
$nudges = Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->getJson(route('api.saved_search.index'))
->assertStatus(200)
->assertJson(
fn (AssertableJson $json) =>
$json->has(1)
->first(
fn ($json) =>
$json->where('id', $search->id_string)
->where('name', $search->getName())
->where('filters', ['max_customer_questions' => 5, 'min_engaging_questions' => 3])
->has('nudges', 2)
->has(
'nudges.0',
fn ($json) =>
$json->where('id', $nudges[0]->id_string)
->where('frequency', 'daily')
->where('channel', 'email')
->has('expiresAt')
)
->has(
'nudges.1',
fn ($json) =>
$json->where('id', $nudges[1]->id_string)
->where('frequency', 'weekly')
->where('channel', 'slack')
->has('expiresAt')
)
)
);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanCreateASavedSearchBasedOnActivityFilters(): void
{
$this->markTestSkipped('Needs to be fixed');
Event::fake();
$this->partialMock(ElasticActivityRepository::class, function (MockInterface $mock) {
$mock->shouldReceive('onDemandScroll')
->times(2)
->andReturn(LazyCollection::empty());
});
/** @var Team $team */
$team = Team::factory()->create([
'uuid' => Str::uuid()->toString(),
'crm_id' => 1, // temporary
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->createQuietly([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$this->apiGuardLogin($user);
$this->actingAs($user)
->postJson(route('api.saved_search.create'), [
'name' => '::searchName::',
'filters' => [
'min_duration' => 1,
'only_recorded' => 1,
],
'nudges' => [
[
'frequency' => 'daily',
'channel' => 'email',
'expiresAt' => now()->addWeek()->format('Y-m-d'),
],
[
'frequency' => 'daily',
'channel' => 'slack',
'expiresAt' => now()->addWeek()->format('Y-m-d'),
],
],
])
->assertStatus(200);
$this->assertDatabaseHas('activity_searches', [
'name' => '::searchName::',
'user_id' => $user->id,
]);
$search = $user->searches()->first();
$this->assertDatabaseHas('nudges', [
'activity_search_id' => $search->id,
'frequency' => 2,
'channel' => 2,
]);
$this->assertDatabaseHas('nudges', [
'activity_search_id' => $search->id,
'frequency' => 2,
'channel' => 4,
]);
$this->assertDatabaseHas('activity_search_filters', [
'activity_search_id' => $search->id,
'filter' => 'min_duration',
'value' => 1,
]);
$this->assertDatabaseHas('activity_search_filters', [
'activity_search_id' => $search->id,
'filter' => 'only_recorded',
'value' => 1,
]);
Event::assertDispatched(NudgeCreated::class, 2);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanUpdateASavedSearchBasedOnActivityFilters(): void
{
/** @var Team $team */
$team = Team::factory()->createQuietly([
'uuid' => Str::uuid()->toString(),
'crm_id' => 1,
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create([
'name' => 'Search Name',
]);
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->putJson(route('api.saved_search.update', $search->id_string), [
'name' => 'Updated Search Name',
])->assertOk()
->assertJson([]);
$this->assertDatabaseMissing('activity_searches', [
'name' => 'Search Name',
'user_id' => $user->id,
]);
$this->assertDatabaseHas('activity_searches', [
'name' => 'Updated Search Name',
'user_id' => $user->id,
]);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanDeleteASavedSearch(): void
{
/** @var Team $team */
$team = Team::factory()->create([
'crm_id' => 1,
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create([
'name' => 'Search Name',
]);
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->deleteJson(route('api.saved_search.delete', $search->id_string))
->assertStatus(200)
->assertJson([]);
$this->assertDatabaseMissing('activity_searches', [
'user_id' => $user->id,
]);
$this->assertDatabaseMissing('activity_search_filters', [
'activity_search_id' => $search->id,
]);
}
}
Sync Changes
Hide This Notification
Code changed:...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
56414
|
1967
|
19
|
2026-05-19T08:05:55.077920+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-19/1779 /Users/lukas/.screenpipe/data/data/2026-05-19/1779177955077_m2.jpg...
|
PhpStorm
|
faVsco.js – SavedSearchCRUDFeatureTest.php
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20676-delete-report-re Project: faVsco.js, menu
JY-20676-delete-report-related-objects, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
3
16
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Tests\Feature\SavedSearches;
use Illuminate\Support\LazyCollection;
use Illuminate\Support\Str;
use Mockery\MockInterface;
use Illuminate\Database\Eloquent\Factories\Sequence;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Illuminate\Support\Facades\Event;
use Illuminate\Testing\Fluent\AssertableJson;
use Jiminny\Events\Nudges\NudgeCreated;
use Jiminny\Models\Activity\Search;
use Jiminny\Models\Activity\SearchFilter;
use Jiminny\Models\Nudge;
use Jiminny\Models\Role;
use Jiminny\Models\Team;
use Jiminny\Models\User;
use Jiminny\Repositories\ElasticActivityRepository;
use Tests\TestCase;
final class SavedSearchCRUDFeatureTest extends TestCase
{
use DatabaseTransactions;
#[\PHPUnit\Framework\Attributes\Test]
public function userCanGetAListOfSavedSearches(): void
{
$this->markTestSkipped('Needs to be fixed');
/** @var Team $team */
$team = Team::factory()->create([
'crm_id' => 1, // temporary
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'status' => User::STATUS_ACTIVE,
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create();
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
$nudges = Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->getJson(route('api.saved_search.index'))
->assertStatus(200)
->assertJson(
fn (AssertableJson $json) =>
$json->has(1)
->first(
fn ($json) =>
$json->where('id', $search->id_string)
->where('name', $search->getName())
->where('filters', ['max_customer_questions' => 5, 'min_engaging_questions' => 3])
->has('nudges', 2)
->has(
'nudges.0',
fn ($json) =>
$json->where('id', $nudges[0]->id_string)
->where('frequency', 'daily')
->where('channel', 'email')
->has('expiresAt')
)
->has(
'nudges.1',
fn ($json) =>
$json->where('id', $nudges[1]->id_string)
->where('frequency', 'weekly')
->where('channel', 'slack')
->has('expiresAt')
)
)
);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanCreateASavedSearchBasedOnActivityFilters(): void
{
$this->markTestSkipped('Needs to be fixed');
Event::fake();
$this->partialMock(ElasticActivityRepository::class, function (MockInterface $mock) {
$mock->shouldReceive('onDemandScroll')
->times(2)
->andReturn(LazyCollection::empty());
});
/** @var Team $team */
$team = Team::factory()->create([
'uuid' => Str::uuid()->toString(),
'crm_id' => 1, // temporary
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->createQuietly([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$this->apiGuardLogin($user);
$this->actingAs($user)
->postJson(route('api.saved_search.create'), [
'name' => '::searchName::',
'filters' => [
'min_duration' => 1,
'only_recorded' => 1,
],
'nudges' => [
[
'frequency' => 'daily',
'channel' => 'email',
'expiresAt' => now()->addWeek()->format('Y-m-d'),
],
[
'frequency' => 'daily',
'channel' => 'slack',
'expiresAt' => now()->addWeek()->format('Y-m-d'),
],
],
])
->assertStatus(200);
$this->assertDatabaseHas('activity_searches', [
'name' => '::searchName::',
'user_id' => $user->id,
]);
$search = $user->searches()->first();
$this->assertDatabaseHas('nudges', [
'activity_search_id' => $search->id,
'frequency' => 2,
'channel' => 2,
]);
$this->assertDatabaseHas('nudges', [
'activity_search_id' => $search->id,
'frequency' => 2,
'channel' => 4,
]);
$this->assertDatabaseHas('activity_search_filters', [
'activity_search_id' => $search->id,
'filter' => 'min_duration',
'value' => 1,
]);
$this->assertDatabaseHas('activity_search_filters', [
'activity_search_id' => $search->id,
'filter' => 'only_recorded',
'value' => 1,
]);
Event::assertDispatched(NudgeCreated::class, 2);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanUpdateASavedSearchBasedOnActivityFilters(): void
{
/** @var Team $team */
$team = Team::factory()->createQuietly([
'uuid' => Str::uuid()->toString(),
'crm_id' => 1,
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create([
'name' => 'Search Name',
]);
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->putJson(route('api.saved_search.update', $search->id_string), [
'name' => 'Updated Search Name',
])->assertOk()
->assertJson([]);
$this->assertDatabaseMissing('activity_searches', [
'name' => 'Search Name',
'user_id' => $user->id,
]);
$this->assertDatabaseHas('activity_searches', [
'name' => 'Updated Search Name',
'user_id' => $user->id,
]);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanDeleteASavedSearch(): void
{
/** @var Team $team */
$team = Team::factory()->create([
'crm_id' => 1,
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create([
'name' => 'Search Name',
]);
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->deleteJson(route('api.saved_search.delete', $search->id_string))
->assertStatus(200)
->assertJson([]);
$this->assertDatabaseMissing('activity_searches', [
'user_id' => $user->id,
]);
$this->assertDatabaseMissing('activity_search_filters', [
'activity_search_id' => $search->id,
]);
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
1
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Component\ActivitySearch\FilterDefinition;
use Illuminate\Support\Collection;
use Jiminny\Component\ActivitySearch\FilterDefinition;
use Jiminny\Component\ActivitySearch\FilterDefinitionQuery;
use Jiminny\Component\ActivitySearch\FilterDefinitionQueryCollection;
use Jiminny\Contracts\ActivitySearch\ValidatedFilterDefinitionInterface;
use Jiminny\Contracts\Repositories\UserRepository;
use Jiminny\Models;
use Jiminny\Models\Feature\FeatureEnum;
use Jiminny\Models\Team;
use Jiminny\Traits\RequiresUUID;
use Elastica\Query;
final class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefinitionInterface
{
private const int NO_GROUP_ID = 999;
private UserRepository $userRepository;
public function __construct(UserRepository $userRepository)
{
$this->userRepository = $userRepository;
}
public function shouldApplyQueries(): bool
{
return count($this->getValue()) > 0;
}
public function getQueries(): FilterDefinitionQueryCollection
{
$userIds = $this->getValue();
return FilterDefinitionQueryCollection::make([
FilterDefinitionQuery::instance()
->setQuery(new Query\Terms('coachingFeedbacks.coach.id_string', $userIds))
->setPath('coachingFeedbacks.coach', 'coachingFeedbacks'),
]);
}
public function toArray(): array
{
return [
'id' => 'coaching-feedback-user-filter',
'label' => 'Coach',
'helpText' => 'The person who completed the Coaching Framework',
'placeholder' => 'Search coaches',
'inputType' => InputTypeEnum::DROPDOWN_MULTIPLE,
'queryParam' => 'coaching_feedback_coach_id',
'options' => $this->getOptions(),
'groupLabelKey' => 'label',
'groupValuesKey' => 'users',
'optionLabelKey' => 'name',
'optionValueKey' => 'id',
'value' => $this->getValue(),
];
}
private function getOptions(): array
{
$user = $this->executedBy;
$query = $user
->getTeam()
->users()
->whereNotIn(
'uuid',
$this->userRepository->findInaccessibleDeactivatedUserUuids($user)
->map(static fn (string $uuid): string => RequiresUUID::toOptimized($uuid))
->all(),
)
->orderBy('name');
$users = $query
->with('group')
->get()
->reduce(
static function (array $carry, Models\User $user): array {
$group = $user->getGroup();
$groupId = $group !== null
? $group->getUuid()
: self::NO_GROUP_ID;
$groupName = $group !== null
? $group->getName()
: '(NON-GROUPED)';
if (! array_key_exists($groupId, $carry)) {
$carry[$groupId] = [
'label' => $groupName,
'users' => [],
];
}
$carry[$groupId]['users'][] = [
'id' => $user->getUuid(),
'name' => sprintf(
'%s%s',
$user->getName(),
! $user->isStatusActive()
? ' (Inactive)'
: ''
),
];
return $carry;
},
[]
);
return Collection::make($users)
->sortBy('label')
->values()
->toArray();
}
public function getValue(): array
{
if (! $this->criteria->hasCoachingFeedbackCoachUserIds()) {
return $this->getDefaultValue();
}
return array_diff(
$this->criteria->getCoachingFeedbackCoachUserId(),
$this->userRepository->findInaccessibleDeactivatedUserUuids($this->executedBy)->all(),
);
}
private function getDefaultValue(): array
{
return [];
}
public function getValidationRules(?string $prefix = null): array
{
$team = $this->executedBy->getTeam();
return [
$prefix . 'coaching_feedback_coach_id' => 'array',
$prefix . 'coaching_feedback_coach_id.*' => 'uuid:users,team_id,' . $team->getId(),
];
}
public function getSortOrder(): int
{
return 86;
}
public function shouldBeIncluded(Team $team): bool
{
return $team->hasFeature(FeatureEnum::COACHING_FRAMEWORK);
}
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20676-delete-report-related-objects, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.098071806,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: JY-20676-delete-report-related-objects","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.8081782,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceTest","depth":6,"bounds":{"left":0.8234708,"top":0.019952115,"width":0.09208777,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"bounds":{"left":0.9155585,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest'","depth":6,"bounds":{"left":0.9268617,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"bounds":{"left":0.9381649,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"bounds":{"left":0.96609044,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"bounds":{"left":0.9773936,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"bounds":{"left":0.9886968,"top":0.019952115,"width":0.011303186,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"3","depth":4,"bounds":{"left":0.390625,"top":0.22426178,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"16","depth":4,"bounds":{"left":0.4005984,"top":0.22426178,"width":0.009640957,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.4119016,"top":0.22266561,"width":0.00731383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.4192154,"top":0.22266561,"width":0.006981383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\nnamespace Tests\\Feature\\SavedSearches;\n\nuse Illuminate\\Support\\LazyCollection;\nuse Illuminate\\Support\\Str;\nuse Mockery\\MockInterface;\nuse Illuminate\\Database\\Eloquent\\Factories\\Sequence;\nuse Illuminate\\Foundation\\Testing\\DatabaseTransactions;\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\Testing\\Fluent\\AssertableJson;\nuse Jiminny\\Events\\Nudges\\NudgeCreated;\nuse Jiminny\\Models\\Activity\\Search;\nuse Jiminny\\Models\\Activity\\SearchFilter;\nuse Jiminny\\Models\\Nudge;\nuse Jiminny\\Models\\Role;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\ElasticActivityRepository;\nuse Tests\\TestCase;\n\nfinal class SavedSearchCRUDFeatureTest extends TestCase\n{\n use DatabaseTransactions;\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanGetAListOfSavedSearches(): void\n {\n $this->markTestSkipped('Needs to be fixed');\n /** @var Team $team */\n $team = Team::factory()->create([\n 'crm_id' => 1, // temporary\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'status' => User::STATUS_ACTIVE,\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create();\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n $nudges = Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->getJson(route('api.saved_search.index'))\n ->assertStatus(200)\n ->assertJson(\n fn (AssertableJson $json) =>\n $json->has(1)\n ->first(\n fn ($json) =>\n $json->where('id', $search->id_string)\n ->where('name', $search->getName())\n ->where('filters', ['max_customer_questions' => 5, 'min_engaging_questions' => 3])\n ->has('nudges', 2)\n ->has(\n 'nudges.0',\n fn ($json) =>\n $json->where('id', $nudges[0]->id_string)\n ->where('frequency', 'daily')\n ->where('channel', 'email')\n ->has('expiresAt')\n )\n ->has(\n 'nudges.1',\n fn ($json) =>\n $json->where('id', $nudges[1]->id_string)\n ->where('frequency', 'weekly')\n ->where('channel', 'slack')\n ->has('expiresAt')\n )\n )\n );\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanCreateASavedSearchBasedOnActivityFilters(): void\n {\n $this->markTestSkipped('Needs to be fixed');\n\n Event::fake();\n\n $this->partialMock(ElasticActivityRepository::class, function (MockInterface $mock) {\n $mock->shouldReceive('onDemandScroll')\n ->times(2)\n ->andReturn(LazyCollection::empty());\n });\n\n /** @var Team $team */\n $team = Team::factory()->create([\n 'uuid' => Str::uuid()->toString(),\n 'crm_id' => 1, // temporary\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->createQuietly([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->postJson(route('api.saved_search.create'), [\n 'name' => '::searchName::',\n 'filters' => [\n 'min_duration' => 1,\n 'only_recorded' => 1,\n ],\n 'nudges' => [\n [\n 'frequency' => 'daily',\n 'channel' => 'email',\n 'expiresAt' => now()->addWeek()->format('Y-m-d'),\n ],\n [\n 'frequency' => 'daily',\n 'channel' => 'slack',\n 'expiresAt' => now()->addWeek()->format('Y-m-d'),\n ],\n ],\n ])\n ->assertStatus(200);\n\n $this->assertDatabaseHas('activity_searches', [\n 'name' => '::searchName::',\n 'user_id' => $user->id,\n ]);\n\n $search = $user->searches()->first();\n\n $this->assertDatabaseHas('nudges', [\n 'activity_search_id' => $search->id,\n 'frequency' => 2,\n 'channel' => 2,\n ]);\n\n $this->assertDatabaseHas('nudges', [\n 'activity_search_id' => $search->id,\n 'frequency' => 2,\n 'channel' => 4,\n ]);\n\n $this->assertDatabaseHas('activity_search_filters', [\n 'activity_search_id' => $search->id,\n 'filter' => 'min_duration',\n 'value' => 1,\n ]);\n\n $this->assertDatabaseHas('activity_search_filters', [\n 'activity_search_id' => $search->id,\n 'filter' => 'only_recorded',\n 'value' => 1,\n ]);\n\n Event::assertDispatched(NudgeCreated::class, 2);\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanUpdateASavedSearchBasedOnActivityFilters(): void\n {\n /** @var Team $team */\n $team = Team::factory()->createQuietly([\n 'uuid' => Str::uuid()->toString(),\n 'crm_id' => 1,\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create([\n 'name' => 'Search Name',\n ]);\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->putJson(route('api.saved_search.update', $search->id_string), [\n 'name' => 'Updated Search Name',\n ])->assertOk()\n ->assertJson([]);\n\n $this->assertDatabaseMissing('activity_searches', [\n 'name' => 'Search Name',\n 'user_id' => $user->id,\n ]);\n\n $this->assertDatabaseHas('activity_searches', [\n 'name' => 'Updated Search Name',\n 'user_id' => $user->id,\n ]);\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanDeleteASavedSearch(): void\n {\n /** @var Team $team */\n $team = Team::factory()->create([\n 'crm_id' => 1,\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create([\n 'name' => 'Search Name',\n ]);\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->deleteJson(route('api.saved_search.delete', $search->id_string))\n ->assertStatus(200)\n ->assertJson([]);\n\n $this->assertDatabaseMissing('activity_searches', [\n 'user_id' => $user->id,\n ]);\n\n $this->assertDatabaseMissing('activity_search_filters', [\n 'activity_search_id' => $search->id,\n ]);\n }\n}","depth":4,"bounds":{"left":0.15990691,"top":0.0,"width":0.2662899,"height":0.49162012},"on_screen":true,"value":"<?php\n\nnamespace Tests\\Feature\\SavedSearches;\n\nuse Illuminate\\Support\\LazyCollection;\nuse Illuminate\\Support\\Str;\nuse Mockery\\MockInterface;\nuse Illuminate\\Database\\Eloquent\\Factories\\Sequence;\nuse Illuminate\\Foundation\\Testing\\DatabaseTransactions;\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\Testing\\Fluent\\AssertableJson;\nuse Jiminny\\Events\\Nudges\\NudgeCreated;\nuse Jiminny\\Models\\Activity\\Search;\nuse Jiminny\\Models\\Activity\\SearchFilter;\nuse Jiminny\\Models\\Nudge;\nuse Jiminny\\Models\\Role;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\ElasticActivityRepository;\nuse Tests\\TestCase;\n\nfinal class SavedSearchCRUDFeatureTest extends TestCase\n{\n use DatabaseTransactions;\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanGetAListOfSavedSearches(): void\n {\n $this->markTestSkipped('Needs to be fixed');\n /** @var Team $team */\n $team = Team::factory()->create([\n 'crm_id' => 1, // temporary\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'status' => User::STATUS_ACTIVE,\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create();\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n $nudges = Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->getJson(route('api.saved_search.index'))\n ->assertStatus(200)\n ->assertJson(\n fn (AssertableJson $json) =>\n $json->has(1)\n ->first(\n fn ($json) =>\n $json->where('id', $search->id_string)\n ->where('name', $search->getName())\n ->where('filters', ['max_customer_questions' => 5, 'min_engaging_questions' => 3])\n ->has('nudges', 2)\n ->has(\n 'nudges.0',\n fn ($json) =>\n $json->where('id', $nudges[0]->id_string)\n ->where('frequency', 'daily')\n ->where('channel', 'email')\n ->has('expiresAt')\n )\n ->has(\n 'nudges.1',\n fn ($json) =>\n $json->where('id', $nudges[1]->id_string)\n ->where('frequency', 'weekly')\n ->where('channel', 'slack')\n ->has('expiresAt')\n )\n )\n );\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanCreateASavedSearchBasedOnActivityFilters(): void\n {\n $this->markTestSkipped('Needs to be fixed');\n\n Event::fake();\n\n $this->partialMock(ElasticActivityRepository::class, function (MockInterface $mock) {\n $mock->shouldReceive('onDemandScroll')\n ->times(2)\n ->andReturn(LazyCollection::empty());\n });\n\n /** @var Team $team */\n $team = Team::factory()->create([\n 'uuid' => Str::uuid()->toString(),\n 'crm_id' => 1, // temporary\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->createQuietly([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->postJson(route('api.saved_search.create'), [\n 'name' => '::searchName::',\n 'filters' => [\n 'min_duration' => 1,\n 'only_recorded' => 1,\n ],\n 'nudges' => [\n [\n 'frequency' => 'daily',\n 'channel' => 'email',\n 'expiresAt' => now()->addWeek()->format('Y-m-d'),\n ],\n [\n 'frequency' => 'daily',\n 'channel' => 'slack',\n 'expiresAt' => now()->addWeek()->format('Y-m-d'),\n ],\n ],\n ])\n ->assertStatus(200);\n\n $this->assertDatabaseHas('activity_searches', [\n 'name' => '::searchName::',\n 'user_id' => $user->id,\n ]);\n\n $search = $user->searches()->first();\n\n $this->assertDatabaseHas('nudges', [\n 'activity_search_id' => $search->id,\n 'frequency' => 2,\n 'channel' => 2,\n ]);\n\n $this->assertDatabaseHas('nudges', [\n 'activity_search_id' => $search->id,\n 'frequency' => 2,\n 'channel' => 4,\n ]);\n\n $this->assertDatabaseHas('activity_search_filters', [\n 'activity_search_id' => $search->id,\n 'filter' => 'min_duration',\n 'value' => 1,\n ]);\n\n $this->assertDatabaseHas('activity_search_filters', [\n 'activity_search_id' => $search->id,\n 'filter' => 'only_recorded',\n 'value' => 1,\n ]);\n\n Event::assertDispatched(NudgeCreated::class, 2);\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanUpdateASavedSearchBasedOnActivityFilters(): void\n {\n /** @var Team $team */\n $team = Team::factory()->createQuietly([\n 'uuid' => Str::uuid()->toString(),\n 'crm_id' => 1,\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create([\n 'name' => 'Search Name',\n ]);\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->putJson(route('api.saved_search.update', $search->id_string), [\n 'name' => 'Updated Search Name',\n ])->assertOk()\n ->assertJson([]);\n\n $this->assertDatabaseMissing('activity_searches', [\n 'name' => 'Search Name',\n 'user_id' => $user->id,\n ]);\n\n $this->assertDatabaseHas('activity_searches', [\n 'name' => 'Updated Search Name',\n 'user_id' => $user->id,\n ]);\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\Test]\n public function userCanDeleteASavedSearch(): void\n {\n /** @var Team $team */\n $team = Team::factory()->create([\n 'crm_id' => 1,\n ]);\n\n $adminRole = Role::firstWhere('name', User::ROLE_ADMIN);\n\n /** @var User $user */\n $user = User::factory()\n ->hasAttached($adminRole, ['user_type' => 'user'])\n ->create([\n 'name' => '::userName::',\n 'team_id' => $team->id,\n ]);\n\n $team->owner_id = $user->id;\n $team->save();\n\n $search = Search::factory()->for($user)->create([\n 'name' => 'Search Name',\n ]);\n\n SearchFilter::factory()\n ->for($search)\n ->count(2)\n ->state(new Sequence(\n ['filter' => 'min_engaging_questions', 'value' => 3],\n ['filter' => 'max_customer_questions', 'value' => 5],\n ))->create();\n\n Nudge::factory()\n ->count(2)\n ->state(\n new Sequence(\n ['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],\n ['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],\n )\n )\n ->create(['activity_search_id' => $search->id]);\n\n $this->apiGuardLogin($user);\n\n $this->actingAs($user)\n ->deleteJson(route('api.saved_search.delete', $search->id_string))\n ->assertStatus(200)\n ->assertJson([]);\n\n $this->assertDatabaseMissing('activity_searches', [\n 'user_id' => $user->id,\n ]);\n\n $this->assertDatabaseMissing('activity_search_filters', [\n 'activity_search_id' => $search->id,\n ]);\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"1","depth":4,"bounds":{"left":0.7124335,"top":0.10055866,"width":0.00731383,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.72140956,"top":0.09896249,"width":0.00731383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.7287234,"top":0.09896249,"width":0.006981383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Component\\ActivitySearch\\FilterDefinition;\n\nuse Illuminate\\Support\\Collection;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinitionQuery;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinitionQueryCollection;\nuse Jiminny\\Contracts\\ActivitySearch\\ValidatedFilterDefinitionInterface;\nuse Jiminny\\Contracts\\Repositories\\UserRepository;\nuse Jiminny\\Models;\nuse Jiminny\\Models\\Feature\\FeatureEnum;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Traits\\RequiresUUID;\nuse Elastica\\Query;\n\nfinal class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefinitionInterface\n{\n private const int NO_GROUP_ID = 999;\n private UserRepository $userRepository;\n\n public function __construct(UserRepository $userRepository)\n {\n $this->userRepository = $userRepository;\n }\n\n public function shouldApplyQueries(): bool\n {\n return count($this->getValue()) > 0;\n }\n\n public function getQueries(): FilterDefinitionQueryCollection\n {\n $userIds = $this->getValue();\n\n return FilterDefinitionQueryCollection::make([\n FilterDefinitionQuery::instance()\n ->setQuery(new Query\\Terms('coachingFeedbacks.coach.id_string', $userIds))\n ->setPath('coachingFeedbacks.coach', 'coachingFeedbacks'),\n ]);\n }\n\n public function toArray(): array\n {\n return [\n 'id' => 'coaching-feedback-user-filter',\n 'label' => 'Coach',\n 'helpText' => 'The person who completed the Coaching Framework',\n 'placeholder' => 'Search coaches',\n 'inputType' => InputTypeEnum::DROPDOWN_MULTIPLE,\n 'queryParam' => 'coaching_feedback_coach_id',\n 'options' => $this->getOptions(),\n 'groupLabelKey' => 'label',\n 'groupValuesKey' => 'users',\n 'optionLabelKey' => 'name',\n 'optionValueKey' => 'id',\n 'value' => $this->getValue(),\n ];\n }\n\n private function getOptions(): array\n {\n $user = $this->executedBy;\n $query = $user\n ->getTeam()\n ->users()\n ->whereNotIn(\n 'uuid',\n $this->userRepository->findInaccessibleDeactivatedUserUuids($user)\n ->map(static fn (string $uuid): string => RequiresUUID::toOptimized($uuid))\n ->all(),\n )\n ->orderBy('name');\n\n $users = $query\n ->with('group')\n ->get()\n ->reduce(\n static function (array $carry, Models\\User $user): array {\n $group = $user->getGroup();\n $groupId = $group !== null\n ? $group->getUuid()\n : self::NO_GROUP_ID;\n $groupName = $group !== null\n ? $group->getName()\n : '(NON-GROUPED)';\n\n if (! array_key_exists($groupId, $carry)) {\n $carry[$groupId] = [\n 'label' => $groupName,\n 'users' => [],\n ];\n }\n\n $carry[$groupId]['users'][] = [\n 'id' => $user->getUuid(),\n 'name' => sprintf(\n '%s%s',\n $user->getName(),\n ! $user->isStatusActive()\n ? ' (Inactive)'\n : ''\n ),\n ];\n\n return $carry;\n },\n []\n );\n\n return Collection::make($users)\n ->sortBy('label')\n ->values()\n ->toArray();\n }\n\n public function getValue(): array\n {\n if (! $this->criteria->hasCoachingFeedbackCoachUserIds()) {\n return $this->getDefaultValue();\n }\n\n return array_diff(\n $this->criteria->getCoachingFeedbackCoachUserId(),\n $this->userRepository->findInaccessibleDeactivatedUserUuids($this->executedBy)->all(),\n );\n }\n\n private function getDefaultValue(): array\n {\n return [];\n }\n\n public function getValidationRules(?string $prefix = null): array\n {\n $team = $this->executedBy->getTeam();\n\n return [\n $prefix . 'coaching_feedback_coach_id' => 'array',\n $prefix . 'coaching_feedback_coach_id.*' => 'uuid:users,team_id,' . $team->getId(),\n ];\n }\n\n public function getSortOrder(): int\n {\n return 86;\n }\n\n public function shouldBeIncluded(Team $team): bool\n {\n return $team->hasFeature(FeatureEnum::COACHING_FRAMEWORK);\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Component\\ActivitySearch\\FilterDefinition;\n\nuse Illuminate\\Support\\Collection;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinitionQuery;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinitionQueryCollection;\nuse Jiminny\\Contracts\\ActivitySearch\\ValidatedFilterDefinitionInterface;\nuse Jiminny\\Contracts\\Repositories\\UserRepository;\nuse Jiminny\\Models;\nuse Jiminny\\Models\\Feature\\FeatureEnum;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Traits\\RequiresUUID;\nuse Elastica\\Query;\n\nfinal class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefinitionInterface\n{\n private const int NO_GROUP_ID = 999;\n private UserRepository $userRepository;\n\n public function __construct(UserRepository $userRepository)\n {\n $this->userRepository = $userRepository;\n }\n\n public function shouldApplyQueries(): bool\n {\n return count($this->getValue()) > 0;\n }\n\n public function getQueries(): FilterDefinitionQueryCollection\n {\n $userIds = $this->getValue();\n\n return FilterDefinitionQueryCollection::make([\n FilterDefinitionQuery::instance()\n ->setQuery(new Query\\Terms('coachingFeedbacks.coach.id_string', $userIds))\n ->setPath('coachingFeedbacks.coach', 'coachingFeedbacks'),\n ]);\n }\n\n public function toArray(): array\n {\n return [\n 'id' => 'coaching-feedback-user-filter',\n 'label' => 'Coach',\n 'helpText' => 'The person who completed the Coaching Framework',\n 'placeholder' => 'Search coaches',\n 'inputType' => InputTypeEnum::DROPDOWN_MULTIPLE,\n 'queryParam' => 'coaching_feedback_coach_id',\n 'options' => $this->getOptions(),\n 'groupLabelKey' => 'label',\n 'groupValuesKey' => 'users',\n 'optionLabelKey' => 'name',\n 'optionValueKey' => 'id',\n 'value' => $this->getValue(),\n ];\n }\n\n private function getOptions(): array\n {\n $user = $this->executedBy;\n $query = $user\n ->getTeam()\n ->users()\n ->whereNotIn(\n 'uuid',\n $this->userRepository->findInaccessibleDeactivatedUserUuids($user)\n ->map(static fn (string $uuid): string => RequiresUUID::toOptimized($uuid))\n ->all(),\n )\n ->orderBy('name');\n\n $users = $query\n ->with('group')\n ->get()\n ->reduce(\n static function (array $carry, Models\\User $user): array {\n $group = $user->getGroup();\n $groupId = $group !== null\n ? $group->getUuid()\n : self::NO_GROUP_ID;\n $groupName = $group !== null\n ? $group->getName()\n : '(NON-GROUPED)';\n\n if (! array_key_exists($groupId, $carry)) {\n $carry[$groupId] = [\n 'label' => $groupName,\n 'users' => [],\n ];\n }\n\n $carry[$groupId]['users'][] = [\n 'id' => $user->getUuid(),\n 'name' => sprintf(\n '%s%s',\n $user->getName(),\n ! $user->isStatusActive()\n ? ' (Inactive)'\n : ''\n ),\n ];\n\n return $carry;\n },\n []\n );\n\n return Collection::make($users)\n ->sortBy('label')\n ->values()\n ->toArray();\n }\n\n public function getValue(): array\n {\n if (! $this->criteria->hasCoachingFeedbackCoachUserIds()) {\n return $this->getDefaultValue();\n }\n\n return array_diff(\n $this->criteria->getCoachingFeedbackCoachUserId(),\n $this->userRepository->findInaccessibleDeactivatedUserUuids($this->executedBy)->all(),\n );\n }\n\n private function getDefaultValue(): array\n {\n return [];\n }\n\n public function getValidationRules(?string $prefix = null): array\n {\n $team = $this->executedBy->getTeam();\n\n return [\n $prefix . 'coaching_feedback_coach_id' => 'array',\n $prefix . 'coaching_feedback_coach_id.*' => 'uuid:users,team_id,' . $team->getId(),\n ];\n }\n\n public function getSortOrder(): int\n {\n return 86;\n }\n\n public function shouldBeIncluded(Team $team): bool\n {\n return $team->hasFeature(FeatureEnum::COACHING_FRAMEWORK);\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"bounds":{"left":0.011968086,"top":0.047885075,"width":0.024268618,"height":0.024740623},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
6509625738266471330
|
-8996616125002602716
|
visual_change
|
accessibility
|
NULL
|
Project: faVsco.js, menu
JY-20676-delete-report-re Project: faVsco.js, menu
JY-20676-delete-report-related-objects, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
3
16
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Tests\Feature\SavedSearches;
use Illuminate\Support\LazyCollection;
use Illuminate\Support\Str;
use Mockery\MockInterface;
use Illuminate\Database\Eloquent\Factories\Sequence;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Illuminate\Support\Facades\Event;
use Illuminate\Testing\Fluent\AssertableJson;
use Jiminny\Events\Nudges\NudgeCreated;
use Jiminny\Models\Activity\Search;
use Jiminny\Models\Activity\SearchFilter;
use Jiminny\Models\Nudge;
use Jiminny\Models\Role;
use Jiminny\Models\Team;
use Jiminny\Models\User;
use Jiminny\Repositories\ElasticActivityRepository;
use Tests\TestCase;
final class SavedSearchCRUDFeatureTest extends TestCase
{
use DatabaseTransactions;
#[\PHPUnit\Framework\Attributes\Test]
public function userCanGetAListOfSavedSearches(): void
{
$this->markTestSkipped('Needs to be fixed');
/** @var Team $team */
$team = Team::factory()->create([
'crm_id' => 1, // temporary
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'status' => User::STATUS_ACTIVE,
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create();
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
$nudges = Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->getJson(route('api.saved_search.index'))
->assertStatus(200)
->assertJson(
fn (AssertableJson $json) =>
$json->has(1)
->first(
fn ($json) =>
$json->where('id', $search->id_string)
->where('name', $search->getName())
->where('filters', ['max_customer_questions' => 5, 'min_engaging_questions' => 3])
->has('nudges', 2)
->has(
'nudges.0',
fn ($json) =>
$json->where('id', $nudges[0]->id_string)
->where('frequency', 'daily')
->where('channel', 'email')
->has('expiresAt')
)
->has(
'nudges.1',
fn ($json) =>
$json->where('id', $nudges[1]->id_string)
->where('frequency', 'weekly')
->where('channel', 'slack')
->has('expiresAt')
)
)
);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanCreateASavedSearchBasedOnActivityFilters(): void
{
$this->markTestSkipped('Needs to be fixed');
Event::fake();
$this->partialMock(ElasticActivityRepository::class, function (MockInterface $mock) {
$mock->shouldReceive('onDemandScroll')
->times(2)
->andReturn(LazyCollection::empty());
});
/** @var Team $team */
$team = Team::factory()->create([
'uuid' => Str::uuid()->toString(),
'crm_id' => 1, // temporary
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->createQuietly([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$this->apiGuardLogin($user);
$this->actingAs($user)
->postJson(route('api.saved_search.create'), [
'name' => '::searchName::',
'filters' => [
'min_duration' => 1,
'only_recorded' => 1,
],
'nudges' => [
[
'frequency' => 'daily',
'channel' => 'email',
'expiresAt' => now()->addWeek()->format('Y-m-d'),
],
[
'frequency' => 'daily',
'channel' => 'slack',
'expiresAt' => now()->addWeek()->format('Y-m-d'),
],
],
])
->assertStatus(200);
$this->assertDatabaseHas('activity_searches', [
'name' => '::searchName::',
'user_id' => $user->id,
]);
$search = $user->searches()->first();
$this->assertDatabaseHas('nudges', [
'activity_search_id' => $search->id,
'frequency' => 2,
'channel' => 2,
]);
$this->assertDatabaseHas('nudges', [
'activity_search_id' => $search->id,
'frequency' => 2,
'channel' => 4,
]);
$this->assertDatabaseHas('activity_search_filters', [
'activity_search_id' => $search->id,
'filter' => 'min_duration',
'value' => 1,
]);
$this->assertDatabaseHas('activity_search_filters', [
'activity_search_id' => $search->id,
'filter' => 'only_recorded',
'value' => 1,
]);
Event::assertDispatched(NudgeCreated::class, 2);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanUpdateASavedSearchBasedOnActivityFilters(): void
{
/** @var Team $team */
$team = Team::factory()->createQuietly([
'uuid' => Str::uuid()->toString(),
'crm_id' => 1,
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create([
'name' => 'Search Name',
]);
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->putJson(route('api.saved_search.update', $search->id_string), [
'name' => 'Updated Search Name',
])->assertOk()
->assertJson([]);
$this->assertDatabaseMissing('activity_searches', [
'name' => 'Search Name',
'user_id' => $user->id,
]);
$this->assertDatabaseHas('activity_searches', [
'name' => 'Updated Search Name',
'user_id' => $user->id,
]);
}
#[\PHPUnit\Framework\Attributes\Test]
public function userCanDeleteASavedSearch(): void
{
/** @var Team $team */
$team = Team::factory()->create([
'crm_id' => 1,
]);
$adminRole = Role::firstWhere('name', User::ROLE_ADMIN);
/** @var User $user */
$user = User::factory()
->hasAttached($adminRole, ['user_type' => 'user'])
->create([
'name' => '::userName::',
'team_id' => $team->id,
]);
$team->owner_id = $user->id;
$team->save();
$search = Search::factory()->for($user)->create([
'name' => 'Search Name',
]);
SearchFilter::factory()
->for($search)
->count(2)
->state(new Sequence(
['filter' => 'min_engaging_questions', 'value' => 3],
['filter' => 'max_customer_questions', 'value' => 5],
))->create();
Nudge::factory()
->count(2)
->state(
new Sequence(
['frequency' => 2, 'channel' => 2, 'expires_at' => now()->addWeek()],
['frequency' => 4, 'channel' => 4, 'expires_at' => now()->addMonth()],
)
)
->create(['activity_search_id' => $search->id]);
$this->apiGuardLogin($user);
$this->actingAs($user)
->deleteJson(route('api.saved_search.delete', $search->id_string))
->assertStatus(200)
->assertJson([]);
$this->assertDatabaseMissing('activity_searches', [
'user_id' => $user->id,
]);
$this->assertDatabaseMissing('activity_search_filters', [
'activity_search_id' => $search->id,
]);
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
1
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Component\ActivitySearch\FilterDefinition;
use Illuminate\Support\Collection;
use Jiminny\Component\ActivitySearch\FilterDefinition;
use Jiminny\Component\ActivitySearch\FilterDefinitionQuery;
use Jiminny\Component\ActivitySearch\FilterDefinitionQueryCollection;
use Jiminny\Contracts\ActivitySearch\ValidatedFilterDefinitionInterface;
use Jiminny\Contracts\Repositories\UserRepository;
use Jiminny\Models;
use Jiminny\Models\Feature\FeatureEnum;
use Jiminny\Models\Team;
use Jiminny\Traits\RequiresUUID;
use Elastica\Query;
final class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefinitionInterface
{
private const int NO_GROUP_ID = 999;
private UserRepository $userRepository;
public function __construct(UserRepository $userRepository)
{
$this->userRepository = $userRepository;
}
public function shouldApplyQueries(): bool
{
return count($this->getValue()) > 0;
}
public function getQueries(): FilterDefinitionQueryCollection
{
$userIds = $this->getValue();
return FilterDefinitionQueryCollection::make([
FilterDefinitionQuery::instance()
->setQuery(new Query\Terms('coachingFeedbacks.coach.id_string', $userIds))
->setPath('coachingFeedbacks.coach', 'coachingFeedbacks'),
]);
}
public function toArray(): array
{
return [
'id' => 'coaching-feedback-user-filter',
'label' => 'Coach',
'helpText' => 'The person who completed the Coaching Framework',
'placeholder' => 'Search coaches',
'inputType' => InputTypeEnum::DROPDOWN_MULTIPLE,
'queryParam' => 'coaching_feedback_coach_id',
'options' => $this->getOptions(),
'groupLabelKey' => 'label',
'groupValuesKey' => 'users',
'optionLabelKey' => 'name',
'optionValueKey' => 'id',
'value' => $this->getValue(),
];
}
private function getOptions(): array
{
$user = $this->executedBy;
$query = $user
->getTeam()
->users()
->whereNotIn(
'uuid',
$this->userRepository->findInaccessibleDeactivatedUserUuids($user)
->map(static fn (string $uuid): string => RequiresUUID::toOptimized($uuid))
->all(),
)
->orderBy('name');
$users = $query
->with('group')
->get()
->reduce(
static function (array $carry, Models\User $user): array {
$group = $user->getGroup();
$groupId = $group !== null
? $group->getUuid()
: self::NO_GROUP_ID;
$groupName = $group !== null
? $group->getName()
: '(NON-GROUPED)';
if (! array_key_exists($groupId, $carry)) {
$carry[$groupId] = [
'label' => $groupName,
'users' => [],
];
}
$carry[$groupId]['users'][] = [
'id' => $user->getUuid(),
'name' => sprintf(
'%s%s',
$user->getName(),
! $user->isStatusActive()
? ' (Inactive)'
: ''
),
];
return $carry;
},
[]
);
return Collection::make($users)
->sortBy('label')
->values()
->toArray();
}
public function getValue(): array
{
if (! $this->criteria->hasCoachingFeedbackCoachUserIds()) {
return $this->getDefaultValue();
}
return array_diff(
$this->criteria->getCoachingFeedbackCoachUserId(),
$this->userRepository->findInaccessibleDeactivatedUserUuids($this->executedBy)->all(),
);
}
private function getDefaultValue(): array
{
return [];
}
public function getValidationRules(?string $prefix = null): array
{
$team = $this->executedBy->getTeam();
return [
$prefix . 'coaching_feedback_coach_id' => 'array',
$prefix . 'coaching_feedback_coach_id.*' => 'uuid:users,team_id,' . $team->getId(),
];
}
public function getSortOrder(): int
{
return 86;
}
public function shouldBeIncluded(Team $team): bool
{
return $team->hasFeature(FeatureEnum::COACHING_FRAMEWORK);
}
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
56416
|
1967
|
20
|
2026-05-19T08:05:55.730221+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-19/1779 /Users/lukas/.screenpipe/data/data/2026-05-19/1779177955730_m2.jpg...
|
PhpStorm
|
faVsco.js – SavedSearchCRUDFeatureTest.php
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20676-delete-report-re Project: faVsco.js, menu
JY-20676-delete-report-related-objects, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20676-delete-report-related-objects, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.098071806,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: JY-20676-delete-report-related-objects","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.8081782,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceTest","depth":6,"bounds":{"left":0.8234708,"top":0.019952115,"width":0.09208777,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"bounds":{"left":0.9155585,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest'","depth":6,"bounds":{"left":0.9268617,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-2895291531155995682
|
-8635651002824405565
|
click
|
hybrid
|
NULL
|
Project: faVsco.js, menu
JY-20676-delete-report-re Project: faVsco.js, menu
JY-20676-delete-report-related-objects, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
PhostormProiectVIewINavicareCodeLaravelKeractorFV faVsco.js?9 JY-20676-delete-report-related-objectsC) AutomatedReport.onp© AskAnythingPromptServiceTest.php= custom.log= laravel.log4 SF jiminny@localhost]4 HS_local [jiminny@localhost]& console [PROD]# console [euy- ActivtvaskAnvihind est.ono© SavedSearchCRUDFeatureTest.php Xe) -xooricontro||erRateLimit est.onoC) FakeProphetClient.ohv> _ Midd eware40) SoftPhoneManager.phpRequestsInteractionsa InvitationsIHlobsIn ListenersD McpN Modelsi194 D >M Notificationsm oraanizationsettingsW rlayllstsD Policies257 D >314( RepositoriesC RulesC SavedSearchesSavedSearchCRUDFeatureTest.php› C Search_ serviceProvidersSheliConsole XLoo XChanges 14 Tiles= .env.local app© ActivityController.php app/Http/Controllers/API© AskAnythingPrompt.php app/Models/AskAnythingc) AsKAnvihinaPromotbto.ono apo/comoonent/AskAnvihino/Dros© AskAnvthinaPromptService.php app/Component/AskAnvthingAsKAnywingPromptuto.pnpA console [STAGING]© CoachingFeedbackCoachUserln.php X© BaseService.phpfinal class CoachingFeedbackCoachUserIn extends FilterDefinition implements ValidatedFilterDefini~C) RoleAttr.png() ListenerRoleCar© ScimProvisioning.php() RoleAttrTest.phppubLic tunccion conscructuserkeposicory suserkeposicorvor...29 6tpublic function shouldApplyQueries: boolf...}ListenerRoleCannotHaveAdminOrManagerPermissionRule.phpC)Activity/Close/Service.php(C) Activity/RinqCentral/Service.php34 6t >public function getQueries: FilterDefinitionQueryCollection{...}© SyncActivity.php© Crm/Close/Service.php(C) TextMessaqingService.phpfinal class SavedSearchCRUDFeatureTest extends TestCaseA3416 ^ v45 6tpubLic function toArray): arrayl...лpublic function userCanUpdateASavedSearchBasedOnActivityFilters: void{...}1 usaad#Phrun1c rramework Accribuces lescpublic function userCanDeleteASavedSearch: void{...}private function getOptions: arrayt...=119-130=131136 >public function getValue: arrayt...lusageprivate function getDefaultValue: arrayt...Ask anvthina (4D1public function getValidationRules(?string $prefix = null): array{...}4 @s Codo Chudo Onuc 17 Modium+ → @ Side-by-side viewer -Do not ignoreHighlight words 158 5604af40 app/CompCurrent versionuse Jiminny Models Role:use liminnv Model c Team:use Jiminny Models Role;use liminnv Model c TeamC)AskAnvthinaPromotServiceTlest.oho tests/Unit/Comoonent/AskAnvthinause Jiminny Models\User;use liminnv Senvices IlsenSenvice.use Jiminny Models\User;use Jiminny\Services\UserService:C)AskJiminnvRevortsController.ono apo/Htto/Controlllers/APVN2use Sentry:use Jiminny\Contracts\Acl \RoleRepositoryInterface:C) Constants.ono apo/Comoonent/SClMI@ CoreUser.php app/DTO/SCIMIAAD/Responseuse ulluminate\Support\Facades\Validaton.class ScimProvisioninguse Jiminny Rules\DependentRolesRule:C) CoreUserRequest.ono ano/DTO/SCIMIAAD/[EMAIL] apn/Console/Commandsphp loadina.nho confialCScimProvisionina.ohn aon/Comnonent/SCINuse Jiminny Rules\ListenerRoleCannotHaveAdmin0rManagerPermissionRule:public function _construct(private readonly Dispatcher SeventDispatcheruse Jiminny Rules \ListenerRoleRequiresListenerFeatureRuleuse Jiminny Actions UpdateUserRolesAction:orivace readonly userservice suserserviceuse Jiminny DTO\Roles UserRolesSyncDT0:(C) Search.oho aon/Models/Activitvlprivate readonly RoleChangeLogger SroleChangeLoggeruse Sentry:Unversioned Files 13 filesclass Sc1mProv1s10n1nqlpublic function validateUserIdInput(Sid. Team Steam): boolf'email' => $dto->getEmailPrimaryWorkO],SuserUodateDatalpublic function -_constructorivate readonly Daspatcher seventiisoatcher.private readonly UserService $userService,orivate readonly RolechangeLogger SroleChangeLogger..orivate readonly RoleRepositoryInterface $roleRepository,orivate readoniv UodatelserRolesAction SundatelserRolesAction.if (! SnewUser->roles()->exists()) {Snewliser->addRole User: ROLE ANALYSTO:/** @var Role Srole */Snole = Role• •quenvo->whenedr'namel => Isen: •ROI F ANAI VSTID->finctinCailo•nublic function validatellsenTdinnut(Sid. Team Steam• hoollThe Huncnell nluain hac haonout affectina the dictionarios for other lanquades (todav 10-00)• suppont Dally • In 3n 0om100% 5• Tue 19 May 11:05:55AskJiminnyReportActivityServiceTest vCascadeAsk Jiminny Report M+0 ..3. loggle validationrtsController.php: 126-169 — In toggleStatus(), when enabled=true and the report is an Ask Jiminnyreport, returns 422 lt elther activity search 1d or ask anything prompt 1d is nult . Disabling is always allowed.4. TestsAskAnythingPromptServiceTest.php - Updated two existing update() mock expectations to match the new payload ( ['aPer your rules i did not add unit tests for the controller. The existing SavedSearchCRUDFeatureTest covers the searchdelete tlow: backend service test covers promot delete pavload.* Reject allAccent all•01.4 difterencesWN Windsurf Toams 214-1UTF.8ih 4 spaces...
|
56414
|
NULL
|
NULL
|
NULL
|