Refactor: Split cost reporting into separate class

Extract read-only reporting methods from PRAutoBlogger_Cost_Tracker into a new
PRAutoBlogger_Cost_Reporter class. This reduces Cost_Tracker from 313 to 206
lines and Reporter to 141 lines, both under the 300-line cap.

Changed files:
- Create includes/core/class-cost-reporter.php with reporting methods:
  * get_monthly_spend(): float
  * get_daily_spend(int $days = 30): array
  * get_spend_by_stage(string $start_date, string $end_date): array
  * get_budget_utilization(): float

- Update includes/core/class-cost-tracker.php:
  * Remove reporting methods
  * Update is_budget_exceeded() and would_exceed_budget() to use Cost_Reporter
  * Keep get_current_run_cost() (tracks current pipeline run only)
  * Add @see cross-reference to Cost_Reporter

- Update templates and admin classes to instantiate Cost_Reporter:
  * templates/admin/metrics-page.php
  * templates/admin/settings-page.php
  * includes/admin/class-admin-notices.php
  * includes/admin/class-dashboard-widget.php

- Split tests/unit/Core/CostTrackerTest.php:
  * Create tests/unit/Core/CostReporterTest.php for reporter methods
  * Keep run ID and budget enforcement tests in CostTrackerTest

Autoloader automatically discovers PRAutoBlogger_Cost_Reporter class.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
peptiderepo
2026-04-16 20:27:57 +07:00
parent 7197249cab
commit 49d094b4f8
8 changed files with 255 additions and 179 deletions

View File

@@ -68,20 +68,6 @@ class CostTrackerTest extends BaseTestCase {
$this->assertFalse( $tracker->is_budget_exceeded() );
}
/**
* Test get_monthly_spend returns float.
*/
public function test_get_monthly_spend_returns_float(): void {
$this->wpdb->method( 'prepare' )->willReturn( 'prepared' );
$this->wpdb->method( 'get_var' )->willReturn( '10.50' );
$tracker = new \PRAutoBlogger_Cost_Tracker();
$spend = $tracker->get_monthly_spend();
$this->assertIsFloat( $spend );
$this->assertGreaterThanOrEqual( 0.0, $spend );
}
/**
* Test get_current_run_cost returns float.
*/
@@ -98,43 +84,6 @@ class CostTrackerTest extends BaseTestCase {
$this->assertGreaterThanOrEqual( 0.0, $cost );
}
/**
* Test get_daily_spend returns array.
*/
public function test_get_daily_spend_returns_array(): void {
$this->wpdb->method( 'prepare' )->willReturn( 'prepared' );
$this->wpdb->method( 'get_results' )->willReturn( [] );
$tracker = new \PRAutoBlogger_Cost_Tracker();
$daily = $tracker->get_daily_spend( 30 );
$this->assertIsArray( $daily );
}
/**
* Test get_spend_by_stage returns array.
*/
public function test_get_spend_by_stage_returns_array(): void {
$this->wpdb->method( 'prepare' )->willReturn( 'prepared' );
$this->wpdb->method( 'get_results' )->willReturn( [] );
$tracker = new \PRAutoBlogger_Cost_Tracker();
$spend = $tracker->get_spend_by_stage( '2026-04-01', '2026-04-30' );
$this->assertIsArray( $spend );
}
/**
* Test get_budget_utilization returns float between 0 and 1.
*/
public function test_get_budget_utilization_returns_float(): void {
$tracker = new \PRAutoBlogger_Cost_Tracker();
$utilization = $tracker->get_budget_utilization();
$this->assertIsFloat( $utilization );
$this->assertGreaterThanOrEqual( 0.0, $utilization );
}
/**
* Test log_api_call with mock database.
*/