diff --git a/src/Filter/DateRange.php b/src/Filter/DateRange.php new file mode 100644 index 0000000000000000000000000000000000000000..5d7b488b2ad5469af4c572a435a32a193d869c55 --- /dev/null +++ b/src/Filter/DateRange.php @@ -0,0 +1,21 @@ +where( + $this->getColumn() . ' >= \'' . $this->getHttpValue()['from'] . ' 00:00:00\' AND ' . + $this->getColumn() . ' <= \'' . $this->getHttpValue()['to'] . ' 23:59:59\'', + ); + + return $queryBuilder; + } +} diff --git a/tests/FilterByDateRangeTest.php b/tests/FilterByDateRangeTest.php new file mode 100644 index 0000000000000000000000000000000000000000..48f45bd422ccf3e265c0db7ec2165bb1547d4e80 --- /dev/null +++ b/tests/FilterByDateRangeTest.php @@ -0,0 +1,186 @@ +em->getRepository(Post::class); + + $firstDate = DateTimeImmutable::createFromFormat('Y-m-d', '2020-01-01'); + $secondDate = DateTimeImmutable::createFromFormat('Y-m-d', '2020-01-05'); + + $post = new Post( + $this->faker->name(), + $this->faker->text(), + $this->faker->boolean(), + $firstDate, + ); + + $post2 = new Post( + $this->faker->name(), + $this->faker->text(), + $this->faker->boolean(), + $secondDate, + ); + + $this->em->persist($post); + $this->em->persist($post2); + $this->em->flush(); + + $result = $postRepository->createQueryByFilter([ + 'createdAt' => DateRange::class, + ], new Request([ + HttpFilter::REQUEST_FILTER_KEY => [ + 'createdAt' => [ + 'from' => $firstDate->format('Y-m-d'), + 'to' => $firstDate->add(new DateInterval('P1D'))->format('Y-m-d'), + ], + ], + ])) + ->getQuery() + ->getResult(); + + $this->assertNotEmpty($result); + $this->assertCount(1, $result); + } + + public function testSuccessFilterDateRangeWithSeveralResults(): void + { + /** @var PostRepository $postRepository */ + $postRepository = $this->em->getRepository(Post::class); + + $firstDate = DateTimeImmutable::createFromFormat('Y-m-d', '2020-01-01'); + $secondDate = DateTimeImmutable::createFromFormat('Y-m-d', '2020-01-05'); + + $post = new Post( + $this->faker->name(), + $this->faker->text(), + $this->faker->boolean(), + $firstDate, + ); + + $post2 = new Post( + $this->faker->name(), + $this->faker->text(), + $this->faker->boolean(), + $secondDate, + ); + + $this->em->persist($post); + $this->em->persist($post2); + $this->em->flush(); + + $result = $postRepository->createQueryByFilter([ + 'createdAt' => DateRange::class, + ], new Request([ + HttpFilter::REQUEST_FILTER_KEY => [ + 'createdAt' => [ + 'from' => $firstDate->format('Y-m-d'), + 'to' => $firstDate->add(new DateInterval('P10D'))->format('Y-m-d'), + ], + ], + ])) + ->getQuery() + ->getResult(); + + $this->assertNotEmpty($result); + $this->assertCount(2, $result); + } + + public function testSuccessFilterDateRangeWithBoundaryResults(): void + { + /** @var PostRepository $postRepository */ + $postRepository = $this->em->getRepository(Post::class); + + $firstDate = DateTimeImmutable::createFromFormat('Y-m-d', '2020-01-01'); + $secondDate = DateTimeImmutable::createFromFormat('Y-m-d', '2020-01-05'); + + $post = new Post( + $this->faker->name(), + $this->faker->text(), + $this->faker->boolean(), + $firstDate, + ); + + $post2 = new Post( + $this->faker->name(), + $this->faker->text(), + $this->faker->boolean(), + $secondDate, + ); + + $this->em->persist($post); + $this->em->persist($post2); + $this->em->flush(); + + $result = $postRepository->createQueryByFilter([ + 'createdAt' => DateRange::class, + ], new Request([ + HttpFilter::REQUEST_FILTER_KEY => [ + 'createdAt' => [ + 'from' => $firstDate->format('Y-m-d'), + 'to' => $secondDate->format('Y-m-d'), + ], + ], + ])) + ->getQuery() + ->getResult(); + + $this->assertNotEmpty($result); + $this->assertCount(2, $result); + } + + public function testSuccessFilterDateRangeWithoutResults(): void + { + /** @var PostRepository $postRepository */ + $postRepository = $this->em->getRepository(Post::class); + + $firstDate = DateTimeImmutable::createFromFormat('Y-m-d', '2020-01-01'); + $secondDate = DateTimeImmutable::createFromFormat('Y-m-d', '2020-01-05'); + + $post = new Post( + $this->faker->name(), + $this->faker->text(), + $this->faker->boolean(), + $firstDate, + ); + + $post2 = new Post( + $this->faker->name(), + $this->faker->text(), + $this->faker->boolean(), + $secondDate, + ); + + $this->em->persist($post); + $this->em->persist($post2); + $this->em->flush(); + + $result = $postRepository->createQueryByFilter([ + 'createdAt' => DateRange::class, + ], new Request([ + HttpFilter::REQUEST_FILTER_KEY => [ + 'createdAt' => [ + 'from' => $firstDate->add(new DateInterval('P1Y'))->format('Y-m-d'), + ], + ], + ])) + ->getQuery() + ->getResult(); + + $this->assertEmpty($result); + } +}