From 94e4919b44719b7db3c31f845defdc74cd18c127 Mon Sep 17 00:00:00 2001 From: Henry Whitaker Date: Tue, 25 Aug 2020 18:26:21 +0100 Subject: [PATCH] Added unit tests for helpers and tests for commands --- .gitignore | 1 + .../Commands/AcceptEULACommandTest.php | 21 +++ .../Feature/{ => Commands}/AppVersionTest.php | 2 +- .../Commands/AuthenticationCommandTest.php | 73 ++++++++ .../Commands/ClearOldSessionCommandTest.php | 24 +++ .../Commands/ClearQueueCommandTest.php | 23 +++ .../Feature/Commands/GetConfigCommandTest.php | 27 +++ .../Commands/SetSlackWebhookCommandTest.php | 29 +++ .../SetTelegramOptionsCommandTest.php | 33 ++++ .../Commands/SpeedtestOverviewCommandTest.php | 23 +++ .../Commands/TestNotificationCommandTest.php | 23 +++ .../ThresholdMessageTest.php | 59 ++++++ .../SettingsHelper/SettingsGetTest.php | 38 ++++ .../SettingsLoadIntegrationsConfigTest.php | 35 ++++ .../SettingsHelper/SettingsSetTest.php | 25 +++ .../SpeedtestHelper/AbsoluteThresholdTest.php | 170 ++++++++++++++++++ .../SpeedtestHelper/CheckOutputTest.php | 59 ++++++ .../SpeedtestHelper/FailureRateTest.php | 46 +++++ .../SpeedtestHelper/ParseUnitsTest.php | 69 +++++++ .../PercentageThresholdTest.php | 72 ++++++++ .../Helpers/SpeedtestHelper/SpeedtestTest.php | 76 ++++++++ 21 files changed, 927 insertions(+), 1 deletion(-) create mode 100644 tests/Feature/Commands/AcceptEULACommandTest.php rename tests/Feature/{ => Commands}/AppVersionTest.php (92%) create mode 100644 tests/Feature/Commands/AuthenticationCommandTest.php create mode 100644 tests/Feature/Commands/ClearOldSessionCommandTest.php create mode 100644 tests/Feature/Commands/ClearQueueCommandTest.php create mode 100644 tests/Feature/Commands/GetConfigCommandTest.php create mode 100644 tests/Feature/Commands/SetSlackWebhookCommandTest.php create mode 100644 tests/Feature/Commands/SetTelegramOptionsCommandTest.php create mode 100644 tests/Feature/Commands/SpeedtestOverviewCommandTest.php create mode 100644 tests/Feature/Commands/TestNotificationCommandTest.php create mode 100644 tests/Unit/Helpers/NotificationsHelper/ThresholdMessageTest.php create mode 100644 tests/Unit/Helpers/SettingsHelper/SettingsGetTest.php create mode 100644 tests/Unit/Helpers/SettingsHelper/SettingsLoadIntegrationsConfigTest.php create mode 100644 tests/Unit/Helpers/SettingsHelper/SettingsSetTest.php create mode 100644 tests/Unit/Helpers/SpeedtestHelper/AbsoluteThresholdTest.php create mode 100644 tests/Unit/Helpers/SpeedtestHelper/CheckOutputTest.php create mode 100644 tests/Unit/Helpers/SpeedtestHelper/FailureRateTest.php create mode 100644 tests/Unit/Helpers/SpeedtestHelper/ParseUnitsTest.php create mode 100644 tests/Unit/Helpers/SpeedtestHelper/PercentageThresholdTest.php create mode 100644 tests/Unit/Helpers/SpeedtestHelper/SpeedtestTest.php diff --git a/.gitignore b/.gitignore index cd67c07b..02c64662 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,4 @@ yarn-error.log _ide_helper.php .idea .config +reports/ diff --git a/tests/Feature/Commands/AcceptEULACommandTest.php b/tests/Feature/Commands/AcceptEULACommandTest.php new file mode 100644 index 00000000..3c0debbc --- /dev/null +++ b/tests/Feature/Commands/AcceptEULACommandTest.php @@ -0,0 +1,21 @@ +artisan('speedtest:eula') + ->assertExitCode(0); + } +} diff --git a/tests/Feature/AppVersionTest.php b/tests/Feature/Commands/AppVersionTest.php similarity index 92% rename from tests/Feature/AppVersionTest.php rename to tests/Feature/Commands/AppVersionTest.php index df424a41..2c02aef1 100644 --- a/tests/Feature/AppVersionTest.php +++ b/tests/Feature/Commands/AppVersionTest.php @@ -1,6 +1,6 @@ assertEquals(Artisan::call('speedtest:auth', [ '--enable' => true ]), 0); + + $this->assertTrue((bool)SettingsHelper::get('auth')->value); + } + + /** + * Disable app auth + * + * @return void + */ + public function testDisableAuth() + { + SettingsHelper::set('auth', true); + + $this->assertEquals(Artisan::call('speedtest:auth', [ '--disable' => true ]), 0); + + $this->assertFalse((bool)SettingsHelper::get('auth')->value); + } + + /** + * Test invalid params for command + * + * @return void + */ + // public function testAuthBothOptions() + // { + // $command = new AuthenticationCommand(); + // $command->setLaravel($this->app); + // $tester = new CommandTester($command); + // $tester->setInputs([]); + // $tester->execute([ '--enable' => true, '--disable' => true ]); + // } + + /** + * Test invalid params for command + * + * @return void + */ + // public function testAuthNoOptions() + // { + // $command = new AuthenticationCommand(); + // $command->setLaravel($this->app); + // $tester = new CommandTester($command); + // $tester->setInputs([]); + // $tester->execute([]); + // } +} diff --git a/tests/Feature/Commands/ClearOldSessionCommandTest.php b/tests/Feature/Commands/ClearOldSessionCommandTest.php new file mode 100644 index 00000000..ad28e1d7 --- /dev/null +++ b/tests/Feature/Commands/ClearOldSessionCommandTest.php @@ -0,0 +1,24 @@ +artisan('speedtest:clear-sessions') + ->expectsOutput('Invalidated expired sessions') + ->assertExitCode(0); + } +} diff --git a/tests/Feature/Commands/ClearQueueCommandTest.php b/tests/Feature/Commands/ClearQueueCommandTest.php new file mode 100644 index 00000000..66146089 --- /dev/null +++ b/tests/Feature/Commands/ClearQueueCommandTest.php @@ -0,0 +1,23 @@ +artisan('queue:clear') + ->assertExitCode(0); + } +} diff --git a/tests/Feature/Commands/GetConfigCommandTest.php b/tests/Feature/Commands/GetConfigCommandTest.php new file mode 100644 index 00000000..32dc8934 --- /dev/null +++ b/tests/Feature/Commands/GetConfigCommandTest.php @@ -0,0 +1,27 @@ +artisan('speedtest:config') + ->expectsOutput($configJson) + ->assertExitCode(0); + } +} diff --git a/tests/Feature/Commands/SetSlackWebhookCommandTest.php b/tests/Feature/Commands/SetSlackWebhookCommandTest.php new file mode 100644 index 00000000..6ecd0f09 --- /dev/null +++ b/tests/Feature/Commands/SetSlackWebhookCommandTest.php @@ -0,0 +1,29 @@ +artisan('speedtest:slack', [ 'webhook' => 'test' ]) + ->expectsOutput('Slack webhook updated') + ->assertExitCode(0); + + $this->assertEquals(SettingsHelper::get('slack_webhook')->value, 'test'); + } +} diff --git a/tests/Feature/Commands/SetTelegramOptionsCommandTest.php b/tests/Feature/Commands/SetTelegramOptionsCommandTest.php new file mode 100644 index 00000000..d3edf2ac --- /dev/null +++ b/tests/Feature/Commands/SetTelegramOptionsCommandTest.php @@ -0,0 +1,33 @@ +artisan('speedtest:telegram', [ + '--bot' => 'test-bot', + '--chat' => 'test-chat' + ])->expectsOutput('Telegram options updated') + ->assertExitCode(0); + + $this->assertEquals(SettingsHelper::get('telegram_bot_token')->value, 'test-bot'); + $this->assertEquals(SettingsHelper::get('telegram_chat_id')->value, 'test-chat'); + } +} diff --git a/tests/Feature/Commands/SpeedtestOverviewCommandTest.php b/tests/Feature/Commands/SpeedtestOverviewCommandTest.php new file mode 100644 index 00000000..361c5032 --- /dev/null +++ b/tests/Feature/Commands/SpeedtestOverviewCommandTest.php @@ -0,0 +1,23 @@ +artisan('speedtest:overview') + ->assertExitCode(0); + } +} diff --git a/tests/Feature/Commands/TestNotificationCommandTest.php b/tests/Feature/Commands/TestNotificationCommandTest.php new file mode 100644 index 00000000..b2d43598 --- /dev/null +++ b/tests/Feature/Commands/TestNotificationCommandTest.php @@ -0,0 +1,23 @@ +artisan('speedtest:notification') + ->assertExitCode(0); + } +} diff --git a/tests/Unit/Helpers/NotificationsHelper/ThresholdMessageTest.php b/tests/Unit/Helpers/NotificationsHelper/ThresholdMessageTest.php new file mode 100644 index 00000000..7bd9f695 --- /dev/null +++ b/tests/Unit/Helpers/NotificationsHelper/ThresholdMessageTest.php @@ -0,0 +1,59 @@ +assertEquals('For the latest speedtest, the ping, upload values exceeded the absolute threshold', $msg); + } + + /** + * Test absolute message + * + * @return void + */ + public function testAbsoluteMessageSingleField() + { + $msg = NotificationsHelper::formatAbsoluteThresholdMessage([ 'ping' ]); + + $this->assertEquals('For the latest speedtest, the ping value exceeded the absolute threshold', $msg); + } + + /** + * Test absolute message + * + * @return void + */ + public function testPercentageMessageMultiField() + { + $msg = NotificationsHelper::formatPercentageThresholdMessage([ 'ping', 'upload' ]); + + $this->assertEquals('For the latest speedtest, the ping, upload values exceeded the percentage threshold', $msg); + } + + /** + * Test absolute message + * + * @return void + */ + public function testPercentageMessageSingleField() + { + $msg = NotificationsHelper::formatPercentageThresholdMessage([ 'ping' ]); + + $this->assertEquals('For the latest speedtest, the ping value exceeded the percentage threshold', $msg); + } +} diff --git a/tests/Unit/Helpers/SettingsHelper/SettingsGetTest.php b/tests/Unit/Helpers/SettingsHelper/SettingsGetTest.php new file mode 100644 index 00000000..ab1b5f4c --- /dev/null +++ b/tests/Unit/Helpers/SettingsHelper/SettingsGetTest.php @@ -0,0 +1,38 @@ +assertNotFalse($response); + $this->assertFalse((bool)$response->value); + } + + /** + * A basic feature test example. + * + * @return void + */ + public function testInvalidSetting() + { + $response = SettingsHelper::get('test'); + + $this->assertFalse($response); + } +} diff --git a/tests/Unit/Helpers/SettingsHelper/SettingsLoadIntegrationsConfigTest.php b/tests/Unit/Helpers/SettingsHelper/SettingsLoadIntegrationsConfigTest.php new file mode 100644 index 00000000..896ad51d --- /dev/null +++ b/tests/Unit/Helpers/SettingsHelper/SettingsLoadIntegrationsConfigTest.php @@ -0,0 +1,35 @@ + false, + "healthchecks_uuid" => null, + "slack_webhook" => null, + "telegram_bot_token" => null, + "telegram_chat_id" => null, + ]; + + SettingsHelper::set('slack_webhook', 'test'); + + SettingsHelper::loadIntegrationConfig(); + + $this->assertEquals(config('integrations.slack_webhook'), 'test'); + } +} diff --git a/tests/Unit/Helpers/SettingsHelper/SettingsSetTest.php b/tests/Unit/Helpers/SettingsHelper/SettingsSetTest.php new file mode 100644 index 00000000..ef08059c --- /dev/null +++ b/tests/Unit/Helpers/SettingsHelper/SettingsSetTest.php @@ -0,0 +1,25 @@ +assertEquals('hello', $response->value); + } +} diff --git a/tests/Unit/Helpers/SpeedtestHelper/AbsoluteThresholdTest.php b/tests/Unit/Helpers/SpeedtestHelper/AbsoluteThresholdTest.php new file mode 100644 index 00000000..f257f6ff --- /dev/null +++ b/tests/Unit/Helpers/SpeedtestHelper/AbsoluteThresholdTest.php @@ -0,0 +1,170 @@ + $dl, + 'upload' => 11, + 'ping' => 5 + ]); + + $result = SpeedtestHelper::testIsLowerThanThreshold('absolute', $test); + + $this->assertEquals([ 'download' ], $result); + } + + /** + * A basic unit test example. + * + * @return void + */ + public function testAbsoluteDownloadThresholdNotExceeded() + { + $threshold = 1; + $dl = 5; + + SettingsHelper::set('threshold_alert_absolute_download', $threshold); + + $test = Speedtest::create([ + 'download' => $dl, + 'upload' => 11, + 'ping' => 5 + ]); + + $result = SpeedtestHelper::testIsLowerThanThreshold('absolute', $test); + + $this->assertEquals([], $result); + } + + /** + * A basic unit test example. + * + * @return void + */ + public function testAbsoluteUploadThresholdExceeded() + { + $threshold = 10; + $ul = 5; + + SettingsHelper::set('threshold_alert_absolute_upload', $threshold); + + $test = Speedtest::create([ + 'download' => 11, + 'upload' => $ul, + 'ping' => 5 + ]); + + $result = SpeedtestHelper::testIsLowerThanThreshold('absolute', $test); + + $this->assertEquals([ 'upload' ], $result); + } + + /** + * A basic unit test example. + * + * @return void + */ + public function testAbsoluteUploadThresholdNotExceeded() + { + $threshold = 1; + $ul = 5; + + SettingsHelper::set('threshold_alert_absolute_upload', $threshold); + + $test = Speedtest::create([ + 'download' => 11, + 'upload' => $ul, + 'ping' => 5 + ]); + + $result = SpeedtestHelper::testIsLowerThanThreshold('absolute', $test); + + $this->assertEquals([], $result); + } + + /** + * A basic unit test example. + * + * @return void + */ + public function testAbsolutePingThresholdExceeded() + { + $threshold = 10; + $ping = 11; + + SettingsHelper::set('threshold_alert_absolute_ping', $threshold); + + $test = Speedtest::create([ + 'download' => 10, + 'upload' => 10, + 'ping' => $ping + ]); + + $result = SpeedtestHelper::testIsLowerThanThreshold('absolute', $test); + + $this->assertEquals([ 'ping' ], $result); + } + + /** + * A basic unit test example. + * + * @return void + */ + public function testAbsolutePingThresholdNotExceeded() + { + $threshold = 10; + $ping = 9; + + SettingsHelper::set('threshold_alert_absolute_ping', $threshold); + + $test = Speedtest::create([ + 'download' => 10, + 'upload' => 10, + 'ping' => $ping + ]); + + $result = SpeedtestHelper::testIsLowerThanThreshold('absolute', $test); + + $this->assertEquals([], $result); + } + + /** + * A basic unit test example. + * + * @return void + */ + public function testInvalidArgument() + { + try { + SpeedtestHelper::testIsLowerThanThreshold('test', new Speedtest()); + } catch(InvalidArgumentException $e) { + $this->assertTrue(true); + return true; + } + + $this->assertTrue(false); + } +} diff --git a/tests/Unit/Helpers/SpeedtestHelper/CheckOutputTest.php b/tests/Unit/Helpers/SpeedtestHelper/CheckOutputTest.php new file mode 100644 index 00000000..ccedf32a --- /dev/null +++ b/tests/Unit/Helpers/SpeedtestHelper/CheckOutputTest.php @@ -0,0 +1,59 @@ + 'result', + 'download' => [ 'bandwidth' => '*' ], + 'upload' => [ 'bandwidth' => '*' ], + 'ping' => [ 'latency' => '*' ], + 'server' => [ + 'id' => '*', + 'name' => '*', + 'host' => '*', + 'port' => '*', + ], + 'result' => [ + 'url' => '*', + ] + ]; + + $this->assertTrue(SpeedtestHelper::checkOutputIsComplete($expected)); + } + + /** + * A basic unit test example. + * + * @return void + */ + public function testBadOutput() + { + $expected = [ + 'type' => 'result', + 'download' => [ 'bandwidth' => '*' ], + 'server' => [ + 'id' => '*', + 'name' => '*', + 'host' => '*', + 'port' => '*', + ], + 'result' => [ + 'url' => '*', + ] + ]; + + $this->assertFalse(SpeedtestHelper::checkOutputIsComplete($expected)); + } +} diff --git a/tests/Unit/Helpers/SpeedtestHelper/FailureRateTest.php b/tests/Unit/Helpers/SpeedtestHelper/FailureRateTest.php new file mode 100644 index 00000000..fe32692e --- /dev/null +++ b/tests/Unit/Helpers/SpeedtestHelper/FailureRateTest.php @@ -0,0 +1,46 @@ + 5, + 'download' => 5, + 'upload' => 5 + ]); + } + + for($i = 0; $i < $failed; $i++) { + Speedtest::create([ + 'ping' => 5, + 'download' => 5, + 'upload' => 5, + 'failed' => true + ]); + } + + $output = SpeedtestHelper::failureRate(1); + + $this->assertEquals($output[0]['success'], $success); + $this->assertEquals($output[0]['failure'], $failed); + } +} diff --git a/tests/Unit/Helpers/SpeedtestHelper/ParseUnitsTest.php b/tests/Unit/Helpers/SpeedtestHelper/ParseUnitsTest.php new file mode 100644 index 00000000..7771d35c --- /dev/null +++ b/tests/Unit/Helpers/SpeedtestHelper/ParseUnitsTest.php @@ -0,0 +1,69 @@ +assertEquals($expected, $result['val']); + } + + /** + * A basic unit test example. + * + * @return void + */ + public function testKbitToMb() + { + $initial = '80 Kbit'; + $expected = 0.08; + + $result = SpeedtestHelper::parseUnits($initial); + + $this->assertEquals($expected, $result['val']); + } + + /** + * A basic unit test example. + * + * @return void + */ + public function testKbyteToMb() + { + $initial = '80 Kbyte'; + $expected = 0.64; + + $result = SpeedtestHelper::parseUnits($initial); + + $this->assertEquals($expected, $result['val']); + } + + /** + * A basic unit test example. + * + * @return void + */ + public function testMbToMb() + { + $initial = '80 Mbit'; + $expected = 80; + + $result = SpeedtestHelper::parseUnits($initial); + + $this->assertEquals($expected, $result['val']); + } +} diff --git a/tests/Unit/Helpers/SpeedtestHelper/PercentageThresholdTest.php b/tests/Unit/Helpers/SpeedtestHelper/PercentageThresholdTest.php new file mode 100644 index 00000000..2ac63c27 --- /dev/null +++ b/tests/Unit/Helpers/SpeedtestHelper/PercentageThresholdTest.php @@ -0,0 +1,72 @@ +createAverageOf5(); + } + + /** + * A basic unit test example. + * + * @return void + */ + public function testPercentageThresholdDownloadExceeded() + { + SettingsHelper::set('threshold_alert_percentage', 15); + + $test = Speedtest::create([ + 'download' => 5 * 0.8, + 'upload' => 5, + 'ping' => 5 + ]); + + $result = SpeedtestHelper::testIsLowerThanThreshold('percentage', $test); + + $this->assertEquals([ 'download' ], $result); + } + + /** + * A basic unit test example. + * + * @return void + */ + public function testThresholdNotSet() + { + SettingsHelper::set('threshold_alert_percentage', ''); + + $test = Speedtest::create([ + 'download' => 5 * 0.9, + 'upload' => 5, + 'ping' => 5 + ]); + + $result = SpeedtestHelper::testIsLowerThanThreshold('percentage', $test); + + $this->assertEquals([], $result); + } + + private function createAverageOf5() + { + for($i = 0; $i < 5; $i++) { + Speedtest::create([ + 'download' => 5, + 'upload' => 5, + 'ping' => 5 + ]); + } + } +} diff --git a/tests/Unit/Helpers/SpeedtestHelper/SpeedtestTest.php b/tests/Unit/Helpers/SpeedtestHelper/SpeedtestTest.php new file mode 100644 index 00000000..8ec152e9 --- /dev/null +++ b/tests/Unit/Helpers/SpeedtestHelper/SpeedtestTest.php @@ -0,0 +1,76 @@ +output = SpeedtestHelper::output(); + } + + /** + * A basic unit test example. + * + * @return void + */ + public function testOutputFunction() + { + $this->assertJson($this->output); + } + + /** + * A basic unit test example. + * + * @return void + */ + public function testRunSpeedtestWithExistingOutput() + { + $output = json_decode($this->output, true); + + $test = SpeedtestHelper::runSpeedtest($this->output); + + $this->assertEquals($output['ping']['latency'], $test->ping); + $this->assertEquals(SpeedtestHelper::convert($output['download']['bandwidth']), $test->download); + $this->assertEquals(SpeedtestHelper::convert($output['upload']['bandwidth']), $test->upload); + } + + /** + * A basic unit test example. + * + * @return void + */ + public function testInvaidJson() + { + $json = '{hi: hi}'; + + $o = SpeedtestHelper::runSpeedtest($json); + + $this->assertFalse($o); + } + + /** + * A basic unit test example. + * + * @return void + */ + public function testIncompleteJson() + { + $json = '{"hi": "hi"}'; + + $o = SpeedtestHelper::runSpeedtest($json); + + $this->assertFalse($o); + } +}