diff --git a/README.md b/README.md index 4342b798..1b738472 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Speedtest Tracker -[![Docker pulls](https://img.shields.io/docker/pulls/henrywhitaker3/speedtest-tracker?style=flat-square)](https://hub.docker.com/r/henrywhitaker3/speedtest-tracker) [![GitHub Workflow Status](https://img.shields.io/github/workflow/status/henrywhitaker3/Speedtest-Tracker/Stable?label=master&logo=github&style=flat-square)](https://github.com/henrywhitaker3/Speedtest-Tracker/actions) [![GitHub Workflow Status](https://img.shields.io/github/workflow/status/henrywhitaker3/Speedtest-Tracker/Dev?label=dev&logo=github&style=flat-square)](https://github.com/henrywhitaker3/Speedtest-Tracker/actions) [![last_commit](https://img.shields.io/github/last-commit/henrywhitaker3/Speedtest-Tracker?style=flat-square)](https://github.com/henrywhitaker3/Speedtest-Tracker/commits) [![issues](https://img.shields.io/github/issues/henrywhitaker3/Speedtest-Tracker?style=flat-square)](https://github.com/henrywhitaker3/Speedtest-Tracker/issues) [![commit_freq](https://img.shields.io/github/commit-activity/m/henrywhitaker3/Speedtest-Tracker?style=flat-square)](https://github.com/henrywhitaker3/Speedtest-Tracker/commits) ![version](https://img.shields.io/badge/version-v1.11.0-success?style=flat-square) [![license](https://img.shields.io/github/license/henrywhitaker3/Speedtest-Tracker?style=flat-square)](https://github.com/henrywhitaker3/Speedtest-Tracker/blob/master/LICENSE) +[![Docker pulls](https://img.shields.io/docker/pulls/henrywhitaker3/speedtest-tracker?style=flat-square)](https://hub.docker.com/r/henrywhitaker3/speedtest-tracker) [![GitHub Workflow Status](https://img.shields.io/github/workflow/status/henrywhitaker3/Speedtest-Tracker/Stable?label=master&logo=github&style=flat-square)](https://github.com/henrywhitaker3/Speedtest-Tracker/actions) [![GitHub Workflow Status](https://img.shields.io/github/workflow/status/henrywhitaker3/Speedtest-Tracker/Dev?label=dev&logo=github&style=flat-square)](https://github.com/henrywhitaker3/Speedtest-Tracker/actions) [![last_commit](https://img.shields.io/github/last-commit/henrywhitaker3/Speedtest-Tracker?style=flat-square)](https://github.com/henrywhitaker3/Speedtest-Tracker/commits) [![issues](https://img.shields.io/github/issues/henrywhitaker3/Speedtest-Tracker?style=flat-square)](https://github.com/henrywhitaker3/Speedtest-Tracker/issues) [![commit_freq](https://img.shields.io/github/commit-activity/m/henrywhitaker3/Speedtest-Tracker?style=flat-square)](https://github.com/henrywhitaker3/Speedtest-Tracker/commits) ![version](https://img.shields.io/badge/version-v1.11.1-success?style=flat-square) [![license](https://img.shields.io/github/license/henrywhitaker3/Speedtest-Tracker?style=flat-square)](https://github.com/henrywhitaker3/Speedtest-Tracker/blob/master/LICENSE) This program runs a speedtest check every hour and graphs the results. The back-end is written in [Laravel](https://laravel.com/) and the front-end uses [React](https://reactjs.org/). It uses the [Ookla's speedtest cli](https://www.speedtest.net/apps/cli) package to get the data and uses [Chart.js](https://www.chartjs.org/) to plot the results. diff --git a/app/Helpers/SpeedtestHelper.php b/app/Helpers/SpeedtestHelper.php index b75fbd83..b4bf3e10 100644 --- a/app/Helpers/SpeedtestHelper.php +++ b/app/Helpers/SpeedtestHelper.php @@ -228,4 +228,42 @@ class SpeedtestHelper throw new InvalidArgumentException(); } + + /** + * Get a percentage rate of failure by days + * + * @param integer $days number of days to get rate for + * @return integer percentage fail rate + */ + public static function failureRate(int $days) + { + $ttl = Carbon::now()->addDays(1); + $rate = Cache::remember('failure-rate-' . $days, $ttl, function () use ($days) { + $range = [ + Carbon::today() + ]; + for ($i = 0; $i < ($days - 1); $i++) { + $prev = end($range); + $new = $prev->copy()->subDays(1); + array_push($range, $new); + } + + $rate = []; + + foreach ($range as $day) { + $success = Speedtest::select(DB::raw('COUNT(id) as rate'))->whereDate('created_at', $day)->where('failed', false)->get()[0]['rate']; + $fail = Speedtest::select(DB::raw('COUNT(id) as rate'))->whereDate('created_at', $day)->where('failed', true)->get()[0]['rate']; + + array_push($rate, [ + 'date' => $day->toDateString(), + 'success' => $success, + 'failure' => $fail, + ]); + } + + return array_reverse($rate); + }); + + return $rate; + } } diff --git a/app/Utils/OoklaTester.php b/app/Utils/OoklaTester.php index c7e275e0..74e617da 100644 --- a/app/Utils/OoklaTester.php +++ b/app/Utils/OoklaTester.php @@ -55,7 +55,7 @@ class OoklaTester implements SpeedtestProvider 'scheduled' => $scheduled, ]); - throw new SpeedtestFailureException((string)$output); + throw new SpeedtestFailureException(json_encode($output)); } Cache::flush(); diff --git a/config/speedtest.php b/config/speedtest.php index 18d0b0a8..1db30b80 100644 --- a/config/speedtest.php +++ b/config/speedtest.php @@ -7,7 +7,7 @@ return [ |-------------------------------------------------------------------------- */ - 'version' => '1.11.0', + 'version' => '1.11.1', /* |-------------------------------------------------------------------------- diff --git a/tests/Unit/Helpers/SpeedtestHelper/CheckOutputTest.php b/tests/Unit/Helpers/SpeedtestHelper/CheckOutputTest.php index db99df80..d017cb7b 100644 --- a/tests/Unit/Helpers/SpeedtestHelper/CheckOutputTest.php +++ b/tests/Unit/Helpers/SpeedtestHelper/CheckOutputTest.php @@ -9,7 +9,7 @@ class CheckOutputTest extends TestCase { private OoklaTester $speedtestProvider; - public function __construct() + public function setUp(): void { $this->speedtestProvider = new OoklaTester(); } diff --git a/tests/Unit/Helpers/SpeedtestHelper/SpeedtestTest.php b/tests/Unit/Helpers/SpeedtestHelper/SpeedtestTest.php index bb854c5e..9c5db28f 100644 --- a/tests/Unit/Helpers/SpeedtestHelper/SpeedtestTest.php +++ b/tests/Unit/Helpers/SpeedtestHelper/SpeedtestTest.php @@ -2,10 +2,10 @@ namespace Tests\Unit\Helpers\SpeedtestHelper; +use App\Exceptions\SpeedtestFailureException; use App\Helpers\SpeedtestHelper; use App\Utils\OoklaTester; use Illuminate\Foundation\Testing\RefreshDatabase; -use JsonException; use Tests\TestCase; class SpeedtestTest extends TestCase @@ -58,11 +58,11 @@ class SpeedtestTest extends TestCase */ public function testInvaidJson() { + $this->expectException(SpeedtestFailureException::class); + $json = '{hi: hi}'; $o = $this->speedtestProvider->run($json); - - $this->assertFalse($o); } /** @@ -72,10 +72,10 @@ class SpeedtestTest extends TestCase */ public function testIncompleteJson() { + $this->expectException(SpeedtestFailureException::class); + $json = '{"hi": "hi"}'; $o = $this->speedtestProvider->run($json); - - $this->assertFalse($o); } }