Skip to content

Commit bfd8a29

Browse files
fix issues with date generation for this_week and last_week and add a bunch of tests for it
1 parent 3ce3234 commit bfd8a29

File tree

8 files changed

+136
-95
lines changed

8 files changed

+136
-95
lines changed

autoload.php

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
'KokoAnalytics\\Chart_View' => '/src/class-chart-view.php',
1313
'KokoAnalytics\\Dashboard' => '/src/class-dashboard.php',
1414
'KokoAnalytics\\Dashboard_Widget' => '/src/class-dashboard-widget.php',
15-
'KokoAnalytics\\Dates' => '/src/class-dates.php',
1615
'KokoAnalytics\\Data_Exporter' => '/src/class-data-exporter.php',
1716
'KokoAnalytics\\Data_Importer' => '/src/class-data-importer.php',
1817
'KokoAnalytics\\Endpoint_Installer' => '/src/class-endpoint-installer.php',

koko-analytics.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,13 +43,13 @@
4343

4444
// don't run if PHP version is lower than 7.4
4545
// prevent direct file access
46-
if (PHP_VERSION_ID < 704000 || ! \defined('ABSPATH')) {
46+
if (PHP_VERSION_ID < 70400 || ! \defined('ABSPATH')) {
4747
return;
4848
}
4949

5050
// Maybe run any pending database migrations
5151
$migrations = new Migrations('koko_analytics_version', KOKO_ANALYTICS_VERSION, KOKO_ANALYTICS_PLUGIN_DIR . '/migrations/');
52-
$migrations->maybe_run();
52+
add_action('init', [$migrations, 'maybe_run']);
5353

5454
// Initialize rest of plugin
5555
if (\defined('DOING_AJAX') && DOING_AJAX) {

phpcs.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,6 @@
1313
<rule ref="PSR12">
1414
<exclude name="Squiz.Classes.ValidClassName.NotCamelCaps" />
1515
<exclude name="PSR1.Methods.CamelCapsMethodName.NotCamelCaps" />
16+
<exclude name="Generic.Files.LineLength.TooLong"/>
1617
</rule>
1718
</ruleset>

src/class-dashboard.php

Lines changed: 71 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,15 +38,16 @@ public function show_standalone_dashboard_page(): void
3838
public function show(): void
3939
{
4040
$settings = get_settings();
41-
$dates = new Dates();
4241
$stats = new Stats();
4342
$items_per_page = (int) apply_filters('koko_analytics_items_per_page', 20);
4443
$dateFormat = get_option('date_format');
4544
$dashboard_url = remove_query_arg(['start_date', 'end_date', 'view', 'posts', 'referrers']);
4645

4746
// parse query params
4847
$range = isset($_GET['view']) ? $_GET['view'] : $settings['default_view'];
49-
$dateRange = $dates->get_range($range);
48+
$now = create_local_datetime('now');
49+
$week_starts_on = (int) get_option('start_of_week', 0);
50+
$dateRange = $this->get_dates_for_range($now, $range, $week_starts_on);
5051

5152
$page = isset($_GET['p']) ? absint($_GET['p']) : 0;
5253
try {
@@ -140,4 +141,72 @@ private function maybe_show_pro_notice(): void
140141

141142
new Notice_Pro();
142143
}
144+
145+
public function get_dates_for_range(\DateTimeImmutable $now, string $key, int $week_starts_on = 0): array
146+
{
147+
switch ($key) {
148+
case 'today':
149+
return [
150+
$now->modify('today midnight'),
151+
$now->modify('tomorrow midnight, -1 second')
152+
];
153+
case 'yesterday':
154+
return [
155+
$now->modify('yesterday midnight'),
156+
$now->modify('today midnight, -1 second')
157+
];
158+
case 'this_week':
159+
$start = $this->get_first_day_of_current_week($now, $week_starts_on);
160+
return [
161+
$start,
162+
$start->modify('+7 days, midnight, -1 second')
163+
];
164+
case 'last_week':
165+
$start = $this->get_first_day_of_current_week($now, $week_starts_on)->modify('-7 days');
166+
return [
167+
$start,
168+
$start->modify('+7 days, midnight, -1 second')
169+
];
170+
case 'last_14_days':
171+
return [
172+
$now->modify('-14 days'),
173+
$now->modify('tomorrow midnight, -1 second')
174+
];
175+
default:
176+
case 'last_28_days':
177+
return [
178+
$now->modify('-28 days'),
179+
$now->modify('tomorrow midnight, -1 second')
180+
];
181+
case 'this_month':
182+
return [
183+
$now->modify('first day of this month'),
184+
$now->modify('last day of this month')
185+
];
186+
case 'last_month':
187+
return [
188+
$now->modify('first day of last month, midnight'),
189+
$now->modify('last day of last month')
190+
];
191+
case 'this_year':
192+
return [
193+
$now->setDate((int) $now->format('Y'), 1, 1),
194+
$now->setDate((int) $now->format('Y'), 12, 31),
195+
];
196+
case 'last_year':
197+
return [
198+
$now->setDate((int) $now->format('Y') - 1, 1, 1),
199+
$now->setDate((int) $now->format('Y') - 1, 12, 31),
200+
];
201+
}
202+
}
203+
204+
public function get_first_day_of_current_week(\DateTimeImmutable $now, int $week_starts_on = 0): \DateTimeImmutable
205+
{
206+
if ((int) $now->format('w') === $week_starts_on) {
207+
return $now;
208+
}
209+
210+
return $now->modify("last sunday, +{$week_starts_on} days");
211+
}
143212
}

src/class-dates.php

Lines changed: 0 additions & 75 deletions
This file was deleted.

src/class-shortcode-site-counter.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818

1919
class ShortCode_Site_Counter
2020
{
21-
const SHORTCODE = 'koko_analytics_counter';
21+
private const SHORTCODE = 'koko_analytics_counter';
2222

2323
public function __construct()
2424
{

tests/DashboardTest.php

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,65 @@ public function testCanInstantiate() : void
1111
$i = new Dashboard();
1212
self::assertTrue($i instanceof Dashboard);
1313
}
14+
15+
public function testGetFirstDayOfCurrentWeekWithWeekStartOnSunday(): void
16+
{
17+
$i = new Dashboard();
18+
19+
self::assertEquals(new \DateTimeImmutable('2025-01-05'), $i->get_first_day_of_current_week(new DateTimeImmutable('2025-01-05'), 0));
20+
self::assertEquals(new \DateTimeImmutable('2025-01-05'), $i->get_first_day_of_current_week(new DateTimeImmutable('2025-01-06'), 0));
21+
self::assertEquals(new \DateTimeImmutable('2025-01-05'), $i->get_first_day_of_current_week(new DateTimeImmutable('2025-01-07'), 0));
22+
self::assertEquals(new \DateTimeImmutable('2025-01-05'), $i->get_first_day_of_current_week(new DateTimeImmutable('2025-01-08'), 0));
23+
self::assertEquals(new \DateTimeImmutable('2025-01-05'), $i->get_first_day_of_current_week(new DateTimeImmutable('2025-01-09'), 0));
24+
self::assertEquals(new \DateTimeImmutable('2025-01-05'), $i->get_first_day_of_current_week(new DateTimeImmutable('2025-01-10'), 0));
25+
self::assertEquals(new \DateTimeImmutable('2025-01-05'), $i->get_first_day_of_current_week(new DateTimeImmutable('2025-01-11'), 0));
26+
self::assertEquals(new \DateTimeImmutable('2025-01-12'), $i->get_first_day_of_current_week(new DateTimeImmutable('2025-01-12'), 0));
27+
}
28+
29+
public function testGetFirstDayOfCurrentWeekWithWeekStartOnMonday(): void
30+
{
31+
$i = new Dashboard();
32+
self::assertEquals(new \DateTimeImmutable('2024-12-30'), $i->get_first_day_of_current_week(new DateTimeImmutable('2025-01-05'), 1));
33+
self::assertEquals(new \DateTimeImmutable('2025-01-06'), $i->get_first_day_of_current_week(new DateTimeImmutable('2025-01-06'), 1));
34+
self::assertEquals(new \DateTimeImmutable('2025-01-06'), $i->get_first_day_of_current_week(new DateTimeImmutable('2025-01-07'), 1));
35+
self::assertEquals(new \DateTimeImmutable('2025-01-06'), $i->get_first_day_of_current_week(new DateTimeImmutable('2025-01-08'), 1));
36+
self::assertEquals(new \DateTimeImmutable('2025-01-06'), $i->get_first_day_of_current_week(new DateTimeImmutable('2025-01-09'), 1));
37+
self::assertEquals(new \DateTimeImmutable('2025-01-06'), $i->get_first_day_of_current_week(new DateTimeImmutable('2025-01-10'), 1));
38+
self::assertEquals(new \DateTimeImmutable('2025-01-06'), $i->get_first_day_of_current_week(new DateTimeImmutable('2025-01-11'), 1));
39+
self::assertEquals(new \DateTimeImmutable('2025-01-06'), $i->get_first_day_of_current_week(new DateTimeImmutable('2025-01-12'), 1));
40+
}
41+
42+
public function testGetDatesForRangeThisWeekWithWeekStartOnSunday(): void
43+
{
44+
$i = new Dashboard();
45+
self::assertEquals([new DateTimeImmutable('2025-01-05'), new DateTimeImmutable('2025-01-11 23:59:59')], $i->get_dates_for_range(new DateTimeImmutable('2025-01-05'), 'this_week', 0));
46+
self::assertEquals([new DateTimeImmutable('2025-01-05'), new DateTimeImmutable('2025-01-11 23:59:59')], $i->get_dates_for_range(new DateTimeImmutable('2025-01-06'), 'this_week', 0));
47+
self::assertEquals([new DateTimeImmutable('2025-01-05'), new DateTimeImmutable('2025-01-11 23:59:59')], $i->get_dates_for_range(new DateTimeImmutable('2025-01-07'), 'this_week', 0));
48+
self::assertEquals([new DateTimeImmutable('2025-01-05'), new DateTimeImmutable('2025-01-11 23:59:59')], $i->get_dates_for_range(new DateTimeImmutable('2025-01-08'), 'this_week', 0));
49+
self::assertEquals([new DateTimeImmutable('2025-01-05'), new DateTimeImmutable('2025-01-11 23:59:59')], $i->get_dates_for_range(new DateTimeImmutable('2025-01-09'), 'this_week', 0));
50+
self::assertEquals([new DateTimeImmutable('2025-01-05'), new DateTimeImmutable('2025-01-11 23:59:59')], $i->get_dates_for_range(new DateTimeImmutable('2025-01-10'), 'this_week', 0));
51+
self::assertEquals([new DateTimeImmutable('2025-01-05'), new DateTimeImmutable('2025-01-11 23:59:59')], $i->get_dates_for_range(new DateTimeImmutable('2025-01-11'), 'this_week', 0));
52+
self::assertEquals([new DateTimeImmutable('2025-01-12'), new DateTimeImmutable('2025-01-18 23:59:59')], $i->get_dates_for_range(new DateTimeImmutable('2025-01-12'), 'this_week', 0));
53+
}
54+
55+
public function testGetDatesForRangeThisWeekWithWeekStartOnMonday(): void
56+
{
57+
$i = new Dashboard();
58+
self::assertEquals([new DateTimeImmutable('2024-12-30'), new DateTimeImmutable('2025-01-05 23:59:59')], $i->get_dates_for_range(new DateTimeImmutable('2025-01-05'), 'this_week', 1));
59+
self::assertEquals([new DateTimeImmutable('2025-01-06'), new DateTimeImmutable('2025-01-12 23:59:59')], $i->get_dates_for_range(new DateTimeImmutable('2025-01-06'), 'this_week', 1));
60+
}
61+
62+
public function testGetDatesForRangeLastWeekWithWeekStartOnSunday(): void
63+
{
64+
$i = new Dashboard();
65+
self::assertEquals([new DateTimeImmutable('2024-12-29'), new DateTimeImmutable('2025-01-04 23:59:59')], $i->get_dates_for_range(new DateTimeImmutable('2025-01-05'), 'last_week', 0));
66+
self::assertEquals([new DateTimeImmutable('2024-12-29'), new DateTimeImmutable('2025-01-04 23:59:59')], $i->get_dates_for_range(new DateTimeImmutable('2025-01-06'), 'last_week', 0));
67+
}
68+
69+
public function testGetDatesForRangeLastWeekWithWeekStartOnMonday(): void
70+
{
71+
$i = new Dashboard();
72+
self::assertEquals([new DateTimeImmutable('2024-12-23'), new DateTimeImmutable('2024-12-29 23:59:59')], $i->get_dates_for_range(new DateTimeImmutable('2025-01-05'), 'last_week', 1));
73+
self::assertEquals([new DateTimeImmutable('2024-12-30'), new DateTimeImmutable('2025-01-05 23:59:59')], $i->get_dates_for_range(new DateTimeImmutable('2025-01-06'), 'last_week', 1));
74+
}
1475
}

tests/DatesTest.php

Lines changed: 0 additions & 14 deletions
This file was deleted.

0 commit comments

Comments
 (0)