Add Route conversion on legacy

- Add legacy handler to access RouteConverter
- Add legacy handler to access ModuleNameMapper
- Add legacy handler to access ActionNameMapper
- Remove action and module name maps from Suite8 side

- Update frontend route converter to check for suite 8 routes
-- When link is a suite 8 route does not convert

- Add LegacyScopeState to allow for nested legacy handler calls
-- Add abstract getHandlerKey to base LegacyHandler
-- Implement getHandlerKey on all legacy handlers

- Update legacy handler init and close methods to use scope state
-- Check if withing an already open legacy handler scope
This commit is contained in:
Clemente Raposo 2020-05-13 13:05:53 +01:00 committed by Dillon-Brown
parent 3931ce40fa
commit 5d6aa45391
42 changed files with 1319 additions and 1133 deletions

View file

@ -4,6 +4,7 @@ use ApiPlatform\Core\Exception\ItemNotFoundException;
use App\Entity\AppListStrings;
use Codeception\Test\Unit;
use SuiteCRM\Core\Legacy\AppListStringsHandler;
use SuiteCRM\Core\Legacy\LegacyScopeState;

class AppListStringsHandlerTest extends Unit
{
@ -23,7 +24,15 @@ class AppListStringsHandlerTest extends Unit
$legacyDir = $projectDir . '/legacy';
$legacySessionName = 'LEGACYSESSID';
$defaultSessionName = 'PHPSESSID';
$this->handler = new AppListStringsHandler($projectDir, $legacyDir, $legacySessionName, $defaultSessionName);
$legacyScope = new LegacyScopeState();

$this->handler = new AppListStringsHandler(
$projectDir,
$legacyDir,
$legacySessionName,
$defaultSessionName,
$legacyScope
);
}

// tests

View file

@ -4,6 +4,7 @@ use ApiPlatform\Core\Exception\ItemNotFoundException;
use App\Entity\AppStrings;
use Codeception\Test\Unit;
use SuiteCRM\Core\Legacy\AppStringsHandler;
use SuiteCRM\Core\Legacy\LegacyScopeState;

class AppStringsHandlerTest extends Unit
{
@ -23,7 +24,15 @@ class AppStringsHandlerTest extends Unit
$legacyDir = $projectDir . '/legacy';
$legacySessionName = 'LEGACYSESSID';
$defaultSessionName = 'PHPSESSID';
$this->handler = new AppStringsHandler($projectDir, $legacyDir, $legacySessionName, $defaultSessionName);
$legacyScope = new LegacyScopeState();

$this->handler = new AppStringsHandler(
$projectDir,
$legacyDir,
$legacySessionName,
$defaultSessionName,
$legacyScope
);
}

// tests

View file

@ -2,9 +2,10 @@

use ApiPlatform\Core\Exception\ItemNotFoundException;
use App\Entity\ModStrings;
use App\Service\ModuleNameMapper;
use Codeception\Test\Unit;
use SuiteCRM\Core\Legacy\LegacyScopeState;
use SuiteCRM\Core\Legacy\ModStringsHandler;
use SuiteCRM\Core\Legacy\ModuleNameMapperHandler;

class ModStringsHandlerTest extends Unit
{
@ -20,343 +21,27 @@ class ModStringsHandlerTest extends Unit

protected function _before(): void
{
$legacyModuleNameMap = [
'Home' => [
'frontend' => 'home',
'core' => 'Home',
],
'Calendar' => [
'frontend' => 'calendar',
'core' => 'Calendar',
],
'Calls' => [
'frontend' => 'calls',
'core' => 'Calls',
],
'Calls_Reschedule' => [
'frontend' => 'calls-reschedule',
'core' => 'CallsReschedule',
],
'Meetings' => [
'frontend' => 'meetings',
'core' => 'Meetings',
],
'Tasks' => [
'frontend' => 'tasks',
'core' => 'Tasks',
],
'Notes' => [
'frontend' => 'notes',
'core' => 'Notes',
],
'Leads' => [
'frontend' => 'leads',
'core' => 'Leads',
],
'Contacts' => [
'frontend' => 'contacts',
'core' => 'Contacts',
],
'Accounts' => [
'frontend' => 'accounts',
'core' => 'Accounts',
],
'Opportunities' => [
'frontend' => 'opportunities',
'core' => 'Opportunities',
],
'Import' => [
'frontend' => 'import',
'core' => 'Import',
],
'Emails' => [
'frontend' => 'emails',
'core' => 'Emails',
],
'EmailTemplates' => [
'frontend' => 'email-templates',
'core' => 'EmailTemplates',
],
'Campaigns' => [
'frontend' => 'campaigns',
'core' => 'Campaigns',
],
'Targets' => [
'frontend' => 'targets',
'core' => 'Targets',
],
'Targets - Lists' => [
'frontend' => 'prospect-lists',
'core' => 'ProspectLists',
],
'Prospects' => [
'frontend' => 'prospects',
'core' => 'Prospects',
],
'ProspectLists' => [
'frontend' => 'prospect-lists',
'core' => 'ProspectLists',
],
'Documents' => [
'frontend' => 'documents',
'core' => 'Documents',
],
'Cases' => [
'frontend' => 'cases',
'core' => 'Cases',
],
'Project' => [
'frontend' => 'project',
'core' => 'Project',
],
'ProjectTask' => [
'frontend' => 'project-task',
'core' => 'ProjectTask',
],
'Bugs' => [
'frontend' => 'bugs',
'core' => 'Bugs',
],
'ResourceCalendar' => [
'frontend' => 'resource-calendar',
'core' => 'ResourceCalendar',
],
'AOBH_BusinessHours' => [
'frontend' => 'business-hours',
'core' => 'BusinessHours',
],
'Spots' => [
'frontend' => 'spots',
'core' => 'Spots',
],
'SecurityGroups' => [
'frontend' => 'security-groups',
'core' => 'SecurityGroups',
],
'ACL' => [
'frontend' => 'acl',
'core' => 'ACL',
],
'ACLRoles' => [
'frontend' => 'acl-roles',
'core' => 'ACLRoles',
],
'Configurator' => [
'frontend' => 'configurator',
'core' => 'Configurator',
],
'UserPreferences' => [
'frontend' => 'user-preferences',
'core' => 'UserPreferences',
],
'SavedSearch' => [
'frontend' => 'saved-search',
'core' => 'SavedSearch',
],
'Studio' => [
'frontend' => 'studio',
'core' => 'Studio',
],
'Connectors' => [
'frontend' => 'connectors',
'core' => 'Connectors',
],
'SugarFeed' => [
'frontend' => 'sugar-feed',
'core' => 'SugarFeed',
],
'EAPM' => [
'frontend' => 'eapm',
'core' => 'EAPM',
],
'OutboundEmailAccounts' => [
'frontend' => 'outbound-email-accounts',
'core' => 'OutboundEmailAccounts',
],
'TemplateSectionLine' => [
'frontend' => 'template-section-line',
'core' => 'TemplateSectionLine',
],
'OAuthKeys' => [
'frontend' => 'oauth-keys',
'core' => 'OAuthKeys',
],
'OAuthTokens' => [
'frontend' => 'oauth-tokens',
'core' => 'OAuthTokens',
],
'OAuth2Tokens' => [
'frontend' => 'oauth2-tokens',
'core' => 'OAuth2Tokens',
],
'OAuth2Clients' => [
'frontend' => 'oauth2-clients',
'core' => 'OAuth2Clients',
],
'Surveys' => [
'frontend' => 'surveys',
'core' => 'Surveys',
],
'SurveyResponses' => [
'frontend' => 'survey-responses',
'core' => 'SurveyResponses',
],
'SurveyQuestionResponses' => [
'frontend' => 'survey-question-responses',
'core' => 'SurveyQuestionResponses',
],
'SurveyQuestions' => [
'frontend' => 'survey-questions',
'core' => 'SurveyQuestions',
],
'SurveyQuestionOptions' => [
'frontend' => 'survey-question-options',
'core' => 'SurveyQuestionOptions',
],
'Reminders' => [
'frontend' => 'reminders',
'core' => 'Reminders',
],
'Reminders_Invitees' => [
'frontend' => 'reminders-invitees',
'core' => 'RemindersInvitees',
],
'AM_ProjectTemplates' => [
'frontend' => 'project-templates',
'core' => 'ProjectTemplates',
],
'AM_TaskTemplates' => [
'frontend' => 'task-templates',
'core' => 'TaskTemplates',
],
'AOK_Knowledge_Base_Categories' => [
'frontend' => 'knowledge-base-categories',
'core' => 'KnowledgeBaseCategories',
],
'AOK_KnowledgeBase' => [
'frontend' => 'knowledge-base',
'core' => 'KnowledgeBase',
],
'FP_events' => [
'frontend' => 'events',
'core' => 'Events',
],
'FP_Event_Locations' => [
'frontend' => 'event-locations',
'core' => 'EventLocations',
],
'AOS_Contracts' => [
'frontend' => 'contracts',
'core' => 'Contracts',
],
'AOS_Invoices' => [
'frontend' => 'invoices',
'core' => 'Invoices',
],
'AOS_PDF_Templates' => [
'frontend' => 'pdf-templates',
'core' => 'PDFTemplates',
],
'AOS_Product_Categories' => [
'frontend' => 'product-categories',
'core' => 'ProductCategories',
],
'AOS_Products' => [
'frontend' => 'products',
'core' => 'Products',
],
'AOS_Quotes' => [
'frontend' => 'quotes',
'core' => 'Quotes',
],
'AOS_Products_Quotes' => [
'frontend' => 'products-quotes',
'core' => 'ProductsQuotes',
],
'AOS_Line_Item_Groups' => [
'frontend' => 'line-item-groups',
'core' => 'LineItemGroups',
],
'jjwg_Maps' => [
'frontend' => 'maps',
'core' => 'Maps',
],
'jjwg_Markers' => [
'frontend' => 'markers',
'core' => 'Markers',
],
'jjwg_Areas' => [
'frontend' => 'areas',
'core' => 'Areas',
],
'jjwg_Address_Cache' => [
'frontend' => 'address-cache',
'core' => 'AddressCache',
],
'AOD_IndexEvent' => [
'frontend' => 'index-event',
'core' => 'IndexEvent',
],
'AOD_Index' => [
'frontend' => 'index',
'core' => 'index',
],
'AOP_Case_Events' => [
'frontend' => 'case-events',
'core' => 'CaseEvents',
],
'AOP_Case_Updates' => [
'frontend' => 'case-updates',
'core' => 'CaseUpdates',
],
'AOR_Reports' => [
'frontend' => 'reports',
'core' => 'Reports',
],
'AOR_Scheduled_Reports' => [
'frontend' => 'scheduled-reports',
'core' => 'ScheduledReports',
],
'AOR_Fields' => [
'frontend' => 'report-fields',
'core' => 'ReportFields',
],
'AOR_Charts' => [
'frontend' => 'report-charts',
'core' => 'ReportCharts',
],
'AOR_Conditions' => [
'frontend' => 'report-conditions',
'core' => 'ReportConditions',
],
'AOW_WorkFlow' => [
'frontend' => 'workFlow',
'core' => 'WorkFlow',
],
'AOW_Actions' => [
'frontend' => 'workflow-actions',
'core' => 'WorkflowActions',
],
'AOW_Processed' => [
'frontend' => 'workflow-processed',
'core' => 'WorflowProcessed',
],
'AOW_Conditions' => [
'frontend' => 'workflow-conditions',
'core' => 'WorkflowConditions',
],
];
$moduleNameMapper = new ModuleNameMapper($legacyModuleNameMap);

$projectDir = codecept_root_dir();
$legacyDir = $projectDir . '/legacy';
$legacySessionName = 'LEGACYSESSID';
$defaultSessionName = 'PHPSESSID';

$legacyScope = new LegacyScopeState();

$moduleNameMapper = new ModuleNameMapperHandler(
$projectDir,
$legacyDir,
$legacySessionName,
$defaultSessionName,
$legacyScope
);

$this->handler = new ModStringsHandler(
$projectDir,
$legacyDir,
$legacySessionName,
$defaultSessionName,
$legacyScope,
$moduleNameMapper
);
}

View file

@ -3,12 +3,13 @@
declare(strict_types=1);

use App\Entity\Navbar;
use App\Service\ActionNameMapper;
use App\Service\ModuleNameMapper;
use App\Service\RouteConverter;
use AspectMock\Test;
use Codeception\Test\Unit;
use SuiteCRM\Core\Legacy\ActionNameMapperHandler;
use SuiteCRM\Core\Legacy\LegacyScopeState;
use SuiteCRM\Core\Legacy\ModuleNameMapperHandler;
use SuiteCRM\Core\Legacy\NavbarHandler;
use SuiteCRM\Core\Legacy\RouteConverterHandler;

final class NavbarTest extends Unit
{
@ -27,58 +28,10 @@ final class NavbarTest extends Unit
*/
protected function _before()
{

$legacyModuleNameMap = [
'Home' => [
'frontend' => 'home',
'core' => 'Home',
],
'Leads' => [
'frontend' => 'leads',
'core' => 'Leads',
],
'Contacts' => [
'frontend' => 'contacts',
'core' => 'Contacts',
],
'Accounts' => [
'frontend' => 'accounts',
'core' => 'Accounts',
],
'Opportunities' => [
'frontend' => 'opportunities',
'core' => 'Opportunities',
],
'Import' => [
'frontend' => 'import',
'core' => 'Import',
],
'Documents' => [
'frontend' => 'documents',
'core' => 'Documents',
]
];

$legacyActionNameMap = [
'index' => 'index',
'multieditview' => 'multieditview',
'DetailView' => 'record',
'EditView' => 'edit',
'ListView' => 'list',
'Popup' => 'popup',
'vcard' => 'vcard',
'ImportVCard' => 'importvcard',
'modulelistmenu' => 'modulelistmenu',
'favorites' => 'favorites',
'noaccess' => 'noaccess',
'Step1' => 'step1',
'ComposeView' => 'compose',
'WizardHome' => 'wizard-home',
'CampaignDiagnostic' => 'diagnostic',
'WebToLeadCreation' => 'web-to-lead',
'ResourceList' => 'resource-list',
'quick_radius' => 'quick-radius',
];
$projectDir = codecept_root_dir();
$legacyDir = $projectDir . '/legacy';
$legacySessionName = 'LEGACYSESSID';
$defaultSessionName = 'PHPSESSID';

$menuItemMap = [
'default' => [
@ -122,9 +75,33 @@ final class NavbarTest extends Unit
],
];

$moduleNameMapper = new ModuleNameMapper($legacyModuleNameMap);
$actionMapper = new ActionNameMapper($legacyActionNameMap);
$routeConverter = new RouteConverter($moduleNameMapper, $actionMapper);
$legacyScope = new LegacyScopeState();

$moduleNameMapper = new ModuleNameMapperHandler(
$projectDir,
$legacyDir,
$legacySessionName,
$defaultSessionName,
$legacyScope
);

$actionMapper = new ActionNameMapperHandler(
$projectDir,
$legacyDir,
$legacySessionName,
$defaultSessionName,
$legacyScope
);

$routeConverter = new RouteConverterHandler(
$projectDir,
$legacyDir,
$legacySessionName,
$defaultSessionName,
$legacyScope,
$moduleNameMapper,
$actionMapper
);

$mockAccessibleModulesList = [
'Home' => 'Home',
@ -192,15 +169,11 @@ final class NavbarTest extends Unit
},
]);

$projectDir = codecept_root_dir();
$legacyDir = $projectDir . '/legacy';
$legacySessionName = 'LEGACYSESSID';
$defaultSessionName = 'PHPSESSID';

$this->navbarHandler = new NavbarHandler($projectDir,
$legacyDir,
$legacySessionName,
$defaultSessionName,
$legacyScope,
$menuItemMap,
$moduleNameMapper,
$routeConverter
@ -333,205 +306,205 @@ final class NavbarTest extends Unit
public function testGetModule(): void
{
$expected = [
"home" => [
"path" => "home",
"defaultRoute" => "./#/home",
"name" => "home",
"labelKey" => "Home",
"menu" => []
'home' => [
'path' => 'home',
'defaultRoute' => './#/home',
'name' => 'home',
'labelKey' => 'Home',
'menu' => []
],
"accounts" => [
"path" => "accounts",
"defaultRoute" => "./#/accounts",
"name" => "accounts",
"labelKey" => "Accounts",
"menu" => [
'accounts' => [
'path' => 'accounts',
'defaultRoute' => './#/accounts',
'name' => 'accounts',
'labelKey' => 'Accounts',
'menu' => [
[
"name" => "Create",
"labelKey" => "LNK_NEW_ACCOUNT",
"url" => "./#/accounts/edit",
"params" => [
"return_module" => "Accounts",
"return_action" => "index"
'name' => 'Create',
'labelKey' => 'LNK_NEW_ACCOUNT',
'url' => './#/accounts/edit',
'params' => [
'return_module' => 'Accounts',
'return_action' => 'index'
],
"icon" => "plus"
'icon' => 'plus'
],
[
"name" => "List",
"labelKey" => "LNK_ACCOUNT_LIST",
"url" => "./#/accounts/index",
"params" => [
"return_module" => "Accounts",
"return_action" => "DetailView"
'name' => 'List',
'labelKey' => 'LNK_ACCOUNT_LIST',
'url' => './#/accounts/index',
'params' => [
'return_module' => 'Accounts',
'return_action' => 'DetailView'
],
"icon" => "view"
'icon' => 'view'
],
[
"name" => "Import",
"labelKey" => "LNK_IMPORT_ACCOUNTS",
"url" => "./#/import/step1",
"params" => [
"import_module" => "Accounts",
"return_module" => "Accounts",
"return_action" => "index"
'name' => 'Import',
'labelKey' => 'LNK_IMPORT_ACCOUNTS',
'url' => './#/import/step1',
'params' => [
'import_module' => 'Accounts',
'return_module' => 'Accounts',
'return_action' => 'index'
],
"icon" => "download"
'icon' => 'download'
]
]
],
"contacts" => [
"path" => "contacts",
"defaultRoute" => "./#/contacts",
"name" => "contacts",
"labelKey" => "Contacts",
"menu" => [
'contacts' => [
'path' => 'contacts',
'defaultRoute' => './#/contacts',
'name' => 'contacts',
'labelKey' => 'Contacts',
'menu' => [
[
"name" => "Create",
"labelKey" => "LNK_NEW_CONTACT",
"url" => "./#/contacts/edit",
"params" => [
"return_module" => "Contacts",
"return_action" => "index"
'name' => 'Create',
'labelKey' => 'LNK_NEW_CONTACT',
'url' => './#/contacts/edit',
'params' => [
'return_module' => 'Contacts',
'return_action' => 'index'
],
"icon" => "plus"
'icon' => 'plus'
],
[
"name" => "Create_Contact_Vcard",
"labelKey" => "LNK_IMPORT_VCARD",
"url" => "./#/contacts/importvcard",
"params" => [],
"icon" => "plus"
'name' => 'Create_Contact_Vcard',
'labelKey' => 'LNK_IMPORT_VCARD',
'url' => './#/contacts/importvcard',
'params' => [],
'icon' => 'plus'
],
[
"name" => "List",
"labelKey" => "LNK_CONTACT_LIST",
"url" => "./#/contacts/index",
"params" => [
"return_module" => "Contacts",
"return_action" => "DetailView"
'name' => 'List',
'labelKey' => 'LNK_CONTACT_LIST',
'url' => './#/contacts/index',
'params' => [
'return_module' => 'Contacts',
'return_action' => 'DetailView'
],
"icon" => "view"
'icon' => 'view'
],
[
"name" => "Import",
"labelKey" => "LNK_IMPORT_CONTACTS",
"url" => "./#/import/step1",
"params" => [
"import_module" => "Contacts",
"return_module" => "Contacts",
"return_action" => "index"
'name' => 'Import',
'labelKey' => 'LNK_IMPORT_CONTACTS',
'url' => './#/import/step1',
'params' => [
'import_module' => 'Contacts',
'return_module' => 'Contacts',
'return_action' => 'index'
],
"icon" => "download"
'icon' => 'download'
]
]
],
"opportunities" => [
"path" => "opportunities",
"defaultRoute" => "./#/opportunities",
"name" => "opportunities",
"labelKey" => "Opportunities",
"menu" => [
'opportunities' => [
'path' => 'opportunities',
'defaultRoute' => './#/opportunities',
'name' => 'opportunities',
'labelKey' => 'Opportunities',
'menu' => [
[
"name" => "Create",
"labelKey" => "LNK_NEW_OPPORTUNITY",
"url" => "./#/opportunities/edit",
"params" => [
"return_module" => "Opportunities",
"return_action" => "DetailView"
'name' => 'Create',
'labelKey' => 'LNK_NEW_OPPORTUNITY',
'url' => './#/opportunities/edit',
'params' => [
'return_module' => 'Opportunities',
'return_action' => 'DetailView'
],
"icon" => "plus"
'icon' => 'plus'
],
[
"name" => "List",
"labelKey" => "LNK_OPPORTUNITY_LIST",
"url" => "./#/opportunities/index",
"params" => [
"return_module" => "Opportunities",
"return_action" => "DetailView"
'name' => 'List',
'labelKey' => 'LNK_OPPORTUNITY_LIST',
'url' => './#/opportunities/index',
'params' => [
'return_module' => 'Opportunities',
'return_action' => 'DetailView'
],
"icon" => "view"
'icon' => 'view'
],
[
"name" => "Import",
"labelKey" => "LNK_IMPORT_OPPORTUNITIES",
"url" => "./#/import/step1",
"params" => [
"import_module" => "Opportunities",
"return_module" => "Opportunities",
"return_action" => "index"
'name' => 'Import',
'labelKey' => 'LNK_IMPORT_OPPORTUNITIES',
'url' => './#/import/step1',
'params' => [
'import_module' => 'Opportunities',
'return_module' => 'Opportunities',
'return_action' => 'index'
],
"icon" => "download"
'icon' => 'download'
]
]
],
"leads" => [
"path" => "leads",
"defaultRoute" => "./#/leads",
"name" => "leads",
"labelKey" => "Leads",
"menu" => [
'leads' => [
'path' => 'leads',
'defaultRoute' => './#/leads',
'name' => 'leads',
'labelKey' => 'Leads',
'menu' => [
[
"name" => "Create",
"labelKey" => "LNK_NEW_LEAD",
"url" => "./#/leads/edit",
"params" => [
"return_module" => "Leads",
"return_action" => "DetailView"
'name' => 'Create',
'labelKey' => 'LNK_NEW_LEAD',
'url' => './#/leads/edit',
'params' => [
'return_module' => 'Leads',
'return_action' => 'DetailView'
],
"icon" => "plus"
'icon' => 'plus'
],
[
"name" => "Create_Lead_Vcard",
"labelKey" => "LNK_IMPORT_VCARD",
"url" => "./#/leads/importvcard",
"params" => [],
"icon" => "plus"
'name' => 'Create_Lead_Vcard',
'labelKey' => 'LNK_IMPORT_VCARD',
'url' => './#/leads/importvcard',
'params' => [],
'icon' => 'plus'
],
[
"name" => "List",
"labelKey" => "LNK_LEAD_LIST",
"url" => "./#/leads/index",
"params" => [
"return_module" => "Leads",
"return_action" => "DetailView"
'name' => 'List',
'labelKey' => 'LNK_LEAD_LIST',
'url' => './#/leads/index',
'params' => [
'return_module' => 'Leads',
'return_action' => 'DetailView'
],
"icon" => "view"
'icon' => 'view'
],
[
"name" => "Import",
"labelKey" => "LNK_IMPORT_LEADS",
"url" => "./#/import/step1",
"params" => [
"import_module" => "Leads",
"return_module" => "Leads",
"return_action" => "index"
'name' => 'Import',
'labelKey' => 'LNK_IMPORT_LEADS',
'url' => './#/import/step1',
'params' => [
'import_module' => 'Leads',
'return_module' => 'Leads',
'return_action' => 'index'
],
"icon" => "download"
'icon' => 'download'
]
]
],
"documents" => [
"path" => "documents",
"defaultRoute" => "./#/documents",
"name" => "documents",
"labelKey" => "Documents",
"menu" => [
'documents' => [
'path' => 'documents',
'defaultRoute' => './#/documents',
'name' => 'documents',
'labelKey' => 'Documents',
'menu' => [
[
"name" => "Create",
"labelKey" => "LNK_NEW_DOCUMENT",
"url" => "./#/documents/edit",
"params" => [
"return_module" => "Documents",
"return_action" => "DetailView"
'name' => 'Create',
'labelKey' => 'LNK_NEW_DOCUMENT',
'url' => './#/documents/edit',
'params' => [
'return_module' => 'Documents',
'return_action' => 'DetailView'
],
"icon" => "plus"
'icon' => 'plus'
],
[
"name" => "List",
"labelKey" => "LNK_DOCUMENT_LIST",
"url" => "./#/documents/index",
"params" => [],
"icon" => "view"
'name' => 'List',
'labelKey' => 'LNK_DOCUMENT_LIST',
'url' => './#/documents/index',
'params' => [],
'icon' => 'view'
]
]
],

View file

@ -1,9 +1,10 @@
<?php namespace App\Tests;

use ApiPlatform\Core\Exception\ItemNotFoundException;
use App\Service\ActionNameMapper;
use App\Service\ModuleNameMapper;
use Codeception\Test\Unit;
use SuiteCRM\Core\Legacy\ActionNameMapperHandler;
use SuiteCRM\Core\Legacy\LegacyScopeState;
use SuiteCRM\Core\Legacy\ModuleNameMapperHandler;
use SuiteCRM\Core\Legacy\SystemConfigHandler;

class SystemConfigHandlerTest extends Unit
@ -41,25 +42,34 @@ class SystemConfigHandlerTest extends Unit
$legacySessionName = 'LEGACYSESSID';
$defaultSessionName = 'PHPSESSID';

$legacyModuleNameMap = [
'Contacts' => [
'frontend' => 'contacts',
'core' => 'Contacts'
],
];
$legacyScope = new LegacyScopeState();

$legacyActionNameMap = [
'index ' => 'index',
'DetailView' => 'record',
'EditView' => 'edit',
'ListView' => 'list',
];
$moduleMapper = new ModuleNameMapperHandler(
$projectDir,
$legacyDir,
$legacySessionName,
$defaultSessionName,
$legacyScope
);

$moduleMapper = new ModuleNameMapper($legacyModuleNameMap);
$actionMapper = new ActionNameMapper($legacyActionNameMap);
$actionMapper = new ActionNameMapperHandler(
$projectDir,
$legacyDir,
$legacySessionName,
$defaultSessionName,
$legacyScope
);

$this->handler = new SystemConfigHandler($projectDir, $legacyDir, $legacySessionName, $defaultSessionName,
$exposedSystemConfigs, $actionMapper, $moduleMapper);
$this->handler = new SystemConfigHandler(
$projectDir,
$legacyDir,
$legacySessionName,
$defaultSessionName,
$legacyScope,
$exposedSystemConfigs,
$actionMapper,
$moduleMapper
);
}

// tests

View file

@ -4,6 +4,7 @@ use ApiPlatform\Core\Exception\ItemNotFoundException;
use AspectMock\Test;
use Codeception\Test\Unit;
use Exception;
use SuiteCRM\Core\Legacy\LegacyScopeState;
use SuiteCRM\Core\Legacy\UserPreferenceHandler;
use User;

@ -45,7 +46,7 @@ class UserPreferencesHandlerTest extends Unit
User::class,
[
'id' => '123',
'getPreference' => function ($name, $category = 'global') use ($self, $mockPreferences) {
'getPreference' => static function ($name, $category = 'global') use ($self, $mockPreferences) {
return $mockPreferences[$category][$name];
},
]
@ -64,8 +65,16 @@ class UserPreferencesHandlerTest extends Unit
$legacySessionName = 'LEGACYSESSID';
$defaultSessionName = 'PHPSESSID';

$this->handler = new UserPreferenceHandler($projectDir, $legacyDir, $legacySessionName, $defaultSessionName,
$exposedUserPreferences);
$legacyScope = new LegacyScopeState();

$this->handler = new UserPreferenceHandler(
$projectDir,
$legacyDir,
$legacySessionName,
$defaultSessionName,
$legacyScope,
$exposedUserPreferences
);
}

// tests

View file

@ -6,6 +6,7 @@ use AuthenticationController;
use Codeception\Test\Unit;
use Exception;
use SuiteCRM\Core\Legacy\Authentication;
use SuiteCRM\Core\Legacy\LegacyScopeState;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
@ -89,7 +90,15 @@ class LegacySessionLogoutHandlerTest extends Unit
]
);

$originalHandler = new Authentication($projectDir, $legacyDir, $legacySessionName, $defaultSessionName);
$legacyScope = new LegacyScopeState();

$originalHandler = new Authentication(
$projectDir,
$legacyDir,
$legacySessionName,
$defaultSessionName,
$legacyScope
);

$this->handler = new LegacySessionLogoutHandler($sessionLogoutHandler, $originalHandler);
}

View file

@ -141,7 +141,7 @@ class LegacySessionSecurityStageTest extends Unit
$this->resourceAccessChecker = $this->makeEmpty(
ResourceAccessCheckerInterface::class,
[
'isGranted' => function (
'isGranted' => static function (
string $resourceClass,
string $expression,
array $extraVariables = []
@ -166,7 +166,7 @@ class LegacySessionSecurityStageTest extends Unit
$this->activeSessionAuthentication = $this->make(
Authentication::class,
[
'checkSession' => function () use ($self) {
'checkSession' => static function () use ($self) {
$self->checkSessionCalled = true;

return true;
@ -177,7 +177,7 @@ class LegacySessionSecurityStageTest extends Unit
$this->expiredSessionAuthentication = $this->make(
Authentication::class,
[
'checkSession' => function () use ($self) {
'checkSession' => static function () use ($self) {
$self->checkSessionCalled = true;

return false;
@ -191,8 +191,6 @@ class LegacySessionSecurityStageTest extends Unit
[
'invalidate' => function () use ($self) {
$self->invalidateCalled = true;

return;
},
]
);

View file

@ -0,0 +1,94 @@
<?php namespace App\Tests;

use App\Service\ActionNameMapperInterface;
use \Codeception\Test\Unit;
use SuiteCRM\Core\Legacy\ActionNameMapperHandler;
use SuiteCRM\Core\Legacy\LegacyScopeState;

class ActionNameMapperTest extends Unit
{
/**
* @var UnitTester
*/
protected $tester;


/**
* @var ActionNameMapperInterface
*/
private $actionMapper;

protected function _before()
{
$projectDir = codecept_root_dir();
$legacyDir = $projectDir . '/legacy';
$legacySessionName = 'LEGACYSESSID';
$defaultSessionName = 'PHPSESSID';

$legacyScope = new LegacyScopeState();

$this->actionMapper = new ActionNameMapperHandler(
$projectDir,
$legacyDir,
$legacySessionName,
$defaultSessionName,
$legacyScope
);
}

/**
* Test action name check with the valid name
*/
public function testValidLegacyActionNameCheck(): void
{
$valid = $this->actionMapper->isValidAction('DetailView');

static::assertTrue($valid);
}

/**
* Test action name check with the invalid name
*/
public function testInvalidLegacyActionNameCheck(): void
{
$valid = $this->actionMapper->isValidAction('FakeAction');
static::assertFalse($valid);
}

/**
* Test action name to frontend mapping with the valid name
*/
public function testLegacyActionNameToFrontEndConversion(): void
{
$frontendName = $this->actionMapper->toFrontEnd('DetailView');
static::assertEquals('record', $frontendName);
}

/**
* Test action name to frontend mapping with the invalid name
*/
public function testInvalidLegacyActionNameToFrontEndConversion(): void
{
$action = $this->actionMapper->toFrontEnd('FakeAction');
static::assertEquals('FakeAction', $action);
}

/**
* Test action name to legacy mapping with the valid name
*/
public function testLegacyActionNameToLegacyConversion(): void
{
$legacyName = $this->actionMapper->toLegacy('record');
static::assertEquals('DetailView', $legacyName);
}

/**
* Test action name to legacy mapping with the invalid name
*/
public function testInvalidLegacyActionNameToLegacyConversion(): void
{
$action = $this->actionMapper->toLegacy('fake-action');
static::assertEquals('fake-action', $action);
}

}

View file

@ -28,6 +28,9 @@ class LegacyAssetRedirectHandlerTest extends Unit
$this->legacyAssetHandler = new LegacyAssetRedirectHandler($legacyAssetPaths, '/legacy');
}

/**
* Test asset path check with an api path
*/
public function testAPIRequestCheck(): void
{
$queryParams = [
@ -55,6 +58,9 @@ class LegacyAssetRedirectHandlerTest extends Unit
static::assertFalse($valid);
}

/**
* Test asset path check for valid path
*/
public function testLegacyValidAssetPathRequestCheck(): void
{
$queryParams = [
@ -82,6 +88,9 @@ class LegacyAssetRedirectHandlerTest extends Unit
static::assertTrue($valid);
}

/**
* Test asset path conversion for valid path
*/
public function testValidLegacyAssetPathConversion(): void
{
$resultingRoute = '/suiteinstance/legacy/themes/default/images/company_logo.png?v=Y0_lwfeIA-XvM4ey09-htw';

View file

@ -1,11 +1,12 @@
<?php namespace App\Tests;

use App\Service\ActionNameMapper;
use App\Service\LegacyNonViewActionRedirectHandler;
use App\Service\ModuleNameMapper;
use App\Service\RouteConverter;
use Codeception\Test\Unit;
use Exception;
use SuiteCRM\Core\Legacy\ActionNameMapperHandler;
use SuiteCRM\Core\Legacy\LegacyScopeState;
use SuiteCRM\Core\Legacy\ModuleNameMapperHandler;
use SuiteCRM\Core\Legacy\RouteConverterHandler;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Exception\ResourceNotFoundException;
use Symfony\Component\Routing\Router;
@ -27,23 +28,38 @@ class LegacyNonViewActionRedirectHandlerTest extends Unit
*/
protected function _before(): void
{
$legacyModuleNameMap = [
'Contacts' => [
'frontend' => 'contacts',
'core' => 'Contacts'
],
];
$projectDir = codecept_root_dir();
$legacyDir = $projectDir . '/legacy';
$legacySessionName = 'LEGACYSESSID';
$defaultSessionName = 'PHPSESSID';

$legacyActionNameMap = [
'index ' => 'index',
'DetailView' => 'detail',
'EditView' => 'edit',
'ListView' => 'list',
];
$legacyScope = new LegacyScopeState();

$moduleMapper = new ModuleNameMapper($legacyModuleNameMap);
$actionMapper = new ActionNameMapper($legacyActionNameMap);
$converter = new RouteConverter($moduleMapper, $actionMapper);
$moduleMapper = new ModuleNameMapperHandler(
$projectDir,
$legacyDir,
$legacySessionName,
$defaultSessionName,
$legacyScope
);

$actionMapper = new ActionNameMapperHandler(
$projectDir,
$legacyDir,
$legacySessionName,
$defaultSessionName,
$legacyScope
);

$converter = new RouteConverterHandler(
$projectDir,
$legacyDir,
$legacySessionName,
$defaultSessionName,
$legacyScope,
$moduleMapper,
$actionMapper
);

$routes = [
'/login',

View file

@ -1,8 +1,10 @@
<?php namespace App\Tests;

use App\Service\ModuleNameMapper;
use App\Service\ModuleNameMapperInterface;
use \Codeception\Test\Unit;
use InvalidArgumentException;
use SuiteCRM\Core\Legacy\LegacyScopeState;
use SuiteCRM\Core\Legacy\ModuleNameMapperHandler;

class ModuleNameMapperTest extends Unit
{
@ -13,56 +15,79 @@ class ModuleNameMapperTest extends Unit


/**
* @var ModuleNameMapper
* @var ModuleNameMapperInterface
*/
private $moduleMapper;

protected function _before()
{
$legacyModuleNameMap = [
'Contacts' => [
'frontend' => 'contacts',
'core' => 'Contacts'
],
];
$projectDir = codecept_root_dir();
$legacyDir = $projectDir . '/legacy';
$legacySessionName = 'LEGACYSESSID';
$defaultSessionName = 'PHPSESSID';

$this->moduleMapper = new ModuleNameMapper($legacyModuleNameMap);
$legacyScope = new LegacyScopeState();

$this->moduleMapper = new ModuleNameMapperHandler(
$projectDir,
$legacyDir,
$legacySessionName,
$defaultSessionName,
$legacyScope
);
}


public function testValidLegacyModuleNameCheck()
/**
* Test valid module name check with valid name
*/
public function testValidLegacyModuleNameCheck(): void
{
$valid = $this->moduleMapper->isValidModule('Contacts');

static::assertTrue($valid);
}

public function testInvalidLegacyModuleNameCheck()
/**
* Test valid module name check with invalid name
*/
public function testInvalidLegacyModuleNameCheck(): void
{
$valid = $this->moduleMapper->isValidModule('FakeModule');

static::assertFalse($valid);
}

public function testLegacyModuleNameToFrontEndConversion()
/**
* Test module name conversion to frontend with valid name
*/
public function testLegacyModuleNameToFrontEndConversion(): void
{
$frontendName = $this->moduleMapper->toFrontEnd('Contacts');
static::assertEquals('contacts', $frontendName);
}

public function testInvalidLegacyModuleNameToFrontEndConversion()
/**
* Test module name conversion to frontend with invalid name
*/
public function testInvalidLegacyModuleNameToFrontEndConversion(): void
{
$this->expectException(InvalidArgumentException::class);
$this->moduleMapper->toFrontEnd('FakeModule');
}

public function testLegacyModuleNameToCoreConversion()
/**
* Test module name conversion to core with valid name
*/
public function testLegacyModuleNameToCoreConversion(): void
{
$coreName = $this->moduleMapper->toCore('Contacts');
static::assertEquals('Contacts', $coreName);
}

public function testInvalidLegacyModuleNameToCoreConversion()
/**
* Test module name conversion to core with invalid name
*/
public function testInvalidLegacyModuleNameToCoreConversion(): void
{
$this->expectException(InvalidArgumentException::class);
$this->moduleMapper->toCore('FakeModule');

View file

@ -1,10 +1,12 @@
<?php namespace App\Tests;

use App\Service\ActionNameMapper;
use App\Service\ModuleNameMapper;
use App\Service\RouteConverter;
use App\Service\RouteConverterInterface;
use \Codeception\Test\Unit;
use InvalidArgumentException;
use SuiteCRM\Core\Legacy\ActionNameMapperHandler;
use SuiteCRM\Core\Legacy\LegacyScopeState;
use SuiteCRM\Core\Legacy\ModuleNameMapperHandler;
use SuiteCRM\Core\Legacy\RouteConverterHandler;
use Symfony\Component\HttpFoundation\Request;

class RouteConverterTest extends Unit
@ -16,32 +18,50 @@ class RouteConverterTest extends Unit


/**
* @var RouteConverter
* @var RouteConverterInterface
*/
private $routeConverter;

protected function _before()
{
$legacyModuleNameMap = [
'Contacts' => [
'frontend' => 'contacts',
'core' => 'Contacts'
],
];
$projectDir = codecept_root_dir();
$legacyDir = $projectDir . '/legacy';
$legacySessionName = 'LEGACYSESSID';
$defaultSessionName = 'PHPSESSID';

$legacyActionNameMap = [
'index ' => 'index',
'DetailView' => 'detail',
'EditView' => 'edit',
'ListView' => 'list',
];
$legacyScope = new LegacyScopeState();

$moduleMapper = new ModuleNameMapper($legacyModuleNameMap);
$actionMapper = new ActionNameMapper($legacyActionNameMap);
$this->routeConverter = new RouteConverter($moduleMapper, $actionMapper);
$moduleMapper = new ModuleNameMapperHandler(
$projectDir,
$legacyDir,
$legacySessionName,
$defaultSessionName,
$legacyScope
);

$actionMapper = new ActionNameMapperHandler(
$projectDir,
$legacyDir,
$legacySessionName,
$defaultSessionName,
$legacyScope
);

$this->routeConverter = new RouteConverterHandler(
$projectDir,
$legacyDir,
$legacySessionName,
$defaultSessionName,
$legacyScope,
$moduleMapper,
$actionMapper
);
}

public function testAPIRequestCheck()
/**
* Test check for to determine if is an API Request
*/
public function testAPIRequestCheck(): void
{
$queryParams = [
];
@ -68,7 +88,10 @@ class RouteConverterTest extends Unit
static::assertFalse($valid);
}

public function testLegacyValidSubPathRequestCheck()
/**
* Test legacy call request on instance installed in a subpath
*/
public function testLegacyValidSubPathRequestCheck(): void
{
$queryParams = [
'module' => 'Contacts',
@ -96,7 +119,10 @@ class RouteConverterTest extends Unit
static::assertTrue($valid);
}

public function testLegacyValidRequestCheck()
/**
* Test legacy call request check with valid request
*/
public function testLegacyValidRequestCheck(): void
{
$queryParams = [
'module' => 'Contacts',
@ -111,7 +137,10 @@ class RouteConverterTest extends Unit
static::assertTrue($valid);
}

public function testLegacyNoModuleRequestCheck()
/**
* Test legacy call request check with no module
*/
public function testLegacyNoModuleRequestCheck(): void
{
$queryParams = [];

@ -122,7 +151,10 @@ class RouteConverterTest extends Unit
static::assertFalse($valid);
}

public function testLegacyInvalidModuleRequestCheck()
/**
* Test legacy call request check with invalid module
*/
public function testLegacyInvalidModuleRequestCheck(): void
{
$queryParams = [
'module' => 'FakeModule',
@ -135,8 +167,10 @@ class RouteConverterTest extends Unit
static::assertFalse($valid);
}


public function testLegacyInvalidActionRequestCheck()
/**
* Test legacy call request check with invalid action
*/
public function testLegacyInvalidActionRequestCheck(): void
{
$queryParams = [
'module' => 'Contacts',
@ -150,7 +184,10 @@ class RouteConverterTest extends Unit
static::assertFalse($valid);
}

public function testLegacyValidModuleIndexRRequest()
/**
* Test legacy call to valid module
*/
public function testLegacyValidModuleIndexRRequest(): void
{
$resultingRoute = './#/contacts';
$queryParams = [
@ -163,7 +200,10 @@ class RouteConverterTest extends Unit
static::assertEquals($resultingRoute, $route);
}

public function testLegacyValidModuleViewRequest()
/**
* Test legacy call to valid view
*/
public function testLegacyValidModuleViewRequest(): void
{
$resultingRoute = './#/contacts/list';
$queryParams = [
@ -178,9 +218,12 @@ class RouteConverterTest extends Unit
static::assertEquals($resultingRoute, $route);
}

public function testLegacyValidModuleRecordRequest()
/**
* Test legacy call to module record
*/
public function testLegacyValidModuleRecordRequest(): void
{
$resultingRoute = './#/contacts/detail/123';
$resultingRoute = './#/contacts/record/123';
$queryParams = [
'module' => 'Contacts',
'action' => 'DetailView',
@ -194,11 +237,14 @@ class RouteConverterTest extends Unit
static::assertEquals($resultingRoute, $route);
}

public function testLegacyInvalidModuleIndexRequest()
/**
* test legacy call to invalid module
*/
public function testLegacyInvalidModuleIndexRequest(): void
{
$this->expectException(InvalidArgumentException::class);
$queryParams = [
'module' => 'FakeAction',
'module' => 'FakeModule',
];

$request = new Request($queryParams);
@ -207,9 +253,12 @@ class RouteConverterTest extends Unit

}

public function testLegacyModuleInvalidActionRequest()
/**
* Test legacy call with invalid action
*/
public function testLegacyModuleInvalidActionRequest(): void
{
$this->expectException(InvalidArgumentException::class);
$resultingRoute = './#/contacts/FakeAction';
$queryParams = [
'module' => 'Contacts',
'action' => 'FakeAction'
@ -217,10 +266,15 @@ class RouteConverterTest extends Unit

$request = new Request($queryParams);

$this->routeConverter->convert($request);
$route = $this->routeConverter->convert($request);

static::assertEquals($resultingRoute, $route);
}

public function testLegacyNoModuleRequest()
/**
* Test legacy call without module
*/
public function testLegacyNoModuleRequest(): void
{
$this->expectException(InvalidArgumentException::class);
$queryParams = [];