namespace Converter\Filters;
use CalendarResult;
use DateOfCalendar;
class FilterResultsOfByNights extends TestCase
{
/** @var FilterResultsOfByNights */
private $sut;
/** @var CalendarResult */
private $providedCalendarResults;
public function setUp()
{
parent::setUp();
$this->serializer = SerializerBuilder::create()->setPropertyNamingStrategy(
new SerializedNameAnnotationStrategy(
new IdenticalPropertyNamingStrategy()
)
)->build();
$this->providedCalendarResults = new CalendarResult();
$this->sut = new FilterCalendarResults();
/**
* @test
*/
public function it_returns_original_calendar_result(): void
{
$expectedSerializedResult = '
{
"01 Dec 2022":{
"date":"01 Dec 2022",
"roomToBook":50,
"availability":"yes"
},
"02 Dec 2022":{
"date":"02 Dec 2022",
"roomToBook":20,
"availability":"yes"
}
}
';
// Given
$providedDateOne = (new DateOfCalendar())
->setDate('01 Dec 2022')
->setRoomToBook(50)
->setAvailability('bookable_rooms')
;
$providedDateTwo = (new DateOfCalendar())
->setDate('02 Dec 2022')
->setRoomToBook(20)
->setAvailability('bookable_rooms')
;
$providedNights = 1;
$this->providedCalendarResults->addDate($providedDateOne);
$this->providedCalendarResults->addDate($providedDateTwo);
// say actual result is collection of DateOfCalendar objet where property are private
$actualResults = $this->sut->filter($this->providedCalendarResults, $providedNights);
self::assertCount(2, $actualResults->getDatesArray());
self::assertSame(
$this->convertJsonToArray($expectedSerializedResult),
// json_ecode wont encode provate property so need to use serializer
$this->passThroughSerializer($actualResults->getDatesArray())
);
}
private function convertJsonToArray(string $jsonData): array
{
return json_decode(
$jsonData,
true
);
}
private function passThroughSerializer($value): array
{
$jsonData = $this->serializer->serialize($value, 'json');
return $this->serializer->deserialize(
$jsonData, 'array', 'json'
);
}
}