selector = new EvolutionPeriodSelector(new Config()); } public function tearDown(): void { unset($_GET['period']); unset($_GET['idSite']); unset($_GET['date']); unset($_GET['compareSegments']); unset($_GET['comparePeriods']); unset($_GET['compareDates']); parent::tearDown(); } /** * @dataProvider getNumDaysDifferenceProvider */ public function testGetNumDaysDifference($expected, $date1, $date2) { $this->assertSame($expected, $this->selector->getNumDaysDifference(Date::factory($date1), Date::factory($date2))); } public function getNumDaysDifferenceProvider() { return [ [0, '2022-02-20','2022-02-20'], [0, '2022-02-20 01:02:03','2022-02-20 01:02:05'], [1, '2022-02-20 01:02:03','2022-02-20 16:02:05'], [1, '2022-02-20','2022-02-21'], [2, '2022-02-22','2022-02-20'], // first date is later [2, '2022-02-20','2022-02-22'], [792, '2020-02-20','2022-04-22'], ]; } public function testGetComparisonPeriodObjectsWhenNoPeriodsGiven() { $this->assertEquals([], $this->selector->getComparisonPeriodObjects(false, false)); $this->assertEquals([], $this->selector->getComparisonPeriodObjects([], [])); } public function testGetComparisonPeriodObjectsWhenOnlyOnePeriodGiven() { /** @var Period[] $periods */ $periods = $this->selector->getComparisonPeriodObjects(['day'], ['2022-01-02']); $this->assertSame('day', $periods[0]->getLabel()); $this->assertSame('2022-01-02,2022-01-02', $periods[0]->getRangeString()); $this->assertCount(1, $periods); } public function testGetComparisonPeriodObjectsWhenMultipleComparisonPeriodsGiven() { /** @var Period[] $periods */ $periods = $this->selector->getComparisonPeriodObjects(['week', 'month'], ['2022-01-02', '2020-05-09']); $this->assertSame('week', $periods[0]->getLabel()); $this->assertSame('2021-12-27,2022-01-02', $periods[0]->getRangeString()); $this->assertSame('month', $periods[1]->getLabel()); $this->assertSame('2020-05-01,2020-05-31', $periods[1]->getRangeString()); $this->assertCount(2, $periods); } public function testGetHighestPeriodInCommonNoComparision() { $day = Period\Factory::build('day', 'today'); $week = Period\Factory::build('week', 'today'); $month = Period\Factory::build('month', 'today'); $year = Period\Factory::build('year', 'today'); $shortRange = Period\Factory::build('range', '2022-01-02,2022-02-03'); $mediumRange = Period\Factory::build('range', '2022-01-02,2022-10-03'); $largeRange = Period\Factory::build('range', '2020-10-02,2022-10-03'); $this->assertHighestPeriodInCommon('day', $day, []); $this->assertHighestPeriodInCommon('day', $week, []); $this->assertHighestPeriodInCommon('day', $month, []); $this->assertHighestPeriodInCommon('week', $year, []); $this->assertHighestPeriodInCommon('day', $shortRange, []); $this->assertHighestPeriodInCommon('week', $mediumRange, []); $this->assertHighestPeriodInCommon('month', $largeRange, []); } public function testGetHighestPeriodInCommonWithComparision() { $day = Period\Factory::build('day', 'today'); $week = Period\Factory::build('week', 'today'); $month = Period\Factory::build('month', 'today'); $year = Period\Factory::build('year', 'today'); $shortRange = Period\Factory::build('range', '2022-01-02,2022-02-03'); $mediumRange = Period\Factory::build('range', '2022-01-02,2022-10-03'); $largeRange = Period\Factory::build('range', '2020-10-02,2022-10-03'); $this->assertHighestPeriodInCommon('day', $day, [$largeRange]); $this->assertHighestPeriodInCommon('day', $month, [$largeRange]); $this->assertHighestPeriodInCommon('week', $year, [$largeRange]); $this->assertHighestPeriodInCommon('week', $year, [$mediumRange, $year]); $this->assertHighestPeriodInCommon('week', $year, [$mediumRange]); $this->assertHighestPeriodInCommon('month', $largeRange, [$largeRange]); $this->assertHighestPeriodInCommon('day', $largeRange, [$largeRange, $shortRange]); $this->assertHighestPeriodInCommon('day', $largeRange, [$largeRange, $week]); } public function testSetSparklineDatePeriodsWhenNotComparing() { $day = Period\Factory::build('day', '2022-05-02'); $week = Period\Factory::build('week', '2022-05-02'); $month = Period\Factory::build('month', '2022-05-02'); $year = Period\Factory::build('year', '2022-05-02'); $shortRange = Period\Factory::build('range', '2022-01-02,2022-02-03'); $mediumRange = Period\Factory::build('range', '2022-01-02,2022-10-03'); $largeRange = Period\Factory::build('range', '2020-10-02,2022-10-03'); $this->assertSetSparklineDatePeriods(['period' => 'day','date' => '2022-04-03,2022-05-02'], $day, []); $this->assertSetSparklineDatePeriods(['period' => 'week','date' => '2021-10-11,2022-05-08'], $week, []); $this->assertSetSparklineDatePeriods(['period' => 'month','date' => '2019-12-01,2022-05-31'], $month, []); $this->assertSetSparklineDatePeriods(['period' => 'year','date' => '2013-01-01,2022-12-31'], $year, []); $this->assertSetSparklineDatePeriods(['period' => 'day','date' => '2022-01-02,2022-02-03'], $shortRange, []); $this->assertSetSparklineDatePeriods(['period' => 'week','date' => '2022-01-02,2022-10-03'], $mediumRange, []); $this->assertSetSparklineDatePeriods(['period' => 'month','date' => '2020-10-02,2022-10-03'], $largeRange, []); } public function testSetSparklineDatePeriodsWhenComparing() { $day = Period\Factory::build('day', '2022-05-02'); $dayPrevious = Period\Factory::build('day', '2022-05-01'); $week = Period\Factory::build('week', '2022-05-02'); $weekPrevious = Period\Factory::build('week', '2022-04-25'); $month = Period\Factory::build('month', '2022-05-02'); $monthPrevious = Period\Factory::build('month', '2022-04-02'); $year = Period\Factory::build('year', '2022-05-02'); $yearPrevious = Period\Factory::build('year', '2021-05-02'); $shortRange = Period\Factory::build('range', '2022-01-02,2022-02-03'); $shortRangePrevious = Period\Factory::build('range', '2021-12-20,2022-01-02'); $mediumRange = Period\Factory::build('range', '2022-01-02,2022-10-03'); $mediumRangePrevious = Period\Factory::build('range', '2021-04-02,2022-01-01'); $largeRange = Period\Factory::build('range', '2020-10-02,2022-10-03'); $largeRangePrevious = Period\Factory::build('range', '2018-09-02,2020-09-29'); // compare with previous $this->assertSetSparklineDatePeriods([ 'period' => 'day','date' => '2022-05-02,2022-05-02', 'comparePeriods' => ['day'], 'compareDates' => ['2022-05-01,2022-05-01'], ], $day, [$dayPrevious]); $this->assertSetSparklineDatePeriods([ 'period' => 'day','date' => $week->getRangeString(), 'comparePeriods' => ['day'], 'compareDates' => [$weekPrevious->getRangeString()], ], $week, [$weekPrevious]); $this->assertSetSparklineDatePeriods([ 'period' => 'day','date' => $month->getRangeString(), 'comparePeriods' => ['day'], 'compareDates' => [$monthPrevious->getRangeString()], ], $month, [$monthPrevious]); $this->assertSetSparklineDatePeriods([ 'period' => 'week','date' => $year->getRangeString(), 'comparePeriods' => ['week'], 'compareDates' => [$yearPrevious->getRangeString()], ], $year, [$yearPrevious]); $this->assertSetSparklineDatePeriods([ 'period' => 'day','date' => $shortRange->getRangeString(), 'comparePeriods' => ['day'], 'compareDates' => [$shortRangePrevious->getRangeString()], ], $shortRange, [$shortRangePrevious]); $this->assertSetSparklineDatePeriods([ 'period' => 'week','date' => $mediumRange->getRangeString(), 'comparePeriods' => ['week'], 'compareDates' => [$mediumRangePrevious->getRangeString()], ], $mediumRange, [$mediumRangePrevious]); $this->assertSetSparklineDatePeriods([ 'period' => 'month','date' => $largeRange->getRangeString(), 'comparePeriods' => ['month'], 'compareDates' => [$largeRangePrevious->getRangeString()], ], $largeRange, [$largeRangePrevious]); // MIXED LENGTH PERIODS GIVEN SHOULD USE LOWEST PERIOD IN COMMON // largeRange would usually use period months but because there is a year it should use lower period week $this->assertSetSparklineDatePeriods([ 'period' => 'week','date' => $year->getRangeString(), 'comparePeriods' => ['week'], 'compareDates' => [$largeRangePrevious->getRangeString()], ], $year, [$largeRangePrevious]); // largeRange would usually use period months but because there is a year it should use lower period week $this->assertSetSparklineDatePeriods([ 'period' => 'week','date' => $largeRangePrevious->getRangeString(), 'comparePeriods' => ['week'], 'compareDates' => [$year->getRangeString()], ], $largeRangePrevious, [$year]); // largeRange would usually use period months but because there is a day it should use lower period day $this->assertSetSparklineDatePeriods([ 'period' => 'day','date' => $day->getRangeString(), 'comparePeriods' => ['day'], 'compareDates' => [$largeRange->getRangeString()], ], $day, [$largeRange]); // largeRange would usually use period months but because there is a day it should use lower period day $this->assertSetSparklineDatePeriods([ 'period' => 'day','date' => $largeRange->getRangeString(), 'comparePeriods' => ['day'], 'compareDates' => [$day->getRangeString()], ], $largeRange, [$day]); // USING MULTIPLE COMPARISON PERIODS // largeRange would usually use period months but because the lowest comparison period is a day it should use lower period day $this->assertSetSparklineDatePeriods([ 'period' => 'day','date' => $year->getRangeString(), 'comparePeriods' => ['day', 'day'], 'compareDates' => [$largeRangePrevious->getRangeString(), $weekPrevious->getRangeString()], ], $year, [$largeRangePrevious, $weekPrevious]); $this->assertSetSparklineDatePeriods([ 'period' => 'week','date' => $year->getRangeString(), 'comparePeriods' => ['week', 'week'], 'compareDates' => [$largeRangePrevious->getRangeString(), $mediumRangePrevious->getRangeString()], ], $year, [$largeRangePrevious, $mediumRangePrevious]); } public function testEvolutionGraphKeepsLastPeriodsWhenOnlyComparingSegments() { $_GET['period'] = 'day'; $_GET['date'] = '2022-05-02'; $_GET['idSite'] = 1; $_GET['compareSegments'] = ['countryCode==nz']; $view = new EvolutionGraph('VisitsSummary.getEvolutionGraph', 'VisitsSummary.get'); $view->beforeLoadDataTable(); $this->assertSame( '2022-04-03,2022-05-02', $view->requestConfig->request_parameters_to_modify['date'] ); } public function testEvolutionGraphKeepsSelectedRangeWhenComparingDates() { $_GET['period'] = 'day'; $_GET['date'] = '2022-05-02'; $_GET['idSite'] = 1; $_GET['compareDates'] = ['2022-05-01']; $_GET['comparePeriods'] = ['day']; $view = new EvolutionGraph('VisitsSummary.getEvolutionGraph', 'VisitsSummary.get'); $view->beforeLoadDataTable(); $this->assertSame('day', $view->requestConfig->request_parameters_to_modify['period']); $this->assertSame( '2022-05-02,2022-05-02', $view->requestConfig->request_parameters_to_modify['date'] ); $this->assertSame(['day'], $view->requestConfig->request_parameters_to_modify['comparePeriods']); $this->assertSame( ['2022-05-01,2022-05-01'], $view->requestConfig->request_parameters_to_modify['compareDates'] ); } private function assertHighestPeriodInCommon($expected, $originalPeriod, $comparePeriods) { $period = $this->selector->getHighestPeriodInCommon($originalPeriod, $comparePeriods); $this->assertSame($expected, $period); } private function assertSetSparklineDatePeriods($expected, Period $originalPeriod, $comparisonPeriods) { $_GET['period'] = $originalPeriod->getLabel(); if ($originalPeriod->getLabel() === 'range') { $_GET['date'] = $originalPeriod->getRangeString(); } else { $_GET['date'] = $originalPeriod->getDateEnd()->toString(); } $_GET['idSite'] = 1; $period = $this->selector->setDatePeriods([], $originalPeriod, $comparisonPeriods, !empty($comparisonPeriods)); $this->assertEquals($expected, $period); } public function provideContainerConfig() { return array( 'Piwik\Access' => new FakeAccess(), ); } }