ldc-crm/tests/coverage/Lib/Helper.php.html

502 lines
285 KiB
HTML
Raw Normal View History

Version 3.0.0 This removes api authentification with token in favor of signature method. Refactorize code and clean up. It add more unit test plus code coverage in test/converage. - Added config.api.timestampTimeout - Added Helper::signRequest This calculates the request signature - Added more unit tests and extend code coverage. - Added rate limiter for web routes - Added RemoveSpaces Sanitizer on api requests - Added stress test suite - Changed AuthServiceProvider api-token to api-hmac - Changed CustomerSeeder to have at least of customer activated (for unit tests) - Changed used transation for saveing multiple models - Changed, in ServiceController generateApiToken to generateServicePassword - Changed, timestamp has to be send in request with a DateTime format, it also has to a UTC value - Composer added brianium/paratest - Composer update - Fixed case where removing single optin could be the wrong one (not for the good service) - Fixed customer delete - Fixed customer would not be resolved by brand. - Fixed Really check that request is json checking body content, preventing sending malformed requests - Remove ApiError::needAuth - Removed api_token - Removed ApiController::authenticate - Removed config.api.tokenTimeout - Removed Header check or usage because of HAProxy doing weird stuff - Removed lock files from gitignore - Removed memcached dependency - Removed unused questions resources api routes - Removed workspace file Migrations - Added unique index on services.bearer_token - Changed customer_id on customer_answer is nullable - Changed services.bearer_pwd length to 312 (the size of the token) - Dropped services.api_token and service.api_token_date
2021-12-19 15:57:24 +01:00
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Code Coverage for /home/jeremy/projets/crm/app/Lib/Helper.php</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="../_css/bootstrap.min.css" rel="stylesheet" type="text/css">
<link href="../_css/octicons.css" rel="stylesheet" type="text/css">
<link href="../_css/style.css" rel="stylesheet" type="text/css">
<link href="../_css/custom.css" rel="stylesheet" type="text/css">
</head>
<body>
<header>
<div class="container-fluid">
<div class="row">
<div class="col-md-12">
<nav aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item"><a href="../index.html">/home/jeremy/projets/crm/app</a></li>
<li class="breadcrumb-item"><a href="index.html">Lib</a></li>
<li class="breadcrumb-item active">Helper.php</li>
</ol>
</nav>
</div>
</div>
</div>
</header>
<div class="container-fluid">
<div class="table-responsive">
<table class="table table-bordered">
<thead>
<tr>
<td>&nbsp;</td>
<td colspan="10"><div align="center"><strong>Code Coverage</strong></div></td>
</tr>
<tr>
<td>&nbsp;</td>
<td colspan="3"><div align="center"><strong>Lines</strong></div></td>
2022-06-09 11:30:49 +02:00
<td colspan="4"><div align="center"><strong>Functions and Methods</strong></div></td>
<td colspan="3"><div align="center"><strong>Classes and Traits</strong></div></td>
Version 3.0.0 This removes api authentification with token in favor of signature method. Refactorize code and clean up. It add more unit test plus code coverage in test/converage. - Added config.api.timestampTimeout - Added Helper::signRequest This calculates the request signature - Added more unit tests and extend code coverage. - Added rate limiter for web routes - Added RemoveSpaces Sanitizer on api requests - Added stress test suite - Changed AuthServiceProvider api-token to api-hmac - Changed CustomerSeeder to have at least of customer activated (for unit tests) - Changed used transation for saveing multiple models - Changed, in ServiceController generateApiToken to generateServicePassword - Changed, timestamp has to be send in request with a DateTime format, it also has to a UTC value - Composer added brianium/paratest - Composer update - Fixed case where removing single optin could be the wrong one (not for the good service) - Fixed customer delete - Fixed customer would not be resolved by brand. - Fixed Really check that request is json checking body content, preventing sending malformed requests - Remove ApiError::needAuth - Removed api_token - Removed ApiController::authenticate - Removed config.api.tokenTimeout - Removed Header check or usage because of HAProxy doing weird stuff - Removed lock files from gitignore - Removed memcached dependency - Removed unused questions resources api routes - Removed workspace file Migrations - Added unique index on services.bearer_token - Changed customer_id on customer_answer is nullable - Changed services.bearer_pwd length to 312 (the size of the token) - Dropped services.api_token and service.api_token_date
2021-12-19 15:57:24 +01:00
</tr>
</thead>
<tbody>
<tr>
<td class="warning">Total</td>
2022-06-09 11:30:49 +02:00
<td class="warning big"> <div class="progress">
<div class="progress-bar bg-warning" role="progressbar" aria-valuenow="77.78" aria-valuemin="0" aria-valuemax="100" style="width: 77.78%">
<span class="sr-only">77.78% covered (warning)</span>
Version 3.0.0 This removes api authentification with token in favor of signature method. Refactorize code and clean up. It add more unit test plus code coverage in test/converage. - Added config.api.timestampTimeout - Added Helper::signRequest This calculates the request signature - Added more unit tests and extend code coverage. - Added rate limiter for web routes - Added RemoveSpaces Sanitizer on api requests - Added stress test suite - Changed AuthServiceProvider api-token to api-hmac - Changed CustomerSeeder to have at least of customer activated (for unit tests) - Changed used transation for saveing multiple models - Changed, in ServiceController generateApiToken to generateServicePassword - Changed, timestamp has to be send in request with a DateTime format, it also has to a UTC value - Composer added brianium/paratest - Composer update - Fixed case where removing single optin could be the wrong one (not for the good service) - Fixed customer delete - Fixed customer would not be resolved by brand. - Fixed Really check that request is json checking body content, preventing sending malformed requests - Remove ApiError::needAuth - Removed api_token - Removed ApiController::authenticate - Removed config.api.tokenTimeout - Removed Header check or usage because of HAProxy doing weird stuff - Removed lock files from gitignore - Removed memcached dependency - Removed unused questions resources api routes - Removed workspace file Migrations - Added unique index on services.bearer_token - Changed customer_id on customer_answer is nullable - Changed services.bearer_pwd length to 312 (the size of the token) - Dropped services.api_token and service.api_token_date
2021-12-19 15:57:24 +01:00
</div>
</div>
</td>
2022-06-09 11:30:49 +02:00
<td class="warning small"><div align="right">77.78%</div></td>
<td class="warning small"><div align="right">42&nbsp;/&nbsp;54</div></td>
Version 3.0.0 This removes api authentification with token in favor of signature method. Refactorize code and clean up. It add more unit test plus code coverage in test/converage. - Added config.api.timestampTimeout - Added Helper::signRequest This calculates the request signature - Added more unit tests and extend code coverage. - Added rate limiter for web routes - Added RemoveSpaces Sanitizer on api requests - Added stress test suite - Changed AuthServiceProvider api-token to api-hmac - Changed CustomerSeeder to have at least of customer activated (for unit tests) - Changed used transation for saveing multiple models - Changed, in ServiceController generateApiToken to generateServicePassword - Changed, timestamp has to be send in request with a DateTime format, it also has to a UTC value - Composer added brianium/paratest - Composer update - Fixed case where removing single optin could be the wrong one (not for the good service) - Fixed customer delete - Fixed customer would not be resolved by brand. - Fixed Really check that request is json checking body content, preventing sending malformed requests - Remove ApiError::needAuth - Removed api_token - Removed ApiController::authenticate - Removed config.api.tokenTimeout - Removed Header check or usage because of HAProxy doing weird stuff - Removed lock files from gitignore - Removed memcached dependency - Removed unused questions resources api routes - Removed workspace file Migrations - Added unique index on services.bearer_token - Changed customer_id on customer_answer is nullable - Changed services.bearer_pwd length to 312 (the size of the token) - Dropped services.api_token and service.api_token_date
2021-12-19 15:57:24 +01:00
<td class="warning big"> <div class="progress">
<div class="progress-bar bg-warning" role="progressbar" aria-valuenow="75.00" aria-valuemin="0" aria-valuemax="100" style="width: 75.00%">
<span class="sr-only">75.00% covered (warning)</span>
</div>
</div>
</td>
<td class="warning small"><div align="right">75.00%</div></td>
<td class="warning small"><div align="right">6&nbsp;/&nbsp;8</div></td>
<td class="warning small"><abbr title="Change Risk Anti-Patterns (CRAP) Index">CRAP</abbr></td>
2022-06-09 11:30:49 +02:00
<td class="danger big"> <div class="progress">
<div class="progress-bar bg-danger" role="progressbar" aria-valuenow="0.00" aria-valuemin="0" aria-valuemax="100" style="width: 0.00%">
<span class="sr-only">0.00% covered (danger)</span>
Version 3.0.0 This removes api authentification with token in favor of signature method. Refactorize code and clean up. It add more unit test plus code coverage in test/converage. - Added config.api.timestampTimeout - Added Helper::signRequest This calculates the request signature - Added more unit tests and extend code coverage. - Added rate limiter for web routes - Added RemoveSpaces Sanitizer on api requests - Added stress test suite - Changed AuthServiceProvider api-token to api-hmac - Changed CustomerSeeder to have at least of customer activated (for unit tests) - Changed used transation for saveing multiple models - Changed, in ServiceController generateApiToken to generateServicePassword - Changed, timestamp has to be send in request with a DateTime format, it also has to a UTC value - Composer added brianium/paratest - Composer update - Fixed case where removing single optin could be the wrong one (not for the good service) - Fixed customer delete - Fixed customer would not be resolved by brand. - Fixed Really check that request is json checking body content, preventing sending malformed requests - Remove ApiError::needAuth - Removed api_token - Removed ApiController::authenticate - Removed config.api.tokenTimeout - Removed Header check or usage because of HAProxy doing weird stuff - Removed lock files from gitignore - Removed memcached dependency - Removed unused questions resources api routes - Removed workspace file Migrations - Added unique index on services.bearer_token - Changed customer_id on customer_answer is nullable - Changed services.bearer_pwd length to 312 (the size of the token) - Dropped services.api_token and service.api_token_date
2021-12-19 15:57:24 +01:00
</div>
</div>
</td>
2022-06-09 11:30:49 +02:00
<td class="danger small"><div align="right">0.00%</div></td>
<td class="danger small"><div align="right">0&nbsp;/&nbsp;1</div></td>
Version 3.0.0 This removes api authentification with token in favor of signature method. Refactorize code and clean up. It add more unit test plus code coverage in test/converage. - Added config.api.timestampTimeout - Added Helper::signRequest This calculates the request signature - Added more unit tests and extend code coverage. - Added rate limiter for web routes - Added RemoveSpaces Sanitizer on api requests - Added stress test suite - Changed AuthServiceProvider api-token to api-hmac - Changed CustomerSeeder to have at least of customer activated (for unit tests) - Changed used transation for saveing multiple models - Changed, in ServiceController generateApiToken to generateServicePassword - Changed, timestamp has to be send in request with a DateTime format, it also has to a UTC value - Composer added brianium/paratest - Composer update - Fixed case where removing single optin could be the wrong one (not for the good service) - Fixed customer delete - Fixed customer would not be resolved by brand. - Fixed Really check that request is json checking body content, preventing sending malformed requests - Remove ApiError::needAuth - Removed api_token - Removed ApiController::authenticate - Removed config.api.tokenTimeout - Removed Header check or usage because of HAProxy doing weird stuff - Removed lock files from gitignore - Removed memcached dependency - Removed unused questions resources api routes - Removed workspace file Migrations - Added unique index on services.bearer_token - Changed customer_id on customer_answer is nullable - Changed services.bearer_pwd length to 312 (the size of the token) - Dropped services.api_token and service.api_token_date
2021-12-19 15:57:24 +01:00
</tr>
<tr>
<td class="warning"><abbr title="App\Lib\Helper">Helper</abbr></td>
2022-06-09 11:30:49 +02:00
<td class="warning big"> <div class="progress">
<div class="progress-bar bg-warning" role="progressbar" aria-valuenow="77.78" aria-valuemin="0" aria-valuemax="100" style="width: 77.78%">
<span class="sr-only">77.78% covered (warning)</span>
Version 3.0.0 This removes api authentification with token in favor of signature method. Refactorize code and clean up. It add more unit test plus code coverage in test/converage. - Added config.api.timestampTimeout - Added Helper::signRequest This calculates the request signature - Added more unit tests and extend code coverage. - Added rate limiter for web routes - Added RemoveSpaces Sanitizer on api requests - Added stress test suite - Changed AuthServiceProvider api-token to api-hmac - Changed CustomerSeeder to have at least of customer activated (for unit tests) - Changed used transation for saveing multiple models - Changed, in ServiceController generateApiToken to generateServicePassword - Changed, timestamp has to be send in request with a DateTime format, it also has to a UTC value - Composer added brianium/paratest - Composer update - Fixed case where removing single optin could be the wrong one (not for the good service) - Fixed customer delete - Fixed customer would not be resolved by brand. - Fixed Really check that request is json checking body content, preventing sending malformed requests - Remove ApiError::needAuth - Removed api_token - Removed ApiController::authenticate - Removed config.api.tokenTimeout - Removed Header check or usage because of HAProxy doing weird stuff - Removed lock files from gitignore - Removed memcached dependency - Removed unused questions resources api routes - Removed workspace file Migrations - Added unique index on services.bearer_token - Changed customer_id on customer_answer is nullable - Changed services.bearer_pwd length to 312 (the size of the token) - Dropped services.api_token and service.api_token_date
2021-12-19 15:57:24 +01:00
</div>
</div>
</td>
2022-06-09 11:30:49 +02:00
<td class="warning small"><div align="right">77.78%</div></td>
<td class="warning small"><div align="right">42&nbsp;/&nbsp;54</div></td>
Version 3.0.0 This removes api authentification with token in favor of signature method. Refactorize code and clean up. It add more unit test plus code coverage in test/converage. - Added config.api.timestampTimeout - Added Helper::signRequest This calculates the request signature - Added more unit tests and extend code coverage. - Added rate limiter for web routes - Added RemoveSpaces Sanitizer on api requests - Added stress test suite - Changed AuthServiceProvider api-token to api-hmac - Changed CustomerSeeder to have at least of customer activated (for unit tests) - Changed used transation for saveing multiple models - Changed, in ServiceController generateApiToken to generateServicePassword - Changed, timestamp has to be send in request with a DateTime format, it also has to a UTC value - Composer added brianium/paratest - Composer update - Fixed case where removing single optin could be the wrong one (not for the good service) - Fixed customer delete - Fixed customer would not be resolved by brand. - Fixed Really check that request is json checking body content, preventing sending malformed requests - Remove ApiError::needAuth - Removed api_token - Removed ApiController::authenticate - Removed config.api.tokenTimeout - Removed Header check or usage because of HAProxy doing weird stuff - Removed lock files from gitignore - Removed memcached dependency - Removed unused questions resources api routes - Removed workspace file Migrations - Added unique index on services.bearer_token - Changed customer_id on customer_answer is nullable - Changed services.bearer_pwd length to 312 (the size of the token) - Dropped services.api_token and service.api_token_date
2021-12-19 15:57:24 +01:00
<td class="warning big"> <div class="progress">
<div class="progress-bar bg-warning" role="progressbar" aria-valuenow="75.00" aria-valuemin="0" aria-valuemax="100" style="width: 75.00%">
<span class="sr-only">75.00% covered (warning)</span>
</div>
</div>
</td>
<td class="warning small"><div align="right">75.00%</div></td>
<td class="warning small"><div align="right">6&nbsp;/&nbsp;8</div></td>
2022-06-09 11:30:49 +02:00
<td class="warning small">30.32</td>
<td class="danger big"> <div class="progress">
<div class="progress-bar bg-danger" role="progressbar" aria-valuenow="0.00" aria-valuemin="0" aria-valuemax="100" style="width: 0.00%">
<span class="sr-only">0.00% covered (danger)</span>
Version 3.0.0 This removes api authentification with token in favor of signature method. Refactorize code and clean up. It add more unit test plus code coverage in test/converage. - Added config.api.timestampTimeout - Added Helper::signRequest This calculates the request signature - Added more unit tests and extend code coverage. - Added rate limiter for web routes - Added RemoveSpaces Sanitizer on api requests - Added stress test suite - Changed AuthServiceProvider api-token to api-hmac - Changed CustomerSeeder to have at least of customer activated (for unit tests) - Changed used transation for saveing multiple models - Changed, in ServiceController generateApiToken to generateServicePassword - Changed, timestamp has to be send in request with a DateTime format, it also has to a UTC value - Composer added brianium/paratest - Composer update - Fixed case where removing single optin could be the wrong one (not for the good service) - Fixed customer delete - Fixed customer would not be resolved by brand. - Fixed Really check that request is json checking body content, preventing sending malformed requests - Remove ApiError::needAuth - Removed api_token - Removed ApiController::authenticate - Removed config.api.tokenTimeout - Removed Header check or usage because of HAProxy doing weird stuff - Removed lock files from gitignore - Removed memcached dependency - Removed unused questions resources api routes - Removed workspace file Migrations - Added unique index on services.bearer_token - Changed customer_id on customer_answer is nullable - Changed services.bearer_pwd length to 312 (the size of the token) - Dropped services.api_token and service.api_token_date
2021-12-19 15:57:24 +01:00
</div>
</div>
</td>
2022-06-09 11:30:49 +02:00
<td class="danger small"><div align="right">0.00%</div></td>
<td class="danger small"><div align="right">0&nbsp;/&nbsp;1</div></td>
Version 3.0.0 This removes api authentification with token in favor of signature method. Refactorize code and clean up. It add more unit test plus code coverage in test/converage. - Added config.api.timestampTimeout - Added Helper::signRequest This calculates the request signature - Added more unit tests and extend code coverage. - Added rate limiter for web routes - Added RemoveSpaces Sanitizer on api requests - Added stress test suite - Changed AuthServiceProvider api-token to api-hmac - Changed CustomerSeeder to have at least of customer activated (for unit tests) - Changed used transation for saveing multiple models - Changed, in ServiceController generateApiToken to generateServicePassword - Changed, timestamp has to be send in request with a DateTime format, it also has to a UTC value - Composer added brianium/paratest - Composer update - Fixed case where removing single optin could be the wrong one (not for the good service) - Fixed customer delete - Fixed customer would not be resolved by brand. - Fixed Really check that request is json checking body content, preventing sending malformed requests - Remove ApiError::needAuth - Removed api_token - Removed ApiController::authenticate - Removed config.api.tokenTimeout - Removed Header check or usage because of HAProxy doing weird stuff - Removed lock files from gitignore - Removed memcached dependency - Removed unused questions resources api routes - Removed workspace file Migrations - Added unique index on services.bearer_token - Changed customer_id on customer_answer is nullable - Changed services.bearer_pwd length to 312 (the size of the token) - Dropped services.api_token and service.api_token_date
2021-12-19 15:57:24 +01:00
</tr>
<tr>
2022-06-09 11:30:49 +02:00
<td class="success">&nbsp;<a href="#30"><abbr title="isRequestForApiV2(Illuminate\Http\Request $request)">isRequestForApiV2</abbr></a></td>
Version 3.0.0 This removes api authentification with token in favor of signature method. Refactorize code and clean up. It add more unit test plus code coverage in test/converage. - Added config.api.timestampTimeout - Added Helper::signRequest This calculates the request signature - Added more unit tests and extend code coverage. - Added rate limiter for web routes - Added RemoveSpaces Sanitizer on api requests - Added stress test suite - Changed AuthServiceProvider api-token to api-hmac - Changed CustomerSeeder to have at least of customer activated (for unit tests) - Changed used transation for saveing multiple models - Changed, in ServiceController generateApiToken to generateServicePassword - Changed, timestamp has to be send in request with a DateTime format, it also has to a UTC value - Composer added brianium/paratest - Composer update - Fixed case where removing single optin could be the wrong one (not for the good service) - Fixed customer delete - Fixed customer would not be resolved by brand. - Fixed Really check that request is json checking body content, preventing sending malformed requests - Remove ApiError::needAuth - Removed api_token - Removed ApiController::authenticate - Removed config.api.tokenTimeout - Removed Header check or usage because of HAProxy doing weird stuff - Removed lock files from gitignore - Removed memcached dependency - Removed unused questions resources api routes - Removed workspace file Migrations - Added unique index on services.bearer_token - Changed customer_id on customer_answer is nullable - Changed services.bearer_pwd length to 312 (the size of the token) - Dropped services.api_token and service.api_token_date
2021-12-19 15:57:24 +01:00
<td class="success big"> <div class="progress">
<div class="progress-bar bg-success" role="progressbar" aria-valuenow="100.00" aria-valuemin="0" aria-valuemax="100" style="width: 100.00%">
<span class="sr-only">100.00% covered (success)</span>
</div>
</div>
</td>
<td class="success small"><div align="right">100.00%</div></td>
2022-06-09 11:30:49 +02:00
<td class="success small"><div align="right">3&nbsp;/&nbsp;3</div></td>
Version 3.0.0 This removes api authentification with token in favor of signature method. Refactorize code and clean up. It add more unit test plus code coverage in test/converage. - Added config.api.timestampTimeout - Added Helper::signRequest This calculates the request signature - Added more unit tests and extend code coverage. - Added rate limiter for web routes - Added RemoveSpaces Sanitizer on api requests - Added stress test suite - Changed AuthServiceProvider api-token to api-hmac - Changed CustomerSeeder to have at least of customer activated (for unit tests) - Changed used transation for saveing multiple models - Changed, in ServiceController generateApiToken to generateServicePassword - Changed, timestamp has to be send in request with a DateTime format, it also has to a UTC value - Composer added brianium/paratest - Composer update - Fixed case where removing single optin could be the wrong one (not for the good service) - Fixed customer delete - Fixed customer would not be resolved by brand. - Fixed Really check that request is json checking body content, preventing sending malformed requests - Remove ApiError::needAuth - Removed api_token - Removed ApiController::authenticate - Removed config.api.tokenTimeout - Removed Header check or usage because of HAProxy doing weird stuff - Removed lock files from gitignore - Removed memcached dependency - Removed unused questions resources api routes - Removed workspace file Migrations - Added unique index on services.bearer_token - Changed customer_id on customer_answer is nullable - Changed services.bearer_pwd length to 312 (the size of the token) - Dropped services.api_token and service.api_token_date
2021-12-19 15:57:24 +01:00
<td class="success big"> <div class="progress">
<div class="progress-bar bg-success" role="progressbar" aria-valuenow="100.00" aria-valuemin="0" aria-valuemax="100" style="width: 100.00%">
<span class="sr-only">100.00% covered (success)</span>
</div>
</div>
</td>
<td class="success small"><div align="right">100.00%</div></td>
2022-06-09 11:30:49 +02:00
<td class="success small"><div align="right">1&nbsp;/&nbsp;1</div></td>
<td class="success small">2</td>
<td class="success" colspan="3"></td>
Version 3.0.0 This removes api authentification with token in favor of signature method. Refactorize code and clean up. It add more unit test plus code coverage in test/converage. - Added config.api.timestampTimeout - Added Helper::signRequest This calculates the request signature - Added more unit tests and extend code coverage. - Added rate limiter for web routes - Added RemoveSpaces Sanitizer on api requests - Added stress test suite - Changed AuthServiceProvider api-token to api-hmac - Changed CustomerSeeder to have at least of customer activated (for unit tests) - Changed used transation for saveing multiple models - Changed, in ServiceController generateApiToken to generateServicePassword - Changed, timestamp has to be send in request with a DateTime format, it also has to a UTC value - Composer added brianium/paratest - Composer update - Fixed case where removing single optin could be the wrong one (not for the good service) - Fixed customer delete - Fixed customer would not be resolved by brand. - Fixed Really check that request is json checking body content, preventing sending malformed requests - Remove ApiError::needAuth - Removed api_token - Removed ApiController::authenticate - Removed config.api.tokenTimeout - Removed Header check or usage because of HAProxy doing weird stuff - Removed lock files from gitignore - Removed memcached dependency - Removed unused questions resources api routes - Removed workspace file Migrations - Added unique index on services.bearer_token - Changed customer_id on customer_answer is nullable - Changed services.bearer_pwd length to 312 (the size of the token) - Dropped services.api_token and service.api_token_date
2021-12-19 15:57:24 +01:00
</tr>
<tr>
2022-06-09 11:30:49 +02:00
<td class="success">&nbsp;<a href="#44"><abbr title="isRequestForApiV1(Illuminate\Http\Request $request): bool">isRequestForApiV1</abbr></a></td>
Version 3.0.0 This removes api authentification with token in favor of signature method. Refactorize code and clean up. It add more unit test plus code coverage in test/converage. - Added config.api.timestampTimeout - Added Helper::signRequest This calculates the request signature - Added more unit tests and extend code coverage. - Added rate limiter for web routes - Added RemoveSpaces Sanitizer on api requests - Added stress test suite - Changed AuthServiceProvider api-token to api-hmac - Changed CustomerSeeder to have at least of customer activated (for unit tests) - Changed used transation for saveing multiple models - Changed, in ServiceController generateApiToken to generateServicePassword - Changed, timestamp has to be send in request with a DateTime format, it also has to a UTC value - Composer added brianium/paratest - Composer update - Fixed case where removing single optin could be the wrong one (not for the good service) - Fixed customer delete - Fixed customer would not be resolved by brand. - Fixed Really check that request is json checking body content, preventing sending malformed requests - Remove ApiError::needAuth - Removed api_token - Removed ApiController::authenticate - Removed config.api.tokenTimeout - Removed Header check or usage because of HAProxy doing weird stuff - Removed lock files from gitignore - Removed memcached dependency - Removed unused questions resources api routes - Removed workspace file Migrations - Added unique index on services.bearer_token - Changed customer_id on customer_answer is nullable - Changed services.bearer_pwd length to 312 (the size of the token) - Dropped services.api_token and service.api_token_date
2021-12-19 15:57:24 +01:00
<td class="success big"> <div class="progress">
<div class="progress-bar bg-success" role="progressbar" aria-valuenow="100.00" aria-valuemin="0" aria-valuemax="100" style="width: 100.00%">
<span class="sr-only">100.00% covered (success)</span>
</div>
</div>
</td>
<td class="success small"><div align="right">100.00%</div></td>
2022-06-09 11:30:49 +02:00
<td class="success small"><div align="right">3&nbsp;/&nbsp;3</div></td>
Version 3.0.0 This removes api authentification with token in favor of signature method. Refactorize code and clean up. It add more unit test plus code coverage in test/converage. - Added config.api.timestampTimeout - Added Helper::signRequest This calculates the request signature - Added more unit tests and extend code coverage. - Added rate limiter for web routes - Added RemoveSpaces Sanitizer on api requests - Added stress test suite - Changed AuthServiceProvider api-token to api-hmac - Changed CustomerSeeder to have at least of customer activated (for unit tests) - Changed used transation for saveing multiple models - Changed, in ServiceController generateApiToken to generateServicePassword - Changed, timestamp has to be send in request with a DateTime format, it also has to a UTC value - Composer added brianium/paratest - Composer update - Fixed case where removing single optin could be the wrong one (not for the good service) - Fixed customer delete - Fixed customer would not be resolved by brand. - Fixed Really check that request is json checking body content, preventing sending malformed requests - Remove ApiError::needAuth - Removed api_token - Removed ApiController::authenticate - Removed config.api.tokenTimeout - Removed Header check or usage because of HAProxy doing weird stuff - Removed lock files from gitignore - Removed memcached dependency - Removed unused questions resources api routes - Removed workspace file Migrations - Added unique index on services.bearer_token - Changed customer_id on customer_answer is nullable - Changed services.bearer_pwd length to 312 (the size of the token) - Dropped services.api_token and service.api_token_date
2021-12-19 15:57:24 +01:00
<td class="success big"> <div class="progress">
<div class="progress-bar bg-success" role="progressbar" aria-valuenow="100.00" aria-valuemin="0" aria-valuemax="100" style="width: 100.00%">
<span class="sr-only">100.00% covered (success)</span>
</div>
</div>
</td>
<td class="success small"><div align="right">100.00%</div></td>
2022-06-09 11:30:49 +02:00
<td class="success small"><div align="right">1&nbsp;/&nbsp;1</div></td>
<td class="success small">3</td>
<td class="success" colspan="3"></td>
Version 3.0.0 This removes api authentification with token in favor of signature method. Refactorize code and clean up. It add more unit test plus code coverage in test/converage. - Added config.api.timestampTimeout - Added Helper::signRequest This calculates the request signature - Added more unit tests and extend code coverage. - Added rate limiter for web routes - Added RemoveSpaces Sanitizer on api requests - Added stress test suite - Changed AuthServiceProvider api-token to api-hmac - Changed CustomerSeeder to have at least of customer activated (for unit tests) - Changed used transation for saveing multiple models - Changed, in ServiceController generateApiToken to generateServicePassword - Changed, timestamp has to be send in request with a DateTime format, it also has to a UTC value - Composer added brianium/paratest - Composer update - Fixed case where removing single optin could be the wrong one (not for the good service) - Fixed customer delete - Fixed customer would not be resolved by brand. - Fixed Really check that request is json checking body content, preventing sending malformed requests - Remove ApiError::needAuth - Removed api_token - Removed ApiController::authenticate - Removed config.api.tokenTimeout - Removed Header check or usage because of HAProxy doing weird stuff - Removed lock files from gitignore - Removed memcached dependency - Removed unused questions resources api routes - Removed workspace file Migrations - Added unique index on services.bearer_token - Changed customer_id on customer_answer is nullable - Changed services.bearer_pwd length to 312 (the size of the token) - Dropped services.api_token and service.api_token_date
2021-12-19 15:57:24 +01:00
</tr>
<tr>
2022-06-09 11:30:49 +02:00
<td class="success">&nbsp;<a href="#58"><abbr title="getRouteName(Illuminate\Http\Request $request)">getRouteName</abbr></a></td>
Version 3.0.0 This removes api authentification with token in favor of signature method. Refactorize code and clean up. It add more unit test plus code coverage in test/converage. - Added config.api.timestampTimeout - Added Helper::signRequest This calculates the request signature - Added more unit tests and extend code coverage. - Added rate limiter for web routes - Added RemoveSpaces Sanitizer on api requests - Added stress test suite - Changed AuthServiceProvider api-token to api-hmac - Changed CustomerSeeder to have at least of customer activated (for unit tests) - Changed used transation for saveing multiple models - Changed, in ServiceController generateApiToken to generateServicePassword - Changed, timestamp has to be send in request with a DateTime format, it also has to a UTC value - Composer added brianium/paratest - Composer update - Fixed case where removing single optin could be the wrong one (not for the good service) - Fixed customer delete - Fixed customer would not be resolved by brand. - Fixed Really check that request is json checking body content, preventing sending malformed requests - Remove ApiError::needAuth - Removed api_token - Removed ApiController::authenticate - Removed config.api.tokenTimeout - Removed Header check or usage because of HAProxy doing weird stuff - Removed lock files from gitignore - Removed memcached dependency - Removed unused questions resources api routes - Removed workspace file Migrations - Added unique index on services.bearer_token - Changed customer_id on customer_answer is nullable - Changed services.bearer_pwd length to 312 (the size of the token) - Dropped services.api_token and service.api_token_date
2021-12-19 15:57:24 +01:00
<td class="success big"> <div class="progress">
<div class="progress-bar bg-success" role="progressbar" aria-valuenow="100.00" aria-valuemin="0" aria-valuemax="100" style="width: 100.00%">
<span class="sr-only">100.00% covered (success)</span>
</div>
</div>
</td>
<td class="success small"><div align="right">100.00%</div></td>
<td class="success small"><div align="right">1&nbsp;/&nbsp;1</div></td>
<td class="success big"> <div class="progress">
<div class="progress-bar bg-success" role="progressbar" aria-valuenow="100.00" aria-valuemin="0" aria-valuemax="100" style="width: 100.00%">
<span class="sr-only">100.00% covered (success)</span>
</div>
</div>
</td>
<td class="success small"><div align="right">100.00%</div></td>
<td class="success small"><div align="right">1&nbsp;/&nbsp;1</div></td>
2022-06-09 11:30:49 +02:00
<td class="success small">2</td>
<td class="success" colspan="3"></td>
Version 3.0.0 This removes api authentification with token in favor of signature method. Refactorize code and clean up. It add more unit test plus code coverage in test/converage. - Added config.api.timestampTimeout - Added Helper::signRequest This calculates the request signature - Added more unit tests and extend code coverage. - Added rate limiter for web routes - Added RemoveSpaces Sanitizer on api requests - Added stress test suite - Changed AuthServiceProvider api-token to api-hmac - Changed CustomerSeeder to have at least of customer activated (for unit tests) - Changed used transation for saveing multiple models - Changed, in ServiceController generateApiToken to generateServicePassword - Changed, timestamp has to be send in request with a DateTime format, it also has to a UTC value - Composer added brianium/paratest - Composer update - Fixed case where removing single optin could be the wrong one (not for the good service) - Fixed customer delete - Fixed customer would not be resolved by brand. - Fixed Really check that request is json checking body content, preventing sending malformed requests - Remove ApiError::needAuth - Removed api_token - Removed ApiController::authenticate - Removed config.api.tokenTimeout - Removed Header check or usage because of HAProxy doing weird stuff - Removed lock files from gitignore - Removed memcached dependency - Removed unused questions resources api routes - Removed workspace file Migrations - Added unique index on services.bearer_token - Changed customer_id on customer_answer is nullable - Changed services.bearer_pwd length to 312 (the size of the token) - Dropped services.api_token and service.api_token_date
2021-12-19 15:57:24 +01:00
</tr>
<tr>
2022-06-09 11:30:49 +02:00
<td class="danger">&nbsp;<a href="#69"><abbr title="getBearerTokenFromRequest(Illuminate\Http\Request $request): ?string">getBearerTokenFromRequest</abbr></a></td>
Version 3.0.0 This removes api authentification with token in favor of signature method. Refactorize code and clean up. It add more unit test plus code coverage in test/converage. - Added config.api.timestampTimeout - Added Helper::signRequest This calculates the request signature - Added more unit tests and extend code coverage. - Added rate limiter for web routes - Added RemoveSpaces Sanitizer on api requests - Added stress test suite - Changed AuthServiceProvider api-token to api-hmac - Changed CustomerSeeder to have at least of customer activated (for unit tests) - Changed used transation for saveing multiple models - Changed, in ServiceController generateApiToken to generateServicePassword - Changed, timestamp has to be send in request with a DateTime format, it also has to a UTC value - Composer added brianium/paratest - Composer update - Fixed case where removing single optin could be the wrong one (not for the good service) - Fixed customer delete - Fixed customer would not be resolved by brand. - Fixed Really check that request is json checking body content, preventing sending malformed requests - Remove ApiError::needAuth - Removed api_token - Removed ApiController::authenticate - Removed config.api.tokenTimeout - Removed Header check or usage because of HAProxy doing weird stuff - Removed lock files from gitignore - Removed memcached dependency - Removed unused questions resources api routes - Removed workspace file Migrations - Added unique index on services.bearer_token - Changed customer_id on customer_answer is nullable - Changed services.bearer_pwd length to 312 (the size of the token) - Dropped services.api_token and service.api_token_date
2021-12-19 15:57:24 +01:00
<td class="danger big"> <div class="progress">
<div class="progress-bar bg-danger" role="progressbar" aria-valuenow="0.00" aria-valuemin="0" aria-valuemax="100" style="width: 0.00%">
<span class="sr-only">0.00% covered (danger)</span>
</div>
</div>
</td>
<td class="danger small"><div align="right">0.00%</div></td>
2022-06-09 11:30:49 +02:00
<td class="danger small"><div align="right">0&nbsp;/&nbsp;7</div></td>
Version 3.0.0 This removes api authentification with token in favor of signature method. Refactorize code and clean up. It add more unit test plus code coverage in test/converage. - Added config.api.timestampTimeout - Added Helper::signRequest This calculates the request signature - Added more unit tests and extend code coverage. - Added rate limiter for web routes - Added RemoveSpaces Sanitizer on api requests - Added stress test suite - Changed AuthServiceProvider api-token to api-hmac - Changed CustomerSeeder to have at least of customer activated (for unit tests) - Changed used transation for saveing multiple models - Changed, in ServiceController generateApiToken to generateServicePassword - Changed, timestamp has to be send in request with a DateTime format, it also has to a UTC value - Composer added brianium/paratest - Composer update - Fixed case where removing single optin could be the wrong one (not for the good service) - Fixed customer delete - Fixed customer would not be resolved by brand. - Fixed Really check that request is json checking body content, preventing sending malformed requests - Remove ApiError::needAuth - Removed api_token - Removed ApiController::authenticate - Removed config.api.tokenTimeout - Removed Header check or usage because of HAProxy doing weird stuff - Removed lock files from gitignore - Removed memcached dependency - Removed unused questions resources api routes - Removed workspace file Migrations - Added unique index on services.bearer_token - Changed customer_id on customer_answer is nullable - Changed services.bearer_pwd length to 312 (the size of the token) - Dropped services.api_token and service.api_token_date
2021-12-19 15:57:24 +01:00
<td class="danger big"> <div class="progress">
<div class="progress-bar bg-danger" role="progressbar" aria-valuenow="0.00" aria-valuemin="0" aria-valuemax="100" style="width: 0.00%">
<span class="sr-only">0.00% covered (danger)</span>
</div>
</div>
</td>
<td class="danger small"><div align="right">0.00%</div></td>
2022-06-09 11:30:49 +02:00
<td class="danger small"><div align="right">0&nbsp;/&nbsp;1</div></td>
<td class="danger small">20</td>
<td class="danger" colspan="3"></td>
Version 3.0.0 This removes api authentification with token in favor of signature method. Refactorize code and clean up. It add more unit test plus code coverage in test/converage. - Added config.api.timestampTimeout - Added Helper::signRequest This calculates the request signature - Added more unit tests and extend code coverage. - Added rate limiter for web routes - Added RemoveSpaces Sanitizer on api requests - Added stress test suite - Changed AuthServiceProvider api-token to api-hmac - Changed CustomerSeeder to have at least of customer activated (for unit tests) - Changed used transation for saveing multiple models - Changed, in ServiceController generateApiToken to generateServicePassword - Changed, timestamp has to be send in request with a DateTime format, it also has to a UTC value - Composer added brianium/paratest - Composer update - Fixed case where removing single optin could be the wrong one (not for the good service) - Fixed customer delete - Fixed customer would not be resolved by brand. - Fixed Really check that request is json checking body content, preventing sending malformed requests - Remove ApiError::needAuth - Removed api_token - Removed ApiController::authenticate - Removed config.api.tokenTimeout - Removed Header check or usage because of HAProxy doing weird stuff - Removed lock files from gitignore - Removed memcached dependency - Removed unused questions resources api routes - Removed workspace file Migrations - Added unique index on services.bearer_token - Changed customer_id on customer_answer is nullable - Changed services.bearer_pwd length to 312 (the size of the token) - Dropped services.api_token and service.api_token_date
2021-12-19 15:57:24 +01:00
</tr>
<tr>
2022-06-09 11:30:49 +02:00
<td class="success">&nbsp;<a href="#90"><abbr title="getRoutePrefix(Illuminate\Http\Request $request)">getRoutePrefix</abbr></a></td>
Version 3.0.0 This removes api authentification with token in favor of signature method. Refactorize code and clean up. It add more unit test plus code coverage in test/converage. - Added config.api.timestampTimeout - Added Helper::signRequest This calculates the request signature - Added more unit tests and extend code coverage. - Added rate limiter for web routes - Added RemoveSpaces Sanitizer on api requests - Added stress test suite - Changed AuthServiceProvider api-token to api-hmac - Changed CustomerSeeder to have at least of customer activated (for unit tests) - Changed used transation for saveing multiple models - Changed, in ServiceController generateApiToken to generateServicePassword - Changed, timestamp has to be send in request with a DateTime format, it also has to a UTC value - Composer added brianium/paratest - Composer update - Fixed case where removing single optin could be the wrong one (not for the good service) - Fixed customer delete - Fixed customer would not be resolved by brand. - Fixed Really check that request is json checking body content, preventing sending malformed requests - Remove ApiError::needAuth - Removed api_token - Removed ApiController::authenticate - Removed config.api.tokenTimeout - Removed Header check or usage because of HAProxy doing weird stuff - Removed lock files from gitignore - Removed memcached dependency - Removed unused questions resources api routes - Removed workspace file Migrations - Added unique index on services.bearer_token - Changed customer_id on customer_answer is nullable - Changed services.bearer_pwd length to 312 (the size of the token) - Dropped services.api_token and service.api_token_date
2021-12-19 15:57:24 +01:00
<td class="success big"> <div class="progress">
<div class="progress-bar bg-success" role="progressbar" aria-valuenow="100.00" aria-valuemin="0" aria-valuemax="100" style="width: 100.00%">
<span class="sr-only">100.00% covered (success)</span>
</div>
</div>
</td>
<td class="success small"><div align="right">100.00%</div></td>
2022-06-09 11:30:49 +02:00
<td class="success small"><div align="right">2&nbsp;/&nbsp;2</div></td>
Version 3.0.0 This removes api authentification with token in favor of signature method. Refactorize code and clean up. It add more unit test plus code coverage in test/converage. - Added config.api.timestampTimeout - Added Helper::signRequest This calculates the request signature - Added more unit tests and extend code coverage. - Added rate limiter for web routes - Added RemoveSpaces Sanitizer on api requests - Added stress test suite - Changed AuthServiceProvider api-token to api-hmac - Changed CustomerSeeder to have at least of customer activated (for unit tests) - Changed used transation for saveing multiple models - Changed, in ServiceController generateApiToken to generateServicePassword - Changed, timestamp has to be send in request with a DateTime format, it also has to a UTC value - Composer added brianium/paratest - Composer update - Fixed case where removing single optin could be the wrong one (not for the good service) - Fixed customer delete - Fixed customer would not be resolved by brand. - Fixed Really check that request is json checking body content, preventing sending malformed requests - Remove ApiError::needAuth - Removed api_token - Removed ApiController::authenticate - Removed config.api.tokenTimeout - Removed Header check or usage because of HAProxy doing weird stuff - Removed lock files from gitignore - Removed memcached dependency - Removed unused questions resources api routes - Removed workspace file Migrations - Added unique index on services.bearer_token - Changed customer_id on customer_answer is nullable - Changed services.bearer_pwd length to 312 (the size of the token) - Dropped services.api_token and service.api_token_date
2021-12-19 15:57:24 +01:00
<td class="success big"> <div class="progress">
<div class="progress-bar bg-success" role="progressbar" aria-valuenow="100.00" aria-valuemin="0" aria-valuemax="100" style="width: 100.00%">
<span class="sr-only">100.00% covered (success)</span>
</div>
</div>
</td>
<td class="success small"><div align="right">100.00%</div></td>
2022-06-09 11:30:49 +02:00
<td class="success small"><div align="right">1&nbsp;/&nbsp;1</div></td>
<td class="success small">3</td>
<td class="success" colspan="3"></td>
Version 3.0.0 This removes api authentification with token in favor of signature method. Refactorize code and clean up. It add more unit test plus code coverage in test/converage. - Added config.api.timestampTimeout - Added Helper::signRequest This calculates the request signature - Added more unit tests and extend code coverage. - Added rate limiter for web routes - Added RemoveSpaces Sanitizer on api requests - Added stress test suite - Changed AuthServiceProvider api-token to api-hmac - Changed CustomerSeeder to have at least of customer activated (for unit tests) - Changed used transation for saveing multiple models - Changed, in ServiceController generateApiToken to generateServicePassword - Changed, timestamp has to be send in request with a DateTime format, it also has to a UTC value - Composer added brianium/paratest - Composer update - Fixed case where removing single optin could be the wrong one (not for the good service) - Fixed customer delete - Fixed customer would not be resolved by brand. - Fixed Really check that request is json checking body content, preventing sending malformed requests - Remove ApiError::needAuth - Removed api_token - Removed ApiController::authenticate - Removed config.api.tokenTimeout - Removed Header check or usage because of HAProxy doing weird stuff - Removed lock files from gitignore - Removed memcached dependency - Removed unused questions resources api routes - Removed workspace file Migrations - Added unique index on services.bearer_token - Changed customer_id on customer_answer is nullable - Changed services.bearer_pwd length to 312 (the size of the token) - Dropped services.api_token and service.api_token_date
2021-12-19 15:57:24 +01:00
</tr>
<tr>
2022-06-09 11:30:49 +02:00
<td class="success">&nbsp;<a href="#102"><abbr title="getRoute(Illuminate\Http\Request $request)">getRoute</abbr></a></td>
Version 3.0.0 This removes api authentification with token in favor of signature method. Refactorize code and clean up. It add more unit test plus code coverage in test/converage. - Added config.api.timestampTimeout - Added Helper::signRequest This calculates the request signature - Added more unit tests and extend code coverage. - Added rate limiter for web routes - Added RemoveSpaces Sanitizer on api requests - Added stress test suite - Changed AuthServiceProvider api-token to api-hmac - Changed CustomerSeeder to have at least of customer activated (for unit tests) - Changed used transation for saveing multiple models - Changed, in ServiceController generateApiToken to generateServicePassword - Changed, timestamp has to be send in request with a DateTime format, it also has to a UTC value - Composer added brianium/paratest - Composer update - Fixed case where removing single optin could be the wrong one (not for the good service) - Fixed customer delete - Fixed customer would not be resolved by brand. - Fixed Really check that request is json checking body content, preventing sending malformed requests - Remove ApiError::needAuth - Removed api_token - Removed ApiController::authenticate - Removed config.api.tokenTimeout - Removed Header check or usage because of HAProxy doing weird stuff - Removed lock files from gitignore - Removed memcached dependency - Removed unused questions resources api routes - Removed workspace file Migrations - Added unique index on services.bearer_token - Changed customer_id on customer_answer is nullable - Changed services.bearer_pwd length to 312 (the size of the token) - Dropped services.api_token and service.api_token_date
2021-12-19 15:57:24 +01:00
<td class="success big"> <div class="progress">
<div class="progress-bar bg-success" role="progressbar" aria-valuenow="100.00" aria-valuemin="0" aria-valuemax="100" style="width: 100.00%">
<span class="sr-only">100.00% covered (success)</span>
</div>
</div>
</td>
<td class="success small"><div align="right">100.00%</div></td>
<td class="success small"><div align="right">1&nbsp;/&nbsp;1</div></td>
<td class="success big"> <div class="progress">
<div class="progress-bar bg-success" role="progressbar" aria-valuenow="100.00" aria-valuemin="0" aria-valuemax="100" style="width: 100.00%">
<span class="sr-only">100.00% covered (success)</span>
</div>
</div>
</td>
<td class="success small"><div align="right">100.00%</div></td>
<td class="success small"><div align="right">1&nbsp;/&nbsp;1</div></td>
2022-06-09 11:30:49 +02:00
<td class="success small">1</td>
<td class="success" colspan="3"></td>
Version 3.0.0 This removes api authentification with token in favor of signature method. Refactorize code and clean up. It add more unit test plus code coverage in test/converage. - Added config.api.timestampTimeout - Added Helper::signRequest This calculates the request signature - Added more unit tests and extend code coverage. - Added rate limiter for web routes - Added RemoveSpaces Sanitizer on api requests - Added stress test suite - Changed AuthServiceProvider api-token to api-hmac - Changed CustomerSeeder to have at least of customer activated (for unit tests) - Changed used transation for saveing multiple models - Changed, in ServiceController generateApiToken to generateServicePassword - Changed, timestamp has to be send in request with a DateTime format, it also has to a UTC value - Composer added brianium/paratest - Composer update - Fixed case where removing single optin could be the wrong one (not for the good service) - Fixed customer delete - Fixed customer would not be resolved by brand. - Fixed Really check that request is json checking body content, preventing sending malformed requests - Remove ApiError::needAuth - Removed api_token - Removed ApiController::authenticate - Removed config.api.tokenTimeout - Removed Header check or usage because of HAProxy doing weird stuff - Removed lock files from gitignore - Removed memcached dependency - Removed unused questions resources api routes - Removed workspace file Migrations - Added unique index on services.bearer_token - Changed customer_id on customer_answer is nullable - Changed services.bearer_pwd length to 312 (the size of the token) - Dropped services.api_token and service.api_token_date
2021-12-19 15:57:24 +01:00
</tr>
<tr>
2022-06-09 11:30:49 +02:00
<td class="success">&nbsp;<a href="#112"><abbr title="getPackageInfo(): array">getPackageInfo</abbr></a></td>
Version 3.0.0 This removes api authentification with token in favor of signature method. Refactorize code and clean up. It add more unit test plus code coverage in test/converage. - Added config.api.timestampTimeout - Added Helper::signRequest This calculates the request signature - Added more unit tests and extend code coverage. - Added rate limiter for web routes - Added RemoveSpaces Sanitizer on api requests - Added stress test suite - Changed AuthServiceProvider api-token to api-hmac - Changed CustomerSeeder to have at least of customer activated (for unit tests) - Changed used transation for saveing multiple models - Changed, in ServiceController generateApiToken to generateServicePassword - Changed, timestamp has to be send in request with a DateTime format, it also has to a UTC value - Composer added brianium/paratest - Composer update - Fixed case where removing single optin could be the wrong one (not for the good service) - Fixed customer delete - Fixed customer would not be resolved by brand. - Fixed Really check that request is json checking body content, preventing sending malformed requests - Remove ApiError::needAuth - Removed api_token - Removed ApiController::authenticate - Removed config.api.tokenTimeout - Removed Header check or usage because of HAProxy doing weird stuff - Removed lock files from gitignore - Removed memcached dependency - Removed unused questions resources api routes - Removed workspace file Migrations - Added unique index on services.bearer_token - Changed customer_id on customer_answer is nullable - Changed services.bearer_pwd length to 312 (the size of the token) - Dropped services.api_token and service.api_token_date
2021-12-19 15:57:24 +01:00
<td class="success big"> <div class="progress">
<div class="progress-bar bg-success" role="progressbar" aria-valuenow="100.00" aria-valuemin="0" aria-valuemax="100" style="width: 100.00%">
<span class="sr-only">100.00% covered (success)</span>
</div>
</div>
</td>
<td class="success small"><div align="right">100.00%</div></td>
2022-06-09 11:30:49 +02:00
<td class="success small"><div align="right">3&nbsp;/&nbsp;3</div></td>
Version 3.0.0 This removes api authentification with token in favor of signature method. Refactorize code and clean up. It add more unit test plus code coverage in test/converage. - Added config.api.timestampTimeout - Added Helper::signRequest This calculates the request signature - Added more unit tests and extend code coverage. - Added rate limiter for web routes - Added RemoveSpaces Sanitizer on api requests - Added stress test suite - Changed AuthServiceProvider api-token to api-hmac - Changed CustomerSeeder to have at least of customer activated (for unit tests) - Changed used transation for saveing multiple models - Changed, in ServiceController generateApiToken to generateServicePassword - Changed, timestamp has to be send in request with a DateTime format, it also has to a UTC value - Composer added brianium/paratest - Composer update - Fixed case where removing single optin could be the wrong one (not for the good service) - Fixed customer delete - Fixed customer would not be resolved by brand. - Fixed Really check that request is json checking body content, preventing sending malformed requests - Remove ApiError::needAuth - Removed api_token - Removed ApiController::authenticate - Removed config.api.tokenTimeout - Removed Header check or usage because of HAProxy doing weird stuff - Removed lock files from gitignore - Removed memcached dependency - Removed unused questions resources api routes - Removed workspace file Migrations - Added unique index on services.bearer_token - Changed customer_id on customer_answer is nullable - Changed services.bearer_pwd length to 312 (the size of the token) - Dropped services.api_token and service.api_token_date
2021-12-19 15:57:24 +01:00
<td class="success big"> <div class="progress">
<div class="progress-bar bg-success" role="progressbar" aria-valuenow="100.00" aria-valuemin="0" aria-valuemax="100" style="width: 100.00%">
<span class="sr-only">100.00% covered (success)</span>
</div>
</div>
</td>
<td class="success small"><div align="right">100.00%</div></td>
2022-06-09 11:30:49 +02:00
<td class="success small"><div align="right">1&nbsp;/&nbsp;1</div></td>
<td class="success small">2</td>
<td class="success" colspan="3"></td>
Version 3.0.0 This removes api authentification with token in favor of signature method. Refactorize code and clean up. It add more unit test plus code coverage in test/converage. - Added config.api.timestampTimeout - Added Helper::signRequest This calculates the request signature - Added more unit tests and extend code coverage. - Added rate limiter for web routes - Added RemoveSpaces Sanitizer on api requests - Added stress test suite - Changed AuthServiceProvider api-token to api-hmac - Changed CustomerSeeder to have at least of customer activated (for unit tests) - Changed used transation for saveing multiple models - Changed, in ServiceController generateApiToken to generateServicePassword - Changed, timestamp has to be send in request with a DateTime format, it also has to a UTC value - Composer added brianium/paratest - Composer update - Fixed case where removing single optin could be the wrong one (not for the good service) - Fixed customer delete - Fixed customer would not be resolved by brand. - Fixed Really check that request is json checking body content, preventing sending malformed requests - Remove ApiError::needAuth - Removed api_token - Removed ApiController::authenticate - Removed config.api.tokenTimeout - Removed Header check or usage because of HAProxy doing weird stuff - Removed lock files from gitignore - Removed memcached dependency - Removed unused questions resources api routes - Removed workspace file Migrations - Added unique index on services.bearer_token - Changed customer_id on customer_answer is nullable - Changed services.bearer_pwd length to 312 (the size of the token) - Dropped services.api_token and service.api_token_date
2021-12-19 15:57:24 +01:00
</tr>
<tr>
<td class="warning">&nbsp;<a href="#130"><abbr title="signRequest(string $secret, string $uri, string $method, array $parameters): string">signRequest</abbr></a></td>
2022-06-09 11:30:49 +02:00
<td class="warning big"> <div class="progress">
<div class="progress-bar bg-warning" role="progressbar" aria-valuenow="85.29" aria-valuemin="0" aria-valuemax="100" style="width: 85.29%">
<span class="sr-only">85.29% covered (warning)</span>
</div>
</div>
</td>
<td class="warning small"><div align="right">85.29%</div></td>
<td class="warning small"><div align="right">29&nbsp;/&nbsp;34</div></td>
Version 3.0.0 This removes api authentification with token in favor of signature method. Refactorize code and clean up. It add more unit test plus code coverage in test/converage. - Added config.api.timestampTimeout - Added Helper::signRequest This calculates the request signature - Added more unit tests and extend code coverage. - Added rate limiter for web routes - Added RemoveSpaces Sanitizer on api requests - Added stress test suite - Changed AuthServiceProvider api-token to api-hmac - Changed CustomerSeeder to have at least of customer activated (for unit tests) - Changed used transation for saveing multiple models - Changed, in ServiceController generateApiToken to generateServicePassword - Changed, timestamp has to be send in request with a DateTime format, it also has to a UTC value - Composer added brianium/paratest - Composer update - Fixed case where removing single optin could be the wrong one (not for the good service) - Fixed customer delete - Fixed customer would not be resolved by brand. - Fixed Really check that request is json checking body content, preventing sending malformed requests - Remove ApiError::needAuth - Removed api_token - Removed ApiController::authenticate - Removed config.api.tokenTimeout - Removed Header check or usage because of HAProxy doing weird stuff - Removed lock files from gitignore - Removed memcached dependency - Removed unused questions resources api routes - Removed workspace file Migrations - Added unique index on services.bearer_token - Changed customer_id on customer_answer is nullable - Changed services.bearer_pwd length to 312 (the size of the token) - Dropped services.api_token and service.api_token_date
2021-12-19 15:57:24 +01:00
<td class="danger big"> <div class="progress">
<div class="progress-bar bg-danger" role="progressbar" aria-valuenow="0.00" aria-valuemin="0" aria-valuemax="100" style="width: 0.00%">
<span class="sr-only">0.00% covered (danger)</span>
</div>
</div>
</td>
<td class="danger small"><div align="right">0.00%</div></td>
<td class="danger small"><div align="right">0&nbsp;/&nbsp;1</div></td>
2022-06-09 11:30:49 +02:00
<td class="danger small">7.16</td>
<td class="danger" colspan="3"></td>
Version 3.0.0 This removes api authentification with token in favor of signature method. Refactorize code and clean up. It add more unit test plus code coverage in test/converage. - Added config.api.timestampTimeout - Added Helper::signRequest This calculates the request signature - Added more unit tests and extend code coverage. - Added rate limiter for web routes - Added RemoveSpaces Sanitizer on api requests - Added stress test suite - Changed AuthServiceProvider api-token to api-hmac - Changed CustomerSeeder to have at least of customer activated (for unit tests) - Changed used transation for saveing multiple models - Changed, in ServiceController generateApiToken to generateServicePassword - Changed, timestamp has to be send in request with a DateTime format, it also has to a UTC value - Composer added brianium/paratest - Composer update - Fixed case where removing single optin could be the wrong one (not for the good service) - Fixed customer delete - Fixed customer would not be resolved by brand. - Fixed Really check that request is json checking body content, preventing sending malformed requests - Remove ApiError::needAuth - Removed api_token - Removed ApiController::authenticate - Removed config.api.tokenTimeout - Removed Header check or usage because of HAProxy doing weird stuff - Removed lock files from gitignore - Removed memcached dependency - Removed unused questions resources api routes - Removed workspace file Migrations - Added unique index on services.bearer_token - Changed customer_id on customer_answer is nullable - Changed services.bearer_pwd length to 312 (the size of the token) - Dropped services.api_token and service.api_token_date
2021-12-19 15:57:24 +01:00
</tr>
</tbody>
</table>
</div>
<table id="code" class="table table-borderless table-condensed">
<tbody>
<tr class=" d-flex"><td class="col-1 text-right"><a id="1" href="#1">1</a></td><td class="col-11 codeLine"><span class="default">&lt;?php</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="2" href="#2">2</a></td><td class="col-11 codeLine"></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="3" href="#3">3</a></td><td class="col-11 codeLine"><span class="keyword">namespace</span><span class="default">&nbsp;</span><span class="default">App</span><span class="default">\</span><span class="default">Lib</span><span class="keyword">;</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="4" href="#4">4</a></td><td class="col-11 codeLine"></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="5" href="#5">5</a></td><td class="col-11 codeLine"><span class="keyword">use</span><span class="default">&nbsp;</span><span class="default">App</span><span class="default">\</span><span class="default">Exceptions</span><span class="default">\</span><span class="default">Api</span><span class="default">\</span><span class="default">V2</span><span class="default">\</span><span class="default">CrmException</span><span class="keyword">;</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="6" href="#6">6</a></td><td class="col-11 codeLine"><span class="keyword">use</span><span class="default">&nbsp;</span><span class="default">Illuminate</span><span class="default">\</span><span class="default">Contracts</span><span class="default">\</span><span class="default">Encryption</span><span class="default">\</span><span class="default">DecryptException</span><span class="keyword">;</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="7" href="#7">7</a></td><td class="col-11 codeLine"><span class="keyword">use</span><span class="default">&nbsp;</span><span class="default">Illuminate</span><span class="default">\</span><span class="default">Http</span><span class="default">\</span><span class="default">Request</span><span class="keyword">;</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="8" href="#8">8</a></td><td class="col-11 codeLine"><span class="keyword">use</span><span class="default">&nbsp;</span><span class="default">Illuminate</span><span class="default">\</span><span class="default">Support</span><span class="default">\</span><span class="default">Facades</span><span class="default">\</span><span class="default">Crypt</span><span class="keyword">;</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="9" href="#9">9</a></td><td class="col-11 codeLine"><span class="keyword">use</span><span class="default">&nbsp;</span><span class="default">Illuminate</span><span class="default">\</span><span class="default">Support</span><span class="default">\</span><span class="default">Facades</span><span class="default">\</span><span class="default">Route</span><span class="keyword">;</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="10" href="#10">10</a></td><td class="col-11 codeLine"><span class="keyword">use</span><span class="default">&nbsp;</span><span class="default">Illuminate</span><span class="default">\</span><span class="default">Support</span><span class="default">\</span><span class="default">Str</span><span class="keyword">;</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="11" href="#11">11</a></td><td class="col-11 codeLine"></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="12" href="#12">12</a></td><td class="col-11 codeLine"><span class="comment">/**</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="13" href="#13">13</a></td><td class="col-11 codeLine"><span class="comment">&nbsp;*&nbsp;Helper&nbsp;Class</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="14" href="#14">14</a></td><td class="col-11 codeLine"><span class="comment">&nbsp;*/</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="15" href="#15">15</a></td><td class="col-11 codeLine"><span class="keyword">class</span><span class="default">&nbsp;</span><span class="default">Helper</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="16" href="#16">16</a></td><td class="col-11 codeLine"><span class="keyword">{</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="17" href="#17">17</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/**</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="18" href="#18">18</a></td><td class="col-11 codeLine"><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Package&nbsp;infos</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="19" href="#19">19</a></td><td class="col-11 codeLine"><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="20" href="#20">20</a></td><td class="col-11 codeLine"><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@var&nbsp;array</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="21" href="#21">21</a></td><td class="col-11 codeLine"><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="22" href="#22">22</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span class="default">&nbsp;</span><span class="keyword">static</span><span class="default">&nbsp;</span><span class="default">$packageInfos</span><span class="keyword">;</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="23" href="#23">23</a></td><td class="col-11 codeLine"></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="24" href="#24">24</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/**</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="25" href="#25">25</a></td><td class="col-11 codeLine"><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Tells&nbsp;if&nbsp;the&nbsp;request&nbsp;is&nbsp;within&nbsp;apiV2&nbsp;routes</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="26" href="#26">26</a></td><td class="col-11 codeLine"><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="27" href="#27">27</a></td><td class="col-11 codeLine"><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;Request&nbsp;$request</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="28" href="#28">28</a></td><td class="col-11 codeLine"><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;boolean</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="29" href="#29">29</a></td><td class="col-11 codeLine"><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="30" href="#30">30</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span class="default">&nbsp;</span><span class="keyword">static</span><span class="default">&nbsp;</span><span class="keyword">function</span><span class="default">&nbsp;</span><span class="default">isRequestForApiV2</span><span class="keyword">(</span><span class="default">Request</span><span class="default">&nbsp;</span><span class="default">$request</span><span class="keyword">)</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="31" href="#31">31</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">{</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="32" href="#32">32</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;*&nbsp;Small&nbsp;hack&nbsp;to&nbsp;ensure&nbsp;to&nbsp;know&nbsp;if&nbsp;route&nbsp;is&nbsp;From&nbsp;APIv2.</span></td></tr>
<tr class="covered-by-large-tests popin d-flex"><td data-title="46 tests cover line 33" data-content="&lt;ul&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\HelperTest::testIsRequestForApiV2&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testOnlyJsonCallsAreHandled&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testTimestampMiddleware&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testTimestampMiddlewareCheckFailMissing&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testTimestampMiddlewareCheckFailWrongFormat&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testTimestampMiddlewareCheckFailIfTooOld&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testApiThrottle&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testWrongMethodCall&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testAuthFailNoToken&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testAuthFailUnknownToken&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testAuthFailWrongSignature&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderDefault&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderGame&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldWork&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongPassword&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongEmail&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfCustomerNotActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerShouldFailIfCustomerAlreadyExists&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerValidationFailures&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerAlreadyActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerShouldFailWhenNothingChanges&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerByEmailOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiCompletelyDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndex&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswers&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswersWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::tes
<tr class="covered-by-large-tests popin d-flex"><td data-title="46 tests cover line 34" data-content="&lt;ul&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\HelperTest::testIsRequestForApiV2&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testOnlyJsonCallsAreHandled&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testTimestampMiddleware&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testTimestampMiddlewareCheckFailMissing&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testTimestampMiddlewareCheckFailWrongFormat&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testTimestampMiddlewareCheckFailIfTooOld&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testApiThrottle&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testWrongMethodCall&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testAuthFailNoToken&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testAuthFailUnknownToken&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testAuthFailWrongSignature&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderDefault&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderGame&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldWork&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongPassword&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongEmail&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfCustomerNotActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerShouldFailIfCustomerAlreadyExists&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerValidationFailures&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerAlreadyActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerShouldFailWhenNothingChanges&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerByEmailOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiCompletelyDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndex&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswers&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswersWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::tes
<tr class="covered-by-large-tests popin d-flex"><td data-title="46 tests cover line 35" data-content="&lt;ul&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\HelperTest::testIsRequestForApiV2&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testOnlyJsonCallsAreHandled&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testTimestampMiddleware&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testTimestampMiddlewareCheckFailMissing&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testTimestampMiddlewareCheckFailWrongFormat&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testTimestampMiddlewareCheckFailIfTooOld&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testApiThrottle&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testWrongMethodCall&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testAuthFailNoToken&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testAuthFailUnknownToken&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testAuthFailWrongSignature&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderDefault&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderGame&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldWork&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongPassword&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongEmail&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfCustomerNotActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerShouldFailIfCustomerAlreadyExists&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerValidationFailures&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerAlreadyActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerShouldFailWhenNothingChanges&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerByEmailOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiCompletelyDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndex&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswers&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswersWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::tes
<tr class=" d-flex"><td class="col-1 text-right"><a id="36" href="#36">36</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">}</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="37" href="#37">37</a></td><td class="col-11 codeLine"></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="38" href="#38">38</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/**</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="39" href="#39">39</a></td><td class="col-11 codeLine"><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Tells&nbsp;if&nbsp;the&nbsp;request&nbsp;is&nbsp;within&nbsp;apiV1&nbsp;routes</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="40" href="#40">40</a></td><td class="col-11 codeLine"><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="41" href="#41">41</a></td><td class="col-11 codeLine"><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;Request&nbsp;$request</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="42" href="#42">42</a></td><td class="col-11 codeLine"><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;boolean</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="43" href="#43">43</a></td><td class="col-11 codeLine"><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="44" href="#44">44</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span class="default">&nbsp;</span><span class="keyword">static</span><span class="default">&nbsp;</span><span class="keyword">function</span><span class="default">&nbsp;</span><span class="default">isRequestForApiV1</span><span class="keyword">(</span><span class="default">Request</span><span class="default">&nbsp;</span><span class="default">$request</span><span class="keyword">)</span><span class="keyword">:</span><span class="default">&nbsp;</span><span class="default">bool</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="45" href="#45">45</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">{</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="46" href="#46">46</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;*&nbsp;Small&nbsp;hack&nbsp;to&nbsp;ensure&nbsp;to&nbsp;know&nbsp;if&nbsp;route&nbsp;is&nbsp;From&nbsp;APIv1.</span></td></tr>
<tr class="covered-by-large-tests popin d-flex"><td data-title="45 tests cover line 47" data-content="&lt;ul&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\HelperTest::testIsRequestForApiV1&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testOnlyJsonCallsAreHandled&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testTimestampMiddleware&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testTimestampMiddlewareCheckFailMissing&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testTimestampMiddlewareCheckFailWrongFormat&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testTimestampMiddlewareCheckFailIfTooOld&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testApiThrottle&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testAuthFailNoToken&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testAuthFailUnknownToken&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testAuthFailWrongSignature&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderDefault&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderGame&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldWork&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongPassword&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongEmail&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfCustomerNotActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerShouldFailIfCustomerAlreadyExists&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerValidationFailures&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerAlreadyActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerShouldFailWhenNothingChanges&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerByEmailOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiCompletelyDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndex&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswers&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswersWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testCustomerUnAnsweredIndex&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\Ques
<tr class="covered-by-large-tests popin d-flex"><td data-title="45 tests cover line 48" data-content="&lt;ul&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\HelperTest::testIsRequestForApiV1&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testOnlyJsonCallsAreHandled&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testTimestampMiddleware&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testTimestampMiddlewareCheckFailMissing&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testTimestampMiddlewareCheckFailWrongFormat&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testTimestampMiddlewareCheckFailIfTooOld&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testApiThrottle&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testAuthFailNoToken&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testAuthFailUnknownToken&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testAuthFailWrongSignature&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderDefault&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderGame&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldWork&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongPassword&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongEmail&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfCustomerNotActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerShouldFailIfCustomerAlreadyExists&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerValidationFailures&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerAlreadyActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerShouldFailWhenNothingChanges&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerByEmailOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiCompletelyDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndex&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswers&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswersWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testCustomerUnAnsweredIndex&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\Ques
<tr class="covered-by-large-tests popin d-flex"><td data-title="45 tests cover line 49" data-content="&lt;ul&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\HelperTest::testIsRequestForApiV1&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testOnlyJsonCallsAreHandled&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testTimestampMiddleware&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testTimestampMiddlewareCheckFailMissing&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testTimestampMiddlewareCheckFailWrongFormat&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testTimestampMiddlewareCheckFailIfTooOld&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testApiThrottle&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testAuthFailNoToken&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testAuthFailUnknownToken&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testAuthFailWrongSignature&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderDefault&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderGame&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldWork&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongPassword&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongEmail&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfCustomerNotActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerShouldFailIfCustomerAlreadyExists&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerValidationFailures&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerAlreadyActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerShouldFailWhenNothingChanges&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerByEmailOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiCompletelyDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndex&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswers&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswersWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testCustomerUnAnsweredIndex&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\Ques
<tr class=" d-flex"><td class="col-1 text-right"><a id="50" href="#50">50</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">}</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="51" href="#51">51</a></td><td class="col-11 codeLine"></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="52" href="#52">52</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/**</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="53" href="#53">53</a></td><td class="col-11 codeLine"><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Try&nbsp;to&nbsp;get&nbsp;current&nbsp;route&nbsp;name</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="54" href="#54">54</a></td><td class="col-11 codeLine"><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="55" href="#55">55</a></td><td class="col-11 codeLine"><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;Request&nbsp;$request</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="56" href="#56">56</a></td><td class="col-11 codeLine"><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;string|null</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="57" href="#57">57</a></td><td class="col-11 codeLine"><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="58" href="#58">58</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span class="default">&nbsp;</span><span class="keyword">static</span><span class="default">&nbsp;</span><span class="keyword">function</span><span class="default">&nbsp;</span><span class="default">getRouteName</span><span class="keyword">(</span><span class="default">Request</span><span class="default">&nbsp;</span><span class="default">$request</span><span class="keyword">)</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="59" href="#59">59</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">{</span></td></tr>
<tr class="covered-by-large-tests popin d-flex"><td data-title="48 tests cover line 60" data-content="&lt;ul&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\HelperTest::testGetRoute&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\HelperTest::testGetRouteName&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\HelperTest::testIsRequestForApiV2&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testOnlyJsonCallsAreHandled&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testTimestampMiddleware&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testTimestampMiddlewareCheckFailMissing&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testTimestampMiddlewareCheckFailWrongFormat&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testTimestampMiddlewareCheckFailIfTooOld&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testApiThrottle&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testWrongMethodCall&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testAuthFailNoToken&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testAuthFailUnknownToken&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testAuthFailWrongSignature&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderDefault&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderGame&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldWork&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongPassword&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongEmail&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfCustomerNotActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerShouldFailIfCustomerAlreadyExists&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerValidationFailures&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerAlreadyActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerShouldFailWhenNothingChanges&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerByEmailOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiCompletelyDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndex&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswers&lt;/li&gt;&lt;li class=&quot;cov
<tr class=" d-flex"><td class="col-1 text-right"><a id="61" href="#61">61</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">}</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="62" href="#62">62</a></td><td class="col-11 codeLine"></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="63" href="#63">63</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/**</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="64" href="#64">64</a></td><td class="col-11 codeLine"><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Get&nbsp;the&nbsp;bearer&nbsp;token&nbsp;from&nbsp;request</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="65" href="#65">65</a></td><td class="col-11 codeLine"><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="66" href="#66">66</a></td><td class="col-11 codeLine"><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;Request&nbsp;$request</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="67" href="#67">67</a></td><td class="col-11 codeLine"><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;string|null</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="68" href="#68">68</a></td><td class="col-11 codeLine"><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="69" href="#69">69</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span class="default">&nbsp;</span><span class="keyword">static</span><span class="default">&nbsp;</span><span class="keyword">function</span><span class="default">&nbsp;</span><span class="default">getBearerTokenFromRequest</span><span class="keyword">(</span><span class="default">Request</span><span class="default">&nbsp;</span><span class="default">$request</span><span class="keyword">)</span><span class="keyword">:</span><span class="default">&nbsp;</span><span class="keyword">?</span><span class="default">string</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="70" href="#70">70</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">{</span></td></tr>
<tr class="danger d-flex"><td class="col-1 text-right"><a id="71" href="#71">71</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="default">$header</span><span class="default">&nbsp;</span><span class="keyword">=</span><span class="default">&nbsp;</span><span class="default">$request</span><span class="default">-&gt;</span><span class="default">header</span><span class="keyword">(</span><span class="default">'Authorization'</span><span class="keyword">,</span><span class="default">&nbsp;</span><span class="default">''</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="72" href="#72">72</a></td><td class="col-11 codeLine"></td></tr>
<tr class="danger d-flex"><td class="col-1 text-right"><a id="73" href="#73">73</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span class="default">&nbsp;</span><span class="keyword">(</span><span class="default">Str</span><span class="default">::</span><span class="default">contains</span><span class="keyword">(</span><span class="default">$header</span><span class="keyword">,</span><span class="default">&nbsp;</span><span class="default">'Bearer&nbsp;'</span><span class="keyword">)</span><span class="keyword">)</span><span class="default">&nbsp;</span><span class="keyword">{</span></td></tr>
<tr class="danger d-flex"><td class="col-1 text-right"><a id="74" href="#74">74</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="default">$auths</span><span class="default">&nbsp;</span><span class="keyword">=</span><span class="default">&nbsp;</span><span class="default">\</span><span class="default">explode</span><span class="keyword">(</span><span class="default">','</span><span class="keyword">,</span><span class="default">&nbsp;</span><span class="default">$header</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
<tr class="danger d-flex"><td class="col-1 text-right"><a id="75" href="#75">75</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">foreach</span><span class="default">&nbsp;</span><span class="keyword">(</span><span class="default">$auths</span><span class="default">&nbsp;</span><span class="keyword">as</span><span class="default">&nbsp;</span><span class="default">$auth</span><span class="keyword">)</span><span class="default">&nbsp;</span><span class="keyword">{</span></td></tr>
<tr class="danger d-flex"><td class="col-1 text-right"><a id="76" href="#76">76</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span class="default">&nbsp;</span><span class="keyword">(</span><span class="default">Str</span><span class="default">::</span><span class="default">contains</span><span class="keyword">(</span><span class="default">$auth</span><span class="keyword">,</span><span class="default">&nbsp;</span><span class="default">'Bearer&nbsp;'</span><span class="keyword">)</span><span class="keyword">)</span><span class="default">&nbsp;</span><span class="keyword">{</span></td></tr>
<tr class="danger d-flex"><td class="col-1 text-right"><a id="77" href="#77">77</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span class="default">&nbsp;</span><span class="default">Str</span><span class="default">::</span><span class="default">substr</span><span class="keyword">(</span><span class="default">$auth</span><span class="keyword">,</span><span class="default">&nbsp;</span><span class="default">7</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="78" href="#78">78</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">}</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="79" href="#79">79</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">}</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="80" href="#80">80</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">}</span></td></tr>
<tr class="danger d-flex"><td class="col-1 text-right"><a id="81" href="#81">81</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span class="default">&nbsp;</span><span class="default">null</span><span class="keyword">;</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="82" href="#82">82</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">}</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="83" href="#83">83</a></td><td class="col-11 codeLine"></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="84" href="#84">84</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/**</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="85" href="#85">85</a></td><td class="col-11 codeLine"><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Try&nbsp;to&nbsp;get&nbsp;current&nbsp;route&nbsp;prefix</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="86" href="#86">86</a></td><td class="col-11 codeLine"><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="87" href="#87">87</a></td><td class="col-11 codeLine"><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;Request&nbsp;$request</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="88" href="#88">88</a></td><td class="col-11 codeLine"><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;string|null</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="89" href="#89">89</a></td><td class="col-11 codeLine"><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="90" href="#90">90</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span class="default">&nbsp;</span><span class="keyword">static</span><span class="default">&nbsp;</span><span class="keyword">function</span><span class="default">&nbsp;</span><span class="default">getRoutePrefix</span><span class="keyword">(</span><span class="default">Request</span><span class="default">&nbsp;</span><span class="default">$request</span><span class="keyword">)</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="91" href="#91">91</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">{</span></td></tr>
<tr class="covered-by-large-tests popin d-flex"><td data-title="46 tests cover line 92" data-content="&lt;ul&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\HelperTest::testGetRoutePrefix&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\HelperTest::testIsRequestForApiV1&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testOnlyJsonCallsAreHandled&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testTimestampMiddleware&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testTimestampMiddlewareCheckFailMissing&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testTimestampMiddlewareCheckFailWrongFormat&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testTimestampMiddlewareCheckFailIfTooOld&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testApiThrottle&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testAuthFailNoToken&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testAuthFailUnknownToken&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testAuthFailWrongSignature&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderDefault&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderGame&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldWork&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongPassword&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongEmail&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfCustomerNotActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerShouldFailIfCustomerAlreadyExists&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerValidationFailures&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerAlreadyActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerShouldFailWhenNothingChanges&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerByEmailOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiCompletelyDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndex&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswers&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswersWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::test
<tr class="covered-by-large-tests popin d-flex"><td data-title="46 tests cover line 93" data-content="&lt;ul&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\HelperTest::testGetRoutePrefix&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\HelperTest::testIsRequestForApiV1&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testOnlyJsonCallsAreHandled&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testTimestampMiddleware&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testTimestampMiddlewareCheckFailMissing&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testTimestampMiddlewareCheckFailWrongFormat&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testTimestampMiddlewareCheckFailIfTooOld&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testApiThrottle&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testAuthFailNoToken&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testAuthFailUnknownToken&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testAuthFailWrongSignature&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderDefault&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderGame&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldWork&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongPassword&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongEmail&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfCustomerNotActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerShouldFailIfCustomerAlreadyExists&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerValidationFailures&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerAlreadyActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerShouldFailWhenNothingChanges&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerByEmailOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiCompletelyDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndex&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswers&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswersWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::test
<tr class=" d-flex"><td class="col-1 text-right"><a id="94" href="#94">94</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">}</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="95" href="#95">95</a></td><td class="col-11 codeLine"></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="96" href="#96">96</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/**</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="97" href="#97">97</a></td><td class="col-11 codeLine"><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Try&nbsp;to&nbsp;get&nbsp;route&nbsp;from&nbsp;request</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="98" href="#98">98</a></td><td class="col-11 codeLine"><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="99" href="#99">99</a></td><td class="col-11 codeLine"><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;Request&nbsp;$request</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="100" href="#100">100</a></td><td class="col-11 codeLine"><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;\Illuminate\Routing\Route|null</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="101" href="#101">101</a></td><td class="col-11 codeLine"><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="102" href="#102">102</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span class="default">&nbsp;</span><span class="keyword">static</span><span class="default">&nbsp;</span><span class="keyword">function</span><span class="default">&nbsp;</span><span class="default">getRoute</span><span class="keyword">(</span><span class="default">Request</span><span class="default">&nbsp;</span><span class="default">$request</span><span class="keyword">)</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="103" href="#103">103</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">{</span></td></tr>
<tr class="covered-by-large-tests popin d-flex"><td data-title="38 tests cover line 104" data-content="&lt;ul&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\HelperTest::testGetRoute&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testAuthFailUnknownToken&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testAuthFailWrongSignature&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderDefault&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderGame&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldWork&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongPassword&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongEmail&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfCustomerNotActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerShouldFailIfCustomerAlreadyExists&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerValidationFailures&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerAlreadyActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerShouldFailWhenNothingChanges&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerByEmailOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiCompletelyDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndex&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswers&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswersWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testCustomerUnAnsweredIndex&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testUnAnsweredIndexWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionSetAnswer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionSetAnswerWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSetSingleOptinOn&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSetSingleOptinOff&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSingleOptinShouldFailIfCustomerExists&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrand&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quo
<tr class=" d-flex"><td class="col-1 text-right"><a id="105" href="#105">105</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">}</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="106" href="#106">106</a></td><td class="col-11 codeLine"></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="107" href="#107">107</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/**</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="108" href="#108">108</a></td><td class="col-11 codeLine"><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Get&nbsp;composer.json&nbsp;infos</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="109" href="#109">109</a></td><td class="col-11 codeLine"><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="110" href="#110">110</a></td><td class="col-11 codeLine"><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;array</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="111" href="#111">111</a></td><td class="col-11 codeLine"><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="112" href="#112">112</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span class="default">&nbsp;</span><span class="keyword">static</span><span class="default">&nbsp;</span><span class="keyword">function</span><span class="default">&nbsp;</span><span class="default">getPackageInfo</span><span class="keyword">(</span><span class="keyword">)</span><span class="keyword">:</span><span class="default">&nbsp;</span><span class="keyword">array</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="113" href="#113">113</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">{</span></td></tr>
2022-06-09 11:30:49 +02:00
<tr class="covered-by-large-tests popin d-flex"><td data-title="115 tests cover line 114" data-content="&lt;ul&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\CrmClientV1CustomerTest::testGetCustomerById&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\CrmClientV1CustomerTest::testGetCustomerByIdShouldFail&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\CrmClientV1CustomerTest::testGetCustomerByEmail&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\CrmClientV1CustomerTest::testGetCustomerByEmailShouldFail&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\CrmClientV1CustomerTest::testCustomerStoreProps&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\CrmClientV1CustomerTest::testCustomerStorePropsShouldFailBecauseAlreadyExist&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\CrmClientV1CustomerTest::testCustomerStorePropsShouldFail&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\CrmClientV1CustomerTest::testCustomerUpdateProps&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\CrmClientV1CustomerTest::testCustomerLoginShouldFailDontExists&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\CrmClientV1CustomerTest::testCustomerLoginShouldFailNotActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\CrmClientV1CustomerTest::testCustomerActivate&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\CrmClientV1CustomerTest::testCustomerLogin&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\CrmClientV1CustomerTest::testCustomerActivateShouldFail&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\CrmClientV1CustomerTest::testCustomerToggleOptin&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\CrmClientV1CustomerTest::testCustomerRemoveOptin&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\CrmClientV1CustomerTest::testCustomerDelete&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\CrmClientV1CustomerTest::testCreateSingleOptin&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\CrmClientV1CustomerTest::testCreateSingleOptinShouldFail&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\CrmClientV1CustomerTest::testCreateArcadiaOutgoingMail&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\CrmClientV1CustomerTest::testCreateArcadiaOutgoingMailGameWithEan&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\CrmClientV1CustomerTest::testCreateArcadiaOutgoingMailGameWithoutEan&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\CrmClientV2ArcadiaTest::testArcadiaSendOrderDefault&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\CrmClientV2ArcadiaTest::testArcadiaOrderDefaultJson&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\CrmClientV2ArcadiaTest::testArcadiaSendOrderGame&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\CrmClientV2ArcadiaTest::testArcadiaSendOrderGameNullString&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\CrmClientV2ArcadiaTest::testArcadiaOrderGameJson&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\CrmClientV2ArcadiaTest::testValidateGeneratedXmlDefault&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\CrmClientV2ArcadiaTest::testValidateGeneratedXmlGame&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\CrmClientV2ClientTest::testApiInterface&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\CrmClientV2ClientTest::testClientPing&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\CrmClientV2ClientTest::testCrmModelSetUnknownAttribute&lt;/li&gt;&lt;li class=&quot;covered-by-la
Version 3.0.0 This removes api authentification with token in favor of signature method. Refactorize code and clean up. It add more unit test plus code coverage in test/converage. - Added config.api.timestampTimeout - Added Helper::signRequest This calculates the request signature - Added more unit tests and extend code coverage. - Added rate limiter for web routes - Added RemoveSpaces Sanitizer on api requests - Added stress test suite - Changed AuthServiceProvider api-token to api-hmac - Changed CustomerSeeder to have at least of customer activated (for unit tests) - Changed used transation for saveing multiple models - Changed, in ServiceController generateApiToken to generateServicePassword - Changed, timestamp has to be send in request with a DateTime format, it also has to a UTC value - Composer added brianium/paratest - Composer update - Fixed case where removing single optin could be the wrong one (not for the good service) - Fixed customer delete - Fixed customer would not be resolved by brand. - Fixed Really check that request is json checking body content, preventing sending malformed requests - Remove ApiError::needAuth - Removed api_token - Removed ApiController::authenticate - Removed config.api.tokenTimeout - Removed Header check or usage because of HAProxy doing weird stuff - Removed lock files from gitignore - Removed memcached dependency - Removed unused questions resources api routes - Removed workspace file Migrations - Added unique index on services.bearer_token - Changed customer_id on customer_answer is nullable - Changed services.bearer_pwd length to 312 (the size of the token) - Dropped services.api_token and service.api_token_date
2021-12-19 15:57:24 +01:00
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 115" data-content="&lt;ul&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\CrmClientV1CustomerTest::testGetCustomerById&lt;/li&gt;&lt;/ul&gt;" data-placement="top" data-html="true" class="col-1 text-right"><a id="115" href="#115">115</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">static</span><span class="default">::</span><span class="default">$packageInfos</span><span class="default">&nbsp;</span><span class="keyword">=</span><span class="default">&nbsp;</span><span class="default">\</span><span class="default">json_decode</span><span class="keyword">(</span><span class="default">\</span><span class="default">file_get_contents</span><span class="keyword">(</span><span class="default">__DIR__</span><span class="default">&nbsp;</span><span class="keyword">.</span><span class="default">&nbsp;</span><span class="default">'/../../composer.json'</span><span class="keyword">)</span><span class="keyword">,</span><span class="default">&nbsp;</span><span class="default">true</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="116" href="#116">116</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">}</span></td></tr>
2022-06-09 11:30:49 +02:00
<tr class="covered-by-large-tests popin d-flex"><td data-title="115 tests cover line 117" data-content="&lt;ul&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\CrmClientV1CustomerTest::testGetCustomerById&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\CrmClientV1CustomerTest::testGetCustomerByIdShouldFail&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\CrmClientV1CustomerTest::testGetCustomerByEmail&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\CrmClientV1CustomerTest::testGetCustomerByEmailShouldFail&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\CrmClientV1CustomerTest::testCustomerStoreProps&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\CrmClientV1CustomerTest::testCustomerStorePropsShouldFailBecauseAlreadyExist&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\CrmClientV1CustomerTest::testCustomerStorePropsShouldFail&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\CrmClientV1CustomerTest::testCustomerUpdateProps&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\CrmClientV1CustomerTest::testCustomerLoginShouldFailDontExists&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\CrmClientV1CustomerTest::testCustomerLoginShouldFailNotActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\CrmClientV1CustomerTest::testCustomerActivate&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\CrmClientV1CustomerTest::testCustomerLogin&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\CrmClientV1CustomerTest::testCustomerActivateShouldFail&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\CrmClientV1CustomerTest::testCustomerToggleOptin&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\CrmClientV1CustomerTest::testCustomerRemoveOptin&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\CrmClientV1CustomerTest::testCustomerDelete&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\CrmClientV1CustomerTest::testCreateSingleOptin&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\CrmClientV1CustomerTest::testCreateSingleOptinShouldFail&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\CrmClientV1CustomerTest::testCreateArcadiaOutgoingMail&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\CrmClientV1CustomerTest::testCreateArcadiaOutgoingMailGameWithEan&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\CrmClientV1CustomerTest::testCreateArcadiaOutgoingMailGameWithoutEan&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\CrmClientV2ArcadiaTest::testArcadiaSendOrderDefault&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\CrmClientV2ArcadiaTest::testArcadiaOrderDefaultJson&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\CrmClientV2ArcadiaTest::testArcadiaSendOrderGame&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\CrmClientV2ArcadiaTest::testArcadiaSendOrderGameNullString&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\CrmClientV2ArcadiaTest::testArcadiaOrderGameJson&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\CrmClientV2ArcadiaTest::testValidateGeneratedXmlDefault&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\CrmClientV2ArcadiaTest::testValidateGeneratedXmlGame&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\CrmClientV2ClientTest::testApiInterface&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\CrmClientV2ClientTest::testClientPing&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\Client\CrmClientV2ClientTest::testCrmModelSetUnknownAttribute&lt;/li&gt;&lt;li class=&quot;covered-by-la
Version 3.0.0 This removes api authentification with token in favor of signature method. Refactorize code and clean up. It add more unit test plus code coverage in test/converage. - Added config.api.timestampTimeout - Added Helper::signRequest This calculates the request signature - Added more unit tests and extend code coverage. - Added rate limiter for web routes - Added RemoveSpaces Sanitizer on api requests - Added stress test suite - Changed AuthServiceProvider api-token to api-hmac - Changed CustomerSeeder to have at least of customer activated (for unit tests) - Changed used transation for saveing multiple models - Changed, in ServiceController generateApiToken to generateServicePassword - Changed, timestamp has to be send in request with a DateTime format, it also has to a UTC value - Composer added brianium/paratest - Composer update - Fixed case where removing single optin could be the wrong one (not for the good service) - Fixed customer delete - Fixed customer would not be resolved by brand. - Fixed Really check that request is json checking body content, preventing sending malformed requests - Remove ApiError::needAuth - Removed api_token - Removed ApiController::authenticate - Removed config.api.tokenTimeout - Removed Header check or usage because of HAProxy doing weird stuff - Removed lock files from gitignore - Removed memcached dependency - Removed unused questions resources api routes - Removed workspace file Migrations - Added unique index on services.bearer_token - Changed customer_id on customer_answer is nullable - Changed services.bearer_pwd length to 312 (the size of the token) - Dropped services.api_token and service.api_token_date
2021-12-19 15:57:24 +01:00
<tr class=" d-flex"><td class="col-1 text-right"><a id="118" href="#118">118</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">}</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="119" href="#119">119</a></td><td class="col-11 codeLine"></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="120" href="#120">120</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/**</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="121" href="#121">121</a></td><td class="col-11 codeLine"><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Calculate&nbsp;the&nbsp;request&nbsp;signature</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="122" href="#122">122</a></td><td class="col-11 codeLine"><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="123" href="#123">123</a></td><td class="col-11 codeLine"><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;string&nbsp;$secret</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="124" href="#124">124</a></td><td class="col-11 codeLine"><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;string&nbsp;$uri</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="125" href="#125">125</a></td><td class="col-11 codeLine"><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;string&nbsp;$method</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="126" href="#126">126</a></td><td class="col-11 codeLine"><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;array&nbsp;&nbsp;$parameters</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="127" href="#127">127</a></td><td class="col-11 codeLine"><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;string&nbsp;request&nbsp;signature</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="128" href="#128">128</a></td><td class="col-11 codeLine"><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@throws&nbsp;CrmException&nbsp;If&nbsp;an&nbsp;error&nbsp;occurs.</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="129" href="#129">129</a></td><td class="col-11 codeLine"><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="130" href="#130">130</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span class="default">&nbsp;</span><span class="keyword">static</span><span class="default">&nbsp;</span><span class="keyword">function</span><span class="default">&nbsp;</span><span class="default">signRequest</span><span class="keyword">(</span><span class="default">string</span><span class="default">&nbsp;</span><span class="default">$secret</span><span class="keyword">,</span><span class="default">&nbsp;</span><span class="default">string</span><span class="default">&nbsp;</span><span class="default">$uri</span><span class="keyword">,</span><span class="default">&nbsp;</span><span class="default">string</span><span class="default">&nbsp;</span><span class="default">$method</span><span class="keyword">,</span><span class="default">&nbsp;</span><span class="keyword">array</span><span class="default">&nbsp;</span><span class="default">$parameters</span><span class="keyword">)</span><span class="keyword">:</span><span class="default">&nbsp;</span><span class="default">string</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="131" href="#131">131</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">{</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="132" href="#132">132</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span class="default">&nbsp;</span><span class="keyword">{</span></td></tr>
<tr class="covered-by-large-tests popin d-flex"><td data-title="36 tests cover line 133" data-content="&lt;ul&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testAuthFailWrongSignature&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderDefault&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderGame&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldWork&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongPassword&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongEmail&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfCustomerNotActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerShouldFailIfCustomerAlreadyExists&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerValidationFailures&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerAlreadyActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerShouldFailWhenNothingChanges&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerByEmailOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiCompletelyDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndex&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswers&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswersWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testCustomerUnAnsweredIndex&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testUnAnsweredIndexWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionSetAnswer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionSetAnswerWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSetSingleOptinOn&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSetSingleOptinOff&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSingleOptinShouldFailIfCustomerExists&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrand&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrandShouldFailWithInvalidDate&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrandShouldFailWithInvalidDateFormat
<tr class="covered-by-large-tests popin d-flex"><td data-title="36 tests cover line 134" data-content="&lt;ul&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testAuthFailWrongSignature&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderDefault&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderGame&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldWork&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongPassword&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongEmail&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfCustomerNotActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerShouldFailIfCustomerAlreadyExists&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerValidationFailures&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerAlreadyActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerShouldFailWhenNothingChanges&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerByEmailOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiCompletelyDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndex&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswers&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswersWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testCustomerUnAnsweredIndex&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testUnAnsweredIndexWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionSetAnswer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionSetAnswerWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSetSingleOptinOn&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSetSingleOptinOff&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSingleOptinShouldFailIfCustomerExists&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrand&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrandShouldFailWithInvalidDate&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrandShouldFailWithInvalidDateFormat
<tr class=" d-flex"><td class="col-1 text-right"><a id="135" href="#135">135</a></td><td class="col-11 codeLine"></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="136" href="#136">136</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;*&nbsp;Remove&nbsp;signature&nbsp;from&nbsp;parameters&nbsp;to&nbsp;calculate&nbsp;the&nbsp;hashmac.</span></td></tr>
<tr class="covered-by-large-tests popin d-flex"><td data-title="36 tests cover line 137" data-content="&lt;ul&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testAuthFailWrongSignature&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderDefault&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderGame&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldWork&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongPassword&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongEmail&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfCustomerNotActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerShouldFailIfCustomerAlreadyExists&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerValidationFailures&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerAlreadyActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerShouldFailWhenNothingChanges&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerByEmailOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiCompletelyDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndex&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswers&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswersWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testCustomerUnAnsweredIndex&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testUnAnsweredIndexWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionSetAnswer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionSetAnswerWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSetSingleOptinOn&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSetSingleOptinOff&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSingleOptinShouldFailIfCustomerExists&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrand&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrandShouldFailWithInvalidDate&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrandShouldFailWithInvalidDateFormat
<tr class="covered-by-large-tests popin d-flex"><td data-title="36 tests cover line 138" data-content="&lt;ul&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testAuthFailWrongSignature&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderDefault&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderGame&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldWork&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongPassword&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongEmail&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfCustomerNotActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerShouldFailIfCustomerAlreadyExists&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerValidationFailures&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerAlreadyActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerShouldFailWhenNothingChanges&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerByEmailOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiCompletelyDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndex&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswers&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswersWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testCustomerUnAnsweredIndex&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testUnAnsweredIndexWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionSetAnswer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionSetAnswerWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSetSingleOptinOn&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSetSingleOptinOff&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSingleOptinShouldFailIfCustomerExists&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrand&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrandShouldFailWithInvalidDate&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrandShouldFailWithInvalidDateFormat
2022-06-09 11:30:49 +02:00
<tr class=" d-flex"><td class="col-1 text-right"><a id="139" href="#139">139</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="default">'%s://%s%s'</span><span class="keyword">,</span></td></tr>
Version 3.0.0 This removes api authentification with token in favor of signature method. Refactorize code and clean up. It add more unit test plus code coverage in test/converage. - Added config.api.timestampTimeout - Added Helper::signRequest This calculates the request signature - Added more unit tests and extend code coverage. - Added rate limiter for web routes - Added RemoveSpaces Sanitizer on api requests - Added stress test suite - Changed AuthServiceProvider api-token to api-hmac - Changed CustomerSeeder to have at least of customer activated (for unit tests) - Changed used transation for saveing multiple models - Changed, in ServiceController generateApiToken to generateServicePassword - Changed, timestamp has to be send in request with a DateTime format, it also has to a UTC value - Composer added brianium/paratest - Composer update - Fixed case where removing single optin could be the wrong one (not for the good service) - Fixed customer delete - Fixed customer would not be resolved by brand. - Fixed Really check that request is json checking body content, preventing sending malformed requests - Remove ApiError::needAuth - Removed api_token - Removed ApiController::authenticate - Removed config.api.tokenTimeout - Removed Header check or usage because of HAProxy doing weird stuff - Removed lock files from gitignore - Removed memcached dependency - Removed unused questions resources api routes - Removed workspace file Migrations - Added unique index on services.bearer_token - Changed customer_id on customer_answer is nullable - Changed services.bearer_pwd length to 312 (the size of the token) - Dropped services.api_token and service.api_token_date
2021-12-19 15:57:24 +01:00
<tr class="covered-by-large-tests popin d-flex"><td data-title="36 tests cover line 140" data-content="&lt;ul&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testAuthFailWrongSignature&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderDefault&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderGame&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldWork&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongPassword&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongEmail&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfCustomerNotActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerShouldFailIfCustomerAlreadyExists&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerValidationFailures&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerAlreadyActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerShouldFailWhenNothingChanges&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerByEmailOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiCompletelyDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndex&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswers&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswersWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testCustomerUnAnsweredIndex&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testUnAnsweredIndexWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionSetAnswer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionSetAnswerWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSetSingleOptinOn&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSetSingleOptinOff&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSingleOptinShouldFailIfCustomerExists&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrand&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrandShouldFailWithInvalidDate&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrandShouldFailWithInvalidDateFormat
<tr class="covered-by-large-tests popin d-flex"><td data-title="36 tests cover line 141" data-content="&lt;ul&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testAuthFailWrongSignature&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderDefault&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderGame&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldWork&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongPassword&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongEmail&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfCustomerNotActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerShouldFailIfCustomerAlreadyExists&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerValidationFailures&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerAlreadyActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerShouldFailWhenNothingChanges&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerByEmailOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiCompletelyDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndex&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswers&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswersWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testCustomerUnAnsweredIndex&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testUnAnsweredIndexWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionSetAnswer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionSetAnswerWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSetSingleOptinOn&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSetSingleOptinOff&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSingleOptinShouldFailIfCustomerExists&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrand&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrandShouldFailWithInvalidDate&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrandShouldFailWithInvalidDateFormat
<tr class="covered-by-large-tests popin d-flex"><td data-title="36 tests cover line 142" data-content="&lt;ul&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testAuthFailWrongSignature&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderDefault&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderGame&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldWork&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongPassword&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongEmail&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfCustomerNotActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerShouldFailIfCustomerAlreadyExists&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerValidationFailures&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerAlreadyActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerShouldFailWhenNothingChanges&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerByEmailOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiCompletelyDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndex&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswers&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswersWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testCustomerUnAnsweredIndex&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testUnAnsweredIndexWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionSetAnswer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionSetAnswerWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSetSingleOptinOn&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSetSingleOptinOff&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSingleOptinShouldFailIfCustomerExists&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrand&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrandShouldFailWithInvalidDate&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrandShouldFailWithInvalidDateFormat
<tr class=" d-flex"><td class="col-1 text-right"><a id="143" href="#143">143</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">)</span><span class="keyword">,</span></td></tr>
2022-06-09 11:30:49 +02:00
<tr class=" d-flex"><td class="col-1 text-right"><a id="144" href="#144">144</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="default">'method'</span><span class="default">&nbsp;</span><span class="default">=&gt;</span><span class="default">&nbsp;</span><span class="default">$method</span></td></tr>
Version 3.0.0 This removes api authentification with token in favor of signature method. Refactorize code and clean up. It add more unit test plus code coverage in test/converage. - Added config.api.timestampTimeout - Added Helper::signRequest This calculates the request signature - Added more unit tests and extend code coverage. - Added rate limiter for web routes - Added RemoveSpaces Sanitizer on api requests - Added stress test suite - Changed AuthServiceProvider api-token to api-hmac - Changed CustomerSeeder to have at least of customer activated (for unit tests) - Changed used transation for saveing multiple models - Changed, in ServiceController generateApiToken to generateServicePassword - Changed, timestamp has to be send in request with a DateTime format, it also has to a UTC value - Composer added brianium/paratest - Composer update - Fixed case where removing single optin could be the wrong one (not for the good service) - Fixed customer delete - Fixed customer would not be resolved by brand. - Fixed Really check that request is json checking body content, preventing sending malformed requests - Remove ApiError::needAuth - Removed api_token - Removed ApiController::authenticate - Removed config.api.tokenTimeout - Removed Header check or usage because of HAProxy doing weird stuff - Removed lock files from gitignore - Removed memcached dependency - Removed unused questions resources api routes - Removed workspace file Migrations - Added unique index on services.bearer_token - Changed customer_id on customer_answer is nullable - Changed services.bearer_pwd length to 312 (the size of the token) - Dropped services.api_token and service.api_token_date
2021-12-19 15:57:24 +01:00
<tr class=" d-flex"><td class="col-1 text-right"><a id="145" href="#145">145</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">]</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="146" href="#146">146</a></td><td class="col-11 codeLine"></td></tr>
<tr class="covered-by-large-tests popin d-flex"><td data-title="36 tests cover line 147" data-content="&lt;ul&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testAuthFailWrongSignature&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderDefault&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderGame&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldWork&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongPassword&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongEmail&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfCustomerNotActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerShouldFailIfCustomerAlreadyExists&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerValidationFailures&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerAlreadyActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerShouldFailWhenNothingChanges&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerByEmailOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiCompletelyDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndex&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswers&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswersWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testCustomerUnAnsweredIndex&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testUnAnsweredIndexWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionSetAnswer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionSetAnswerWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSetSingleOptinOn&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSetSingleOptinOff&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSingleOptinShouldFailIfCustomerExists&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrand&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrandShouldFailWithInvalidDate&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrandShouldFailWithInvalidDateFormat
<tr class="covered-by-large-tests popin d-flex"><td data-title="36 tests cover line 148" data-content="&lt;ul&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testAuthFailWrongSignature&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderDefault&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderGame&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldWork&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongPassword&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongEmail&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfCustomerNotActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerShouldFailIfCustomerAlreadyExists&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerValidationFailures&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerAlreadyActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerShouldFailWhenNothingChanges&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerByEmailOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiCompletelyDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndex&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswers&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswersWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testCustomerUnAnsweredIndex&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testUnAnsweredIndexWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionSetAnswer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionSetAnswerWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSetSingleOptinOn&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSetSingleOptinOff&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSingleOptinShouldFailIfCustomerExists&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrand&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrandShouldFailWithInvalidDate&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrandShouldFailWithInvalidDateFormat
<tr class="covered-by-large-tests popin d-flex"><td data-title="36 tests cover line 149" data-content="&lt;ul&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testAuthFailWrongSignature&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderDefault&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderGame&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldWork&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongPassword&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongEmail&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfCustomerNotActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerShouldFailIfCustomerAlreadyExists&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerValidationFailures&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerAlreadyActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerShouldFailWhenNothingChanges&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerByEmailOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiCompletelyDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndex&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswers&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswersWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testCustomerUnAnsweredIndex&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testUnAnsweredIndexWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionSetAnswer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionSetAnswerWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSetSingleOptinOn&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSetSingleOptinOff&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSingleOptinShouldFailIfCustomerExists&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrand&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrandShouldFailWithInvalidDate&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrandShouldFailWithInvalidDateFormat
<tr class="covered-by-large-tests popin d-flex"><td data-title="36 tests cover line 150" data-content="&lt;ul&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testAuthFailWrongSignature&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderDefault&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderGame&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldWork&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongPassword&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongEmail&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfCustomerNotActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerShouldFailIfCustomerAlreadyExists&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerValidationFailures&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerAlreadyActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerShouldFailWhenNothingChanges&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerByEmailOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiCompletelyDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndex&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswers&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswersWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testCustomerUnAnsweredIndex&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testUnAnsweredIndexWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionSetAnswer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionSetAnswerWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSetSingleOptinOn&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSetSingleOptinOff&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSingleOptinShouldFailIfCustomerExists&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrand&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrandShouldFailWithInvalidDate&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrandShouldFailWithInvalidDateFormat
<tr class="covered-by-large-tests popin d-flex"><td data-title="3 tests cover line 151" data-content="&lt;ul&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderDefault&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderGame&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionSetAnswer&lt;/li&gt;&lt;/ul&gt;" data-placement="top" data-html="true" class="col-1 text-right"><a id="151" href="#151">151</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="default">$subArray</span><span class="default">&nbsp;</span><span class="keyword">=</span><span class="default">&nbsp;</span><span class="default">$flattenRequestArray</span><span class="keyword">(</span><span class="default">$value</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
<tr class="covered-by-large-tests popin d-flex"><td data-title="3 tests cover line 152" data-content="&lt;ul&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderDefault&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderGame&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionSetAnswer&lt;/li&gt;&lt;/ul&gt;" data-placement="top" data-html="true" class="col-1 text-right"><a id="152" href="#152">152</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">foreach</span><span class="default">&nbsp;</span><span class="keyword">(</span><span class="default">$subArray</span><span class="default">&nbsp;</span><span class="keyword">as</span><span class="default">&nbsp;</span><span class="default">$subKey</span><span class="default">&nbsp;</span><span class="default">=&gt;</span><span class="default">&nbsp;</span><span class="default">$subValue</span><span class="keyword">)</span><span class="default">&nbsp;</span><span class="keyword">{</span></td></tr>
<tr class="covered-by-large-tests popin d-flex"><td data-title="3 tests cover line 153" data-content="&lt;ul&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderDefault&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderGame&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionSetAnswer&lt;/li&gt;&lt;/ul&gt;" data-placement="top" data-html="true" class="col-1 text-right"><a id="153" href="#153">153</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="default">$out</span><span class="keyword">[</span><span class="string">&quot;</span><span class="string">$key</span><span class="string">.</span><span class="string">$subKey</span><span class="string">&quot;</span><span class="keyword">]</span><span class="default">&nbsp;</span><span class="keyword">=</span><span class="default">&nbsp;</span><span class="default">$subValue</span><span class="keyword">;</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="154" href="#154">154</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">}</span></td></tr>
<tr class="covered-by-large-tests popin d-flex"><td data-title="3 tests cover line 155" data-content="&lt;ul&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderDefault&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderGame&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionSetAnswer&lt;/li&gt;&lt;/ul&gt;" data-placement="top" data-html="true" class="col-1 text-right"><a id="155" href="#155">155</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">continue</span><span class="keyword">;</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="156" href="#156">156</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">}</span></td></tr>
<tr class="covered-by-large-tests popin d-flex"><td data-title="36 tests cover line 157" data-content="&lt;ul&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testAuthFailWrongSignature&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderDefault&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderGame&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldWork&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongPassword&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongEmail&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfCustomerNotActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerShouldFailIfCustomerAlreadyExists&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerValidationFailures&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerAlreadyActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerShouldFailWhenNothingChanges&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerByEmailOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiCompletelyDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndex&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswers&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswersWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testCustomerUnAnsweredIndex&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testUnAnsweredIndexWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionSetAnswer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionSetAnswerWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSetSingleOptinOn&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSetSingleOptinOff&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSingleOptinShouldFailIfCustomerExists&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrand&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrandShouldFailWithInvalidDate&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrandShouldFailWithInvalidDateFormat
<tr class=" d-flex"><td class="col-1 text-right"><a id="158" href="#158">158</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">}</span></td></tr>
<tr class="covered-by-large-tests popin d-flex"><td data-title="36 tests cover line 159" data-content="&lt;ul&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testAuthFailWrongSignature&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderDefault&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderGame&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldWork&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongPassword&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongEmail&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfCustomerNotActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerShouldFailIfCustomerAlreadyExists&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerValidationFailures&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerAlreadyActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerShouldFailWhenNothingChanges&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerByEmailOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiCompletelyDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndex&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswers&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswersWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testCustomerUnAnsweredIndex&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testUnAnsweredIndexWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionSetAnswer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionSetAnswerWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSetSingleOptinOn&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSetSingleOptinOff&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSingleOptinShouldFailIfCustomerExists&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrand&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrandShouldFailWithInvalidDate&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrandShouldFailWithInvalidDateFormat
2022-06-09 11:30:49 +02:00
<tr class=" d-flex"><td class="col-1 text-right"><a id="160" href="#160">160</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">}</span><span class="keyword">;</span></td></tr>
Version 3.0.0 This removes api authentification with token in favor of signature method. Refactorize code and clean up. It add more unit test plus code coverage in test/converage. - Added config.api.timestampTimeout - Added Helper::signRequest This calculates the request signature - Added more unit tests and extend code coverage. - Added rate limiter for web routes - Added RemoveSpaces Sanitizer on api requests - Added stress test suite - Changed AuthServiceProvider api-token to api-hmac - Changed CustomerSeeder to have at least of customer activated (for unit tests) - Changed used transation for saveing multiple models - Changed, in ServiceController generateApiToken to generateServicePassword - Changed, timestamp has to be send in request with a DateTime format, it also has to a UTC value - Composer added brianium/paratest - Composer update - Fixed case where removing single optin could be the wrong one (not for the good service) - Fixed customer delete - Fixed customer would not be resolved by brand. - Fixed Really check that request is json checking body content, preventing sending malformed requests - Remove ApiError::needAuth - Removed api_token - Removed ApiController::authenticate - Removed config.api.tokenTimeout - Removed Header check or usage because of HAProxy doing weird stuff - Removed lock files from gitignore - Removed memcached dependency - Removed unused questions resources api routes - Removed workspace file Migrations - Added unique index on services.bearer_token - Changed customer_id on customer_answer is nullable - Changed services.bearer_pwd length to 312 (the size of the token) - Dropped services.api_token and service.api_token_date
2021-12-19 15:57:24 +01:00
<tr class=" d-flex"><td class="col-1 text-right"><a id="161" href="#161">161</a></td><td class="col-11 codeLine"></td></tr>
<tr class="covered-by-large-tests popin d-flex"><td data-title="36 tests cover line 162" data-content="&lt;ul&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testAuthFailWrongSignature&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderDefault&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderGame&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldWork&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongPassword&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongEmail&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfCustomerNotActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerShouldFailIfCustomerAlreadyExists&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerValidationFailures&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerAlreadyActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerShouldFailWhenNothingChanges&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerByEmailOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiCompletelyDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndex&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswers&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswersWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testCustomerUnAnsweredIndex&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testUnAnsweredIndexWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionSetAnswer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionSetAnswerWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSetSingleOptinOn&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSetSingleOptinOff&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSingleOptinShouldFailIfCustomerExists&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrand&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrandShouldFailWithInvalidDate&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrandShouldFailWithInvalidDateFormat
<tr class="covered-by-large-tests popin d-flex"><td data-title="36 tests cover line 163" data-content="&lt;ul&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testAuthFailWrongSignature&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderDefault&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderGame&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldWork&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongPassword&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongEmail&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfCustomerNotActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerShouldFailIfCustomerAlreadyExists&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerValidationFailures&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerAlreadyActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerShouldFailWhenNothingChanges&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerByEmailOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiCompletelyDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndex&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswers&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswersWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testCustomerUnAnsweredIndex&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testUnAnsweredIndexWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionSetAnswer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionSetAnswerWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSetSingleOptinOn&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSetSingleOptinOff&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSingleOptinShouldFailIfCustomerExists&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrand&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrandShouldFailWithInvalidDate&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrandShouldFailWithInvalidDateFormat
<tr class=" d-flex"><td class="col-1 text-right"><a id="164" href="#164">164</a></td><td class="col-11 codeLine"></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="165" href="#165">165</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;*&nbsp;Remove&nbsp;signature&nbsp;from&nbsp;parameters.</span></td></tr>
<tr class="covered-by-large-tests popin d-flex"><td data-title="36 tests cover line 166" data-content="&lt;ul&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testAuthFailWrongSignature&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderDefault&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderGame&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldWork&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongPassword&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongEmail&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfCustomerNotActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerShouldFailIfCustomerAlreadyExists&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerValidationFailures&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerAlreadyActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerShouldFailWhenNothingChanges&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerByEmailOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiCompletelyDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndex&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswers&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswersWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testCustomerUnAnsweredIndex&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testUnAnsweredIndexWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionSetAnswer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionSetAnswerWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSetSingleOptinOn&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSetSingleOptinOff&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSingleOptinShouldFailIfCustomerExists&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrand&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrandShouldFailWithInvalidDate&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrandShouldFailWithInvalidDateFormat
<tr class=" d-flex"><td class="col-1 text-right"><a id="167" href="#167">167</a></td><td class="col-11 codeLine"></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="168" href="#168">168</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;*&nbsp;Natural&nbsp;sort&nbsp;all&nbsp;parameters.</span></td></tr>
<tr class="covered-by-large-tests popin d-flex"><td data-title="36 tests cover line 169" data-content="&lt;ul&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testAuthFailWrongSignature&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderDefault&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderGame&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldWork&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongPassword&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongEmail&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfCustomerNotActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerShouldFailIfCustomerAlreadyExists&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerValidationFailures&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerAlreadyActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerShouldFailWhenNothingChanges&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerByEmailOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiCompletelyDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndex&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswers&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswersWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testCustomerUnAnsweredIndex&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testUnAnsweredIndexWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionSetAnswer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionSetAnswerWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSetSingleOptinOn&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSetSingleOptinOff&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSingleOptinShouldFailIfCustomerExists&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrand&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrandShouldFailWithInvalidDate&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrandShouldFailWithInvalidDateFormat
<tr class="covered-by-large-tests popin d-flex"><td data-title="36 tests cover line 170" data-content="&lt;ul&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testAuthFailWrongSignature&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderDefault&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderGame&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldWork&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongPassword&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongEmail&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfCustomerNotActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerShouldFailIfCustomerAlreadyExists&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerValidationFailures&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerAlreadyActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerShouldFailWhenNothingChanges&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerByEmailOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiCompletelyDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndex&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswers&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswersWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testCustomerUnAnsweredIndex&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testUnAnsweredIndexWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionSetAnswer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionSetAnswerWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSetSingleOptinOn&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSetSingleOptinOff&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSingleOptinShouldFailIfCustomerExists&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrand&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrandShouldFailWithInvalidDate&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrandShouldFailWithInvalidDateFormat
<tr class="covered-by-large-tests popin d-flex"><td data-title="36 tests cover line 171" data-content="&lt;ul&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testAuthFailWrongSignature&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderDefault&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderGame&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldWork&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongPassword&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongEmail&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfCustomerNotActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerShouldFailIfCustomerAlreadyExists&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerValidationFailures&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerAlreadyActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerShouldFailWhenNothingChanges&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerByEmailOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiCompletelyDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndex&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswers&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswersWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testCustomerUnAnsweredIndex&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testUnAnsweredIndexWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionSetAnswer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionSetAnswerWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSetSingleOptinOn&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSetSingleOptinOff&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSingleOptinShouldFailIfCustomerExists&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrand&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrandShouldFailWithInvalidDate&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrandShouldFailWithInvalidDateFormat
2022-06-09 11:30:49 +02:00
<tr class=" d-flex"><td class="col-1 text-right"><a id="172" href="#172">172</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">}</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
Version 3.0.0 This removes api authentification with token in favor of signature method. Refactorize code and clean up. It add more unit test plus code coverage in test/converage. - Added config.api.timestampTimeout - Added Helper::signRequest This calculates the request signature - Added more unit tests and extend code coverage. - Added rate limiter for web routes - Added RemoveSpaces Sanitizer on api requests - Added stress test suite - Changed AuthServiceProvider api-token to api-hmac - Changed CustomerSeeder to have at least of customer activated (for unit tests) - Changed used transation for saveing multiple models - Changed, in ServiceController generateApiToken to generateServicePassword - Changed, timestamp has to be send in request with a DateTime format, it also has to a UTC value - Composer added brianium/paratest - Composer update - Fixed case where removing single optin could be the wrong one (not for the good service) - Fixed customer delete - Fixed customer would not be resolved by brand. - Fixed Really check that request is json checking body content, preventing sending malformed requests - Remove ApiError::needAuth - Removed api_token - Removed ApiController::authenticate - Removed config.api.tokenTimeout - Removed Header check or usage because of HAProxy doing weird stuff - Removed lock files from gitignore - Removed memcached dependency - Removed unused questions resources api routes - Removed workspace file Migrations - Added unique index on services.bearer_token - Changed customer_id on customer_answer is nullable - Changed services.bearer_pwd length to 312 (the size of the token) - Dropped services.api_token and service.api_token_date
2021-12-19 15:57:24 +01:00
<tr class=" d-flex"><td class="col-1 text-right"><a id="173" href="#173">173</a></td><td class="col-11 codeLine"></td></tr>
<tr class="covered-by-large-tests popin d-flex"><td data-title="36 tests cover line 174" data-content="&lt;ul&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testAuthFailWrongSignature&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderDefault&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderGame&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldWork&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongPassword&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongEmail&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfCustomerNotActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerShouldFailIfCustomerAlreadyExists&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerValidationFailures&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerAlreadyActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerShouldFailWhenNothingChanges&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerByEmailOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiCompletelyDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndex&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswers&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswersWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testCustomerUnAnsweredIndex&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testUnAnsweredIndexWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionSetAnswer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionSetAnswerWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSetSingleOptinOn&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSetSingleOptinOff&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSingleOptinShouldFailIfCustomerExists&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrand&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrandShouldFailWithInvalidDate&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrandShouldFailWithInvalidDateFormat
<tr class=" d-flex"><td class="col-1 text-right"><a id="175" href="#175">175</a></td><td class="col-11 codeLine"></td></tr>
<tr class="covered-by-large-tests popin d-flex"><td data-title="36 tests cover line 176" data-content="&lt;ul&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testAuthFailWrongSignature&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderDefault&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderGame&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldWork&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongPassword&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongEmail&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfCustomerNotActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerShouldFailIfCustomerAlreadyExists&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerValidationFailures&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerAlreadyActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerShouldFailWhenNothingChanges&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerByEmailOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiCompletelyDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndex&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswers&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswersWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testCustomerUnAnsweredIndex&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testUnAnsweredIndexWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionSetAnswer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionSetAnswerWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSetSingleOptinOn&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSetSingleOptinOff&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSingleOptinShouldFailIfCustomerExists&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrand&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrandShouldFailWithInvalidDate&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrandShouldFailWithInvalidDateFormat
2022-06-09 11:30:49 +02:00
<tr class=" d-flex"><td class="col-1 text-right"><a id="177" href="#177">177</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="default">'sha256'</span><span class="keyword">,</span></td></tr>
Version 3.0.0 This removes api authentification with token in favor of signature method. Refactorize code and clean up. It add more unit test plus code coverage in test/converage. - Added config.api.timestampTimeout - Added Helper::signRequest This calculates the request signature - Added more unit tests and extend code coverage. - Added rate limiter for web routes - Added RemoveSpaces Sanitizer on api requests - Added stress test suite - Changed AuthServiceProvider api-token to api-hmac - Changed CustomerSeeder to have at least of customer activated (for unit tests) - Changed used transation for saveing multiple models - Changed, in ServiceController generateApiToken to generateServicePassword - Changed, timestamp has to be send in request with a DateTime format, it also has to a UTC value - Composer added brianium/paratest - Composer update - Fixed case where removing single optin could be the wrong one (not for the good service) - Fixed customer delete - Fixed customer would not be resolved by brand. - Fixed Really check that request is json checking body content, preventing sending malformed requests - Remove ApiError::needAuth - Removed api_token - Removed ApiController::authenticate - Removed config.api.tokenTimeout - Removed Header check or usage because of HAProxy doing weird stuff - Removed lock files from gitignore - Removed memcached dependency - Removed unused questions resources api routes - Removed workspace file Migrations - Added unique index on services.bearer_token - Changed customer_id on customer_answer is nullable - Changed services.bearer_pwd length to 312 (the size of the token) - Dropped services.api_token and service.api_token_date
2021-12-19 15:57:24 +01:00
<tr class="covered-by-large-tests popin d-flex"><td data-title="36 tests cover line 178" data-content="&lt;ul&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testAuthFailWrongSignature&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderDefault&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderGame&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldWork&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongPassword&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongEmail&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfCustomerNotActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerShouldFailIfCustomerAlreadyExists&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerValidationFailures&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerAlreadyActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerShouldFailWhenNothingChanges&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerByEmailOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiCompletelyDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndex&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswers&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswersWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testCustomerUnAnsweredIndex&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testUnAnsweredIndexWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionSetAnswer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionSetAnswerWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSetSingleOptinOn&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSetSingleOptinOff&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSingleOptinShouldFailIfCustomerExists&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrand&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrandShouldFailWithInvalidDate&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrandShouldFailWithInvalidDateFormat
<tr class="covered-by-large-tests popin d-flex"><td data-title="36 tests cover line 179" data-content="&lt;ul&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testAuthFailWrongSignature&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderDefault&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderGame&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldWork&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongPassword&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongEmail&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfCustomerNotActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerShouldFailIfCustomerAlreadyExists&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerValidationFailures&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerAlreadyActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerShouldFailWhenNothingChanges&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerByEmailOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiCompletelyDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndex&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswers&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswersWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testCustomerUnAnsweredIndex&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testUnAnsweredIndexWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionSetAnswer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionSetAnswerWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSetSingleOptinOn&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSetSingleOptinOff&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSingleOptinShouldFailIfCustomerExists&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrand&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrandShouldFailWithInvalidDate&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrandShouldFailWithInvalidDateFormat
2022-06-09 11:30:49 +02:00
<tr class=" d-flex"><td class="col-1 text-right"><a id="180" href="#180">180</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="default">true</span></td></tr>
Version 3.0.0 This removes api authentification with token in favor of signature method. Refactorize code and clean up. It add more unit test plus code coverage in test/converage. - Added config.api.timestampTimeout - Added Helper::signRequest This calculates the request signature - Added more unit tests and extend code coverage. - Added rate limiter for web routes - Added RemoveSpaces Sanitizer on api requests - Added stress test suite - Changed AuthServiceProvider api-token to api-hmac - Changed CustomerSeeder to have at least of customer activated (for unit tests) - Changed used transation for saveing multiple models - Changed, in ServiceController generateApiToken to generateServicePassword - Changed, timestamp has to be send in request with a DateTime format, it also has to a UTC value - Composer added brianium/paratest - Composer update - Fixed case where removing single optin could be the wrong one (not for the good service) - Fixed customer delete - Fixed customer would not be resolved by brand. - Fixed Really check that request is json checking body content, preventing sending malformed requests - Remove ApiError::needAuth - Removed api_token - Removed ApiController::authenticate - Removed config.api.tokenTimeout - Removed Header check or usage because of HAProxy doing weird stuff - Removed lock files from gitignore - Removed memcached dependency - Removed unused questions resources api routes - Removed workspace file Migrations - Added unique index on services.bearer_token - Changed customer_id on customer_answer is nullable - Changed services.bearer_pwd length to 312 (the size of the token) - Dropped services.api_token and service.api_token_date
2021-12-19 15:57:24 +01:00
<tr class=" d-flex"><td class="col-1 text-right"><a id="181" href="#181">181</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">)</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="182" href="#182">182</a></td><td class="col-11 codeLine"></td></tr>
<tr class="covered-by-large-tests popin d-flex"><td data-title="36 tests cover line 183" data-content="&lt;ul&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testAuthFailWrongSignature&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderDefault&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderGame&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldWork&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongPassword&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongEmail&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfCustomerNotActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerShouldFailIfCustomerAlreadyExists&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerValidationFailures&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerAlreadyActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerShouldFailWhenNothingChanges&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerByEmailOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiCompletelyDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndex&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswers&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswersWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testCustomerUnAnsweredIndex&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testUnAnsweredIndexWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionSetAnswer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionSetAnswerWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSetSingleOptinOn&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSetSingleOptinOff&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSingleOptinShouldFailIfCustomerExists&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrand&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrandShouldFailWithInvalidDate&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrandShouldFailWithInvalidDateFormat
<tr class="danger d-flex"><td class="col-1 text-right"><a id="184" href="#184">184</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">throw</span><span class="default">&nbsp;</span><span class="keyword">new</span><span class="default">&nbsp;</span><span class="default">CrmException</span><span class="keyword">(</span><span class="default">'Failed&nbsp;to&nbsp;calculate&nbsp;requests&nbsp;hash'</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="185" href="#185">185</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">}</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="186" href="#186">186</a></td><td class="col-11 codeLine"></td></tr>
<tr class="covered-by-large-tests popin d-flex"><td data-title="36 tests cover line 187" data-content="&lt;ul&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ApiTest::testAuthFailWrongSignature&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderDefault&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\ArcadiaTest::testArcadiaSendOrderGame&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldWork&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongPassword&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfWrongEmail&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiAuthenticateCustomerShouldFailIfCustomerNotActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerShouldFailIfCustomerAlreadyExists&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiStoreCustomerValidationFailures&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testActivateCustomerAlreadyActivated&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiUpdateCustomerShouldFailWhenNothingChanges&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerByEmailOk&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiGetCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\CustomerTest::testApiCompletelyDestroyCustomer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndex&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswers&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionIndexWithAnswersWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testCustomerUnAnsweredIndex&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testUnAnsweredIndexWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionSetAnswer&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\QuestionTest::testQuestionSetAnswerWhenCustomerNotFound&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSetSingleOptinOn&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSetSingleOptinOff&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\SingleOptinTest::testSingleOptinShouldFailIfCustomerExists&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrand&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrandShouldFailWithInvalidDate&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;Tests\CRM\ApiV2\StatsTest::testStatsByBrandShouldFailWithInvalidDateFormat
<tr class="danger d-flex"><td class="col-1 text-right"><a id="188" href="#188">188</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">}</span><span class="default">&nbsp;</span><span class="keyword">catch</span><span class="default">&nbsp;</span><span class="keyword">(</span><span class="default">DecryptException</span><span class="default">&nbsp;</span><span class="default">$e</span><span class="keyword">)</span><span class="default">&nbsp;</span><span class="keyword">{</span></td></tr>
<tr class="danger d-flex"><td class="col-1 text-right"><a id="189" href="#189">189</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">throw</span><span class="default">&nbsp;</span><span class="keyword">new</span><span class="default">&nbsp;</span><span class="default">CrmException</span><span class="keyword">(</span><span class="default">'Failed&nbsp;to&nbsp;decrypt&nbsp;service&nbsp;credentials'</span><span class="keyword">,</span><span class="default">&nbsp;</span><span class="default">0</span><span class="keyword">,</span><span class="default">&nbsp;</span><span class="default">$e</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
<tr class="danger d-flex"><td class="col-1 text-right"><a id="190" href="#190">190</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">}</span><span class="default">&nbsp;</span><span class="keyword">catch</span><span class="default">&nbsp;</span><span class="keyword">(</span><span class="default">\</span><span class="default">Exception</span><span class="default">&nbsp;</span><span class="default">$e</span><span class="keyword">)</span><span class="default">&nbsp;</span><span class="keyword">{</span></td></tr>
<tr class="danger d-flex"><td class="col-1 text-right"><a id="191" href="#191">191</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">throw</span><span class="default">&nbsp;</span><span class="keyword">new</span><span class="default">&nbsp;</span><span class="default">CrmException</span><span class="keyword">(</span><span class="default">'An&nbsp;error&nbsp;occured&nbsp;when&nbsp;authenticating&nbsp;service'</span><span class="keyword">,</span><span class="default">&nbsp;</span><span class="default">0</span><span class="keyword">,</span><span class="default">&nbsp;</span><span class="default">$e</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="192" href="#192">192</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">}</span><span class="comment">//end&nbsp;try</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="193" href="#193">193</a></td><td class="col-11 codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">}</span></td></tr>
<tr class=" d-flex"><td class="col-1 text-right"><a id="194" href="#194">194</a></td><td class="col-11 codeLine"><span class="keyword">}</span></td></tr>
</tbody>
</table>
<footer>
<hr/>
<h4>Legend</h4>
<p><span class="success"><strong>Executed</strong></span><span class="danger"><strong>Not Executed</strong></span><span class="warning"><strong>Dead Code</strong></span></p>
<p>
<small>Generated by <a href="https://github.com/sebastianbergmann/php-code-coverage" target="_top">php-code-coverage 9.2.16</a> using <a href="https://secure.php.net/" target="_top">PHP 7.3.33-5+ubuntu20.04.1+deb.sury.org+1</a> and <a href="https://phpunit.de/">PHPUnit 9.5.23</a> at Wed Aug 24 11:52:02 CEST 2022.</small>
Version 3.0.0 This removes api authentification with token in favor of signature method. Refactorize code and clean up. It add more unit test plus code coverage in test/converage. - Added config.api.timestampTimeout - Added Helper::signRequest This calculates the request signature - Added more unit tests and extend code coverage. - Added rate limiter for web routes - Added RemoveSpaces Sanitizer on api requests - Added stress test suite - Changed AuthServiceProvider api-token to api-hmac - Changed CustomerSeeder to have at least of customer activated (for unit tests) - Changed used transation for saveing multiple models - Changed, in ServiceController generateApiToken to generateServicePassword - Changed, timestamp has to be send in request with a DateTime format, it also has to a UTC value - Composer added brianium/paratest - Composer update - Fixed case where removing single optin could be the wrong one (not for the good service) - Fixed customer delete - Fixed customer would not be resolved by brand. - Fixed Really check that request is json checking body content, preventing sending malformed requests - Remove ApiError::needAuth - Removed api_token - Removed ApiController::authenticate - Removed config.api.tokenTimeout - Removed Header check or usage because of HAProxy doing weird stuff - Removed lock files from gitignore - Removed memcached dependency - Removed unused questions resources api routes - Removed workspace file Migrations - Added unique index on services.bearer_token - Changed customer_id on customer_answer is nullable - Changed services.bearer_pwd length to 312 (the size of the token) - Dropped services.api_token and service.api_token_date
2021-12-19 15:57:24 +01:00
</p>
<a title="Back to the top" id="toplink" href="#">
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="16" viewBox="0 0 12 16"><path fill-rule="evenodd" d="M12 11L6 5l-6 6h12z"/></svg>
</a>
</footer>
</div>
<script src="../_js/jquery.min.js" type="text/javascript"></script>
<script src="../_js/popper.min.js" type="text/javascript"></script>
<script src="../_js/bootstrap.min.js" type="text/javascript"></script>
<script src="../_js/file.js" type="text/javascript"></script>
</body>
</html>