Возникла задача с тестированием модуля подписок для drupal commerce. Модуль подписок должен отменять подписку при невозможности списания денег с карты подписчика. Но проблема в том, что после неудачного списания должно пройти 24 часа, прежде чем подписка будет отменена. После недели обычного тестирования я понял, что пора брать управление временем в свои руки.
Существует библиотека libfaketime, которая позволяет обманывать приложения, подсовывая им указанное вами время.
Чтобы использовать её в проекте docksal нужно:
1) Создать в папке проекта .docksal/services/cli/ файл Dockerfile
RUN git clone https://github.com/wolfcw/libfaketime && cd libfaketime && make && make install
после FROM нужно указать образ от которого вы будете наследоваться
2) В файл docksal.yml нужно дописать
cli:
image: ${COMPOSE_PROJECT_NAME_SAFE}_cli
build: services/cli
environment:
- LD_PRELOAD=/usr/local/lib/faketime/libfaketime.so.1
- FAKETIME=@2022-08-20 10:00:01
где в FAKETIME можно писать нужное время. Если убрать символ @ то время не будет идти, а замрет на указанном значении
3) Запускаем/перезапускаем проект fin p start
и проверяем время, например вызовом
<?php
echo date("Y-m-d H:i:s");
?>