From c30bda4402e6867dd18cf7496e3faaf1b1606357 Mon Sep 17 00:00:00 2001 From: sgiehl Date: Thu, 30 Jan 2025 16:26:21 +0100 Subject: [PATCH] rewrite and add tests for console command --- .../Commands/InvalidateReportDataTest.php | 1051 +++++++++++++---- 1 file changed, 796 insertions(+), 255 deletions(-) diff --git a/plugins/CoreAdminHome/tests/Integration/Commands/InvalidateReportDataTest.php b/plugins/CoreAdminHome/tests/Integration/Commands/InvalidateReportDataTest.php index 6cbe8ac3c0e..e93010fb73a 100644 --- a/plugins/CoreAdminHome/tests/Integration/Commands/InvalidateReportDataTest.php +++ b/plugins/CoreAdminHome/tests/Integration/Commands/InvalidateReportDataTest.php @@ -10,6 +10,9 @@ namespace Piwik\Plugins\CoreAdminHome\tests\Integration\Commands; use Monolog\Handler\AbstractProcessingHandler; +use Piwik\ArchiveProcessor\Rules; +use Piwik\Common; +use Piwik\Db; use Piwik\Plugins\CustomDimensions\CustomDimensions; use Piwik\Plugins\CustomDimensions\API as CustomDimensionsAPI; use Piwik\Plugins\SegmentEditor\API as SegmentEditorAPI; @@ -28,8 +31,8 @@ public static function setUpBeforeClass(): void { parent::setUpBeforeClass(); - $idSite = Fixture::createWebsite('2012-01-01 00:00:00'); - Fixture::createWebsite('2012-01-01 00:00:00'); + $idSite = Fixture::createWebsite('2011-01-01 00:00:00'); + Fixture::createWebsite('2012-01-02 00:00:00'); Fixture::createWebsite('2012-01-01 00:00:00'); CustomDimensionsAPI::getInstance()->configureNewCustomDimension( @@ -39,14 +42,17 @@ public static function setUpBeforeClass(): void true ); - SegmentEditorAPI::getInstance()->add('test segment', 'browserCode==IE', $idSite); - SegmentEditorAPI::getInstance()->add('custom dimension', 'dimension1==test', $idSite); + Rules::setBrowserTriggerArchiving(false); + SegmentEditorAPI::getInstance()->add('test segment', 'browserCode==IE', false, true); + SegmentEditorAPI::getInstance()->add('custom dimension', 'dimension1==test', $idSite, true); + SegmentEditorAPI::getInstance()->add('browser segment', 'browserCode==FF', false, false); } public function setUp(): void { parent::setUp(); self::$captureHandler->messages = []; + Db::query('TRUNCATE table ' . Common::prefixTable('archive_invalidations')); } protected function tearDown(): void @@ -56,137 +62,162 @@ protected function tearDown(): void } /** - * @dataProvider getInvalidDateRanges + * @dataProvider getInvalidCommandOptions */ - public function testCommandFailsWhenAnInvalidDateRangeIsUsed($invalidDateRange) + public function testCommandFailsWithInvalidOptions(array $commandOptions, array $expectedOutputs) { - $code = $this->applicationTester->run([ - 'command' => 'core:invalidate-report-data', - '--dates' => [$invalidDateRange], - '--periods' => 'day', - '--sites' => '1', - '--dry-run' => true, - '-vvv' => true, - ]); - - $this->assertNotEquals(0, $code, $this->getCommandDisplayOutputErrorMessage()); - self::assertStringContainsString("Invalid date or date range specifier", $this->getLogOutput()); - } - - public function getInvalidDateRanges() - { - return [ - ['garbage'], - ['2012-01-03 2013-02-01'], - ]; - } + $commandOptions = array_merge(['command' => 'core:invalidate-report-data'], $commandOptions); - /** - * @dataProvider getInvalidPeriodTypes - */ - public function testCommandFailsWhenAnInvalidPeriodTypeIsUsed($invalidPeriodType) - { - $code = $this->applicationTester->run([ - 'command' => 'core:invalidate-report-data', - '--dates' => '2012-01-01', - '--periods' => $invalidPeriodType, - '--sites' => '1', - '--dry-run' => true, - '-vvv' => true, - ]); + $code = $this->applicationTester->run($commandOptions); + self::assertNotEquals(0, $code, $this->getCommandDisplayOutputErrorMessage()); - $this->assertNotEquals(0, $code, $this->getCommandDisplayOutputErrorMessage()); - self::assertStringContainsString("Invalid period type", $this->getLogOutput()); + foreach ($expectedOutputs as $expectedOutput) { + self::assertStringContainsString($expectedOutput, $this->getLogOutput()); + } } - public function getInvalidPeriodTypes() + public function getInvalidCommandOptions(): iterable { - return [ - ['cranberries'], + yield 'invalid dates parameter' => [ + [ + '--dates' => ['garbage'], + '--periods' => 'day', + '--sites' => '1', + '--dry-run' => true, + '-vvv' => true, + ], + [ + 'Invalid date or date range specifier' + ] ]; - } - - /** - * @dataProvider getInvalidSiteLists - */ - public function testCommandFailsWhenAnInvalidSiteListIsUsed($invalidSites) - { - $code = $this->applicationTester->run([ - 'command' => 'core:invalidate-report-data', - '--dates' => '2012-01-01', - '--periods' => 'day', - '--sites' => $invalidSites, - '--dry-run' => true, - '-vvv' => true, - ]); - $this->assertNotEquals(0, $code, $this->getCommandDisplayOutputErrorMessage()); - self::assertStringContainsString("Invalid --sites value", $this->getLogOutput()); - } + yield 'invalid dates parameter format' => [ + [ + '--dates' => ['2012-01-03 2013-02-01'], + '--periods' => 'day', + '--sites' => '1', + '--dry-run' => true, + '-vvv' => true, + ], + [ + 'Invalid date or date range specifier' + ] + ]; - public function getInvalidSiteLists() - { - return [ - ['wolfalice'], - [','], - ['1,500'], + yield 'dates parameter with too many dates in range' => [ + [ + '--dates' => ['2019-01-01,2019-01-09,2019-01-12,2019-01-15'], + '--periods' => 'range', + '--sites' => '1', + '--dry-run' => true, + '-vvv' => true, + ], + [ + "The date '2019-01-01,2019-01-09,2019-01-12,2019-01-15' is not a correct date range" + ] ]; - } - public function testCommandFailsWhenAnInvalidSegmentIsUsed() - { - $code = $this->applicationTester->run([ - 'command' => 'core:invalidate-report-data', - '--dates' => '2012-01-01', - '--periods' => 'day', - '--sites' => '1', - '--segment' => ['ablksdjfdslkjf'], - '--dry-run' => true, - '-vvv' => true, - ]); + yield 'invalid period parameter' => [ + [ + '--dates' => ['2012-01-03'], + '--periods' => 'cranberries', + '--sites' => '1', + '--dry-run' => true, + '-vvv' => true, + ], + [ + 'Invalid period type' + ] + ]; - $this->assertNotEquals(0, $code, $this->getCommandDisplayOutputErrorMessage()); - self::assertStringContainsString("The segment condition 'ablksdjfdslkjf' is not valid", $this->getLogOutput()); - } + yield 'non numeric sites parameter' => [ + [ + '--dates' => ['2012-01-03'], + '--periods' => 'day', + '--sites' => 'wolfalice', + '--dry-run' => true, + '-vvv' => true, + ], + [ + 'Invalid --sites value' + ] + ]; - public function testCommandFailsWhenACustomDimensionSegmentIsNotSupportedByAllSites() - { - $code = $this->applicationTester->run([ - 'command' => 'core:invalidate-report-data', - '--dates' => '2012-01-01', - '--periods' => 'day', - '--sites' => '1,2', - '--segment' => ['custom dimension'], - '--dry-run' => true, - '-vvv' => true, - ]); + yield 'idSite list without values' => [ + [ + '--dates' => ['2012-01-03'], + '--periods' => 'day', + '--sites' => ',', + '--dry-run' => true, + '-vvv' => true, + ], + [ + 'Invalid --sites value' + ] + ]; - $this->assertNotEquals(0, $code, $this->getCommandDisplayOutputErrorMessage()); - self::assertStringContainsString("Segment 'dimension1' is not a supported segment", $this->getLogOutput()); - } + yield 'not existing idSite included in list' => [ + [ + '--dates' => ['2012-01-03'], + '--periods' => 'day', + '--sites' => '1,500', + '--dry-run' => true, + '-vvv' => true, + ], + [ + 'Invalid --sites value' + ] + ]; + yield 'invalid segment provided' => [ + [ + '--dates' => ['2012-01-03'], + '--periods' => 'day', + '--sites' => '1', + '--segment' => ['ablksdjfdslkjf'], + '--dry-run' => true, + '-vvv' => true, + ], + [ + "The segment condition 'ablksdjfdslkjf' is not valid" + ] + ]; - public function testCommandFailsWhenACustomDimensionSegmentIsNotValidForAnySite() - { - $code = $this->applicationTester->run([ - 'command' => 'core:invalidate-report-data', - '--dates' => '2012-01-01', - '--periods' => 'day', - '--sites' => '2,3', - '--segment' => ['custom dimension'], - '--dry-run' => true, - '-vvv' => true, - ]); + yield 'segment name provided that does not exist for given site' => [ + [ + '--dates' => ['2012-01-03'], + '--periods' => 'day', + '--sites' => '2,3', + '--segment' => ['custom dimension'], + '--dry-run' => true, + '-vvv' => true, + ], + [ + "'custom dimension' did not match any stored segment, but invalidating it anyway.", + "The segment condition 'custom dimension' is not valid.", + ] + ]; - $this->assertNotEquals(0, $code, $this->getCommandDisplayOutputErrorMessage()); - self::assertStringContainsString("'custom dimension' did not match any stored segment, but invalidating it anyway", $this->getLogOutput()); - self::assertStringContainsString("The segment condition 'custom dimension' is not valid", $this->getLogOutput()); + yield 'segment provided that does not exist for given site' => [ + [ + '--dates' => ['2012-01-03'], + '--periods' => 'day', + '--sites' => '2', + '--segment' => ['dimension1==test'], + '--dry-run' => true, + '-vvv' => true, + ], + [ + "'dimension1==test' did not match any stored segment, but invalidating it anyway.", + "Segment 'dimension1' is not a supported segment." + ] + ]; } - /** + /** * @dataProvider getTestDataForSuccessTests */ - public function testCommandInvalidatesCorrectSitesAndDates($dates, $periods, $sites, $cascade, $segments, $plugin, $expectedOutputs) + public function testCommandOutputSuccess($dates, $periods, $sites, $cascade, $segments, $plugin, $expectedOutputs) { $options = [ 'command' => 'core:invalidate-report-data', @@ -212,131 +243,6 @@ public function testCommandInvalidatesCorrectSitesAndDates($dates, $periods, $si } } - public function testCommandInvalidateDateRange() - { - $code = $this->applicationTester->run([ - 'command' => 'core:invalidate-report-data', - '--dates' => ['2019-01-01,2019-01-09'], - '--periods' => 'range', - '--sites' => '1', - '--dry-run' => true, - '-vvv' => true, - ]); - - $this->assertEquals(0, $code, $this->getCommandDisplayOutputErrorMessage()); - self::assertStringContainsString("Invalidating range periods overlapping 2019-01-01,2019-01-09 [segment = all segments]", $this->getLogOutput()); - } - - public function testCommandInvalidateDateRangeInvalidDate() - { - $code = $this->applicationTester->run([ - 'command' => 'core:invalidate-report-data', - '--dates' => ['2019-01-01,2019-01--09'], - '--periods' => 'range', - '--sites' => '1', - '--dry-run' => true, - '-vvv' => true, - ]); - - $this->assertNotEquals(0, $code, $this->getCommandDisplayOutputErrorMessage()); - self::assertStringContainsString("The date '2019-01-01,2019-01--09' is not a correct date range", $this->getLogOutput()); - } - - public function testCommandInvalidateDateRangeOnlyOneDate() - { - $code = $this->applicationTester->run([ - 'command' => 'core:invalidate-report-data', - '--dates' => ['2019-01-01'], - '--periods' => 'range', - '--sites' => '1', - '--dry-run' => true, - '-vvv' => true, - ]); - - $this->assertNotEquals(0, $code, $this->getCommandDisplayOutputErrorMessage()); - self::assertStringContainsString("The date '2019-01-01' is not a correct date range", $this->getLogOutput()); - } - - public function testCommandInvalidateDateRangeTooManyDatesInRange() - { - $code = $this->applicationTester->run([ - 'command' => 'core:invalidate-report-data', - '--dates' => ['2019-01-01,2019-01-09,2019-01-12,2019-01-15'], - '--periods' => 'range', - '--sites' => '1', - '--dry-run' => true, - '-vvv' => true, - ]); - - $this->assertNotEquals(0, $code, $this->getCommandDisplayOutputErrorMessage()); - self::assertStringContainsString("The date '2019-01-01,2019-01-09,2019-01-12,2019-01-15' is not a correct date range", $this->getLogOutput()); - } - - public function testCommandInvalidateDateRangeMultipleDateRanges() - { - $code = $this->applicationTester->run([ - 'command' => 'core:invalidate-report-data', - '--dates' => ['2019-01-01,2019-01-09', '2019-01-12,2019-01-15'], - '--periods' => 'range', - '--sites' => '1', - '--dry-run' => true, - '-vvv' => true, - ]); - - $this->assertEquals(0, $code, $this->getCommandDisplayOutputErrorMessage()); - self::assertStringContainsString("Invalidating range periods overlapping 2019-01-01,2019-01-09;2019-01-12,2019-01-15", $this->getLogOutput()); - } - - public function testCommandInvalidateDateRangeInvalidateAllPeriodTypesSkipsRangeWhenNotRangeDAte() - { - $code = $this->applicationTester->run([ - 'command' => 'core:invalidate-report-data', - '--dates' => ['2019-01-01'], - '--periods' => 'all', - '--sites' => '1', - '--dry-run' => true, - '-vvv' => true, - ]); - - $this->assertEquals(0, $code, $this->getCommandDisplayOutputErrorMessage()); - self::assertStringNotContainsString("range", $this->getLogOutput()); - self::assertStringNotContainsString("Range", $this->getLogOutput()); - } - - public function testCommandInvalidateDateRangeInvalidateAllPeriodTypes() - { - $code = $this->applicationTester->run([ - 'command' => 'core:invalidate-report-data', - '--dates' => ['2019-01-01,2019-01-09'], - '--periods' => 'all', - '--sites' => '1', - '--dry-run' => true, - '-vvv' => true, - ]); - - $this->assertEquals(0, $code, $this->getCommandDisplayOutputErrorMessage()); - self::assertStringContainsString("Invalidating day periods in 2019-01-01,2019-01-09 [segment = all segments]", $this->getLogOutput()); - self::assertStringContainsString("Invalidating week periods in 2019-01-01,2019-01-09 [segment = all segments]", $this->getLogOutput()); - self::assertStringContainsString("Invalidating month periods in 2019-01-01,2019-01-09 [segment = all segments]", $this->getLogOutput()); - self::assertStringContainsString("Invalidating year periods in 2019-01-01,2019-01-09 [segment = all segments]", $this->getLogOutput()); - self::assertStringContainsString("Invalidating range periods overlapping 2019-01-01,2019-01-09 [segment = all segments]", $this->getLogOutput()); - } - - public function testCommandInvalidateAllMultipleDateRanges() - { - $code = $this->applicationTester->run([ - 'command' => 'core:invalidate-report-data', - '--dates' => ['2019-01-01,2019-01-09', '2019-01-12,2019-01-13'], - '--periods' => 'all', - '--sites' => '1', - '--dry-run' => true, - '-vvv' => true, - ]); - - $this->assertEquals(0, $code, $this->getCommandDisplayOutputErrorMessage()); - self::assertStringContainsString("Invalidating range periods overlapping 2019-01-01,2019-01-09;2019-01-12,2019-01-13 [segment = all segments]", $this->getLogOutput()); - } - /** * @return iterable> */ @@ -350,7 +256,9 @@ public function getTestDataForSuccessTests(): iterable null, null, [ - '[Dry-run] invalidating archives for site = [ 1 ], dates = [ 2012-01-01 ], period = [ day ], segment = [ all segments ]', + '[Dry-run] invalidating archives for site = [ 1 ], dates = [ 2012-01-01 ], period = [ day ], segment = [ ]', + '[Dry-run] invalidating archives for site = [ 1 ], dates = [ 2012-01-01 ], period = [ day ], segment = [ browserCode==IE ]', + '[Dry-run] invalidating archives for site = [ 1 ], dates = [ 2012-01-01 ], period = [ day ], segment = [ dimension1==test ]', ], ]; @@ -362,7 +270,9 @@ public function getTestDataForSuccessTests(): iterable null, null, [ - '[Dry-run] invalidating archives for site = [ 1 ], dates = [ 2012-01-01 ], period = [ day ], segment = [ all segments ]', + '[Dry-run] invalidating archives for site = [ 1 ], dates = [ 2012-01-01 ], period = [ day ], segment = [ ]', + '[Dry-run] invalidating archives for site = [ 1 ], dates = [ 2012-01-01 ], period = [ day ], segment = [ browserCode==IE ]', + '[Dry-run] invalidating archives for site = [ 1 ], dates = [ 2012-01-01 ], period = [ day ], segment = [ dimension1==test ]', ], ]; @@ -374,7 +284,9 @@ public function getTestDataForSuccessTests(): iterable null, null, [ - '[Dry-run] invalidating archives for site = [ 1 ], dates = [ 2011-12-26 ], period = [ week ], segment = [ all segments ]', + '[Dry-run] invalidating archives for site = [ 1 ], dates = [ 2011-12-26 ], period = [ week ], segment = [ ]', + '[Dry-run] invalidating archives for site = [ 1 ], dates = [ 2011-12-26 ], period = [ week ], segment = [ browserCode==IE ]', + '[Dry-run] invalidating archives for site = [ 1 ], dates = [ 2011-12-26 ], period = [ week ], segment = [ dimension1==test ]', ], ]; @@ -386,12 +298,25 @@ public function getTestDataForSuccessTests(): iterable null, null, [ - '[Dry-run] invalidating archives for site = [ 1, 3 ], dates = [ 2012-01-01, 2012-02-01 ], period = [ month ], segment = [ all segments ], cascade = [ 0 ]', - '[Dry-run] invalidating archives for site = [ 1, 3 ], dates = [ 2012-01-01 ], period = [ month ], segment = [ all segments ], cascade = [ 0 ]', - '[Dry-run] invalidating archives for site = [ 1, 3 ], dates = [ 2013-03-01 ], period = [ month ], segment = [ all segments ], cascade = [ 0 ]', - '[Dry-run] invalidating archives for site = [ 1, 3 ], dates = [ 2011-12-26, 2012-01-02, 2012-01-09, 2012-01-16, 2012-01-23, 2012-01-30 ], period = [ week ], segment = [ all segments ], cascade = [ 0 ]', - '[Dry-run] invalidating archives for site = [ 1, 3 ], dates = [ 2012-01-23 ], period = [ week ], segment = [ all segments ], cascade = [ 0 ]', - '[Dry-run] invalidating archives for site = [ 1, 3 ], dates = [ 2013-03-18 ], period = [ week ], segment = [ all segments ], cascade = [ 0 ]', + 'Segment [dimension1==test] not available for all sites, skipping this segment for sites [ 3 ].', + '[Dry-run] invalidating archives for site = [ 1, 3 ], dates = [ 2012-01-01, 2012-02-01 ], period = [ month ], segment = [ ], cascade = [ 0 ]', + '[Dry-run] invalidating archives for site = [ 1, 3 ], dates = [ 2012-01-01, 2012-02-01 ], period = [ month ], segment = [ browserCode==IE ], cascade = [ 0 ]', + '[Dry-run] invalidating archives for site = [ 1 ], dates = [ 2012-01-01, 2012-02-01 ], period = [ month ], segment = [ dimension1==test ], cascade = [ 0 ]', + '[Dry-run] invalidating archives for site = [ 1, 3 ], dates = [ 2012-01-01 ], period = [ month ], segment = [ ], cascade = [ 0 ]', + '[Dry-run] invalidating archives for site = [ 1, 3 ], dates = [ 2012-01-01 ], period = [ month ], segment = [ browserCode==IE ], cascade = [ 0 ]', + '[Dry-run] invalidating archives for site = [ 1 ], dates = [ 2012-01-01 ], period = [ month ], segment = [ dimension1==test ], cascade = [ 0 ]', + '[Dry-run] invalidating archives for site = [ 1, 3 ], dates = [ 2013-03-01 ], period = [ month ], segment = [ ], cascade = [ 0 ]', + '[Dry-run] invalidating archives for site = [ 1, 3 ], dates = [ 2013-03-01 ], period = [ month ], segment = [ browserCode==IE ], cascade = [ 0 ]', + '[Dry-run] invalidating archives for site = [ 1 ], dates = [ 2013-03-01 ], period = [ month ], segment = [ dimension1==test ], cascade = [ 0 ]', + '[Dry-run] invalidating archives for site = [ 1, 3 ], dates = [ 2011-12-26, 2012-01-02, 2012-01-09, 2012-01-16, 2012-01-23, 2012-01-30 ], period = [ week ], segment = [ ], cascade = [ 0 ]', + '[Dry-run] invalidating archives for site = [ 1, 3 ], dates = [ 2011-12-26, 2012-01-02, 2012-01-09, 2012-01-16, 2012-01-23, 2012-01-30 ], period = [ week ], segment = [ browserCode==IE ], cascade = [ 0 ]', + '[Dry-run] invalidating archives for site = [ 1 ], dates = [ 2011-12-26, 2012-01-02, 2012-01-09, 2012-01-16, 2012-01-23, 2012-01-30 ], period = [ week ], segment = [ dimension1==test ], cascade = [ 0 ]', + '[Dry-run] invalidating archives for site = [ 1, 3 ], dates = [ 2012-01-23 ], period = [ week ], segment = [ ], cascade = [ 0 ]', + '[Dry-run] invalidating archives for site = [ 1, 3 ], dates = [ 2012-01-23 ], period = [ week ], segment = [ browserCode==IE ], cascade = [ 0 ]', + '[Dry-run] invalidating archives for site = [ 1 ], dates = [ 2012-01-23 ], period = [ week ], segment = [ dimension1==test ], cascade = [ 0 ]', + '[Dry-run] invalidating archives for site = [ 1, 3 ], dates = [ 2013-03-18 ], period = [ week ], segment = [ ], cascade = [ 0 ]', + '[Dry-run] invalidating archives for site = [ 1, 3 ], dates = [ 2013-03-18 ], period = [ week ], segment = [ browserCode==IE ], cascade = [ 0 ]', + '[Dry-run] invalidating archives for site = [ 1 ], dates = [ 2013-03-18 ], period = [ week ], segment = [ dimension1==test ], cascade = [ 0 ]', ], ]; @@ -403,7 +328,8 @@ public function getTestDataForSuccessTests(): iterable null, null, [ - '[Dry-run] invalidating archives for site = [ 2 ], dates = [ 2012-01-30, 2012-02-06 ], period = [ week ], segment = [ all segments ], cascade = [ 1 ]', + '[Dry-run] invalidating archives for site = [ 2 ], dates = [ 2012-01-30, 2012-02-06 ], period = [ week ], segment = [ ], cascade = [ 1 ]', + '[Dry-run] invalidating archives for site = [ 2 ], dates = [ 2012-01-30, 2012-02-06 ], period = [ week ], segment = [ browserCode==IE ], cascade = [ 1 ]', ], ]; @@ -415,12 +341,25 @@ public function getTestDataForSuccessTests(): iterable null, null, [ - '[Dry-run] invalidating archives for site = [ 1, 2, 3 ], dates = [ 2012-02-01 ], period = [ month ], segment = [ all segments ], cascade = [ 1 ]', - '[Dry-run] invalidating archives for site = [ 1, 2, 3 ], dates = [ 2012-03-01 ], period = [ month ], segment = [ all segments ], cascade = [ 1 ]', - '[Dry-run] invalidating archives for site = [ 1, 2, 3 ], dates = [ 2012-01-30 ], period = [ week ], segment = [ all segments ], cascade = [ 1 ]', - '[Dry-run] invalidating archives for site = [ 1, 2, 3 ], dates = [ 2012-03-12 ], period = [ week ], segment = [ all segments ], cascade = [ 1 ]', - '[Dry-run] invalidating archives for site = [ 1, 2, 3 ], dates = [ 2012-02-03, 2012-02-04 ], period = [ day ], segment = [ all segments ], cascade = [ 1 ]', - '[Dry-run] invalidating archives for site = [ 1, 2, 3 ], dates = [ 2012-03-15 ], period = [ day ], segment = [ all segments ], cascade = [ 1 ]', + 'Segment [dimension1==test] not available for all sites, skipping this segment for sites [ 2, 3 ].', + '[Dry-run] invalidating archives for site = [ 1, 2, 3 ], dates = [ 2012-02-01 ], period = [ month ], segment = [ ], cascade = [ 1 ]', + '[Dry-run] invalidating archives for site = [ 1, 2, 3 ], dates = [ 2012-02-01 ], period = [ month ], segment = [ browserCode==IE ], cascade = [ 1 ]', + '[Dry-run] invalidating archives for site = [ 1, 2, 3 ], dates = [ 2012-02-01 ], period = [ month ], segment = [ ], cascade = [ 1 ]', + '[Dry-run] invalidating archives for site = [ 1, 2, 3 ], dates = [ 2012-03-01 ], period = [ month ], segment = [ ], cascade = [ 1 ]', + '[Dry-run] invalidating archives for site = [ 1, 2, 3 ], dates = [ 2012-03-01 ], period = [ month ], segment = [ browserCode==IE ], cascade = [ 1 ]', + '[Dry-run] invalidating archives for site = [ 1 ], dates = [ 2012-03-01 ], period = [ month ], segment = [ dimension1==test ], cascade = [ 1 ]', + '[Dry-run] invalidating archives for site = [ 1, 2, 3 ], dates = [ 2012-01-30 ], period = [ week ], segment = [ ], cascade = [ 1 ]', + '[Dry-run] invalidating archives for site = [ 1, 2, 3 ], dates = [ 2012-01-30 ], period = [ week ], segment = [ browserCode==IE ], cascade = [ 1 ]', + '[Dry-run] invalidating archives for site = [ 1 ], dates = [ 2012-01-30 ], period = [ week ], segment = [ dimension1==test ], cascade = [ 1 ]', + '[Dry-run] invalidating archives for site = [ 1, 2, 3 ], dates = [ 2012-03-12 ], period = [ week ], segment = [ ], cascade = [ 1 ]', + '[Dry-run] invalidating archives for site = [ 1, 2, 3 ], dates = [ 2012-03-12 ], period = [ week ], segment = [ browserCode==IE ], cascade = [ 1 ]', + '[Dry-run] invalidating archives for site = [ 1 ], dates = [ 2012-03-12 ], period = [ week ], segment = [ dimension1==test ], cascade = [ 1 ]', + '[Dry-run] invalidating archives for site = [ 1, 2, 3 ], dates = [ 2012-02-03, 2012-02-04 ], period = [ day ], segment = [ ], cascade = [ 1 ]', + '[Dry-run] invalidating archives for site = [ 1, 2, 3 ], dates = [ 2012-02-03, 2012-02-04 ], period = [ day ], segment = [ browserCode==IE ], cascade = [ 1 ]', + '[Dry-run] invalidating archives for site = [ 1 ], dates = [ 2012-02-03, 2012-02-04 ], period = [ day ], segment = [ dimension1==test ], cascade = [ 1 ]', + '[Dry-run] invalidating archives for site = [ 1, 2, 3 ], dates = [ 2012-03-15 ], period = [ day ], segment = [ ], cascade = [ 1 ]', + '[Dry-run] invalidating archives for site = [ 1, 2, 3 ], dates = [ 2012-03-15 ], period = [ day ], segment = [ browserCode==IE ], cascade = [ 1 ]', + '[Dry-run] invalidating archives for site = [ 1 ], dates = [ 2012-03-15 ], period = [ day ], segment = [ dimension1==test ], cascade = [ 1 ]', ], ]; @@ -444,7 +383,9 @@ public function getTestDataForSuccessTests(): iterable null, 'ExamplePlugin', [ - '[Dry-run] invalidating archives for site = [ 1 ], dates = [ 2015-05-04 ], period = [ day ], segment = [ all segments ], cascade = [ 0 ], plugin = [ ExamplePlugin ]', + '[Dry-run] invalidating archives for site = [ 1 ], dates = [ 2015-05-04 ], period = [ day ], segment = [ ], cascade = [ 0 ], plugin = [ ExamplePlugin ]', + '[Dry-run] invalidating archives for site = [ 1 ], dates = [ 2015-05-04 ], period = [ day ], segment = [ browserCode==IE ], cascade = [ 0 ], plugin = [ ExamplePlugin ]', + '[Dry-run] invalidating archives for site = [ 1 ], dates = [ 2015-05-04 ], period = [ day ], segment = [ dimension1==test ], cascade = [ 0 ], plugin = [ ExamplePlugin ]', ], ]; @@ -507,6 +448,599 @@ public function getTestDataForSuccessTests(): iterable '[Dry-run] invalidating archives for site = [ 1 ], dates = [ 2015-05-04 ], period = [ day ], segment = [ ], cascade = [ 0 ]', ], ]; + + yield 'segment only invalidated for supported sites, whileignoring others' => [ + ['2012-01-01'], + 'day', + '1,2', + false, + ['custom dimension'], + null, + [ + 'Segment [dimension1==test] not available for all sites, skipping this segment for sites [ 2 ]', + '[Dry-run] invalidating archives for site = [ 1 ], dates = [ 2012-01-01 ], period = [ day ], segment = [ dimension1==test ]', + ], + ]; + + yield 'invalidating multiple date ranges' => [ + ['2019-01-01,2019-01-09', '2019-01-12,2019-01-15'], + 'range', + '1', + false, + null, + null, + [ + "Invalidating range periods overlapping 2019-01-01,2019-01-09;2019-01-12,2019-01-15 for site = [ 1 ], segment = [ ]", + "Invalidating range periods overlapping 2019-01-01,2019-01-09;2019-01-12,2019-01-15 for site = [ 1 ], segment = [ browserCode==IE ]", + "Invalidating range periods overlapping 2019-01-01,2019-01-09;2019-01-12,2019-01-15 for site = [ 1 ], segment = [ dimension1==test ]", + ], + ]; + + yield 'invalidating period type all for range invalidates all period types' => [ + ['2019-01-01,2019-01-09'], + 'all', + '1', + false, + null, + null, + [ + "Invalidating day periods in 2019-01-01,2019-01-09 for site = [ 1 ], segment = [ ]", + "Invalidating day periods in 2019-01-01,2019-01-09 for site = [ 1 ], segment = [ browserCode==IE ]", + "Invalidating day periods in 2019-01-01,2019-01-09 for site = [ 1 ], segment = [ dimension1==test ]", + "Invalidating week periods in 2019-01-01,2019-01-09 for site = [ 1 ], segment = [ ]", + "Invalidating week periods in 2019-01-01,2019-01-09 for site = [ 1 ], segment = [ browserCode==IE ]", + "Invalidating week periods in 2019-01-01,2019-01-09 for site = [ 1 ], segment = [ dimension1==test ]", + "Invalidating month periods in 2019-01-01,2019-01-09 for site = [ 1 ], segment = [ ]", + "Invalidating month periods in 2019-01-01,2019-01-09 for site = [ 1 ], segment = [ browserCode==IE ]", + "Invalidating month periods in 2019-01-01,2019-01-09 for site = [ 1 ], segment = [ dimension1==test ]", + "Invalidating year periods in 2019-01-01,2019-01-09 for site = [ 1 ], segment = [ ]", + "Invalidating year periods in 2019-01-01,2019-01-09 for site = [ 1 ], segment = [ browserCode==IE ]", + "Invalidating year periods in 2019-01-01,2019-01-09 for site = [ 1 ], segment = [ dimension1==test ]", + "Invalidating range periods overlapping 2019-01-01,2019-01-09 for site = [ 1 ], segment = [ ]", + "Invalidating range periods overlapping 2019-01-01,2019-01-09 for site = [ 1 ], segment = [ browserCode==IE ]", + "Invalidating range periods overlapping 2019-01-01,2019-01-09 for site = [ 1 ], segment = [ dimension1==test ]", + ], + ]; + } + + + /** + * @dataProvider getInvalidationTestData + */ + public function testCommandCreatesExpectedInvalidations(array $commandOptions, array $expectedInvalidations) + { + Db::query('TRUNCATE table ' . Common::prefixTable('archive_invalidations')); + + $commandOptions = array_merge(['command' => 'core:invalidate-report-data'], $commandOptions); + + $code = $this->applicationTester->run($commandOptions); + + self::assertEquals(0, $code, $this->getCommandDisplayOutputErrorMessage()); + + self::assertInvalidationsPresent($expectedInvalidations); + } + + public function getInvalidationTestData(): iterable + { + yield "Invalidating a single day works for all segments, one website" => [ + [ + '--dates' => ['2012-01-01'], + '--sites' => '1', + ], + [ + ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-01', 'period' => 1, 'report' => null], + ['name' => 'done', 'idsite' => 1, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], + ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], + ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-01', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], + ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-01', 'period' => 1, 'report' => null], + ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], + ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], + ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], + ] + ]; + + yield "Invalidating a single day works for all visits segment only, one website" => [ + [ + '--dates' => ['2012-01-01'], + '--sites' => '1', + '--segment' => [''], + ], + [ + ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-01', 'period' => 1, 'report' => null], + ['name' => 'done', 'idsite' => 1, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], + ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], + ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], + ] + ]; + + yield "Invalidating a single day works for specific segment only, one website" => [ + [ + '--dates' => ['2012-01-01'], + '--sites' => '1', + '--segment' => ['browserCode==IE'], + ], + [ + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-01', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], + ] + ]; + + yield "Invalidating a single day works for multiple segments, one website" => [ + [ + '--dates' => ['2012-01-01'], + '--sites' => '1', + '--segment' => ['browserCode==IE', 'dimension1==test'], + ], + [ + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-01', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], + ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-01', 'period' => 1, 'report' => null], + ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], + ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], + ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], + ] + ]; + + yield "Invalidating plugin for a single day works for all visits segment only, one website" => [ + [ + '--dates' => ['2012-01-01'], + '--sites' => '1', + '--segment' => [''], + '--plugin' => 'Actions' + ], + [ + ['name' => 'done.Actions', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-01', 'period' => 1, 'report' => null], + ['name' => 'done.Actions', 'idsite' => 1, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], + ['name' => 'done.Actions', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], + ['name' => 'done.Actions', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], + ] + ]; + + yield "Invalidating plugin for a single day works for all segments, one website" => [ + [ + '--dates' => ['2012-01-01'], + '--sites' => '1', + '--plugin' => 'Actions' + ], + [ + ['name' => 'done.Actions', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-01', 'period' => 1, 'report' => null], + ['name' => 'done.Actions', 'idsite' => 1, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], + ['name' => 'done.Actions', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], + ['name' => 'done.Actions', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc.Actions', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-01', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc.Actions', 'idsite' => 1, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc.Actions', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc.Actions', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], + ['name' => 'done9aedf9b6022140586347897209404279.Actions', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-01', 'period' => 1, 'report' => null], + ['name' => 'done9aedf9b6022140586347897209404279.Actions', 'idsite' => 1, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], + ['name' => 'done9aedf9b6022140586347897209404279.Actions', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], + ['name' => 'done9aedf9b6022140586347897209404279.Actions', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], + ] + ]; + + yield "Invalidating a single day as period works for segment, one website" => [ + [ + '--dates' => ['2012-01-01,2012-01-01'], + '--sites' => '1', + '--segment' => ['browserCode==IE'], + ], + [ + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-01', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], + ] + ]; + + yield "Invalidating a period works for all segments, one website" => [ + [ + '--dates' => ['2012-01-01,2012-01-12'], + '--sites' => '1', + ], + [ + ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-01', 'period' => 1, 'report' => null], + ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-02', 'date2' => '2012-01-02', 'period' => 1, 'report' => null], + ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-03', 'date2' => '2012-01-03', 'period' => 1, 'report' => null], + ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-04', 'date2' => '2012-01-04', 'period' => 1, 'report' => null], + ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-05', 'date2' => '2012-01-05', 'period' => 1, 'report' => null], + ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-06', 'date2' => '2012-01-06', 'period' => 1, 'report' => null], + ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-07', 'date2' => '2012-01-07', 'period' => 1, 'report' => null], + ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-08', 'date2' => '2012-01-08', 'period' => 1, 'report' => null], + ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-09', 'date2' => '2012-01-09', 'period' => 1, 'report' => null], + ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-10', 'date2' => '2012-01-10', 'period' => 1, 'report' => null], + ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-11', 'date2' => '2012-01-11', 'period' => 1, 'report' => null], + ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-12', 'date2' => '2012-01-12', 'period' => 1, 'report' => null], + ['name' => 'done', 'idsite' => 1, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], + ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-02', 'date2' => '2012-01-08', 'period' => 2, 'report' => null], + ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-09', 'date2' => '2012-01-15', 'period' => 2, 'report' => null], + ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], + ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-01', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-02', 'date2' => '2012-01-02', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-03', 'date2' => '2012-01-03', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-04', 'date2' => '2012-01-04', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-05', 'date2' => '2012-01-05', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-06', 'date2' => '2012-01-06', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-07', 'date2' => '2012-01-07', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-08', 'date2' => '2012-01-08', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-09', 'date2' => '2012-01-09', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-10', 'date2' => '2012-01-10', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-11', 'date2' => '2012-01-11', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-12', 'date2' => '2012-01-12', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-02', 'date2' => '2012-01-08', 'period' => 2, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-09', 'date2' => '2012-01-15', 'period' => 2, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], + ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-01', 'period' => 1, 'report' => null], + ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-02', 'date2' => '2012-01-02', 'period' => 1, 'report' => null], + ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-03', 'date2' => '2012-01-03', 'period' => 1, 'report' => null], + ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-04', 'date2' => '2012-01-04', 'period' => 1, 'report' => null], + ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-05', 'date2' => '2012-01-05', 'period' => 1, 'report' => null], + ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-06', 'date2' => '2012-01-06', 'period' => 1, 'report' => null], + ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-07', 'date2' => '2012-01-07', 'period' => 1, 'report' => null], + ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-08', 'date2' => '2012-01-08', 'period' => 1, 'report' => null], + ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-09', 'date2' => '2012-01-09', 'period' => 1, 'report' => null], + ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-10', 'date2' => '2012-01-10', 'period' => 1, 'report' => null], + ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-11', 'date2' => '2012-01-11', 'period' => 1, 'report' => null], + ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-12', 'date2' => '2012-01-12', 'period' => 1, 'report' => null], + ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], + ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-02', 'date2' => '2012-01-08', 'period' => 2, 'report' => null], + ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-09', 'date2' => '2012-01-15', 'period' => 2, 'report' => null], + ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], + ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], + ] + ]; + + yield "Invalidating a multiple dates works for all segments, one website" => [ + [ + '--dates' => ['2012-01-01', '2012-01-06', '2012-01-12'], + '--sites' => '1', + ], + [ + ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-01', 'period' => 1, 'report' => null], + ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-06', 'date2' => '2012-01-06', 'period' => 1, 'report' => null], + ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-12', 'date2' => '2012-01-12', 'period' => 1, 'report' => null], + ['name' => 'done', 'idsite' => 1, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], + ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-02', 'date2' => '2012-01-08', 'period' => 2, 'report' => null], + ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-09', 'date2' => '2012-01-15', 'period' => 2, 'report' => null], + ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], + ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-01', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-06', 'date2' => '2012-01-06', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-12', 'date2' => '2012-01-12', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-02', 'date2' => '2012-01-08', 'period' => 2, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-09', 'date2' => '2012-01-15', 'period' => 2, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], + ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-01', 'period' => 1, 'report' => null], + ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-06', 'date2' => '2012-01-06', 'period' => 1, 'report' => null], + ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-12', 'date2' => '2012-01-12', 'period' => 1, 'report' => null], + ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], + ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-02', 'date2' => '2012-01-08', 'period' => 2, 'report' => null], + ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-09', 'date2' => '2012-01-15', 'period' => 2, 'report' => null], + ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], + ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], + ] + ]; + + yield "Invalidating multiple periods works for all segments, one website" => [ + [ + '--dates' => ['2012-01-01,2012-01-03', '2012-01-06,2012-01-07', '2012-01-10,2012-01-12'], + '--sites' => '1', + ], + [ + ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-01', 'period' => 1, 'report' => null], + ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-02', 'date2' => '2012-01-02', 'period' => 1, 'report' => null], + ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-03', 'date2' => '2012-01-03', 'period' => 1, 'report' => null], + ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-06', 'date2' => '2012-01-06', 'period' => 1, 'report' => null], + ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-07', 'date2' => '2012-01-07', 'period' => 1, 'report' => null], + ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-10', 'date2' => '2012-01-10', 'period' => 1, 'report' => null], + ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-11', 'date2' => '2012-01-11', 'period' => 1, 'report' => null], + ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-12', 'date2' => '2012-01-12', 'period' => 1, 'report' => null], + ['name' => 'done', 'idsite' => 1, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], + ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-02', 'date2' => '2012-01-08', 'period' => 2, 'report' => null], + ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-09', 'date2' => '2012-01-15', 'period' => 2, 'report' => null], + ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], + ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-01', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-02', 'date2' => '2012-01-02', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-03', 'date2' => '2012-01-03', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-06', 'date2' => '2012-01-06', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-07', 'date2' => '2012-01-07', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-10', 'date2' => '2012-01-10', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-11', 'date2' => '2012-01-11', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-12', 'date2' => '2012-01-12', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-02', 'date2' => '2012-01-08', 'period' => 2, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-09', 'date2' => '2012-01-15', 'period' => 2, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], + ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-01', 'period' => 1, 'report' => null], + ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-02', 'date2' => '2012-01-02', 'period' => 1, 'report' => null], + ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-03', 'date2' => '2012-01-03', 'period' => 1, 'report' => null], + ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-06', 'date2' => '2012-01-06', 'period' => 1, 'report' => null], + ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-07', 'date2' => '2012-01-07', 'period' => 1, 'report' => null], + ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-10', 'date2' => '2012-01-10', 'period' => 1, 'report' => null], + ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-11', 'date2' => '2012-01-11', 'period' => 1, 'report' => null], + ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-12', 'date2' => '2012-01-12', 'period' => 1, 'report' => null], + ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], + ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-02', 'date2' => '2012-01-08', 'period' => 2, 'report' => null], + ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-09', 'date2' => '2012-01-15', 'period' => 2, 'report' => null], + ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], + ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], + ] + ]; + + yield "Invalidating a single day works for all segments, multiple websites" => [ + [ + '--dates' => ['2012-01-01'], + '--sites' => '1,2', + ], + [ + ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-01', 'period' => 1, 'report' => null], + ['name' => 'done', 'idsite' => 1, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], + ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], + ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-01', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], + ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-01', 'period' => 1, 'report' => null], + ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], + ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], + ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], + ['name' => 'done', 'idsite' => 2, 'date1' => '2012-01-01', 'date2' => '2012-01-01', 'period' => 1, 'report' => null], + ['name' => 'done', 'idsite' => 2, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], + ['name' => 'done', 'idsite' => 2, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], + ['name' => 'done', 'idsite' => 2, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 2, 'date1' => '2012-01-01', 'date2' => '2012-01-01', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 2, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 2, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 2, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], + // second segment is only valid for idsite 1, so missing here + ] + ]; + + yield "Invalidating a week period works for specific segment only, one website" => [ + [ + '--dates' => ['2012-01-08'], + '--sites' => '1', + '--periods' => 'week', + '--segment' => ['browserCode==IE'], + ], + [ + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-02', 'date2' => '2012-01-08', 'period' => 2, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], + ] + ]; + + yield "Invalidating a week period accross years should not cascade up, one website" => [ + [ + '--dates' => ['2012-01-01'], + '--sites' => '1', + '--periods' => 'week', + '--segment' => ['browserCode==IE'], + ], + [ + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], + ] + ]; + + yield "Invalidating a week period accross months should not cascade up, one website" => [ + [ + '--dates' => ['2012-01-31'], + '--sites' => '1', + '--periods' => 'week', + '--segment' => ['browserCode==IE'], + ], + [ + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-30', 'date2' => '2012-02-05', 'period' => 2, 'report' => null], + ] + ]; + + yield "Invalidating a month period works for specific segment only, one website" => [ + [ + '--dates' => ['2012-01-01'], + '--sites' => '1', + '--periods' => 'month', + '--segment' => ['browserCode==IE'], + ], + [ + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], + ] + ]; + + yield "Invalidating a year period works for specific segment only, one website" => [ + [ + '--dates' => ['2012-01-01'], + '--sites' => '1', + '--periods' => 'year', + '--segment' => ['browserCode==IE'], + ], + [ + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], + ] + ]; + + yield "Invalidating a month period works for specific segment only, one website, cascade down" => [ + [ + '--dates' => ['2012-01-01'], + '--sites' => '1', + '--periods' => 'month', + '--cascade' => true, + '--segment' => ['browserCode==IE'], + ], + [ + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-01', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-02', 'date2' => '2012-01-02', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-03', 'date2' => '2012-01-03', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-04', 'date2' => '2012-01-04', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-05', 'date2' => '2012-01-05', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-06', 'date2' => '2012-01-06', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-07', 'date2' => '2012-01-07', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-08', 'date2' => '2012-01-08', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-09', 'date2' => '2012-01-09', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-10', 'date2' => '2012-01-10', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-11', 'date2' => '2012-01-11', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-12', 'date2' => '2012-01-12', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-13', 'date2' => '2012-01-13', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-14', 'date2' => '2012-01-14', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-15', 'date2' => '2012-01-15', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-16', 'date2' => '2012-01-16', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-17', 'date2' => '2012-01-17', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-18', 'date2' => '2012-01-18', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-19', 'date2' => '2012-01-19', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-20', 'date2' => '2012-01-20', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-21', 'date2' => '2012-01-21', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-22', 'date2' => '2012-01-22', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-23', 'date2' => '2012-01-23', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-24', 'date2' => '2012-01-24', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-25', 'date2' => '2012-01-25', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-26', 'date2' => '2012-01-26', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-27', 'date2' => '2012-01-27', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-28', 'date2' => '2012-01-28', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-29', 'date2' => '2012-01-29', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-30', 'date2' => '2012-01-30', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-31', 'date2' => '2012-01-31', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-02', 'date2' => '2012-01-08', 'period' => 2, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-09', 'date2' => '2012-01-15', 'period' => 2, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-16', 'date2' => '2012-01-22', 'period' => 2, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-23', 'date2' => '2012-01-29', 'period' => 2, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-30', 'date2' => '2012-02-05', 'period' => 2, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], + ] + ]; + + yield "Invalidating a week period accross years should not cascade up, one website, cascade down" => [ + [ + '--dates' => ['2012-01-01'], + '--sites' => '1', + '--periods' => 'week', + '--cascade' => true, + '--segment' => ['browserCode==IE'], + ], + [ + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2011-12-26', 'date2' => '2011-12-26', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2011-12-27', 'date2' => '2011-12-27', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2011-12-28', 'date2' => '2011-12-28', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2011-12-29', 'date2' => '2011-12-29', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2011-12-30', 'date2' => '2011-12-30', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2011-12-31', 'date2' => '2011-12-31', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-01', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2011-12-01', 'date2' => '2011-12-31', 'period' => 3, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2011-01-01', 'date2' => '2011-12-31', 'period' => 4, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], + ] + ]; + + yield "Invalidating a week period accross years should not invalidate dates before website creation, one website, cascade down" => [ + [ + '--dates' => ['2012-01-01'], + '--sites' => '2', + '--periods' => 'week', + '--cascade' => true, + '--segment' => ['browserCode==IE'], + ], + [ + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 2, 'date1' => '2012-01-01', 'date2' => '2012-01-01', 'period' => 1, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 2, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 2, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 2, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], + ] + ]; + + yield "Invalidating a multiple periods works for specific segment only, one website, no cascade" => [ + [ + '--dates' => ['2012-01-01'], + '--sites' => '1', + '--periods' => 'week,year', + '--cascade' => false, + '--segment' => ['browserCode==IE'], + ], + [ + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], + ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], + ] + ]; + } + + public function testCommandInvalidateDateRange() + { + $code = $this->applicationTester->run([ + 'command' => 'core:invalidate-report-data', + '--dates' => ['2019-01-01,2019-01-09'], + '--periods' => 'range', + '--sites' => '1', + '--dry-run' => true, + '-vvv' => true, + ]); + + $this->assertEquals(0, $code, $this->getCommandDisplayOutputErrorMessage()); + self::assertStringContainsString("Invalidating range periods overlapping 2019-01-01,2019-01-09 for site = [ 1 ], segment = [ ]", $this->getLogOutput()); + self::assertStringContainsString("Invalidating range periods overlapping 2019-01-01,2019-01-09 for site = [ 1 ], segment = [ browserCode==IE ]", $this->getLogOutput()); + self::assertStringContainsString("Invalidating range periods overlapping 2019-01-01,2019-01-09 for site = [ 1 ], segment = [ dimension1==test ]", $this->getLogOutput()); + } + + public function testCommandInvalidateDateRangeInvalidDate() + { + $code = $this->applicationTester->run([ + 'command' => 'core:invalidate-report-data', + '--dates' => ['2019-01-01,2019-01--09'], + '--periods' => 'range', + '--sites' => '1', + '--dry-run' => true, + '-vvv' => true, + ]); + + $this->assertNotEquals(0, $code, $this->getCommandDisplayOutputErrorMessage()); + self::assertStringContainsString("The date '2019-01-01,2019-01--09' is not a correct date range", $this->getLogOutput()); + } + + public function testCommandInvalidateDateRangeOnlyOneDate() + { + $code = $this->applicationTester->run([ + 'command' => 'core:invalidate-report-data', + '--dates' => ['2019-01-01'], + '--periods' => 'range', + '--sites' => '1', + '--dry-run' => true, + '-vvv' => true, + ]); + + $this->assertNotEquals(0, $code, $this->getCommandDisplayOutputErrorMessage()); + self::assertStringContainsString("The date '2019-01-01' is not a correct date range", $this->getLogOutput()); + } + + public function testCommandInvalidateDateRangeInvalidateAllPeriodTypesSkipsRangeWhenNotRangeDAte() + { + $code = $this->applicationTester->run([ + 'command' => 'core:invalidate-report-data', + '--dates' => ['2019-01-01'], + '--periods' => 'all', + '--sites' => '1', + '--dry-run' => true, + '-vvv' => true, + ]); + + $this->assertEquals(0, $code, $this->getCommandDisplayOutputErrorMessage()); + self::assertStringNotContainsString("range", $this->getLogOutput()); + self::assertStringNotContainsString("Range", $this->getLogOutput()); } /** @@ -536,4 +1070,11 @@ private function getLogOutput(): string { return implode("\n", self::$captureHandler->messages); } + + private static function assertInvalidationsPresent(array $expectedInvalidations): void + { + $existingInvalidations = Db::fetchAll('SELECT name, idsite, date1, date2, period, report from ' . Common::prefixTable('archive_invalidations') . ' ORDER BY idsite, name, period, date1'); + + self::assertEquals($expectedInvalidations, $existingInvalidations); + } }