Settings Modernization: Refactoring

Settings Modernization: Fixing Date issue

Settings Modernization: Reroute

Settings Modernization: Reroute settings to /settings/profile, Cleanup and Refactoring
This commit is contained in:
frischler 2022-10-15 23:08:45 +02:00 committed by Igor Scheller
parent d6899d37d9
commit 63f1c12429
13 changed files with 109 additions and 378 deletions

View File

@ -74,7 +74,6 @@ $includeFiles = [
__DIR__ . '/../includes/pages/admin_user.php',
__DIR__ . '/../includes/pages/guest_login.php',
__DIR__ . '/../includes/pages/user_myshifts.php',
__DIR__ . '/../includes/pages/user_settings.php',
__DIR__ . '/../includes/pages/user_shifts.php',
__DIR__ . '/../includes/pages/schedule/ImportSchedule.php',

View File

@ -1,149 +0,0 @@
<?php
use Carbon\Carbon;
use Engelsystem\Models\User\User;
/**
* @return string
*/
function settings_title()
{
return __('Settings');
}
/**
* Change user main attributes (name, dates, etc.)
*
* @param User $user_source The user
* @param bool $enable_tshirt_size
* @param array $tshirt_sizes
* @return User
*/
function user_settings_main($user_source, $enable_tshirt_size, $tshirt_sizes)
{
$valid = true;
$request = request();
if ($request->has('mail')) {
$result = User_validate_mail($request->input('mail'));
$user_source->email = $result->getValue();
if (!$result->isValid()) {
$valid = false;
error(__('E-mail address is not correct.'));
}
} else {
$valid = false;
error(__('Please enter your e-mail.'));
}
$user_source->settings->email_shiftinfo = $request->has('email_shiftinfo');
$user_source->settings->email_human = $request->has('email_by_human_allowed');
$user_source->settings->email_news = $request->has('email_news');
if (config('enable_goody')) {
$user_source->settings->email_goody = $request->has('email_goody');
}
if ($request->has('tshirt_size') && isset($tshirt_sizes[$request->input('tshirt_size')])) {
$user_source->personalData->shirt_size = $request->input('tshirt_size');
} elseif ($enable_tshirt_size) {
$valid = false;
}
if ($request->has('planned_arrival_date') && $request->input('planned_arrival_date')) {
$tmp = parse_date('Y-m-d H:i', $request->input('planned_arrival_date') . ' 00:00');
$result = User_validate_planned_arrival_date($tmp);
$user_source->personalData->planned_arrival_date = Carbon::createFromTimestamp($result->getValue());
if (!$result->isValid()) {
$valid = false;
error(__('Please enter your planned date of arrival. It should be after the buildup start date and before teardown end date.'));
}
}
if ($request->has('planned_departure_date') && $request->input('planned_departure_date')) {
$tmp = parse_date('Y-m-d H:i', $request->input('planned_departure_date') . ' 00:00');
$plannedArrivalDate = $user_source->personalData->planned_arrival_date;
$result = User_validate_planned_departure_date(
$plannedArrivalDate ? $plannedArrivalDate->getTimestamp() : 0,
$tmp
);
$user_source->personalData->planned_departure_date = Carbon::createFromTimestamp($result->getValue());
if (!$result->isValid()) {
$valid = false;
error(__('Please enter your planned date of departure. It should be after your planned arrival date and after buildup start date and before teardown end date.'));
}
}
// Trivia
$pronoun = strip_request_item('pronoun', $user_source->personalData->pronoun);
if (config('enable_pronoun') && mb_strlen($pronoun) <= 15) {
$user_source->personalData->pronoun = $pronoun;
}
if (config('enable_user_name')) {
$user_source->personalData->last_name = strip_request_item('lastname', $user_source->personalData->last_name);
$user_source->personalData->first_name = strip_request_item('prename', $user_source->personalData->first_name);
}
if (config('enable_dect')) {
if (strlen(strip_request_item('dect')) <= 40) {
$user_source->contact->dect = strip_request_item('dect', $user_source->contact->dect);
} else {
$valid = false;
error(__('For dect numbers are only 40 digits allowed.'));
}
}
$user_source->contact->mobile = strip_request_item('mobile', $user_source->contact->mobile);
if (config('enable_mobile_show')) {
$user_source->settings->mobile_show = $request->has('mobile_show');
}
if ($valid) {
$user_source->save();
$user_source->contact->save();
$user_source->personalData->save();
$user_source->settings->save();
success(__('Settings saved.'));
throw_redirect(page_link_to('user_settings'));
}
return $user_source;
}
/**
* Main user settings page/controller
*
* @return string
*/
function user_settings()
{
$request = request();
$config = config();
$enable_tshirt_size = config('enable_tshirt_size');
$tshirt_sizes = config('tshirt_sizes');
$buildup_start_date = null;
$teardown_end_date = null;
if ($buildup = $config->get('buildup_start')) {
/** @var Carbon $buildup */
$buildup_start_date = $buildup->getTimestamp();
}
if ($teardown = $config->get('teardown_end')) {
/** @var Carbon $teardown */
$teardown_end_date = $teardown->getTimestamp();
}
$user_source = auth()->user();
if ($request->hasPostData('submit')) {
$user_source = user_settings_main($user_source, $enable_tshirt_size, $tshirt_sizes);
}
return User_settings_view(
$user_source,
$buildup_start_date,
$teardown_end_date,
$enable_tshirt_size,
$tshirt_sizes
);
}

View File

@ -65,9 +65,9 @@ function make_user_submenu()
if (auth()->can('user_settings')) {
$user_submenu[] = toolbar_dropdown_item(
page_link_to('user_settings'),
page_link_to('settings/profile'),
__('Settings'),
$page == 'user_settings',
$page == 'settings/profile',
'gear'
);
}

View File

@ -1,139 +1,11 @@
<?php
use Carbon\Carbon;
use Engelsystem\Http\UrlGeneratorInterface;
use Engelsystem\Models\Room;
use Engelsystem\Models\User\User;
use Engelsystem\Models\Worklog;
use Engelsystem\Renderer\Renderer;
use Illuminate\Support\Collection;
use Illuminate\Support\Str;
use Engelsystem\Controllers\SettingsController;
/**
* Renders user settings page
*
* @param User $user_source The user
* @param int $buildup_start_date Unix timestamp
* @param int $teardown_end_date Unix timestamp
* @param bool $enable_tshirt_size
* @param array $tshirt_sizes
*
* @return string
*/
function User_settings_view(
$user_source,
$buildup_start_date,
$teardown_end_date,
$enable_tshirt_size,
$tshirt_sizes
) {
$personalData = $user_source->personalData;
$enable_user_name = config('enable_user_name');
$enable_pronoun = config('enable_pronoun');
$enable_dect = config('enable_dect');
$enable_planned_arrival = config('enable_planned_arrival');
$enable_goody = config('enable_goody');
$enable_mobile_show = config('enable_mobile_show');
/** @var $urlGenerator UrlGeneratorInterface */
$urlGenerator = app(UrlGeneratorInterface::class);
/** @var Renderer $renderer */
$renderer = app(Renderer::class);
return $renderer->render(
'pages/settings/settings.twig',
[
'title' => 'settings.profile',
'settings_menu' => app()->make(SettingsController::class)->settingsMenu(),
'content' =>
msg()
. div('row', [
div('col-md-9', [
form([
form_info('', __('Here you can change your user details.')),
form_info(entry_required() . ' = ' . __('Entry required!')),
form_text('nick', __('Nick'), $user_source->name, true),
$enable_pronoun
? form_text('pronoun', __('Pronoun'), $personalData->pronoun, false, 15)
. form_info('', __('Will be shown on your profile page and in angel lists.'))
: '',
$enable_user_name
? form_text('lastname', __('Last name'), $personalData->last_name, false, 64)
: '',
$enable_user_name
? form_text('prename', __('First name'), $personalData->first_name, false, 64)
: '',
$enable_planned_arrival ? form_date(
'planned_arrival_date',
__('Planned date of arrival') . ' ' . entry_required(),
$personalData->planned_arrival_date
? $personalData->planned_arrival_date->getTimestamp()
: '',
$buildup_start_date,
$teardown_end_date
) : '',
$enable_planned_arrival ? form_date(
'planned_departure_date',
__('Planned date of departure'),
$personalData->planned_departure_date
? $personalData->planned_departure_date->getTimestamp()
: '',
$buildup_start_date,
$teardown_end_date
) : '',
$enable_dect ? form_text('dect', __('DECT'), $user_source->contact->dect, false, 40) : '',
form_text('mobile', __('Mobile'), $user_source->contact->mobile, false, 40),
$enable_mobile_show ? form_checkbox(
'mobile_show',
__('Show mobile number to other users to contact me'),
$user_source->settings->mobile_show
) : '',
form_text('mail', __('E-Mail') . ' ' . entry_required(), $user_source->email, false, 254),
form_checkbox(
'email_shiftinfo',
__(
'The %s is allowed to send me an email (e.g. when my shifts change)',
[config('app_name')]
),
$user_source->settings->email_shiftinfo
),
form_checkbox(
'email_news',
__('Notify me of new news'),
$user_source->settings->email_news
),
form_checkbox(
'email_by_human_allowed',
__('Allow heaven angels to contact you by e-mail.'),
$user_source->settings->email_human
),
$enable_goody ? form_checkbox(
'email_goody',
__('To receive vouchers, give consent that nick, email address, worked hours and shirt size will be stored until the next similar event.')
. (config('privacy_email') ? ' ' . __('To withdraw your approval, send an email to <a href="mailto:%s">%1$s</a>.', [config('privacy_email')]) : ''),
$user_source->settings->email_goody
) : '',
$enable_tshirt_size ? form_select(
'tshirt_size',
__('Shirt size'),
$tshirt_sizes,
$personalData->shirt_size,
__('Please select...')
) : '',
form_info(
'',
__(
'You can manage your Angeltypes <a href="%s">on the Angeltypes page</a>.',
[$urlGenerator->to('angeltypes')]
)
),
form_submit('submit', __('Save'))
]),
])
])
]
);
}
/**
* Gui for deleting user with password field.
@ -363,7 +235,7 @@ function User_view_shiftentries($needed_angel_type)
{
$shift_info = '<br><a href="'
. page_link_to('angeltypes', ['action' => 'view', 'angeltype_id' => $needed_angel_type['id']])
. '"><b>' . $needed_angel_type['name'] . '</a>:</b> ';
.'"><b>' . $needed_angel_type['name'] . '</a>:</b> ';
$shift_entries = [];
foreach ($needed_angel_type['users'] as $user_shift) {
@ -585,8 +457,8 @@ function User_view(
$auth = auth();
$nightShiftsConfig = config('night_shifts');
$user_name = htmlspecialchars(
$user_source->personalData->first_name
) . ' ' . htmlspecialchars($user_source->personalData->last_name);
$user_source->personalData->first_name) . ' ' . htmlspecialchars($user_source->personalData->last_name
);
$myshifts_table = '';
if ($its_me || $admin_user_privilege) {
$my_shifts = User_view_myshifts(
@ -658,7 +530,7 @@ function User_view(
icon('list') . __('Add work log')
) : '',
$its_me ? button(
page_link_to('user_settings'),
page_link_to('settings/profile'),
icon('gear') . __('Settings')
) : '',
($its_me && $auth->can('ical')) ? button(
@ -682,7 +554,7 @@ function User_view(
]),
div('row user-info', [
div('col-md-2', [
config('enable_dect') && $user_source->contact->dect ?
config('enable_dect') ?
heading(
icon('phone')
. ' <a href="tel:' . $user_source->contact->dect . '">'
@ -690,16 +562,6 @@ function User_view(
. '</a>'
)
: '' ,
config('enable_mobile_show') && $user_source->contact->mobile ?
$user_source->settings->mobile_show ?
heading(
icon('phone')
. ' <a href="tel:' . $user_source->contact->mobile . '">'
. $user_source->contact->mobile
. '</a>'
)
: ''
: '' ,
$auth->can('user_messages') ?
heading(
'<a href="' . page_link_to('/messages/' . $user_source->id) . '">'
@ -952,7 +814,7 @@ function User_Pronoun_render(User $user): string
*/
function render_profile_link($text, $user_id = null, $class = '')
{
$profile_link = page_link_to('user-settings');
$profile_link = page_link_to('settings/profile');
if (!is_null($user_id)) {
$profile_link = page_link_to('users', ['action' => 'view', 'user_id' => $user_id]);
}

View File

@ -245,7 +245,6 @@ msgstr ""
"Wir haben dir eine eMail mit einem Link zum Passwort-zurücksetzen geschickt."
#: resources/views/pages/password/reset-success.twig:9
#: includes/pages/user_settings.php:120
msgid "Password saved."
msgstr "Passwort gespeichert."
@ -388,7 +387,6 @@ msgid "The buildup start date has to be before the teardown end date."
msgstr "Das Aufbau Start Datum muss vor dem Abbau Ende Datum liegen."
#: includes/controller/event_config_controller.php:120
#: includes/pages/user_settings.php:93
msgid "Settings saved."
msgstr "Einstellungen gespeichert."
@ -1586,7 +1584,7 @@ msgstr "Der Nick &quot;%s&quot; existiert schon."
msgid "Please enter a nickname."
msgstr "Gib bitte einen Nick an."
#: includes/pages/guest_login.php:93 includes/pages/user_settings.php:32
#: includes/pages/guest_login.php:93
msgid "E-mail address is not correct."
msgstr "Die E-Mail Adresse ist nicht in Ordnung."
@ -1594,7 +1592,7 @@ msgstr "Die E-Mail Adresse ist nicht in Ordnung."
msgid "E-mail address is already used by another user."
msgstr "Die E-Mail Adresse wurde bereits von einem anderen User benutzt."
#: includes/pages/guest_login.php:101 includes/pages/user_settings.php:36
#: includes/pages/guest_login.php:101
msgid "Please enter your e-mail."
msgstr "Bitte gib Deine E-Mail-Adresse ein."
@ -1608,7 +1606,6 @@ msgid "Your password is too short (please use at least %s characters)."
msgstr "Dein Passwort ist zu kurz (Bitte mindestens %s Zeichen nutzen)."
#: includes/pages/guest_login.php:140 includes/pages/guest_login.php:144
#: includes/pages/user_settings.php:54
msgid ""
"Please enter your planned date of arrival. It should be after the buildup "
"start date and before teardown end date."
@ -1616,7 +1613,7 @@ msgstr ""
"Bitte gib Dein geplantes Ankunftsdatum an. Es sollte nach dem Aufbaubeginn "
"und vor dem Abbauende liegen."
#: includes/pages/guest_login.php:166 includes/pages/user_settings.php:82
#: includes/pages/guest_login.php:166
msgid "For dect numbers are only 40 digits allowed."
msgstr "Die DECT Nummer darf nur 40 Zeichen lang sein."
@ -1809,12 +1806,11 @@ msgstr "Unvollständiger Aufruf, fehlende Fragen ID."
msgid "No question found."
msgstr "Keine Frage gefunden."
#: includes/pages/user_settings.php:11 includes/sys_menu.php:69
#: includes/sys_menu.php:69
#: includes/view/User_view.php:616
msgid "Settings"
msgstr "Einstellungen"
#: includes/pages/user_settings.php:68
msgid ""
"Please enter your planned date of departure. It should be after your planned "
"arrival date and after buildup start date and before teardown end date."
@ -1822,11 +1818,9 @@ msgstr ""
"Bitte gibt dein geplantes Abreisedatum an. Es sollte nach Deinem "
"Anreisedatum, nach dem Aufbaubeginn und vor dem Abbauende liegen."
#: includes/pages/user_settings.php:113
msgid "-> not OK. Please try again."
msgstr "-> Nicht OK. Bitte erneut versuchen."
#: includes/pages/user_settings.php:115
msgid "Your password is to short (please use at least 6 characters)."
msgstr "Dein Passwort ist zu kurz (Bitte mindestens 6 Zeichen nutzen)."

View File

@ -139,7 +139,6 @@ msgid "The buildup start date has to be before the teardown end date."
msgstr "A data de montagem deve ser anterior a data de desmontagem do evento."
#: includes/controller/event_config_controller.php:92
#: includes/pages/user_settings.php:77
msgid "Settings saved."
msgstr "Configurações salvas."
@ -515,28 +514,26 @@ msgid "Token is not correct."
msgstr "O token não está correto."
#: includes/controller/users_controller.php:227
#: includes/pages/guest_login.php:102 includes/pages/user_settings.php:97
#: includes/pages/guest_login.php:102
msgid "Your passwords don't match."
msgstr "Suas senhas não correspondem."
#: includes/controller/users_controller.php:231
#: includes/pages/user_settings.php:95
msgid "Your password is to short (please use at least 6 characters)."
msgstr "Sua senha é muito curta (por favor use no mínimo 6 caracteres)."
#: includes/controller/users_controller.php:236
#: includes/pages/user_settings.php:99
msgid "Password saved."
msgstr "Sua senha foi salva."
#: includes/controller/users_controller.php:257
#: includes/controller/users_controller.php:261
#: includes/pages/guest_login.php:67 includes/pages/user_settings.php:21
#: includes/pages/guest_login.php:67
msgid "E-mail address is not correct."
msgstr "E-mail não está correto."
#: includes/controller/users_controller.php:265
#: includes/pages/guest_login.php:71 includes/pages/user_settings.php:25
#: includes/pages/guest_login.php:71
msgid "Please enter your e-mail."
msgstr "Por favor digite seu e-mail."
@ -1307,7 +1304,7 @@ msgstr "Seu apelido &quot;%s&quot; já existe."
msgid "Your nick &quot;%s&quot; is too short (min. 2 characters)."
msgstr "Seu apelido &quot;%s&quot; é muito pequeno (mínimo 2 caracteres)."
#: includes/pages/guest_login.php:86 includes/pages/user_settings.php:36
#: includes/pages/guest_login.php:86
msgid "Please check your jabber account information."
msgstr "Por favor verifique a informação da sua conta jabber."
@ -1320,7 +1317,7 @@ msgstr "Por favor escolha o tamanho da camisa."
msgid "Your password is too short (please use at least %s characters)."
msgstr "Sua senha é muito curta (por favor use pelo menos %s caracteres)."
#: includes/pages/guest_login.php:115 includes/pages/user_settings.php:52
#: includes/pages/guest_login.php:115
msgid ""
"Please enter your planned date of arrival. It should be after the buildup "
"start date and before teardown end date."
@ -1593,11 +1590,10 @@ msgstr "Chamada incompletada, falta o ID da pergunta."
msgid "No question found."
msgstr "Nenhuma dúvida encontrada."
#: includes/pages/user_settings.php:4 includes/view/User_view.php:332
#: includes/view/User_view.php:332
msgid "Settings"
msgstr "Configurações"
#: includes/pages/user_settings.php:62
msgid ""
"Please enter your planned date of departure. It should be after your planned "
"arrival date and after buildup start date and before teardown end date."
@ -1606,11 +1602,9 @@ msgstr ""
"chegada\n"
"e ao início da montagem, e anterior à data de desmontagem."
#: includes/pages/user_settings.php:93
msgid "-> not OK. Please try again."
msgstr "-> não OK. Por favor tente novamente."
#: includes/pages/user_settings.php:101
msgid "Failed setting password."
msgstr "A alteração da senha falhaou."

View File

@ -57,12 +57,13 @@
'max': config('teardown_end') ? config('teardown_end').format('Y-m-d') : '',
}
) }}
{% set planned_departure_date = user.personalData.planned_departure_date %}
{{ f.input(
'planned_departure_date',
__('settings.profile.planned_departure_date'),
'date',
{
'value': user.personalData.planned_departure_date.format('Y-m-d'),
'value': planned_departure_date ? planned_departure_date.format('Y-m-d') : '',
'min': config('buildup_start') ? config('buildup_start').format('Y-m-d') : '',
'max': config('teardown_end') ? config('teardown_end').format('Y-m-d') : '',
}

View File

@ -9,13 +9,14 @@ trait ChecksArrivalsAndDepartures
{
protected function isArrivalDateValid(?string $arrival, ?string $departure): bool
{
if (is_null($arrival)) {
$arrival_carbon = $this->toCarbon($arrival);
$departure_carbon = $this->toCarbon($departure);
if (is_null($arrival_carbon)) {
return false; // since required value
}
$arrival_carbon = $this->toCarbon($arrival);
if (!is_null($departure) && $arrival_carbon->greaterThan($this->toCarbon($departure))) {
if (!is_null($departure_carbon) && $arrival_carbon->greaterThan($departure_carbon)) {
return false;
}
@ -24,29 +25,32 @@ trait ChecksArrivalsAndDepartures
protected function isDepartureDateValid(?string $arrival, ?string $departure): bool
{
if (is_null($departure)) {
return true; // since optional value
}
$arrival_carbon = $this->toCarbon($arrival);
$departure_carbon = $this->toCarbon($departure);
return $departure_carbon->greaterThanOrEqualTo($this->toCarbon($arrival)) &&
if (is_null($departure_carbon)) {
return true; // since optional value
}
return $departure_carbon->greaterThanOrEqualTo($arrival_carbon) &&
!$this->isBeforeBuildup($departure_carbon) && !$this->isAfterTeardown($departure_carbon);
}
private function toCarbon(string $date_string): Carbon
private function toCarbon(?string $date_string): ?Carbon
{
return new Carbon(DateTime::createFromFormat('Y-m-d', $date_string));
$dateTime = DateTime::createFromFormat('Y-m-d', $date_string ?: '');
return $dateTime ? new Carbon($dateTime) : null;
}
private function isBeforeBuildup(Carbon $date): bool
{
$buildup = config('buildup_start');
return !empty($buildup) && $date->lessThan($buildup->setTime(0,0));
return !empty($buildup) && $date->lessThan($buildup->setTime(0, 0));
}
private function isAfterTeardown(Carbon $date): bool
{
$teardown = config('teardown_end');
return !empty($teardown) && $date->greaterThanOrEqualTo($teardown->addDay()->setTime(0,0));
return !empty($teardown) && $date->greaterThanOrEqualTo($teardown->addDay()->setTime(0, 0));
}
}

View File

@ -2,7 +2,6 @@
namespace Engelsystem\Controllers;
use Carbon\Carbon;
use Engelsystem\Config\Config;
use Engelsystem\Http\Exceptions\HttpNotFound;
use Engelsystem\Http\Response;
@ -107,14 +106,12 @@ class SettingsController extends BaseController
if (!$this->isArrivalDateValid($data['planned_arrival_date'], $data['planned_departure_date'])) {
$this->addNotification('settings.profile.planned_arrival_date.invalid', 'errors');
return $this->redirect->to('/settings/profile');
} else if (!$this->isDepartureDateValid($data['planned_arrival_date'], $data['planned_departure_date'])) {
} elseif (!$this->isDepartureDateValid($data['planned_arrival_date'], $data['planned_departure_date'])) {
$this->addNotification('settings.profile.planned_departure_date.invalid', 'errors');
return $this->redirect->to('/settings/profile');
} else {
$user->personalData->planned_arrival_date = $data['planned_arrival_date'];
$user->personalData->planned_departure_date = $data['planned_departure_date'];
$user->personalData->planned_departure_date = $data['planned_departure_date'] ?: null;
}
}
@ -124,12 +121,12 @@ class SettingsController extends BaseController
$user->contact->mobile = $data['mobile'];
$user->email = $data['email'];
$user->settings->email_shiftinfo = $data['email_shiftinfo'];
$user->settings->email_news = $data['email_news'];
$user->settings->email_human = $data['email_human'];
$user->settings->email_shiftinfo = $data['email_shiftinfo'] ?: false;
$user->settings->email_news = $data['email_news'] ?: false;
$user->settings->email_human = $data['email_human'] ?: false;
if (config('enable_goody')) {
$user->settings->email_goody = $data['email_goody'];
$user->settings->email_goody = $data['email_goody'] ?: false;
}
if (isset(config('tshirt_sizes')[$data['shirt_size']])) {
@ -301,7 +298,7 @@ class SettingsController extends BaseController
public function settingsMenu(): array
{
$menu = [
url('/user-settings') => 'settings.profile',
url('/settings/profile') => 'settings.profile',
url('/settings/password') => 'settings.password',
url('/settings/language') => 'settings.language',
url('/settings/theme') => 'settings.theme'

View File

@ -141,10 +141,6 @@ class LegacyMiddleware implements MiddlewareInterface
return [$title, $content];
case 'user_worklog':
return user_worklog_controller();
case 'user_settings':
$title = settings_title();
$content = user_settings();
return [$title, $content];
case 'register':
$title = register_title();
$content = guest_register();

View File

@ -9,35 +9,57 @@ use Engelsystem\Test\Unit\TestCase;
class ChecksArrivalsAndDeparturesTest extends TestCase
{
public function invalidDateCombinations(): array
public function invalidArrivalCombinations(): array
{
return [
[null, null, null, null], # arrival being null
[null, null, '2022-01-16', '2022-01-15'], # arrival greater than departure
['2022-01-15', '2022-01-15', '2022-01-14', '2022-01-16'], # arrival before buildup, departure after teardown
['2022-01-15', null, '2022-01-14', null], # arrival before buildup
[null, '2022-01-14', '2022-01-15', null], # arrival after teardown
];
}
public function validDateCombinations(): array
public function invalidDepartureCombinations(): array
{
return [
[null, null, '2022-01-16', '2022-01-15'], # departure smaller than arrival
['2022-01-15', null, null, '2022-01-14'], # departure before buildup
[null, '2022-01-14', null, '2022-01-15'], # departure after teardown
];
}
public function validArrivalCombinations(): array
{
return [
[null, null, '2022-01-15', '2022-01-15'], # arrival equals departure
[null, null, '2022-01-14', '2022-01-15'], # arrival smaller than departure
['2022-01-14', null, '2022-01-14', '2022-01-15'], # arrival on buildup
['2022-01-13', null, '2022-01-14', '2022-01-15'], # arrival after buildup
];
}
public function validDepartureCombinations(): array
{
return [
[null, null, '2022-01-15', null], # departure being null
[null, null, '2022-01-15', '2022-01-15'], # departure equals arrival
[null, null, '2022-01-14', '2022-01-15'], # departure greater than arrival
[null, '2022-01-15', '2022-01-14', '2022-01-15'], # departure on teardown
[null, '2022-01-16', '2022-01-14', '2022-01-15'], # departure before teardown
['2022-01-14', '2022-01-16', '2022-01-14', '2022-01-15'], # all together
];
}
/**
* @covers \Engelsystem\Controllers\ChecksArrivalsAndDepartures::isArrivalDateValid
* @dataProvider invalidDateCombinations
* @covers \Engelsystem\Controllers\ChecksArrivalsAndDepartures::toCarbon
* @covers \Engelsystem\Controllers\ChecksArrivalsAndDepartures::isBeforeBuildup
* @covers \Engelsystem\Controllers\ChecksArrivalsAndDepartures::isAfterTeardown
* @dataProvider invalidArrivalCombinations
*/
public function testCheckInvalidDatesForArrival($buildup, $teardown, $arrival, $departure)
{
config(['buildup_start' => is_null($buildup) ? null: new Carbon($buildup)]);
config(['teardown_end' => is_null($teardown) ? null: new Carbon($teardown)]);
config(['buildup_start' => is_null($buildup) ? null : new Carbon($buildup)]);
config(['teardown_end' => is_null($teardown) ? null : new Carbon($teardown)]);
$check = new ChecksArrivalsAndDeparturesImplementation();
$this->assertFalse($check->checkArrival($arrival, $departure));
@ -45,12 +67,15 @@ class ChecksArrivalsAndDeparturesTest extends TestCase
/**
* @covers \Engelsystem\Controllers\ChecksArrivalsAndDepartures::isDepartureDateValid
* @dataProvider invalidDateCombinations
* @covers \Engelsystem\Controllers\ChecksArrivalsAndDepartures::toCarbon
* @covers \Engelsystem\Controllers\ChecksArrivalsAndDepartures::isBeforeBuildup
* @covers \Engelsystem\Controllers\ChecksArrivalsAndDepartures::isAfterTeardown
* @dataProvider invalidDepartureCombinations
*/
public function testCheckInvalidDatesForDeparture($buildup, $teardown, $arrival, $departure)
{
config(['buildup_start' => is_null($buildup) ? null: new Carbon($buildup)]);
config(['teardown_end' => is_null($teardown) ? null: new Carbon($teardown)]);
config(['buildup_start' => is_null($buildup) ? null : new Carbon($buildup)]);
config(['teardown_end' => is_null($teardown) ? null : new Carbon($teardown)]);
$check = new ChecksArrivalsAndDeparturesImplementation();
$this->assertFalse($check->checkDeparture($arrival, $departure));
@ -58,12 +83,15 @@ class ChecksArrivalsAndDeparturesTest extends TestCase
/**
* @covers \Engelsystem\Controllers\ChecksArrivalsAndDepartures::isArrivalDateValid
* @dataProvider validDateCombinations
* @covers \Engelsystem\Controllers\ChecksArrivalsAndDepartures::toCarbon
* @covers \Engelsystem\Controllers\ChecksArrivalsAndDepartures::isBeforeBuildup
* @covers \Engelsystem\Controllers\ChecksArrivalsAndDepartures::isAfterTeardown
* @dataProvider validArrivalCombinations
*/
public function testCheckValidDatesForArrival($buildup, $teardown, $arrival, $departure)
{
config(['buildup_start' => is_null($buildup) ? null: new Carbon($buildup)]);
config(['teardown_end' => is_null($teardown) ? null: new Carbon($teardown)]);
config(['buildup_start' => is_null($buildup) ? null : new Carbon($buildup)]);
config(['teardown_end' => is_null($teardown) ? null : new Carbon($teardown)]);
$check = new ChecksArrivalsAndDeparturesImplementation();
$this->assertTrue($check->checkArrival($arrival, $departure));
@ -71,12 +99,15 @@ class ChecksArrivalsAndDeparturesTest extends TestCase
/**
* @covers \Engelsystem\Controllers\ChecksArrivalsAndDepartures::isDepartureDateValid
* @dataProvider validDateCombinations
* @covers \Engelsystem\Controllers\ChecksArrivalsAndDepartures::toCarbon
* @covers \Engelsystem\Controllers\ChecksArrivalsAndDepartures::isBeforeBuildup
* @covers \Engelsystem\Controllers\ChecksArrivalsAndDepartures::isAfterTeardown
* @dataProvider validDepartureCombinations
*/
public function testCheckValidDatesForDeparture($buildup, $teardown, $arrival, $departure)
{
config(['buildup_start' => is_null($buildup) ? null: new Carbon($buildup)]);
config(['teardown_end' => is_null($teardown) ? null: new Carbon($teardown)]);
config(['buildup_start' => is_null($buildup) ? null : new Carbon($buildup)]);
config(['teardown_end' => is_null($teardown) ? null : new Carbon($teardown)]);
$check = new ChecksArrivalsAndDeparturesImplementation();
$this->assertTrue($check->checkDeparture($arrival, $departure));

View File

@ -3,15 +3,10 @@
namespace Engelsystem\Test\Unit\Controllers;
use Engelsystem\Config\Config;
use Engelsystem\Controllers\Admin\UserShirtController;
use Engelsystem\Controllers\SettingsController;
use Engelsystem\Http\Exceptions\HttpNotFound;
use Engelsystem\Http\Redirector;
use Engelsystem\Http\Response;
use Engelsystem\Models\User\Contact;
use Engelsystem\Models\User\PersonalData;
use Engelsystem\Models\User\Settings;
use Engelsystem\Models\User\State;
use Engelsystem\Test\Unit\TestCase;
use PHPUnit\Framework\MockObject\MockObject;
use Symfony\Component\HttpFoundation\Session\Session;
@ -56,7 +51,8 @@ class SettingsControllerTest extends TestCase
/** @var SettingsController */
protected $controller;
protected function setUpProfileTest() {
protected function setUpProfileTest()
{
$body = [
'pronoun' => 'Herr',
'first_name' => 'John',
@ -128,8 +124,14 @@ class SettingsControllerTest extends TestCase
$this->assertEquals($body['pronoun'], $this->user->personalData->pronoun);
$this->assertEquals($body['first_name'], $this->user->personalData->first_name);
$this->assertEquals($body['last_name'], $this->user->personalData->last_name);
$this->assertEquals($body['planned_arrival_date'], $this->user->personalData->planned_arrival_date->format('Y-m-d'));
$this->assertEquals($body['planned_departure_date'], $this->user->personalData->planned_departure_date->format('Y-m-d'));
$this->assertEquals(
$body['planned_arrival_date'],
$this->user->personalData->planned_arrival_date->format('Y-m-d')
);
$this->assertEquals(
$body['planned_departure_date'],
$this->user->personalData->planned_departure_date->format('Y-m-d')
);
$this->assertEquals($body['dect'], $this->user->contact->dect);
$this->assertEquals($body['mobile'], $this->user->contact->mobile);
$this->assertEquals($body['email'], $this->user->email);
@ -565,7 +567,7 @@ class SettingsControllerTest extends TestCase
config(['oauth' => $providers]);
$this->assertEquals([
'http://localhost/user-settings' => 'settings.profile',
'http://localhost/settings/profile' => 'settings.profile',
'http://localhost/settings/password' => 'settings.password',
'http://localhost/settings/language' => 'settings.language',
'http://localhost/settings/theme' => 'settings.theme',
@ -574,7 +576,7 @@ class SettingsControllerTest extends TestCase
config(['oauth' => $providersHidden]);
$this->assertEquals([
'http://localhost/user-settings' => 'settings.profile',
'http://localhost/settings/profile' => 'settings.profile',
'http://localhost/settings/password' => 'settings.password',
'http://localhost/settings/language' => 'settings.language',
'http://localhost/settings/theme' => 'settings.theme',
@ -590,7 +592,7 @@ class SettingsControllerTest extends TestCase
config(['oauth' => []]);
$this->assertEquals([
'http://localhost/user-settings' => 'settings.profile',
'http://localhost/settings/profile' => 'settings.profile',
'http://localhost/settings/password' => 'settings.password',
'http://localhost/settings/language' => 'settings.language',
'http://localhost/settings/theme' => 'settings.theme'

View File

@ -8,12 +8,12 @@ class ChecksArrivalsAndDeparturesImplementation
{
use ChecksArrivalsAndDepartures;
public function checkArrival(string $arrival, string $departure): bool
public function checkArrival(?string $arrival, ?string $departure): bool
{
return $this->isArrivalDateValid($arrival, $departure);
}
public function checkDeparture(string $arrival, string $departure): bool
public function checkDeparture(?string $arrival, ?string $departure): bool
{
return $this->isDepartureDateValid($arrival, $departure);
}