1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
<?php
/**
* Piwik - free/libre analytics platform
*
* @link https://matomo.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
namespace Piwik\Tests\Integration;
use Piwik\ArchiveProcessor\PluginsArchiver;
use Piwik\Cache;
use Piwik\EventDispatcher;
use Piwik\Plugin\Archiver;
use Piwik\Tests\Framework\Fixture;
use Piwik\Plugins\VisitsSummary\API as VisitsSummaryAPI;
use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
class ArchiveWithNoVisitsTest_MockArchiver extends Archiver
{
public static $methodsCalled = array();
public static $runWithoutVisits = false;
public function aggregateDayReport()
{
self::$methodsCalled[] = 'aggregateDayReport';
}
public function aggregateMultipleReports()
{
self::$methodsCalled[] = 'aggregateMultipleReports';
}
public static function shouldRunEvenWhenNoVisits()
{
return self::$runWithoutVisits;
}
}
class ArchiveWithNoVisitsTest extends IntegrationTestCase
{
public function setUp()
{
parent::setUp();
Fixture::createWebsite('2011-01-01');
ArchiveWithNoVisitsTest_MockArchiver::$methodsCalled = array();
}
public function tests_ArchivingNotTriggeredWhenNoVisits()
{
PluginsArchiver::$archivers['VisitsSummary'] = 'Piwik\Tests\Integration\ArchiveWithNoVisitsTest_MockArchiver';
// initiate archiving w/o adding the event and make sure no methods are called
VisitsSummaryAPI::getInstance()->get($idSite = 1, 'week', '2012-01-01');
$this->assertEmpty(ArchiveWithNoVisitsTest_MockArchiver::$methodsCalled);
}
public function test_getIdSitesToArchiveWhenNoVisits_CanBeUsedToTriggerArchiving_EvenIfSiteHasNoVisits()
{
// add our mock archiver instance
// TODO: should use a dummy plugin that is activated for this test explicitly, but that can be tricky, especially in the future
PluginsArchiver::$archivers['VisitsSummary'] = 'Piwik\Tests\Integration\ArchiveWithNoVisitsTest_MockArchiver';
// mark our only site as should archive when no visits
$eventDispatcher = $this->getEventDispatcher();
$eventDispatcher->addObserver('Archiving.getIdSitesToArchiveWhenNoVisits', function (&$idSites) {
$idSites[] = 1;
});
Cache::getTransientCache()->flushAll();
// initiate archiving and make sure both aggregate methods are called correctly
VisitsSummaryAPI::getInstance()->get($idSite = 1, 'week', '2012-01-10');
$expectedMethodCalls = array(
'aggregateDayReport',
'aggregateDayReport',
'aggregateDayReport',
'aggregateDayReport',
'aggregateDayReport',
'aggregateDayReport',
'aggregateDayReport',
'aggregateMultipleReports',
);
$this->assertEquals($expectedMethodCalls, ArchiveWithNoVisitsTest_MockArchiver::$methodsCalled);
}
public function test_PluginArchiver_CanBeUsedToTriggerArchiving_EvenIfSiteHasNoVisits()
{
PluginsArchiver::$archivers['VisitsSummary'] = 'Piwik\Tests\Integration\ArchiveWithNoVisitsTest_MockArchiver';
ArchiveWithNoVisitsTest_MockArchiver::$runWithoutVisits = true;
// initiate archiving and make sure methods are called
VisitsSummaryAPI::getInstance()->get($idSite = 1, 'week', '2012-01-01');
$expectedMethodCalls = array(
'aggregateDayReport',
'aggregateDayReport',
'aggregateDayReport',
'aggregateDayReport',
'aggregateDayReport',
'aggregateDayReport',
'aggregateDayReport',
'aggregateMultipleReports',
);
$this->assertEquals($expectedMethodCalls, ArchiveWithNoVisitsTest_MockArchiver::$methodsCalled);
}
/**
* @return EventDispatcher
*/
private function getEventDispatcher()
{
return self::$fixture->piwikEnvironment->getContainer()->get('Piwik\EventDispatcher');
}
}
|