From d8f6123fa09540cfb7f800a41ddda790aafa411c Mon Sep 17 00:00:00 2001 From: Vincent Chalamon Date: Thu, 14 May 2020 19:36:31 +0200 Subject: [PATCH] Refacto User login --- .env.test | 1 + assets/js/_planning-missions.js | 4 +- assets/js/fos_js_routes.json | 2 +- config/packages/security.yaml | 30 +---- config/services_test.yaml | 10 +- features/organization/assets.feature | 61 +++------- features/organization/forecast.feature | 8 +- features/organization/home.feature | 19 ++- features/organization/mission_type.feature | 14 +-- features/organization/planning.feature | 14 +-- features/organization/search.feature | 38 +++--- features/organization/users.feature | 99 ++++++++------- features/user/account.feature | 2 +- features/user/availabilities.feature | 7 +- features/user/login.feature | 13 +- features/user/password.feature | 5 +- fixtures/organizations.yaml | 4 - fixtures/users.yaml | 12 +- src/Command/LoadOrganizationsCommand.php | 17 +-- .../AbstractOrganizationController.php | 11 +- .../AssetType/AssetTypeEditController.php | 10 +- .../AssetType/AssetTypeListController.php | 8 +- .../Organization/Children/EditController.php | 15 ++- .../Organization/Children/ListController.php | 22 +--- .../Organization/Children/NewController.php | 20 ++- .../AssetAddController.php | 7 +- .../AssetDeleteController.php | 5 +- .../AssetEditController.php | 5 +- .../AssetShowModalController.php | 6 +- .../AssetsListController.php | 10 +- .../AvailabilityController.php | 2 + .../AvailabilityMissionsFindController.php | 2 + .../PreAddAssetController.php | 7 +- .../Organization/DashboardController.php | 11 +- .../Forecast/PlanningForecastController.php | 9 +- .../Organization/IndexController.php | 19 --- .../Mission/AddUserAjaxController.php | 2 + .../Mission/MissionController.php | 28 ++--- .../Mission/MissionModalController.php | 8 +- .../MissionsFindByFiltersController.php | 9 +- .../MissionType/MissionTypeController.php | 14 +-- .../MissionTypeDeleteController.php | 2 +- .../PlanningCheckLastUpdateController.php | 9 +- .../Planning/PlanningController.php | 12 +- .../Planning/PlanningUpdateController.php | 10 +- .../Organization/SearchController.php | 10 +- .../Organization/Security/LoginController.php | 47 ------- .../Security/LogoutController.php | 20 --- .../User/AddToMissionModalController.php | 11 +- .../User/UserDeleteController.php | 15 ++- .../Organization/User/UserEditController.php | 17 ++- .../Organization/User/UserListController.php | 10 +- .../User/UserMissionsListController.php | 10 +- .../User/UserShowModalController.php | 8 +- .../User/Account/CreateAccountController.php | 2 +- .../User/Account/EditAccountController.php | 6 +- .../ManageAvailabilityController.php | 6 +- .../Availability/MissionModalController.php | 2 +- .../Availability/MissionsFindController.php | 5 +- .../User/Security/LoginController.php | 9 +- src/DataFixtures/ApplicationFixtures.php | 23 +--- src/Domain/PlanningDomain.php | 17 +-- src/Entity/Organization.php | 84 ++++--------- src/Entity/User.php | 79 ++++++++++-- src/EventListener/OrganizationListener.php | 67 ++++++++++ .../OrganizationSelectorFormFactory.php | 4 +- src/Form/Type/MissionTypeAssetTypesType.php | 34 ++++-- src/Form/Type/UserLoginType.php | 6 + src/Form/Type/UserType.php | 7 ++ src/Migrations/Version20200516150857.php | 42 +++++++ src/ParamConverter/AssetParamConverter.php | 13 +- .../OrganizationParamConverter.php | 54 -------- src/ParamConverter/UserParamConverter.php | 12 +- src/Repository/OrganizationRepository.php | 15 +-- .../OrganizationLoginFormAuthenticator.php | 115 ------------------ src/Security/UserAutomaticLoginHandler.php | 10 +- src/Security/UserLoginFormAuthenticator.php | 19 ++- .../Voter/CommissionableAssetVoter.php | 36 ------ src/Security/Voter/OrganizationVoter.php | 35 +++--- src/Security/Voter/UserVoter.php | 35 ------ src/Twig/Extension/OrganizationExtension.php | 26 ++-- templates/_navbar.html.twig | 15 ++- templates/base.html.twig | 4 + .../organization/assetType/edit.html.twig | 4 +- .../organization/assetType/list.html.twig | 4 +- templates/organization/base.html.twig | 44 +++---- .../commissionable_asset/_list.html.twig | 2 +- .../commissionable_asset/_show.html.twig | 4 +- .../commissionable_asset/form.html.twig | 2 +- .../commissionable_asset/list.html.twig | 2 +- .../commissionable_asset/preAdd.html.twig | 2 +- templates/organization/edit.html.twig | 2 +- templates/organization/home.html.twig | 12 +- templates/organization/list.html.twig | 14 +-- templates/organization/login.html.twig | 55 --------- .../organization/mission/_list.html.twig | 2 +- .../organization/mission/_list_full.html.twig | 6 +- .../organization/mission/_show.html.twig | 2 +- .../planning/_availabilities_assets.html.twig | 2 +- .../planning/_availabilities_users.html.twig | 4 +- .../organization/planning/_results.html.twig | 2 +- templates/organization/search.html.twig | 6 +- templates/organization/user/_list.html.twig | 2 +- templates/organization/user/_show.html.twig | 4 +- templates/organization/user/edit.html.twig | 2 +- templates/user/_user_form.html.twig | 11 +- templates/user/login.html.twig | 1 + tests/Behat/SecurityContext.php | 50 ++------ tests/Behat/UserPlanningContext.php | 26 ++-- .../Voter/CommissionableAssetVoterTest.php | 80 ------------ .../Security/Voter/OrganizationVoterTest.php | 73 ----------- translations/messages.fr.yaml | 1 + 112 files changed, 734 insertions(+), 1240 deletions(-) delete mode 100644 src/Controller/Organization/IndexController.php delete mode 100644 src/Controller/Organization/Security/LoginController.php delete mode 100644 src/Controller/Organization/Security/LogoutController.php create mode 100644 src/EventListener/OrganizationListener.php create mode 100644 src/Migrations/Version20200516150857.php delete mode 100644 src/ParamConverter/OrganizationParamConverter.php delete mode 100644 src/Security/OrganizationLoginFormAuthenticator.php delete mode 100644 src/Security/Voter/CommissionableAssetVoter.php delete mode 100644 src/Security/Voter/UserVoter.php delete mode 100644 templates/organization/login.html.twig delete mode 100644 tests/Security/Voter/CommissionableAssetVoterTest.php delete mode 100644 tests/Security/Voter/OrganizationVoterTest.php diff --git a/.env.test b/.env.test index 47001204..69562c40 100644 --- a/.env.test +++ b/.env.test @@ -5,3 +5,4 @@ SYMFONY_DEPRECATIONS_HELPER=disabled DATABASE_URL=postgresql://resop:postgrespwd@postgres/resop-test?serverVersion=11&charset=utf8 PANTHER_CHROME_ARGUMENTS="--headless --no-sandbox" PANTHER_APP_ENV=panther +APP_SLOT_INTERVAL="+2 hours" diff --git a/assets/js/_planning-missions.js b/assets/js/_planning-missions.js index d262c605..6ca4b05b 100644 --- a/assets/js/_planning-missions.js +++ b/assets/js/_planning-missions.js @@ -16,11 +16,11 @@ function setSlotMisssion(mission, $slot) { missionsText += ' '; // User part - let url = Routing.generate('app_user_availability_mission_modal', { id: mission.id }); + let url = Routing.generate('app_user_availability_mission_modal', { mission: mission.id }); if (window.location.pathname.indexOf('organizations') >= 0 && !!mission?.organization?.id) { // Organization part - url = Routing.generate('app_organization_mission_modal', { organization: mission.organization.id, id: mission.id }); + url = Routing.generate('app_organization_mission_modal', { organization: mission.organization.id, mission: mission.id }); } missionsText += $(` - + + + - {% include 'organization/_help.html.twig' %} + {% include 'organization/_help.html.twig' %} - {{ 'action.logout' | trans }} + {{ 'action.logout' | trans }} - - - {{ app.user }} - - {% endif %} + + + {{ app.request.attributes.get('currentOrganization') }} + diff --git a/templates/organization/commissionable_asset/_list.html.twig b/templates/organization/commissionable_asset/_list.html.twig index 9d8cee29..a4d36b07 100644 --- a/templates/organization/commissionable_asset/_list.html.twig +++ b/templates/organization/commissionable_asset/_list.html.twig @@ -32,7 +32,7 @@ {% if showLinks is not defined or showLinks %} - diff --git a/templates/organization/commissionable_asset/_show.html.twig b/templates/organization/commissionable_asset/_show.html.twig index 247b7fc0..04bc2b40 100644 --- a/templates/organization/commissionable_asset/_show.html.twig +++ b/templates/organization/commissionable_asset/_show.html.twig @@ -8,8 +8,8 @@ {% endif %} {% endmacro %} -{% if app.user == asset.organization or app.user == asset.organization.parent %} - {{ 'action.edit' | trans }} +{% if is_granted('ROLE_PARENT_ORGANIZATION', asset.organization) %} + {{ 'action.edit' | trans }} {% endif %}

{{ asset }}

diff --git a/templates/organization/commissionable_asset/form.html.twig b/templates/organization/commissionable_asset/form.html.twig index 8f07516d..693df12a 100644 --- a/templates/organization/commissionable_asset/form.html.twig +++ b/templates/organization/commissionable_asset/form.html.twig @@ -11,7 +11,7 @@ class="btn btn-outline-danger trigger-delete float-right" data-message="{{ 'message.deleteAssetWarning' | trans }}" data-display-name="{{ asset }}" - data-href="{{ path('app_organization_asset_delete', { asset: asset.id, organization: asset.organization.id }) }}" + data-href="{{ path('app_organization_asset_delete', { asset: asset.id }) }}" href="#" >{{ 'action.delete' | trans }} {% endif %} diff --git a/templates/organization/commissionable_asset/list.html.twig b/templates/organization/commissionable_asset/list.html.twig index 0a0c863b..ba9ff830 100644 --- a/templates/organization/commissionable_asset/list.html.twig +++ b/templates/organization/commissionable_asset/list.html.twig @@ -14,7 +14,7 @@
diff --git a/templates/organization/commissionable_asset/preAdd.html.twig b/templates/organization/commissionable_asset/preAdd.html.twig index 4ec23805..5b431a92 100644 --- a/templates/organization/commissionable_asset/preAdd.html.twig +++ b/templates/organization/commissionable_asset/preAdd.html.twig @@ -1,7 +1,7 @@ {% extends 'organization/base.html.twig' %} {% block body %} - {{ form_start(form, { method: 'GET', action: path('app_organization_asset_add', {organization: organization.id | default(app.user.id)})}) }} + {{ form_start(form, { method: 'GET', action: path('app_organization_asset_add')}) }} {{ form_rest(form) }} {{ form_end(form) }} {% endblock %} diff --git a/templates/organization/edit.html.twig b/templates/organization/edit.html.twig index 5b2f8c10..79b21b85 100644 --- a/templates/organization/edit.html.twig +++ b/templates/organization/edit.html.twig @@ -4,7 +4,7 @@ {% set formAction = path('app_organization_new') %} {% set formTitle = 'organization.add' | trans %} {% else %} - {% set formAction = path('app_organization_edit', { object: organization.id }) %} + {% set formAction = path('app_organization_edit', { organizationToEdit: organization.id }) %} {% set formTitle = 'organization.edit' | trans %} {% endif %} diff --git a/templates/organization/home.html.twig b/templates/organization/home.html.twig index eecba79d..efa509fe 100644 --- a/templates/organization/home.html.twig +++ b/templates/organization/home.html.twig @@ -5,27 +5,27 @@ {% block body %} {{ include('misc/flash-messages.html.twig') }} -

{{ app.user }}

+

{{ organization }}

{{ 'calendar.week.current' | trans }} : {{ 'calendar.period' | trans ({ '%from%' : 'this week' | date('d/m/Y'), '%to%' : 'sunday this week' | date('d/m/Y') }) }}

- + {{ 'organization.userAvailabilityCurrentWeek' | trans }}

{{ 'calendar.week.next' | trans }} : {{ 'calendar.period' | trans ({ '%from%' : 'next week' | date('d/m/Y'), '%to%' : 'sunday next week' | date('d/m/Y') }) }}

- + {{ 'organization.userAvailabilityNextWeek' | trans }}


-

{{ 'organization.showUserList' | trans }}

-

{{ 'organization.showCommissionableAssets' | trans }}

+

{{ 'organization.showUserList' | trans }}

+

{{ 'organization.showCommissionableAssets' | trans }}

- {% if app.user.isParent() %} + {% if organization.isParent() %}

{{ 'organization.showAllUsersAvailability' | trans }}

{{ 'organization.forecast' | trans }}

diff --git a/templates/organization/list.html.twig b/templates/organization/list.html.twig index d81c5084..d8a11b4a 100644 --- a/templates/organization/list.html.twig +++ b/templates/organization/list.html.twig @@ -3,7 +3,7 @@ {% block title %}{{ 'organization.list' | trans }}{% endblock %} {% block body %} -

{{ app.user }}

+

{{ organization }}

@@ -19,14 +19,14 @@ - {% for organization in organizations %} + {% for child in organization.children %} - {{ organization.name }} + {{ child.name }} - {{ 'action.edit' | trans }} - {{ 'organization.userList' | trans }} - {{ 'organization.assetsList' | trans }} - {{ 'organization.userAvailabilities' | trans }} + {{ 'action.edit' | trans }} + {{ 'organization.userList' | trans }} + {{ 'organization.assetsList' | trans }} + {{ 'organization.userAvailabilities' | trans }} {% endfor %} diff --git a/templates/organization/login.html.twig b/templates/organization/login.html.twig deleted file mode 100644 index d814e45e..00000000 --- a/templates/organization/login.html.twig +++ /dev/null @@ -1,55 +0,0 @@ -{% extends 'organization/base.html.twig' %} - -{% block title %}{{ 'action.login' | trans }}{% endblock %} - -{% block body %} -
-
-
- {% if error %} -
- {{ error.messageKey|trans(error.messageData, 'security_organization') }} -
- {% endif %} - -

{{ 'action.login' | trans }}

- -
- - -
- -
- - -
- -
- -
- - - - -
-
-
- -{% endblock %} diff --git a/templates/organization/mission/_list.html.twig b/templates/organization/mission/_list.html.twig index c8219ca7..785040d3 100644 --- a/templates/organization/mission/_list.html.twig +++ b/templates/organization/mission/_list.html.twig @@ -58,7 +58,7 @@ {% endif %} {% if modalLinks is not defined or modalLinks %} - {% endif %} diff --git a/templates/organization/mission/_list_full.html.twig b/templates/organization/mission/_list_full.html.twig index 0d2cbb83..3cbb0a06 100644 --- a/templates/organization/mission/_list_full.html.twig +++ b/templates/organization/mission/_list_full.html.twig @@ -23,7 +23,7 @@ {{ mission.type.name | default('') }} - @@ -45,7 +45,7 @@ {{ user.organization.name }} - @@ -66,7 +66,7 @@ {{ asset.organization.name }} - diff --git a/templates/organization/mission/_show.html.twig b/templates/organization/mission/_show.html.twig index d6510371..d99b2cdd 100644 --- a/templates/organization/mission/_show.html.twig +++ b/templates/organization/mission/_show.html.twig @@ -1,4 +1,4 @@ -{% if app.user == mission.organization %} +{% if organization == mission.organization %} {{ 'action.edit' | trans }} {% endif %} diff --git a/templates/organization/planning/_availabilities_assets.html.twig b/templates/organization/planning/_availabilities_assets.html.twig index 08268e7f..dc4ff5a3 100644 --- a/templates/organization/planning/_availabilities_assets.html.twig +++ b/templates/organization/planning/_availabilities_assets.html.twig @@ -11,7 +11,7 @@ {% endblock itemDataHeader %} {% block itemDataRowHeader %} - {% endblock itemDataRowHeader %} diff --git a/templates/organization/planning/_availabilities_users.html.twig b/templates/organization/planning/_availabilities_users.html.twig index d5d6b20b..8869ed3d 100644 --- a/templates/organization/planning/_availabilities_users.html.twig +++ b/templates/organization/planning/_availabilities_users.html.twig @@ -16,7 +16,7 @@ {% endblock itemDataHeader %} {% block itemDataRowHeader %} - @@ -43,7 +43,7 @@ from: periodCalculator.from | date('Y-m-d\\T00:00:00'), to: periodCalculator.to | date_modify('- 1 minute') | date('Y-m-d\\T00:00:00'), organization: item.entity.organization.id, - userToAdd: item.entity.id + user: item.entity.id }) }}" title="{{ 'organization.asset.engage' | trans }}" > {{ 'organization.mission.title' | trans }} diff --git a/templates/organization/planning/_results.html.twig b/templates/organization/planning/_results.html.twig index 68dd456d..fff30a5a 100644 --- a/templates/organization/planning/_results.html.twig +++ b/templates/organization/planning/_results.html.twig @@ -1,4 +1,4 @@ -{% set displayActions = app.user.parent is empty %} +{% set displayActions = organization.parent is empty %}
diff --git a/templates/organization/search.html.twig b/templates/organization/search.html.twig index 87cd27aa..e7c9e885 100644 --- a/templates/organization/search.html.twig +++ b/templates/organization/search.html.twig @@ -15,11 +15,11 @@

Bénévoles

{% if users|length %} - {% include 'organization/user/_list.html.twig' with {organization: app.user} %} + {% include 'organization/user/_list.html.twig' %} {% else %}

{{ 'organization.search.noUsers' | trans }}

{% endif %} -

Afficher la liste de mes bénévoles inscrits

+

Afficher la liste de mes bénévoles inscrits


Véhicules

@@ -28,5 +28,5 @@ {% else %}

{{ 'organization.search.noAssets' | trans }}

{% endif %} -

Afficher la liste de mes véhicules

+

Afficher la liste de mes véhicules

{% endblock %} diff --git a/templates/organization/user/_list.html.twig b/templates/organization/user/_list.html.twig index 385439b0..358867d1 100644 --- a/templates/organization/user/_list.html.twig +++ b/templates/organization/user/_list.html.twig @@ -38,7 +38,7 @@ {% if showLinks is not defined or showLinks %} - diff --git a/templates/organization/user/_show.html.twig b/templates/organization/user/_show.html.twig index 6b6f8c64..281b127b 100644 --- a/templates/organization/user/_show.html.twig +++ b/templates/organization/user/_show.html.twig @@ -1,5 +1,5 @@ -{% if app.user == user.organization or app.user == user.organization.parent %} - {{ 'action.edit' | trans }} +{% if is_granted('ROLE_PARENT_ORGANIZATION', user.organization) %} + {{ 'action.edit' | trans }} {% endif %}

{{ user }}

diff --git a/templates/organization/user/edit.html.twig b/templates/organization/user/edit.html.twig index 723ab5ad..e6ffd9ab 100644 --- a/templates/organization/user/edit.html.twig +++ b/templates/organization/user/edit.html.twig @@ -25,7 +25,7 @@ class="btn btn-outline-danger trigger-delete float-right" data-message="{{ 'message.deleteUserWarning' | trans }}" data-display-name="{{ user.firstName }} {{ user.lastName }} ( {{ user.identificationNumber }} )" - data-href="{{ path('app_organization_user_delete', { 'userToDelete': user.id }) }}" + data-href="{{ path('app_organization_user_delete', { user: user.id }) }}" href="#" >{{ 'action.delete' | trans }} diff --git a/templates/user/_user_form.html.twig b/templates/user/_user_form.html.twig index 5b340383..9c2fd1c0 100644 --- a/templates/user/_user_form.html.twig +++ b/templates/user/_user_form.html.twig @@ -30,9 +30,14 @@
-{% if form.birthday is defined %} - {{ form_row(form.birthday, { 'label': 'user.dob' | trans }) }} -{% endif %} +
+
+ {{ form_row(form.birthday, { 'label': 'user.dob' | trans }) }} +
+
+ {{ form_row(form.plainPassword, { 'label': 'user.password' | trans }) }} +
+
{{ form_row(form.vulnerable, { 'label': 'user.detail.vulnerable.label' | trans, 'help_attr': {'class': 'nowrap'} }) }} {{ form_row(form.organizationOccupation, { 'label': labels.organizationOccupation }) }} diff --git a/templates/user/login.html.twig b/templates/user/login.html.twig index e35247ce..d15719b0 100644 --- a/templates/user/login.html.twig +++ b/templates/user/login.html.twig @@ -23,6 +23,7 @@ {{ form_start(loginForm) }} {{ form_row(loginForm.identifier) }} {{ form_row(loginForm.birthday) }} + {{ form_row(loginForm.password) }}
diff --git a/tests/Behat/SecurityContext.php b/tests/Behat/SecurityContext.php index 8a1edccb..2798ce3b 100644 --- a/tests/Behat/SecurityContext.php +++ b/tests/Behat/SecurityContext.php @@ -4,9 +4,6 @@ namespace App\Tests\Behat; -use App\Entity\Organization; -use App\Entity\User; -use App\Repository\OrganizationRepository; use App\Repository\UserRepository; use Behat\Behat\Context\Environment\InitializedContextEnvironment; use Behat\Behat\Hook\Scope\BeforeScenarioScope; @@ -15,7 +12,6 @@ use Behat\MinkExtension\Context\MinkContext; use Behat\MinkExtension\Context\RawMinkContext; use PantherExtension\Driver\PantherDriver; -use Symfony\Bridge\Doctrine\Security\User\UserLoaderInterface; use Symfony\Component\BrowserKit\Cookie; use Symfony\Component\HttpFoundation\Session\SessionInterface; use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken; @@ -25,14 +21,12 @@ final class SecurityContext extends RawMinkContext { private UserRepository $userRepository; - private OrganizationRepository $organizationRepository; private SessionInterface $session; private MinkContext $minkContext; - public function __construct(UserRepository $userRepository, OrganizationRepository $organizationRepository, SessionInterface $session) + public function __construct(UserRepository $userRepository, SessionInterface $session) { $this->userRepository = $userRepository; - $this->organizationRepository = $organizationRepository; $this->session = $session; } @@ -51,16 +45,11 @@ public function gatherContext(BeforeScenarioScope $scope): void /** * @Given I am authenticated as :username */ - public function login(string $username, UserLoaderInterface $repository = null): void + public function login(string $username): void { - if ($repository) { - $user = $repository->loadUserByUsername($username); - } elseif (!$user = $this->userRepository->loadUserByUsername($username)) { - $user = $this->organizationRepository->loadUserByUsername($username); - } - + $user = $this->userRepository->loadUserByUsername($username); if (!$user) { - throw new UsernameNotFoundException(\sprintf('%s is not a valid User or Organization.', $username)); + throw new UsernameNotFoundException(\sprintf('%s is not a valid User.', $username)); } /** @var BrowserKitDriver|PantherDriver $driver */ @@ -72,10 +61,9 @@ public function login(string $username, UserLoaderInterface $repository = null): return; } - $firewall = $user instanceof Organization ? 'organizations' : 'main'; $this->session->set( - "_security_$firewall", - serialize(new UsernamePasswordToken($user, null, $firewall, $user->getRoles())) + '_security_main', + serialize(new UsernamePasswordToken($user, null, 'main', $user->getRoles())) ); $this->session->save(); @@ -88,29 +76,13 @@ public function login(string $username, UserLoaderInterface $repository = null): private function loginForPanther(UserInterface $user): void { try { - if ($user instanceof User) { - $this->loginUserForPantherDriver($user); - } - - if ($user instanceof Organization) { - $this->loginOrganizationForPantherDriver($user); - } + $this->minkContext->visit('/login'); + $this->minkContext->fillField('user_login[identifier]', $user->getUsername()); + $this->minkContext->fillField('user_login[password]', 'covid19'); + $this->minkContext->pressButton('Je me connecte'); + $this->minkContext->assertPageAddress('/'); } catch (\Exception $exception) { throw new ExpectationException(sprintf('Impossible to connect user: %s', $exception->getMessage()), $this->getSession(), $exception); } } - - private function loginUserForPantherDriver(User $user): void - { - throw new \Exception('Impossible to connect an User yet.'); - } - - private function loginOrganizationForPantherDriver(Organization $user): void - { - $this->minkContext->visit('/organizations/login'); - $this->minkContext->selectOption('identifier', $user->getUsername()); - $this->minkContext->fillField('password', 'covid19'); - $this->minkContext->pressButton('Je me connecte'); - $this->minkContext->assertPageAddress('/organizations/'.$user->getId()); - } } diff --git a/tests/Behat/UserPlanningContext.php b/tests/Behat/UserPlanningContext.php index 4681d008..094f4413 100644 --- a/tests/Behat/UserPlanningContext.php +++ b/tests/Behat/UserPlanningContext.php @@ -4,12 +4,20 @@ namespace App\Tests\Behat; +use App\Domain\DatePeriodCalculator; use Behat\Mink\Exception\ElementNotFoundException; use Behat\Mink\Exception\ExpectationException; use Behat\MinkExtension\Context\RawMinkContext; final class UserPlanningContext extends RawMinkContext { + private string $slotInterval; + + public function __construct(string $slotInterval) + { + $this->slotInterval = $slotInterval; + } + /** * @When /^I (?P(?:check|uncheck)) "(?P